xtistrm.cpp
来自「A*算法 A*算法 A*算法 A*算法A*算法A*算法」· C++ 代码 · 共 852 行 · 第 1/3 页
CPP
852 行
// 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 , obj, pi , value ) )
{
DoBeginWriteProperty( pi ) ;
if ( cti )
{
const wxClassInfo* pci = cti->GetClassInfo() ;
wxObject *vobj = pci->VariantToInstance( value ) ;
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
{
DoWriteSimpleType( value ) ;
}
DoEndWriteProperty( pi ) ;
}
}
}
}
int wxWriter::GetObjectID(const wxObject *obj)
{
if ( !IsObjectKnown( obj ) )
return wxInvalidObjectID ;
return m_data->m_writtenObjects[obj] ;
}
bool wxWriter::IsObjectKnown( const wxObject *obj )
{
return m_data->m_writtenObjects.find( obj ) != m_data->m_writtenObjects.end() ;
}
// ----------------------------------------------------------------------------
// reading objects in
// ----------------------------------------------------------------------------
struct wxReader::wxReaderInternal
{
map<int,wxClassInfo*> m_classInfos;
};
wxReader::wxReader()
{
m_data = new wxReaderInternal;
}
wxReader::~wxReader()
{
delete m_data;
}
wxClassInfo* wxReader::GetObjectClassInfo(int objectID)
{
if ( objectID == wxNullObjectID || objectID == wxInvalidObjectID )
{
wxLogError( _("Invalid or Null Object ID passed to GetObjectClassInfo" ) ) ;
return NULL ;
}
if ( m_data->m_classInfos.find(objectID) == m_data->m_classInfos.end() )
{
wxLogError( _("Unknown Object passed to GetObjectClassInfo" ) ) ;
return NULL ;
}
return m_data->m_classInfos[objectID] ;
}
void wxReader::SetObjectClassInfo(int objectID, wxClassInfo *classInfo )
{
if ( objectID == wxNullObjectID || objectID == wxInvalidObjectID )
{
wxLogError( _("Invalid or Null Object ID passed to GetObjectClassInfo" ) ) ;
return ;
}
if ( m_data->m_classInfos.find(objectID) != m_data->m_classInfos.end() )
{
wxLogError( _("Already Registered Object passed to SetObjectClassInfo" ) ) ;
return ;
}
m_data->m_classInfos[objectID] = classInfo ;
}
bool wxReader::HasObjectClassInfo( int objectID )
{
if ( objectID == wxNullObjectID || objectID == wxInvalidObjectID )
{
wxLogError( _("Invalid or Null Object ID passed to HasObjectClassInfo" ) ) ;
return NULL ;
}
return m_data->m_classInfos.find(objectID) != m_data->m_classInfos.end() ;
}
// ----------------------------------------------------------------------------
// reading xml in
// ----------------------------------------------------------------------------
/*
Reading components has not to be extended for components
as properties are always sought by typeinfo over all levels
and create params are always toplevel class only
*/
// ----------------------------------------------------------------------------
// depersisting to memory
// ----------------------------------------------------------------------------
struct wxRuntimeDepersister::wxRuntimeDepersisterInternal
{
map<int,wxObject *> m_objects;
void SetObject(int objectID, wxObject *obj )
{
if ( m_objects.find(objectID) != m_objects.end() )
{
wxLogError( _("Passing a already registered object to SetObject") ) ;
return ;
}
m_objects[objectID] = obj ;
}
wxObject* GetObject( int objectID )
{
if ( objectID == wxNullObjectID )
return NULL ;
if ( m_objects.find(objectID) == m_objects.end() )
{
wxLogError( _("Passing an unkown object to GetObject") ) ;
return NULL ;
}
return m_objects[objectID] ;
}
} ;
wxRuntimeDepersister::wxRuntimeDepersister()
{
m_data = new wxRuntimeDepersisterInternal() ;
}
wxRuntimeDepersister::~wxRuntimeDepersister()
{
delete m_data ;
}
void wxRuntimeDepersister::AllocateObject(int objectID, wxClassInfo *classInfo ,
wxxVariantArray &WXUNUSED(metadata))
{
wxObject *O;
O = classInfo->CreateObject();
m_data->SetObject(objectID, O);
}
void wxRuntimeDepersister::CreateObject(int objectID,
const wxClassInfo *classInfo,
int paramCount,
wxxVariant *params,
int *objectIdValues,
const wxClassInfo **objectClassInfos ,
wxxVariantArray &WXUNUSED(metadata))
{
wxObject *o;
o = m_data->GetObject(objectID);
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) ;
}
}
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;
o = m_data->GetObject(objectID);
delete o ;
}
void wxRuntimeDepersister::SetProperty(int objectID,
const wxClassInfo *classInfo,
const wxPropertyInfo* propertyInfo,
const wxxVariant &value)
{
wxObject *o;
o = m_data->GetObject(objectID);
classInfo->SetProperty( o , propertyInfo->GetName() , value ) ;
}
void wxRuntimeDepersister::SetPropertyAsObject(int objectID,
const wxClassInfo *classInfo,
const wxPropertyInfo* propertyInfo,
int valueObjectId)
{
wxObject *o, *valo;
o = m_data->GetObject(objectID);
valo = m_data->GetObject(valueObjectId);
const wxClassInfo* valClassInfo = (dynamic_cast<const wxClassTypeInfo*>(propertyInfo->GetTypeInfo()))->GetClassInfo() ;
// if this is a dynamic object and we are asked for another class
// than wxDynamicObject we cast it down manually.
wxDynamicObject *dynvalo = dynamic_cast< wxDynamicObject * > (valo) ;
if ( dynvalo!=NULL && (valClassInfo != dynvalo->GetClassInfo()) )
{
valo = dynvalo->GetSuperClassInstance() ;
}
classInfo->SetProperty( o , propertyInfo->GetName() , valClassInfo->InstanceToVariant(valo) ) ;
}
void wxRuntimeDepersister::SetConnect(int eventSourceObjectID,
const wxClassInfo *WXUNUSED(eventSourceClassInfo),
const wxPropertyInfo *delegateInfo ,
const wxClassInfo *WXUNUSED(eventSinkClassInfo) ,
const wxHandlerInfo* handlerInfo ,
int eventSinkObjectID )
{
wxEvtHandler *ehsource = dynamic_cast< wxEvtHandler* >( m_data->GetObject( eventSourceObjectID ) ) ;
wxEvtHandler *ehsink = dynamic_cast< wxEvtHandler *>(m_data->GetObject(eventSinkObjectID) ) ;
if ( ehsource && ehsink )
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?