xti streaming

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@22599 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Stefan Csomor
2003-08-05 17:24:02 +00:00
parent b25757395c
commit 8ec1974ea1

View File

@@ -20,6 +20,9 @@
#if wxUSE_EXTENDED_RTTI #if wxUSE_EXTENDED_RTTI
const int wxInvalidObjectID = -2 ;
const int wxNullObjectID = -1 ;
// Filer contains the interfaces for streaming objects in and out of XML, // Filer contains the interfaces for streaming objects in and out of XML,
// rendering them either to objects in memory, or to code. Note: We // rendering them either to objects in memory, or to code. Note: We
// consider the process of generating code to be one of *depersisting* the // consider the process of generating code to be one of *depersisting* the
@@ -34,148 +37,228 @@
void WriteComponent(wxObject *Object, const wxClassInfo *ClassInfo, wxXmlNode *parent, const wxString& nodeName ); void WriteComponent(wxObject *Object, const wxClassInfo *ClassInfo, wxXmlNode *parent, const wxString& nodeName );
class wxReader;
/* /*
Streaming callbacks for depersisting XML to code, or running objects Streaming callbacks for depersisting XML to code, or running objects
*/ */
struct wxIDepersist ; class wxDepersister ;
/* /*
wxReader handles streaming in a class from XML. Maintains a list of wxReader handles streaming in a class from a arbitrary format. While walking through
objects, and names, and issues calls out to interfaces to depersist the it issues calls out to interfaces to depersist the guts from the underlying storage format.
guts from the XML tree.
*/ */
class wxReader : wxObject
class wxReader : public wxObject
{ {
struct wxReaderInternal;
wxReaderInternal *Data;
wxxVariant ReadPropertyValueNoAssign(wxXmlNode *Node,
wxClassInfo *ClassInfo,
const wxPropertyInfo *& propertyInfo ,
wxIDepersist *Callbacks = NULL);
void ReadPropertyValue(wxXmlNode *Node,
wxClassInfo *ClassInfo,
int ObjectId ,
wxIDepersist *Callbacks = NULL );
bool genCode; // true if the reader should generate code.
// ISSUE: ick!
// this interface is getting crufty. Why the
// different depersist callbacks in here, if there
// is another place that knows that we're generating
// code? Needs some repair work.
public : public :
wxReader(bool GenerateCode = false); wxReader() ;
~wxReader() ; ~wxReader() ;
// the only thing wxReader knows about is the class info by object ID
wxClassInfo *GetObjectClassInfo(int objectID) ;
bool HasObjectClassInfo( int objectID ) ;
void SetObjectClassInfo(int objectID, wxClassInfo* classInfo);
// Reads a component from XML. The return is the object ID, which can // Reads the component the reader is pointed at from the underlying format.
// be used in calls to GetObject or GetObjectName. // The return value is the root object ID, which can
// // then be used to ask the depersister about that object
// ISSUE: Still needs to implement references to objects. virtual int ReadObject( wxDepersister *depersist ) = 0 ;
// requires a bit of additional design in the XML (minor).
int ReadComponent(wxXmlNode *parent, wxIDepersist *Callbacks);
// When streaming in, we may we depersisting to code, or to objects private :
// in memory. The depersist callbacks for generating code will struct wxReaderInternal;
// not create the objects, but will create names for them instead. wxReaderInternal *m_data;
// So internally, we keep track of IDs, not pointers. Depending
// on who you are in your callbacks, you can query the names or
// pointers of the objects as need be. You should not mix both,
// because you will die if you do.
wxObject *GetObject(int id);
wxString GetObjectName(int id);
wxClassInfo *GetObjectClassInfo(int id) ;
void SetObject(int id, wxObject *Object);
void SetObjectName(int id, const wxString &Name, wxClassInfo* ClassInfo);
// Returns the result of a top level ReadComponent call. Used
// typically after you have instructed the reader to stream in an
// object, and you want the object back now. Only really valid if
// you are reading back in to an object in memory, as opposed to code.
wxObject *GetRoot() { return GetObject( 0 ) ; }
} ; } ;
struct wxIDepersist /*
{ wxXmlReader handles streaming in a class from XML
// NotifyReader is called by wxReader so that we can have access to the */
// object store functions in the reader when we are called back. Hmm.
// probably should have just made the callback functions each take a
// wxReader.
virtual void NotifyReader(wxReader *Reader) = 0;
// The next three callbacks match the ACS model of creation of objects. class wxXmlReader : public wxReader
{
public:
wxXmlReader(wxXmlNode *parent) { m_parent = parent ; }
~wxXmlReader() {}
// Reads a component from XML. The return value is the root object ID, which can
// then be used to ask the depersister about that object
int ReadObject(wxDepersister *callbacks);
private :
int ReadComponent(wxXmlNode *parent, wxDepersister *callbacks);
// accessor is only used as a temporary measure
wxxVariant ReadValue(wxXmlNode *Node,
wxPropertyAccessor *accessor );
wxXmlNode * m_parent ;
};
// This abstract class matches the allocate-init/create model of creation of objects.
// At runtime, these will create actual instances, and manipulate them. // At runtime, these will create actual instances, and manipulate them.
// When generating code, these will just create statements of C++ // When generating code, these will just create statements of C++
// code to create the objects. // code to create the objects.
class wxDepersister
{
public :
// allocate the new object on the heap, that object will have the passed in ID
virtual void AllocateObject(int ObjectID, wxClassInfo *ClassInfo) = 0; virtual void AllocateObject(int ObjectID, wxClassInfo *ClassInfo) = 0;
// initialize the already allocated object having the ID ObjectID with the Create method
// creation parameters which are objects are having their Ids passed in objectIDValues
// having objectId <> wxInvalidObjectID
virtual void CreateObject(int ObjectID, virtual void CreateObject(int ObjectID,
wxClassInfo *ClassInfo, const wxClassInfo *ClassInfo,
int ParamCount, int ParamCount,
wxxVariant *VariantValues) = 0; wxxVariant *VariantValues ,
int *objectIDValues ,
const wxClassInfo **objectClassInfos
) = 0;
// destroy the heap-allocated object having the ID ObjectID, this may be used if an object
// is embedded in another object and set via value semantics, so the intermediate
// object can be destroyed after safely
virtual void DestroyObject(int ObjectID, wxClassInfo *ClassInfo) = 0;
// set the corresponding property
virtual void SetProperty(int ObjectID, virtual void SetProperty(int ObjectID,
wxClassInfo *ClassInfo, const wxClassInfo *ClassInfo,
const wxPropertyInfo* PropertyInfo , const wxPropertyInfo* PropertyInfo ,
const wxxVariant &VariantValue) = 0; const wxxVariant &VariantValue) = 0;
// sets the corresponding property (value is an object)
virtual void SetPropertyAsObject(int ObjectId,
const wxClassInfo *ClassInfo,
const wxPropertyInfo* PropertyInfo ,
int valueObjectId) = 0;
// sets the corresponding event handler
virtual void SetConnect(int EventSourceObjectID, virtual void SetConnect(int EventSourceObjectID,
wxClassInfo *EventSourceClassInfo, const wxClassInfo *EventSourceClassInfo,
int eventType , const wxDelegateTypeInfo *delegateInfo ,
const wxString &handlerName , const wxClassInfo *EventSinkClassInfo ,
const wxHandlerInfo* handlerInfo ,
int EventSinkObjectID ) = 0; int EventSinkObjectID ) = 0;
}; };
/* /*
wxIDepersistRuntime implements the callbacks that will depersist wxRuntimeDepersister implements the callbacks that will depersist
an object into a running memory image, as opposed to writing an object into a running memory image, as opposed to writing
C++ initialization code to bring the object to life. C++ initialization code to bring the object to life.
*/ */
class wxIDepersistRuntime : public wxIDepersist class wxRuntimeDepersister : public wxDepersister
{ {
wxReader *Reader; struct wxRuntimeDepersisterInternal ;
wxRuntimeDepersisterInternal * m_data ;
public : public :
virtual void NotifyReader(wxReader *_Reader) wxRuntimeDepersister() ;
{ ~wxRuntimeDepersister() ;
Reader = _Reader;
} // returns the object having the corresponding ID fully constructed
virtual void AllocateObject(int ObjectID, wxClassInfo *ClassInfo); wxObject *GetObject(int objectID) ;
virtual void CreateObject(int ObjectID, wxClassInfo *ClassInfo, int ParamCount, wxxVariant *VariantValues);
virtual void SetProperty(int ObjectID, wxClassInfo *ClassInfo, const wxPropertyInfo* PropertyInfo, const wxxVariant &VariantValue); // allocate the new object on the heap, that object will have the passed in ID
virtual void SetConnect(int EventSourceObjectID, virtual void AllocateObject(int objectID, wxClassInfo *classInfo) ;
wxClassInfo *EventSourceClassInfo,
int eventType , // initialize the already allocated object having the ID ObjectID with the Create method
const wxString &handlerName , // creation parameters which are objects are having their Ids passed in objectIDValues
int EventSinkObjectID ) ; // having objectId <> wxInvalidObjectID
virtual void CreateObject(int ObjectID,
const wxClassInfo *ClassInfo,
int ParamCount,
wxxVariant *VariantValues ,
int *objectIDValues,
const wxClassInfo **objectClassInfos
) ;
// destroy the heap-allocated object having the ID ObjectID, this may be used if an object
// is embedded in another object and set via value semantics, so the intermediate
// object can be destroyed after safely
virtual void DestroyObject(int objectID, wxClassInfo *classInfo) ;
// set the corresponding property
virtual void SetProperty(int objectID,
const wxClassInfo *classInfo,
const wxPropertyInfo* propertyInfo ,
const wxxVariant &variantValue);
// sets the corresponding property (value is an object)
virtual void SetPropertyAsObject(int objectId,
const wxClassInfo *classInfo,
const wxPropertyInfo* propertyInfo ,
int valueObjectId) ;
// sets the corresponding event handler
virtual void SetConnect(int eventSourceObjectID,
const wxClassInfo *eventSourceClassInfo,
const wxDelegateTypeInfo *delegateInfo ,
const wxClassInfo *eventSinkClassInfo ,
const wxHandlerInfo* handlerInfo ,
int eventSinkObjectID ) ;
}; };
/* /*
wxIDepersistCode implements the callbacks that will depersist wxDepersisterCode implements the callbacks that will depersist
an object into a C++ initialization function. an object into a C++ initialization function.
*/ */
class wxTextOutputStream ; class wxTextOutputStream ;
class wxIDepersistCode : public wxIDepersist class wxCodeDepersister : public wxDepersister
{ {
wxReader *Reader; private :
wxTextOutputStream *fp; struct wxCodeDepersisterInternal ;
wxCodeDepersisterInternal * m_data ;
wxTextOutputStream *m_fp;
wxString ValueAsCode( const wxxVariant &param ) ;
public: public:
wxIDepersistCode(wxTextOutputStream *out) : fp(out) { } wxCodeDepersister(wxTextOutputStream *out) ;
virtual void NotifyReader(wxReader *_Reader) ~wxCodeDepersister() ;
{
Reader = _Reader; // allocate the new object on the heap, that object will have the passed in ID
} virtual void AllocateObject(int objectID, wxClassInfo *classInfo) ;
virtual void AllocateObject(int ObjectID, wxClassInfo *ClassInfo);
virtual void CreateObject(int ObjectID, wxClassInfo *ClassInfo, int ParamCount, wxxVariant *VariantValues); // initialize the already allocated object having the ID ObjectID with the Create method
virtual void SetProperty(int ObjectID, wxClassInfo *ClassInfo, const wxPropertyInfo* PropertyInfo, const wxxVariant &VariantValue); // creation parameters which are objects are having their Ids passed in objectIDValues
virtual void SetConnect(int EventSourceObjectID, // having objectId <> wxInvalidObjectID
wxClassInfo *EventSourceClassInfo,
int eventType , virtual void CreateObject(int objectID,
const wxString &handlerName , const wxClassInfo *classInfo,
int EventSinkObjectID ) ; int paramCount,
wxxVariant *variantValues ,
int *objectIDValues,
const wxClassInfo **objectClassInfos
) ;
// destroy the heap-allocated object having the ID ObjectID, this may be used if an object
// is embedded in another object and set via value semantics, so the intermediate
// object can be destroyed after safely
virtual void DestroyObject(int objectID, wxClassInfo *classInfo) ;
// set the corresponding property
virtual void SetProperty(int objectID,
const wxClassInfo *classInfo,
const wxPropertyInfo* propertyInfo ,
const wxxVariant &variantValue);
// sets the corresponding property (value is an object)
virtual void SetPropertyAsObject(int objectId,
const wxClassInfo *classInfo,
const wxPropertyInfo* propertyInfo ,
int valueObjectId) ;
// sets the corresponding event handler
virtual void SetConnect(int eventSourceObjectID,
const wxClassInfo *eventSourceClassInfo,
const wxDelegateTypeInfo *delegateInfo ,
const wxClassInfo *eventSinkClassInfo ,
const wxHandlerInfo* handlerInfo ,
int eventSinkObjectID ) ;
}; };
#endif // wxUSE_EXTENDED_RTTI #endif // wxUSE_EXTENDED_RTTI