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 + -
显示快捷键?