Gizmo3D

gzModule.h

Go to the documentation of this file.
00001 //*****************************************************************************
00002 // File         : gzModule.h
00003 // Module       : gzBase
00004 // Description  : Class definition of dynamic plugin modules
00005 // Author       : Anders Modén      
00006 // Product      : GizmoBase 2.1.1
00007 //      
00008 // Copyright © 2003- Saab Training System AB, Sweden
00009 //          
00010 // NOTE:    GizmoBase is a platform abstraction utility layer for C++. It contains 
00011 //          design patterns and C++ solutions for the advanced programmer.
00012 //
00013 //
00014 // Revision History...                          
00015 //                                  
00016 // Who  Date    Description                     
00017 //                                  
00018 // AMO  990928  Created file    
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 &copy);
00045     GZ_BASE_EXPORT virtual ~gzModule();
00046     GZ_BASE_EXPORT gzModule & operator==(const gzModule &copy);
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     //-------------------- thread safe ref stuff -----------------------------
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     //-------------------- global methods ------------------------------------
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 //  GZ_BASE_EXPORT static gzVoid        cleanupModules();
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     // All modules
00081 
00082     GZ_BASE_EXPORT static gzArray<gzString> getLoadedModuleNames();
00083 
00084     // Module Packages
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     // External executables
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 // registration macros
00118 
00119 // Dummy class initialisation
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 // Built in types
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 // Custom types
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 // Built in types (properties)
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 // Custom types (properties)
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 // ------------------ no body, implement in .cpp file ----------------------
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 // ----------------- SET only ----------------------------------------------
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 // ------------------ no body, implement in .cpp file ----------------------
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 // !!! No custom types in SET
00162 
00163 // ----------------- GET only ----------------------------------------------
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 // ----------------- Interface Methods Only ----------------------------
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 // !!! No custom types in Interface Only Methods
00186 
00187 #endif
00188 

Documentation for Gizmo3D generated at Wed Feb 20 11:54:07 2008 by   Saab Training Systems AB, ¸ (c) 2003-and beyond