1 /////////////////////////////////////////////////////////////////////////////
2 // Name: src/common/xtistrm.cpp
3 // Purpose: streaming runtime metadata information
4 // Author: Stefan Csomor
8 // Copyright: (c) 2003 Stefan Csomor
9 // Licence: wxWindows licence
10 /////////////////////////////////////////////////////////////////////////////
12 // For compilers that support precompilation, includes "wx.h".
13 #include "wx/wxprec.h"
19 #include "wx/xtistrm.h"
22 #include "wx/object.h"
32 #include "wx/tokenzr.h"
33 #include "wx/txtstrm.h"
34 #include "codereadercallback.h"
36 #if !wxUSE_EXTENDED_RTTI
37 #error This sample requires XTI (eXtended RTTI) enabled
40 // ----------------------------------------------------------------------------
41 // wxObjectCodeReaderCallback - depersisting to code
42 // ----------------------------------------------------------------------------
44 struct wxObjectCodeReaderCallback::wxObjectCodeReaderCallbackInternal
47 map
<int,wstring
> m_objectNames
;
49 map
<int,string
> m_objectNames
;
52 void SetObjectName(int objectID
, const wxString
&name
)
54 if ( m_objectNames
.find(objectID
) != m_objectNames
.end() )
56 wxLogError( _("Passing a already registered object to SetObjectName") );
59 m_objectNames
[objectID
] = (const wxChar
*)name
;
62 wxString
GetObjectName( int objectID
)
64 if ( objectID
== wxNullObjectID
)
67 if ( m_objectNames
.find(objectID
) == m_objectNames
.end() )
69 wxLogError( _("Passing an unkown object to GetObject") );
72 return wxString( m_objectNames
[objectID
].c_str() );
76 wxObjectCodeReaderCallback::wxObjectCodeReaderCallback(wxTextOutputStream
*out
)
79 m_data
= new wxObjectCodeReaderCallbackInternal
;
82 wxObjectCodeReaderCallback::~wxObjectCodeReaderCallback()
87 void wxObjectCodeReaderCallback::AllocateObject(int objectID
, wxClassInfo
*classInfo
,
88 wxVariantBaseArray
&WXUNUSED(metadata
))
90 wxString objectName
= wxString::Format( wxT("LocalObject_%d"), objectID
);
91 m_fp
->WriteString( wxString::Format( wxT("\t%s *%s = new %s;\n"),
92 classInfo
->GetClassName(),
94 classInfo
->GetClassName()) );
95 m_data
->SetObjectName( objectID
, objectName
);
98 void wxObjectCodeReaderCallback::DestroyObject(int objectID
, wxClassInfo
*WXUNUSED(classInfo
))
100 m_fp
->WriteString( wxString::Format( wxT("\tdelete %s;\n"),
101 m_data
->GetObjectName( objectID
).c_str() ) );
104 wxString
wxObjectCodeReaderCallback::ValueAsCode( const wxVariantBase
¶m
)
107 const wxTypeInfo
* type
= param
.GetTypeInfo();
108 if ( type
->GetKind() == wxT_CUSTOM
)
110 const wxCustomTypeInfo
* cti
= wx_dynamic_cast(const wxCustomTypeInfo
*, type
);
113 value
.Printf( wxT("%s(%s)"), cti
->GetTypeName().c_str(),
114 param
.GetAsString().c_str() );
118 wxLogError ( _("Internal error, illegal wxCustomTypeInfo") );
121 else if ( type
->GetKind() == wxT_STRING
)
123 value
.Printf( wxT("\"%s\""),param
.GetAsString().c_str() );
127 value
.Printf( wxT("%s"), param
.GetAsString().c_str() );
132 void wxObjectCodeReaderCallback::CreateObject(int objectID
,
133 const wxClassInfo
*WXUNUSED(classInfo
),
135 wxVariantBase
*params
,
137 const wxClassInfo
**WXUNUSED(objectClassInfos
),
138 wxVariantBaseArray
&WXUNUSED(metadata
)
142 m_fp
->WriteString( wxString::Format( wxT("\t%s->Create("),
143 m_data
->GetObjectName(objectID
).c_str() ) );
144 for (i
= 0; i
< paramCount
; i
++)
146 if ( objectIDValues
[i
] != wxInvalidObjectID
)
149 wxString::Format( wxT("%s"),
150 m_data
->GetObjectName( objectIDValues
[i
] ).c_str() );
151 m_fp
->WriteString( str
);
156 wxString::Format( wxT("%s"), ValueAsCode(params
[i
]).c_str() ) );
158 if (i
< paramCount
- 1)
159 m_fp
->WriteString( wxT(", "));
161 m_fp
->WriteString( wxT(");\n") );
164 void wxObjectCodeReaderCallback::ConstructObject(int objectID
,
165 const wxClassInfo
*classInfo
,
167 wxVariantBase
*params
,
169 const wxClassInfo
**WXUNUSED(objectClassInfos
),
170 wxVariantBaseArray
&WXUNUSED(metadata
)
173 wxString objectName
= wxString::Format( wxT("LocalObject_%d"), objectID
);
174 m_fp
->WriteString( wxString::Format( wxT("\t%s *%s = new %s("),
175 classInfo
->GetClassName(),
177 classInfo
->GetClassName()) );
178 m_data
->SetObjectName( objectID
, objectName
);
181 for (i
= 0; i
< paramCount
; i
++)
183 if ( objectIDValues
[i
] != wxInvalidObjectID
)
184 m_fp
->WriteString( wxString::Format( wxT("%s"),
185 m_data
->GetObjectName( objectIDValues
[i
] ).c_str() ) );
189 wxString::Format( wxT("%s"), ValueAsCode(params
[i
]).c_str() ) );
191 if (i
< paramCount
- 1)
192 m_fp
->WriteString( wxT(", ") );
194 m_fp
->WriteString( wxT(");\n") );
197 void wxObjectCodeReaderCallback::SetProperty(int objectID
,
198 const wxClassInfo
*WXUNUSED(classInfo
),
199 const wxPropertyInfo
* propertyInfo
,
200 const wxVariantBase
&value
)
202 m_fp
->WriteString( wxString::Format( wxT("\t%s->%s(%s);\n"),
203 m_data
->GetObjectName(objectID
).c_str(),
204 propertyInfo
->GetAccessor()->GetSetterName().c_str(),
205 ValueAsCode(value
).c_str()) );
208 void wxObjectCodeReaderCallback::SetPropertyAsObject(int objectID
,
209 const wxClassInfo
*WXUNUSED(classInfo
),
210 const wxPropertyInfo
* propertyInfo
,
213 if ( propertyInfo
->GetTypeInfo()->GetKind() == wxT_OBJECT
)
214 m_fp
->WriteString( wxString::Format( wxT("\t%s->%s(*%s);\n"),
215 m_data
->GetObjectName(objectID
).c_str(),
216 propertyInfo
->GetAccessor()->GetSetterName().c_str(),
217 m_data
->GetObjectName( valueObjectId
).c_str() ) );
219 m_fp
->WriteString( wxString::Format( wxT("\t%s->%s(%s);\n"),
220 m_data
->GetObjectName(objectID
).c_str(),
221 propertyInfo
->GetAccessor()->GetSetterName().c_str(),
222 m_data
->GetObjectName( valueObjectId
).c_str() ) );
225 void wxObjectCodeReaderCallback::AddToPropertyCollection( int objectID
,
226 const wxClassInfo
*WXUNUSED(classInfo
),
227 const wxPropertyInfo
* propertyInfo
,
228 const wxVariantBase
&value
)
230 m_fp
->WriteString( wxString::Format( wxT("\t%s->%s(%s);\n"),
231 m_data
->GetObjectName(objectID
).c_str(),
232 propertyInfo
->GetAccessor()->GetAdderName().c_str(),
233 ValueAsCode(value
).c_str()) );
236 // sets the corresponding property (value is an object)
237 void wxObjectCodeReaderCallback::
238 AddToPropertyCollectionAsObject(int WXUNUSED(objectID
),
239 const wxClassInfo
*WXUNUSED(classInfo
),
240 const wxPropertyInfo
* WXUNUSED(propertyInfo
),
241 int WXUNUSED(valueObjectId
))
246 void wxObjectCodeReaderCallback::SetConnect(int eventSourceObjectID
,
247 const wxClassInfo
*WXUNUSED(eventSourceClassInfo
),
248 const wxPropertyInfo
*delegateInfo
,
249 const wxClassInfo
*eventSinkClassInfo
,
250 const wxHandlerInfo
* handlerInfo
,
251 int eventSinkObjectID
)
253 wxString ehsource
= m_data
->GetObjectName( eventSourceObjectID
);
254 wxString ehsink
= m_data
->GetObjectName(eventSinkObjectID
);
255 wxString ehsinkClass
= eventSinkClassInfo
->GetClassName();
256 const wxEventSourceTypeInfo
*delegateTypeInfo
=
257 wx_dynamic_cast(const wxEventSourceTypeInfo
*, delegateInfo
->GetTypeInfo());
258 if ( delegateTypeInfo
)
260 int eventType
= delegateTypeInfo
->GetEventType();
261 wxString handlerName
= handlerInfo
->GetName();
265 wxT("\t%s->Connect( %s->GetId(), %d, ")
266 wxT("(wxObjectEventFunction)(wxEventFunction) & %s::%s, NULL, %s );"),
267 ehsource
.c_str(), ehsource
.c_str(), eventType
, ehsinkClass
.c_str(),
268 handlerName
.c_str(), ehsink
.c_str() );
270 m_fp
->WriteString( code
);
274 wxLogError(_("delegate has no type info"));