00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032 #ifndef XObjectFactoryH
00033 #define XObjectFactoryH
00034
00035 #include <zeusbase/Config/ZeusMacros.hpp>
00036 #include <zeusbase/System/Interfaces/IXObjectFactory.hpp>
00037 #include <zeusbase/System/ZObject.h>
00038 #include <zeusbase/System/ArrayList.hpp>
00039 #include <zeusbase/System/StringMap.hpp>
00040 #include <zeusbase/System/XRootObject.h>
00041
00042
00043 #define MyXObjectFactory TXObjectFactory::getInstance()
00044
00045 BEGIN_NAMESPACE_Zeus
00046
00047 class IXMLParser;
00048 class TCriticalSection;
00049
00050
00053
00054 zeusbase_class TXObjectFactory : public TZObject, public IXObjectFactory
00055 {
00056 public:
00057 void setDelegationInterface(IXObjectFactory& rFactory);
00058 void releaseDelegationInterface();
00059 static TXObjectFactory& getInstance();
00060
00061
00062 virtual Retval MQUALIFIER createObjectFromStream(const IString& rStream,
00063 IXObject*& rpObj,
00064 bool bOnlyRoot = true,
00065 bool bDoUnfreeze = true);
00066 virtual Retval MQUALIFIER createObjectFromFile(const IString& rFileName,
00067 IXObject*& rpObj,
00068 bool bOnlyRoot = true,
00069 bool bDoUnfreeze = true);
00070 virtual Retval MQUALIFIER createChildObjects(IXMLNode& rParentNode,
00071 IXObject& rParent,
00072 bool bDoUnfreeze = true);
00073 virtual Retval MQUALIFIER addNewChildObjects(IXMLNode& rNewNode,
00074 IXObject& rParent,
00075 IXObject*& rpChild,
00076 bool bDoUnfreeze = true,
00077 IXObject* pRightSibling = NULL);
00078 virtual Uint32 MQUALIFIER registerXClass(const IString& rClassName, IXObject::DltCreateXObject pdltFunct);
00079 virtual Uint32 MQUALIFIER registerXClassOfCodeModule(const IString& rClassName, const IString& rCodeModule, IXObject::DltCreateXObject pdltFunct);
00080 virtual bool MQUALIFIER unregisterXClass(Uint uiHandle, const IString& rClassName);
00081 virtual Retval MQUALIFIER createObjectFromDocument(NAMESPACE_Zeus::IXMLDocument& rDocument,
00082 IXObject*& rpObj,
00083 bool bOnlyRoot = true,
00084 bool bDoUnfreeze = true);
00085 virtual void MQUALIFIER setErrorObjectExpandProperty(bool bValue);
00086 virtual Retval MQUALIFIER createChildObjectBySchema(const IString& rName,
00087 IXObject& rParent,
00088 IXMLNode& rSchemaNode,
00089 IXObject*& rpChildObj,
00090 bool bDoUnfreeze = true);
00091 virtual Retval MQUALIFIER createObjectByXMLNode(IXMLNode& rMainNode,
00092 NAMESPACE_Zeus::IXMLDocument* pDocu,
00093 IXObject*& rpObj,
00094 bool bDoUnfreeze = true);
00095 virtual bool MQUALIFIER isRegistered(const IString& rClassName, const IString& rCodeModule) const;
00096
00097
00098 MEMORY_MANAGER_DECL
00099
00100
00104
00105 inline static TString createEntryName(const IString& rClassName,
00106 const IString& rCodeModule)
00107 {
00108 TString strEntryName(rCodeModule);
00109 #if defined(ENABLE_LINUX_BINDING)
00110
00111 #elif defined(ENABLE_WIN32_BINDING)
00112 strEntryName = strEntryName.toLowerCase();
00113 #else
00114 #error not a defined platform
00115 #endif
00116 strEntryName += L"::";
00117 strEntryName += rClassName;
00118 return strEntryName;
00119 }
00120
00121 protected:
00123
00124 REG_ROOT_BEGIN(TXRootObject)
00125 REG_ROOT_ADD(TXRootObject, L"TXRootObject");
00126 REG_ROOT_END
00127
00128 REG_SUB_BEGIN(TXObject)
00129 REG_SUB_ADD(TXObject, L"TXObject");
00130 REG_SUB_END
00131
00132 private:
00133
00134
00138
00139 struct TypeClassRegistry
00140 {
00142 IXObject::DltCreateXObject pdltFunction;
00144 TString strClassName;
00146 TString strCodeModule;
00148 TString strEntryName;
00150 Uint uiHandle;
00151
00152
00155
00156 inline TypeClassRegistry()
00157 {
00158 pdltFunction = NULL;
00159 uiHandle = 0;
00160 }
00161
00162
00165
00166 inline TypeClassRegistry(const TString& rClassName,
00167 const TString& rCodeModule,
00168 IXObject::DltCreateXObject pdltFunct)
00169 : strClassName(rClassName),
00170 strCodeModule(rCodeModule),
00171 strEntryName(TXObjectFactory::createEntryName(rClassName, rCodeModule))
00172 {
00173 pdltFunction = pdltFunct;
00174 uiHandle = 0;
00175 }
00176
00177
00180
00181 inline TypeClassRegistry& operator=(const TypeClassRegistry& rInpar)
00182 {
00183 strClassName = rInpar.strClassName;
00184 strCodeModule = rInpar.strCodeModule;
00185 strEntryName = rInpar.strEntryName;
00186 pdltFunction = rInpar.pdltFunction;
00187 uiHandle = rInpar.uiHandle;
00188 return *this;
00189 }
00190
00191
00194
00195 inline bool operator==(const TypeClassRegistry& rInpar) const
00196 {
00197 return (pdltFunction == rInpar.pdltFunction &&
00198 strClassName == rInpar.strClassName &&
00199 strCodeModule == rInpar.strCodeModule);
00200 }
00201 };
00202
00203 Retval createRootObject(IXMLNode& rMainNode, NAMESPACE_Zeus::IXMLDocument* pDocu, IXObject*& rpObj, bool bOnlyRoot);
00204 Retval createSubObjects(IXMLNode& rParentNode, IXObject& rParent);
00205 Retval getXMLParser(IXMLParser*& rpParser);
00206 Retval loadExtXMLRef(IXObject& rParent);
00207 Retval createObject_internal(NAMESPACE_Zeus::IXMLDocument& rDocument, IXObject*& rpObj, bool bRootOnly, bool bDoUnfreeze);
00208 IXObject::DltCreateXObject lookupFactoryFunct(const IString& rClassname, const IString& rCodemodule, Uint* pHandle = NULL);
00209
00211 TAutoPtr<IXObjectFactory> m_ptrDelegation;
00213 bool m_bErrorObjectExpandProperty;
00215 TArrayList<TypeClassRegistry> m_lstClassList;
00217 TStringMap<TypeClassRegistry> m_mapLookupTable;
00219 TCriticalSection& m_rLock;
00220
00222 static TAutoPtr<TXObjectFactory> m_ptrInstance;
00223
00224
00225
00227
00228 #ifdef _MSC_VER
00229 public:
00230 #endif
00231
00232
00233 TXObjectFactory();
00234 virtual ~TXObjectFactory();
00235
00236 };
00237
00238
00241
00242 inline Uint32 MQUALIFIER TXObjectFactory::registerXClass(const IString& rClassName, IXObject::DltCreateXObject pdltFunct)
00243 {
00244 return registerXClassOfCodeModule(rClassName, TString(L""), pdltFunct);
00245 }
00246
00247
00250
00251 inline void TXObjectFactory::releaseDelegationInterface()
00252 {
00253 m_ptrDelegation.release();
00254 }
00255
00256
00259
00260 inline TXObjectFactory& TXObjectFactory::getInstance()
00261 {
00262 return *m_ptrInstance;
00263 }
00264
00265 END_NAMESPACE_Zeus
00266 #endif
00267