From ed45345eb10a0a2c1f20f66c41ebbf12e713729b Mon Sep 17 00:00:00 2001 From: Stefan Csomor Date: Mon, 25 Aug 2003 23:31:41 +0000 Subject: [PATCH] unicode and linkage corrections git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@23223 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- src/common/xtistrm.cpp | 122 ++++++++++++++++++++++++++++++++++++----- src/common/xtixml.cpp | 49 +++++++++++++---- 2 files changed, 148 insertions(+), 23 deletions(-) diff --git a/src/common/xtistrm.cpp b/src/common/xtistrm.cpp index d6543ee4a5..5688168f0d 100644 --- a/src/common/xtistrm.cpp +++ b/src/common/xtistrm.cpp @@ -186,7 +186,6 @@ void wxWriter::WriteOneProperty( const wxObject *obj , const wxClassInfo* ci , c if ( dynobj && (dynamic_cast(ci) == NULL) ) obj = dynobj->GetSuperClassInstance() ; - DoBeginWriteProperty( pi ) ; if ( pi->GetTypeInfo()->GetKind() == wxT_COLLECTION ) { wxxVariantArray data ; @@ -194,6 +193,9 @@ void wxWriter::WriteOneProperty( const wxObject *obj , const wxClassInfo* ci , c const wxTypeInfo * elementType = dynamic_cast< const wxCollectionTypeInfo* >( pi->GetTypeInfo() )->GetElementType() ; for ( size_t i = 0 ; i < data.GetCount() ; ++i ) { + if ( i == 0 ) + DoBeginWriteProperty( pi ) ; + DoBeginWriteElement() ; wxxVariant value = data[i] ; if ( persister->BeforeWriteProperty( this , pi , value ) ) @@ -212,8 +214,10 @@ void wxWriter::WriteOneProperty( const wxObject *obj , const wxClassInfo* ci , c } } DoEndWriteElement() ; - } - } + if ( i == data.GetCount() - 1 ) + DoEndWriteProperty( pi ) ; + } + } else { const wxDelegateTypeInfo* dti = dynamic_cast< const wxDelegateTypeInfo* > ( pi->GetTypeInfo() ) ; @@ -230,8 +234,10 @@ void wxWriter::WriteOneProperty( const wxObject *obj , const wxClassInfo* ci , c { if ( sink != NULL && handler != NULL ) { + DoBeginWriteProperty( pi ) ; wxASSERT_MSG( IsObjectKnown( sink ) , wxT("Streaming delegates for not already streamed objects not yet supported") ) ; DoWriteDelegate( obj , ci , pi , sink , GetObjectID( sink ) , sink->GetClassInfo() , handler ) ; + DoEndWriteProperty( pi ) ; } } } @@ -239,30 +245,59 @@ void wxWriter::WriteOneProperty( const wxObject *obj , const wxClassInfo* ci , c { wxxVariant value ; pi->GetAccessor()->GetProperty(obj, value) ; + + // avoid streaming out void objects + if( value.IsEmpty() ) + return ; + + if ( pi->GetFlags() & wxPROP_ENUM_STORE_LONG ) + { + const wxEnumTypeInfo *eti = dynamic_cast( pi->GetTypeInfo() ) ; + wxASSERT_MSG( eti , wxT("Type must have enum - long conversion") ) ; + eti->ConvertFromLong( value.Get() , value ) ; + } + + // avoid streaming out default values + if ( pi->GetTypeInfo()->HasStringConverters() && !pi->GetDefaultValue().IsEmpty() ) + { + if ( value.GetAsString() == pi->GetDefaultValue().GetAsString() ) + return ; + } + + // avoid streaming out null objects + const wxClassTypeInfo* cti = dynamic_cast< const wxClassTypeInfo* > ( pi->GetTypeInfo() ) ; + + if ( cti && value.GetAsObject() == NULL ) + return ; + if ( persister->BeforeWriteProperty( this , pi , value ) ) { - const wxClassTypeInfo* cti = dynamic_cast< const wxClassTypeInfo* > ( pi->GetTypeInfo() ) ; + DoBeginWriteProperty( pi ) ; if ( cti ) { const wxClassInfo* pci = cti->GetClassInfo() ; wxObject *vobj = pci->VariantToInstance( value ) ; - wxxVariantArray md ; - WriteObject( vobj , (vobj ? vobj->GetClassInfo() : pci ) , persister , cti->GetKind()== wxT_OBJECT , md) ; + if ( vobj && pi->GetTypeInfo()->HasStringConverters() ) + { + wxString stringValue ; + cti->ConvertToString( value , stringValue ) ; + wxxVariant convertedValue(stringValue) ; + DoWriteSimpleType( convertedValue ) ; + } + else + { + wxxVariantArray md ; + WriteObject( vobj , (vobj ? vobj->GetClassInfo() : pci ) , persister , cti->GetKind()== wxT_OBJECT , md) ; + } } else { - if ( pi->GetFlags() & wxPROP_ENUM_STORE_LONG ) - { - const wxEnumTypeInfo *eti = dynamic_cast( pi->GetTypeInfo() ) ; - wxASSERT_MSG( eti , wxT("Type must have enum - long conversion") ) ; - eti->ConvertFromLong( value.Get() , value ) ; - } DoWriteSimpleType( value ) ; } + DoEndWriteProperty( pi ) ; } } } - DoEndWriteProperty( pi ) ; } int wxWriter::GetObjectID(const wxObject *obj) @@ -397,6 +432,36 @@ void wxRuntimeDepersister::CreateObject(int objectID, classInfo->Create(o, paramCount, params); } +void wxRuntimeDepersister::ConstructObject(int objectID, + const wxClassInfo *classInfo, + int paramCount, + wxxVariant *params, + int *objectIdValues, + const wxClassInfo **objectClassInfos , + wxxVariantArray &WXUNUSED(metadata)) +{ + wxObject *o; + for ( int i = 0 ; i < paramCount ; ++i ) + { + if ( objectIdValues[i] != wxInvalidObjectID ) + { + wxObject *o; + o = m_data->GetObject(objectIdValues[i]); + // if this is a dynamic object and we are asked for another class + // than wxDynamicObject we cast it down manually. + wxDynamicObject *dyno = dynamic_cast< wxDynamicObject * > (o) ; + if ( dyno!=NULL && (objectClassInfos[i] != dyno->GetClassInfo()) ) + { + o = dyno->GetSuperClassInstance() ; + } + params[i] = objectClassInfos[i]->InstanceToVariant(o) ; + } + } + o = classInfo->ConstructObject(paramCount, params); + m_data->SetObject(objectID, o); +} + + void wxRuntimeDepersister::DestroyObject(int objectID, wxClassInfo *WXUNUSED(classInfo)) { wxObject *o; @@ -587,6 +652,37 @@ void wxCodeDepersister::CreateObject(int objectID, m_fp->WriteString( ");\n"); } +void wxCodeDepersister::ConstructObject(int objectID, + const wxClassInfo *classInfo, + int paramCount, + wxxVariant *params, + int *objectIDValues, + const wxClassInfo **WXUNUSED(objectClassInfos) , + wxxVariantArray &WXUNUSED(metadata) + ) +{ + wxString objectName = wxString::Format( "LocalObject_%d" , objectID ) ; + m_fp->WriteString( wxString::Format( "\t%s *%s = new %s(", + classInfo->GetClassName(), + objectName.c_str(), + classInfo->GetClassName()) ); + m_data->SetObjectName( objectID , objectName ) ; + + int i; + for (i = 0; i < paramCount; i++) + { + if ( objectIDValues[i] != wxInvalidObjectID ) + m_fp->WriteString( wxString::Format( "%s", m_data->GetObjectName( objectIDValues[i] ).c_str() ) ); + else + { + m_fp->WriteString( wxString::Format( "%s", ValueAsCode(params[i]).c_str() ) ); + } + if (i < paramCount - 1) + m_fp->WriteString( ", "); + } + m_fp->WriteString( ");\n"); +} + void wxCodeDepersister::SetProperty(int objectID, const wxClassInfo *WXUNUSED(classInfo), const wxPropertyInfo* propertyInfo, diff --git a/src/common/xtixml.cpp b/src/common/xtixml.cpp index 4e70082ea5..5e77fc7c0c 100644 --- a/src/common/xtixml.cpp +++ b/src/common/xtixml.cpp @@ -266,7 +266,8 @@ int wxXmlReader::ReadComponent(wxXmlNode *node, wxDepersister *callbacks) } xp = xp->GetNext() ; } - callbacks->AllocateObject(objectID, classInfo, metadata); + if ( !classInfo->NeedsDirectConstruction() ) + callbacks->AllocateObject(objectID, classInfo, metadata); // // stream back the Create parameters first @@ -332,14 +333,28 @@ int wxXmlReader::ReadComponent(wxXmlNode *node, wxDepersister *callbacks) } else { - createParams[i] = pi->GetDefaultValue() ; + if ( pi->GetTypeInfo()->IsObjectType() ) + { + createParamOids[i] = wxNullObjectID ; + createClassInfos[i] = dynamic_cast(pi->GetTypeInfo())->GetClassInfo() ; + } + else + { + createParams[i] = pi->GetDefaultValue() ; + createParamOids[i] = wxInvalidObjectID ; + } } } // got the parameters. Call the Create method - callbacks->CreateObject(objectID, classInfo, - classInfo->GetCreateParamCount(), - createParams, createParamOids, createClassInfos, metadata ); + if ( classInfo->NeedsDirectConstruction() ) + callbacks->ConstructObject(objectID, classInfo, + classInfo->GetCreateParamCount(), + createParams, createParamOids, createClassInfos, metadata ); + else + callbacks->CreateObject(objectID, classInfo, + classInfo->GetCreateParamCount(), + createParams, createParamOids, createClassInfos, metadata ); // now stream in the rest of the properties, in the sequence their properties were written in the xml for ( size_t j = 0 ; j < propertyNames.size() ; ++j ) @@ -386,12 +401,26 @@ int wxXmlReader::ReadComponent(wxXmlNode *node, wxDepersister *callbacks) } else if ( pi->GetTypeInfo()->IsObjectType() ) { - int valueId = ReadComponent( prop , callbacks ) ; - if ( valueId != wxInvalidObjectID ) + // and object can either be streamed out a string or as an object + // in case we have no node, then the object's streaming out has been vetoed + if ( prop ) { - callbacks->SetPropertyAsObject( objectID , classInfo , pi , valueId ) ; - if ( pi->GetTypeInfo()->GetKind() == wxT_OBJECT && valueId != wxNullObjectID ) - callbacks->DestroyObject( valueId , GetObjectClassInfo( valueId ) ) ; + if ( prop->GetName() == wxT("object") ) + { + int valueId = ReadComponent( prop , callbacks ) ; + if ( valueId != wxInvalidObjectID ) + { + callbacks->SetPropertyAsObject( objectID , classInfo , pi , valueId ) ; + if ( pi->GetTypeInfo()->GetKind() == wxT_OBJECT && valueId != wxNullObjectID ) + callbacks->DestroyObject( valueId , GetObjectClassInfo( valueId ) ) ; + } + } + else + { + wxASSERT( pi->GetTypeInfo()->HasStringConverters() ) ; + wxxVariant nodeval = ReadValue( prop , pi->GetTypeInfo() ) ; + callbacks->SetProperty( objectID, classInfo ,pi , nodeval ) ; + } } } else if ( pi->GetTypeInfo()->IsDelegateType() ) -- 2.45.2