00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #ifndef __GZ_MODULE_H__
00022 #define __GZ_MODULE_H__
00023
00024 #include "gzDynamic.h"
00025 #include "gzNotify.h"
00026 #include "gzLibRef.h"
00027
00028
00030 const gzString GZ_DEFAULT_MODULE_KEY="GIZMO_MODULES";
00031
00033 enum gzModuleEvent
00034 {
00035 GZ_MODULE_ADD ,
00036 GZ_MODULE_REMOVE
00037 } ;
00038
00039 class gzModule : public gzDynamicInvokeInterface , public gzDynamicEventInterface , public gzReference
00040 {
00041 public:
00042
00043 GZ_BASE_EXPORT gzModule();
00044 GZ_BASE_EXPORT gzModule(const gzModule ©);
00045 GZ_BASE_EXPORT virtual ~gzModule();
00046 GZ_BASE_EXPORT gzModule & operator==(const gzModule ©);
00047
00049 GZ_BASE_EXPORT gzVoid virtual onEvent(gzModuleEvent event){};
00050 GZ_DECLARE_TYPE_INTERFACE_EXPORT(GZ_BASE_EXPORT);
00051
00052
00053 GZ_BASE_EXPORT gzVoid unLoad();
00054 GZ_BASE_EXPORT gzString getClassName();
00055 GZ_BASE_EXPORT gzString getModuleName();
00056
00057 GZ_BASE_EXPORT gzLibReference * getLibReference();
00058
00059
00060 GZ_BASE_EXPORT virtual gzVoid ref();
00061 GZ_BASE_EXPORT virtual gzVoid unref();
00062 GZ_BASE_EXPORT virtual gzUInt unrefNoDelete();
00063 GZ_BASE_EXPORT virtual gzBool checkDelete();
00064 GZ_BASE_EXPORT virtual gzUInt getRef() const;
00065
00066
00067
00068 GZ_BASE_EXPORT static gzModule * getModule(gzString moduleName);
00069 GZ_BASE_EXPORT static gzModule * getClass(const gzString & className);
00070 GZ_BASE_EXPORT static gzULong loadModules(const gzString & moduleKey=GZ_DEFAULT_MODULE_KEY);
00071 GZ_BASE_EXPORT static gzVoid unLoadModules();
00072 GZ_BASE_EXPORT static gzBool isModuleLoaded(const gzString & moduleName);
00073 GZ_BASE_EXPORT static gzBool isClassLoaded(const gzString & className);
00074
00075
00076 GZ_BASE_EXPORT static gzBool existModule(const gzString &moduleName);
00077 GZ_BASE_EXPORT static gzDynamicType executeModuleMethod(const gzString &moduleName,const gzString &methodName,GZ_DYNAMIC_ATTRIBUTE_LIST);
00078 GZ_BASE_EXPORT static gzDynamicType executeModuleAutoTest(const gzString &moduleName);
00079
00080
00081
00082 GZ_BASE_EXPORT static gzArray<gzString> getLoadedModuleNames();
00083
00084
00085
00086 GZ_BASE_EXPORT static gzBool updateModulePackage(const gzString &url_package, const gzString &moduleName, const gzString &platform,const gzString &url_module,gzBool replace=FALSE);
00087 GZ_BASE_EXPORT static gzModule * loadModulePackage(gzSerializeAdapter *adapter);
00088
00089
00090 GZ_BASE_EXPORT static gzBool exec(const gzString &executable,gzBool waitForTermination=FALSE);
00091
00092 private:
00093
00094 gzString m_className;
00095 gzString m_moduleName;
00096 gzMutex m_ThreadSafeRefLock;
00097 gzBool m_staticInstance;
00098
00099 gzRefPointer<gzLibReference> m_libRef;
00100
00101 static gzRefDict<gzString,gzModule> s_classList;
00102 static gzRefDict<gzString,gzModule> s_moduleList;
00103 static gzMutex s_moduleLock;
00104 };
00105
00106 #ifdef GZ_WINDOWS
00107 #define GZ_MODULE_EXPORT __declspec(dllexport)
00108 #else
00109 #define GZ_MODULE_EXPORT
00110 #endif
00111
00112 #define GZ_DECLARE_MODULE(x) GZ_MODULE_EXPORT x gzmoduleinstance;\
00113 GZ_MODULE_EXPORT gzString gzmoduleinstancename=#x;\
00114 gzInt GZ_CALLBACK DllMain( gzVoid * handle, gzULong reason , gzVoid * reserved ){return TRUE;}
00115
00116
00117
00118
00119
00120 template<class T> inline gzVoid gzDynamic_Init(T &var){}
00121 template<> inline gzVoid gzDynamic_Init(gzBool &var){var=FALSE;}
00122 template<> inline gzVoid gzDynamic_Init(gzUShort &var){var=0;}
00123 template<> inline gzVoid gzDynamic_Init(gzDouble &var){var=0.0;}
00124
00125
00126 #define GZ_MODULE_PROPERTY_REG(type,name,className) {registerMethod("get"#name,&className::getDynamicProperty##name);registerMethod("set"#name,&className::setDynamicProperty##name);type val;gzDynamic_Init(val);setArgCheck("set"#name,gzDynamicType(val).getDynamicType());}
00127 #define GZ_MODULE_PROPERTY_REG_SET(type,name,className) {registerMethod("set"#name,&className::setDynamicProperty##name);type val;gzDynamic_Init(val);setArgCheck("set"#name,gzDynamicType(val).getDynamicType());}
00128 #define GZ_MODULE_PROPERTY_REG_GET(type,name,className) {registerMethod("get"#name,&className::getDynamicProperty##name);}
00129
00130
00131 #define GZ_MODULE_PROPERTY_REG_C(type,name,className) {registerMethod("get"#name,&className::getDynamicProperty##name);registerMethod("set"#name,&className::setDynamicProperty##name);type val;gzDynamic_Init(val);setArgCheck("set"#name,gzDynamicTypeCustom<type>(val).getDynamicType());}
00132 #define GZ_MODULE_PROPERTY_REG_SET_C(type,name,className) {registerMethod("set"#name,&className::setDynamicProperty##name);type val;gzDynamic_Init(val);setArgCheck("set"#name,gzDynamicTypeCustom<type>(val).getDynamicType());}
00133 #define GZ_MODULE_PROPERTY_REG_GET_C(type,name,className) {registerMethod("get"#name,&className::getDynamicProperty##name);}
00134
00135
00136 #define GZ_MODULE_PROPERTY(type,name) GZ_PROPERTY(type,name) gzDynamicType getDynamicProperty##name(GZ_DYNAMIC_ATTRIBUTE_LIST){return m_property##name;} gzDynamicType setDynamicProperty##name(GZ_DYNAMIC_ATTRIBUTE_LIST){m_property##name=gzDynamic_Cast<type>(a0);return GZ_DYN_VOID;}
00137 #define GZ_MODULE_PROPERTY_EXPORT(type,name,exportDef) GZ_PROPERTY_EXPORT(type,name,exportDef) exportDef gzDynamicType getDynamicProperty##name(GZ_DYNAMIC_ATTRIBUTE_LIST){return m_property##name;} exportDef gzDynamicType setDynamicProperty##name(GZ_DYNAMIC_ATTRIBUTE_LIST){m_property##name=gzDynamic_Cast<type>(a0);return GZ_DYN_VOID;}
00138
00139 #define GZ_MODULE_PROPERTY_MUTEX(type,name,mutex) GZ_PROPERTY_MUTEX(type,name,mutex) gzDynamicType getDynamicProperty##name(GZ_DYNAMIC_ATTRIBUTE_LIST){GZ_BODYGUARD(mutex);return m_property##name;} gzDynamicType setDynamicProperty##name(GZ_DYNAMIC_ATTRIBUTE_LIST){GZ_BODYGUARD(mutex);m_property##name=gzDynamic_Cast<type>(a0);return GZ_DYN_VOID;}
00140 #define GZ_MODULE_PROPERTY_MUTEX_EXPORT(type,name,mutex,exportDef) GZ_PROPERTY_MUTEX_EXPORT(type,name,mutex,exportDef) exportDef gzDynamicType getDynamicProperty##name(GZ_DYNAMIC_ATTRIBUTE_LIST){GZ_BODYGUARD(mutex);return m_property##name;} exportDef gzDynamicType setDynamicProperty##name(GZ_DYNAMIC_ATTRIBUTE_LIST){GZ_BODYGUARD(mutex);m_property##name=gzDynamic_Cast<type>(a0);return GZ_DYN_VOID;}
00141
00142
00143 #define GZ_MODULE_PROPERTY_C(type,name) GZ_PROPERTY(type,name) gzDynamicType getDynamicProperty##name(GZ_DYNAMIC_ATTRIBUTE_LIST){return gzDynamicTypeCustom<type>(m_property##name);} gzDynamicType setDynamicProperty##name(GZ_DYNAMIC_ATTRIBUTE_LIST){m_property##name=gzDynamic_Cast<type>(a0);return GZ_DYN_VOID;}
00144 #define GZ_MODULE_PROPERTY_EXPORT_C(type,name,exportDef) GZ_PROPERTY_EXPORT(type,name,exportDef) exportDef gzDynamicType getDynamicProperty##name(GZ_DYNAMIC_ATTRIBUTE_LIST){return gzDynamicTypeCustom<type>(m_property##name);} exportDef gzDynamicType setDynamicProperty##name(GZ_DYNAMIC_ATTRIBUTE_LIST){m_property##name=gzDynamic_Cast<type>(a0);return GZ_DYN_VOID;}
00145
00146
00147
00148 #define GZ_MODULE_PROPERTY_(type,name) GZ_PROPERTY_(type,name) gzDynamicType getDynamicProperty##name(GZ_DYNAMIC_ATTRIBUTE_LIST); gzDynamicType setDynamicProperty##name(GZ_DYNAMIC_ATTRIBUTE_LIST);
00149 #define GZ_MODULE_PROPERTY_EXPORT_(type,name,exportDef) GZ_PROPERTY_EXPORT_(type,name,exportDef) exportDef gzDynamicType getDynamicProperty##name(GZ_DYNAMIC_ATTRIBUTE_LIST); exportDef gzDynamicType setDynamicProperty##name(GZ_DYNAMIC_ATTRIBUTE_LIST);
00150
00151
00152
00153 #define GZ_MODULE_PROPERTY_SET(type,name) GZ_PROPERTY_SET(type,name) gzDynamicType setDynamicProperty##name(GZ_DYNAMIC_ATTRIBUTE_LIST){m_property##name=gzDynamic_Cast<type>(a0);return GZ_DYN_VOID;}
00154 #define GZ_MODULE_PROPERTY_SET_EXPORT(type,name,exportDef) GZ_PROPERTY_SET_EXPORT(type,name,exportDef) exportDef gzDynamicType setDynamicProperty##name(GZ_DYNAMIC_ATTRIBUTE_LIST){m_property##name=gzDynamic_Cast<type>(a0);return GZ_DYN_VOID;}
00155
00156
00157
00158 #define GZ_MODULE_PROPERTY_SET_(type,name) GZ_PROPERTY_SET_(type,name) gzDynamicType setDynamicProperty##name(GZ_DYNAMIC_ATTRIBUTE_LIST);
00159 #define GZ_MODULE_PROPERTY_SET_EXPORT_(type,name,exportDef) GZ_PROPERTY_SET_EXPORT_(type,name,exportDef) exportDef gzDynamicType setDynamicProperty##name(GZ_DYNAMIC_ATTRIBUTE_LIST);
00160
00161
00162
00163
00164
00165 #define GZ_MODULE_PROPERTY_GET(type,name) GZ_PROPERTY_GET(type,name) gzDynamicType getDynamicProperty##name(GZ_DYNAMIC_ATTRIBUTE_LIST){return m_property##name;}
00166 #define GZ_MODULE_PROPERTY_GET_EXPORT(type,name,exportDef) GZ_PROPERTY_GET_EXPORT(type,name,exportDef) exportDef gzDynamicType getDynamicProperty##name(GZ_DYNAMIC_ATTRIBUTE_LIST){return m_property##name;}
00167
00168 #define GZ_MODULE_PROPERTY_GET_(type,name) GZ_PROPERTY_GET_(type,name) gzDynamicType getDynamicProperty##name(GZ_DYNAMIC_ATTRIBUTE_LIST);
00169 #define GZ_MODULE_PROPERTY_GET_EXPORT_(type,name,exportDef) GZ_PROPERTY_GET_EXPORT_(type,name,exportDef) exportDef gzDynamicType getDynamicProperty##name(GZ_DYNAMIC_ATTRIBUTE_LIST);
00170
00171 #define GZ_MODULE_PROPERTY_GET_C(type,name) GZ_PROPERTY_GET(type,name) gzDynamicType getDynamicProperty##name(GZ_DYNAMIC_ATTRIBUTE_LIST){return gzDynamicTypeCustom<type>(m_property##name);}
00172 #define GZ_MODULE_PROPERTY_GET_EXPORT_C(type,name,exportDef) GZ_PROPERTY_GET_EXPORT(type,name,exportDef) exportDef gzDynamicType getDynamicProperty##name(GZ_DYNAMIC_ATTRIBUTE_LIST){return gzDynamicTypeCustom<type>(m_property##name);}
00173
00174
00175
00176 #define GZ_MODULE_PROPERTY_SET_I(type,name) GZ_PROPERTY_SET_I(type,name) gzDynamicType setDynamicProperty##name(GZ_DYNAMIC_ATTRIBUTE_LIST);
00177 #define GZ_MODULE_PROPERTY_SET_EXPORT_I(type,name,exportDef) GZ_PROPERTY_SET_EXPORT_I(type,name,exportDef) exportDef gzDynamicType setDynamicProperty##name(GZ_DYNAMIC_ATTRIBUTE_LIST);
00178
00179 #define GZ_MODULE_PROPERTY_GET_I(type,name) GZ_PROPERTY_GET_I(type,name) gzDynamicType getDynamicProperty##name(GZ_DYNAMIC_ATTRIBUTE_LIST);
00180 #define GZ_MODULE_PROPERTY_GET_EXPORT_I(type,name,exportDef) GZ_PROPERTY_GET_EXPORT_I(type,name,exportDef) exportDef gzDynamicType getDynamicProperty##name(GZ_DYNAMIC_ATTRIBUTE_LIST);
00181
00182 #define GZ_MODULE_PROPERTY_I(type,name) GZ_PROPERTY_I(type,name) gzDynamicType getDynamicProperty##name(GZ_DYNAMIC_ATTRIBUTE_LIST); gzDynamicType setDynamicProperty##name(GZ_DYNAMIC_ATTRIBUTE_LIST);
00183 #define GZ_MODULE_PROPERTY_EXPORT_I(type,name,exportDef) GZ_PROPERTY_EXPORT_I(type,name,exportDef) exportDef gzDynamicType getDynamicProperty##name(GZ_DYNAMIC_ATTRIBUTE_LIST); exportDef gzDynamicType setDynamicProperty##name(GZ_DYNAMIC_ATTRIBUTE_LIST);
00184
00185
00186
00187 #endif
00188