Gizmo3D

gzDynamic.h

Go to the documentation of this file.
00001 // *****************************************************************************
00002 // File         : gzDynamic.h
00003 // Module       : gzBase
00004 // Description  : Class definition of dynamic methods and vars
00005 // Author       : Anders Modén
00006 // Product      : GizmoBase 2.1.1
00007 //
00008 // Copyright © 2003- Saab Training Systems 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  991002  Created file
00019 //
00020 // ******************************************************************************
00021 
00022 #ifndef __GZ_DYNAMIC_H__
00023 #define __GZ_DYNAMIC_H__
00024 
00025 #include "gzBase.h"
00026 #include "gzSerialize.h"
00027 #include "gzExceptions.h"
00028 #include "gzReference.h"
00029 #include "gzNotify.h"
00030 #include "gzGuid.h"
00031 
00032 //------------------------- IID --------------------------------------------------
00033 // Generic commands
00034 
00035 const gzString      IIDS_DEBUG                  ="debug";
00036 const gzULongLong   IID_DEBUG                   =LL(0x7fffffff00000001);
00037 
00038 const gzString      IIDS_VERSION                ="version";
00039 const gzULongLong   IID_VERSION                 =LL(0x7fffffff00000002);
00040 
00041 const gzString      IIDS_LICENSE_EXPIRE_DAYS    ="licenseExpireDays";
00042 const gzULongLong   IID_LICENSE_EXPIRE_DAYS     =LL(0x7fffffff00000003);
00043 
00044 const gzString      IIDS_TEST                   ="test";
00045 const gzULongLong   IID_TEST                    =LL(0x7fffffff00000004);
00046 
00047 const gzULongLong   IID_NOT_SUPPORTED           =LL(0xFFFFFFFFFFFFFFFF);
00048 
00049 //----------------------- Unique ID definitions for gizmo dynamic type -----------------------
00050 
00051 const gzUShort GZ_DYNAMIC_TYPE_STRING_UNIQUE_ID     = 1;
00052 const gzUShort GZ_DYNAMIC_TYPE_VOID_UNIQUE_ID       = 2;
00053 const gzUShort GZ_DYNAMIC_TYPE_NUMBER_UNIQUE_ID     = 3;
00054 const gzUShort GZ_DYNAMIC_TYPE_POINTER_UNIQUE_ID    = 4;
00055 const gzUShort GZ_DYNAMIC_TYPE_REFERENCE_UNIQUE_ID  = 5;
00056 const gzUShort GZ_DYNAMIC_TYPE_ERROR_UNIQUE_ID      = 6;
00057 const gzUShort GZ_DYNAMIC_TYPE_LONGLONG_UNIQUE_ID   = 7;
00058 const gzUShort GZ_DYNAMIC_TYPE_ARRAY_UNIQUE_ID      = 8;
00059 const gzUShort GZ_DYNAMIC_TYPE_VEC2_UNIQUE_ID       = 9;
00060 const gzUShort GZ_DYNAMIC_TYPE_VEC3_UNIQUE_ID       = 10;
00061 const gzUShort GZ_DYNAMIC_TYPE_VEC4_UNIQUE_ID       = 11;
00062 const gzUShort GZ_DYNAMIC_TYPE_CONTAINER_UNIQUE_ID  = 12;
00063 const gzUShort GZ_DYNAMIC_TYPE_CHAIN_UNIQUE_ID      = 13;
00064 const gzUShort GZ_DYNAMIC_TYPE_GUID_UNIQUE_ID       = 19;
00065 
00066 //----------------------- general dynamic type -------------------------------------
00067 
00068 const gzString  GZ_DYNAMIC_TYPE_STRING      =gzUniqueString("str"   ,GZ_DYNAMIC_TYPE_STRING_UNIQUE_ID); // System defined strings
00069 const gzString  GZ_DYNAMIC_TYPE_VOID        =gzUniqueString("void"  ,GZ_DYNAMIC_TYPE_VOID_UNIQUE_ID);
00070 const gzString  GZ_DYNAMIC_TYPE_NUMBER      =gzUniqueString("num"   ,GZ_DYNAMIC_TYPE_NUMBER_UNIQUE_ID);
00071 const gzString  GZ_DYNAMIC_TYPE_POINTER     =gzUniqueString("ptr"   ,GZ_DYNAMIC_TYPE_POINTER_UNIQUE_ID);
00072 const gzString  GZ_DYNAMIC_TYPE_REFERENCE   =gzUniqueString("ref"   ,GZ_DYNAMIC_TYPE_REFERENCE_UNIQUE_ID);
00073 const gzString  GZ_DYNAMIC_TYPE_ERROR       =gzUniqueString("error" ,GZ_DYNAMIC_TYPE_ERROR_UNIQUE_ID);
00074 const gzString  GZ_DYNAMIC_TYPE_LONGLONG    =gzUniqueString("llnum" ,GZ_DYNAMIC_TYPE_LONGLONG_UNIQUE_ID);
00075 const gzString  GZ_DYNAMIC_TYPE_ARRAY       =gzUniqueString("array" ,GZ_DYNAMIC_TYPE_ARRAY_UNIQUE_ID);
00076 const gzString  GZ_DYNAMIC_TYPE_VEC2        =gzUniqueString("vec2"  ,GZ_DYNAMIC_TYPE_VEC2_UNIQUE_ID);
00077 const gzString  GZ_DYNAMIC_TYPE_VEC3        =gzUniqueString("vec3"  ,GZ_DYNAMIC_TYPE_VEC3_UNIQUE_ID);
00078 const gzString  GZ_DYNAMIC_TYPE_VEC4        =gzUniqueString("vec4"  ,GZ_DYNAMIC_TYPE_VEC4_UNIQUE_ID);
00079 const gzString  GZ_DYNAMIC_TYPE_CONTAINER   =gzUniqueString("cont"  ,GZ_DYNAMIC_TYPE_CONTAINER_UNIQUE_ID);
00080 const gzString  GZ_DYNAMIC_TYPE_CHAIN       =gzUniqueString("chain" ,GZ_DYNAMIC_TYPE_CHAIN_UNIQUE_ID);  // Chain the command to a higher level of command
00081 const gzString  GZ_DYNAMIC_TYPE_GUID        =gzUniqueString("guid"  ,GZ_DYNAMIC_TYPE_GUID_UNIQUE_ID);
00082 
00084 const gzUByte GZ_UNIQUE_ID_ESCAPE_TOKEN=0xfc;
00085 
00086 //******************************************************************************
00087 // Class    : gzDynRefList
00088 //                                  
00089 // Purpose  : Internal utility class that manages reference counting in dynamic types
00090 //                                  
00091 // Notes    : - 
00092 //                                  
00093 // Revision History...                          
00094 //                                  
00095 // Who  Date    Description                     
00096 //                                  
00097 // AMO  001030  Created 
00098 //                                  
00099 //******************************************************************************
00100 class gzDynRefList : public gzList<gzReference>
00101 {
00102 public:
00103     
00104     gzDynRefList(){};
00105 
00106     gzDynRefList( const gzDynRefList &copy ):gzList<gzReference>(){ *this=copy; }
00107 
00108     virtual ~gzDynRefList(){ clear(); }
00109 
00110     virtual gzVoid onInsert(gzReference *item ) const {item->ref(); }
00111 
00112     virtual gzVoid onRemove(gzReference *item ) const {item->unref(); }
00113 
00114     virtual gzReference *cloneEntry(gzReference *item ) const { return item; }
00115 };
00116 
00117 //******************************************************************************
00118 // Class    : gzDynamicType
00119 //                                  
00120 // Purpose  : Base class for gizmo dynamic data
00121 //                                  
00122 // Notes    : - 
00123 //                                  
00124 // Revision History...                          
00125 //                                  
00126 // Who  Date    Description                     
00127 //                                  
00128 // AMO  980912  Created 
00129 //                                  
00130 //******************************************************************************
00131 class  gzDynamicType : public gzSerializeData , public gzTypeInterface
00132 {
00133 public:
00134 
00135     GZ_DECLARE_TYPE_INTERFACE_EXPORT(GZ_BASE_EXPORT);
00136 
00137     GZ_BASE_EXPORT gzDynamicType(const gzDouble     &value);
00138     GZ_BASE_EXPORT gzDynamicType(const gzString     &value);
00139     GZ_BASE_EXPORT gzDynamicType(const gzVoid       *value);
00140     GZ_BASE_EXPORT gzDynamicType(const gzReference  *value);
00141     GZ_BASE_EXPORT gzDynamicType(const gzVec2       &value);
00142     GZ_BASE_EXPORT gzDynamicType(const gzVec3       &value);
00143     GZ_BASE_EXPORT gzDynamicType(const gzVec4       &value);
00144     GZ_BASE_EXPORT gzDynamicType(const char         *value);
00145     GZ_BASE_EXPORT gzDynamicType(const gzGUID       &value);
00146 
00147     GZ_BASE_EXPORT gzDynamicType();
00148 
00149     GZ_BASE_EXPORT gzDynamicType(const gzDynamicType & copy);
00150 
00151     GZ_BASE_EXPORT gzDynamicType & operator=(const gzDynamicType & copy);
00152 
00153     GZ_BASE_EXPORT virtual ~gzDynamicType();
00154 
00155     GZ_BASE_EXPORT gzBool               is(const gzString & dynamicType) const;
00156     GZ_BASE_EXPORT const gzString &     getDynamicType() const;
00157     GZ_BASE_EXPORT gzArray< gzUByte >   getDynamicData() const;
00158     GZ_BASE_EXPORT const gzDynRefList & getDynamicReferences() const;
00159     GZ_BASE_EXPORT gzBool               hasDynamicReferences() const;
00160 
00161     GZ_BASE_EXPORT virtual gzVoid write(gzSerializeAdapter *adapter);
00162     GZ_BASE_EXPORT virtual gzVoid read(gzSerializeAdapter *adapter);
00163     GZ_BASE_EXPORT virtual gzVoid pushBack(gzSerializeAdapter *adapter);
00164     GZ_BASE_EXPORT virtual gzULong  getDataSize(gzSerializeAdapter *adapter=NULL) const;
00165 
00166 
00167     GZ_BASE_EXPORT gzString         getString()     const;
00168     GZ_BASE_EXPORT gzDouble         getNumber()     const;
00169     GZ_BASE_EXPORT gzVoid *         getPointer()    const;
00170     GZ_BASE_EXPORT gzReference *    getReference()  const;
00171 
00172     GZ_BASE_EXPORT gzVec2           getVec2()       const;
00173     GZ_BASE_EXPORT gzVec3           getVec3()       const;
00174     GZ_BASE_EXPORT gzVec4           getVec4()       const;
00175     GZ_BASE_EXPORT gzGUID           getGUID()       const;
00176 
00177     GZ_BASE_EXPORT gzBool   operator ==(const gzDynamicType & compare) const;
00178     GZ_BASE_EXPORT gzBool   operator !=(const gzDynamicType & compare) const;
00179 
00180     GZ_BASE_EXPORT gzVoid           reset();
00181 
00182 protected:
00183     
00184     gzString                            m_type;
00185     gzArray< gzUByte >                  m_data;
00186     gzLateBindData<gzDynRefList>        m_references;
00187 };
00188 
00189 //******************************************************************************
00190 // Class    : gzDynamicTypeVoid
00191 //                                  
00192 // Purpose  : gzVoid
00193 //                                  
00194 // Notes    : - 
00195 //                                  
00196 // Revision History...                          
00197 //                                  
00198 // Who  Date    Description                     
00199 //                                  
00200 // AMO  000602  Created 
00201 //                                  
00202 //******************************************************************************
00203 class  gzDynamicTypeVoid : public gzDynamicType
00204 {
00205 public:
00206     GZ_BASE_EXPORT gzDynamicTypeVoid();
00207     GZ_BASE_EXPORT gzDynamicTypeVoid(const gzDynamicType &copy);
00208 };
00209 
00210 //******************************************************************************
00211 // Class    : gzDynamicTypeChain
00212 //                                  
00213 // Purpose  : Chain a possible result evaluation to a higher level of command
00214 //                                  
00215 // Notes    : - 
00216 //                                  
00217 // Revision History...                          
00218 //                                  
00219 // Who  Date    Description                     
00220 //                                  
00221 // AMO  031217  Created 
00222 //                                  
00223 //******************************************************************************
00225 class  gzDynamicTypeChain : public gzDynamicType
00226 {
00227 public:
00228     GZ_BASE_EXPORT gzDynamicTypeChain();
00229     GZ_BASE_EXPORT gzDynamicTypeChain(const gzDynamicType &copy);
00230 };
00231 
00232 
00233 //------------------ gzDynamicTypeError standard values -----------------------
00234 
00235 const gzString GZ_DYNAMIC_ERROR_VALUE_NOT_SET   =   gzUniqueString("Value not set"      ,14);
00236 const gzString GZ_DYNAMIC_ERROR_NOT_IMPLEMENTED =   gzUniqueString("Not implemented"    ,15);
00237 const gzString GZ_DYNAMIC_ERROR_NO_ERROR        =   gzUniqueString("OK"                 ,16);
00238 const gzString GZ_DYNAMIC_ERROR_TEST_OK         =   gzUniqueString("Test OK"            ,17);
00239 const gzString GZ_DYNAMIC_ERROR_TEST_FAIL       =   gzUniqueString("Test FAIL"          ,18);
00240 
00241 //******************************************************************************
00242 // Class    : gzDynamicTypeError
00243 //                                  
00244 // Purpose  :  Dynamic Errors
00245 //                                  
00246 // Notes    : - 
00247 //                                  
00248 // Revision History...                          
00249 //                                  
00250 // Who  Date    Description                     
00251 //                                  
00252 // AMO  000602  Created 
00253 //                                  
00254 //******************************************************************************
00255 class  gzDynamicTypeError : public gzDynamicType
00256 {
00257 public:
00258     GZ_BASE_EXPORT gzDynamicTypeError(const gzString &errorvalue);
00259     GZ_BASE_EXPORT gzDynamicTypeError(const gzDynamicType &copy);
00260 
00261     GZ_BASE_EXPORT gzString getError() const;
00262     GZ_BASE_EXPORT gzVoid   setError(const gzString &error);
00263     GZ_BASE_EXPORT operator gzString () const { return getError(); }
00264     GZ_BASE_EXPORT gzBool   isError() const;
00265 };
00266 
00267 //******************************************************************************
00268 // Class    : gzDynamicTypeLongLong
00269 //                                  
00270 // Purpose  : Large Long Numbers
00271 //                                  
00272 // Notes    : - 
00273 //                                  
00274 // Revision History...                          
00275 //                                  
00276 // Who  Date    Description                     
00277 //                                  
00278 // AMO  000602  Created 
00279 //                                  
00280 //******************************************************************************
00281 class  gzDynamicTypeLongLong : public gzDynamicType
00282 {
00283 public:
00284     GZ_BASE_EXPORT gzDynamicTypeLongLong(const gzLongLong &value);
00285     GZ_BASE_EXPORT gzDynamicTypeLongLong(const gzDynamicType &copy);
00286 
00287     GZ_BASE_EXPORT gzLongLong getLongLong() const;
00288     GZ_BASE_EXPORT operator gzLongLong () const { return getLongLong(); }
00289 };
00290 
00291 //******************************************************************************
00292 // Class    : gzDynamicTypeArray
00293 //                                  
00294 // Purpose  : Dynamic Array
00295 //                                  
00296 // Notes    : - 
00297 //                                  
00298 // Revision History...                          
00299 //                                  
00300 // Who  Date    Description                     
00301 //                                  
00302 // AMO  000623  Created 
00303 //                                  
00304 //******************************************************************************
00305 class  gzDynamicTypeArray : public gzDynamicType
00306 {
00307 public:
00308     GZ_BASE_EXPORT gzDynamicTypeArray(const gzArray<gzDynamicType> &array);
00309     GZ_BASE_EXPORT gzDynamicTypeArray(const gzDynamicType &copy);
00310     GZ_BASE_EXPORT gzDynamicTypeArray();
00311 
00312     GZ_BASE_EXPORT gzArray<gzDynamicType> getArray() const;
00313     GZ_BASE_EXPORT operator gzArray<gzDynamicType> () const { return getArray(); }
00314 };
00315 
00316 //----------------------------------------------------------------------------------
00317 
00319 const gzDynamicTypeError    GZ_DYN_ERR_OK(GZ_DYNAMIC_ERROR_NO_ERROR);
00320 const gzDynamicTypeError    GZ_DYN_TEST_OK(GZ_DYNAMIC_ERROR_TEST_OK);
00321 const gzDynamicTypeError    GZ_DYN_TEST_FAIL(GZ_DYNAMIC_ERROR_TEST_FAIL);
00322 const gzDynamicTypeVoid     GZ_DYN_VOID;
00323 
00324 GZ_BASE_EXPORT gzBool GZ_FAIL           (const gzDynamicType &result);  // TRUE if error but not  GZ_DYN_ERR_OK and not GZ_DYN_TEST_OK
00325 GZ_BASE_EXPORT gzBool GZ_TEST_FAIL      (const gzDynamicType &result);  // TRUE if GZ_DYN_TEST_FAIL
00326 GZ_BASE_EXPORT gzBool GZ_SUCCESS        (const gzDynamicType &result);  // TRUE if non error or GZ_DYN_ERR_OK or GZ_DYN_TEST_OK
00327 GZ_BASE_EXPORT gzBool GZ_TEST_SUCCESS   (const gzDynamicType &result);  // TRUE if GZ_DYN_TEST_OK
00328 
00329 #define GZ_DYN_ARG(n)           const gzDynamicType &a##n
00330 #define GZ_DYN_ARG_TYPE(n)      const gzString &t##n
00331 #define GZ_DYN_ARG_NULL(n)      const gzString &t##n=GZ_EMPTY_STRING
00332 
00333 #define GZ_DYN_ARG_VOID(n)      GZ_DYN_ARG(n)=GZ_DYN_VOID
00334 #define GZ_DYN_ARG_TYPE_VOID(n) GZ_DYN_ARG_TYPE(n)=GZ_DYNAMIC_TYPE_VOID
00335 
00336 
00337 
00338 #define GZ_DYNAMIC_ATTRIBUTE_LIST   GZ_DYN_ARG_VOID(0),\
00339                                     GZ_DYN_ARG_VOID(1),\
00340                                     GZ_DYN_ARG_VOID(2),\
00341                                     GZ_DYN_ARG_VOID(3),\
00342                                     GZ_DYN_ARG_VOID(4),\
00343                                     GZ_DYN_ARG_VOID(5),\
00344                                     GZ_DYN_ARG_VOID(6),\
00345                                     GZ_DYN_ARG_VOID(7),\
00346                                     GZ_DYN_ARG_VOID(8),\
00347                                     GZ_DYN_ARG_VOID(9)
00348 
00349 #define GZ_DYNAMIC_ATTRIBUTE_TYPE_LIST  GZ_DYN_ARG_TYPE_VOID(0),\
00350                                         GZ_DYN_ARG_TYPE_VOID(1),\
00351                                         GZ_DYN_ARG_TYPE_VOID(2),\
00352                                         GZ_DYN_ARG_TYPE_VOID(3),\
00353                                         GZ_DYN_ARG_TYPE_VOID(4),\
00354                                         GZ_DYN_ARG_TYPE_VOID(5),\
00355                                         GZ_DYN_ARG_TYPE_VOID(6),\
00356                                         GZ_DYN_ARG_TYPE_VOID(7),\
00357                                         GZ_DYN_ARG_TYPE_VOID(8),\
00358                                         GZ_DYN_ARG_TYPE_VOID(9)
00359 
00360 #define GZ_DYNAMIC_ATTRIBUTE_LIST_IMP   GZ_DYN_ARG(0),\
00361                                         GZ_DYN_ARG(1),\
00362                                         GZ_DYN_ARG(2),\
00363                                         GZ_DYN_ARG(3),\
00364                                         GZ_DYN_ARG(4),\
00365                                         GZ_DYN_ARG(5),\
00366                                         GZ_DYN_ARG(6),\
00367                                         GZ_DYN_ARG(7),\
00368                                         GZ_DYN_ARG(8),\
00369                                         GZ_DYN_ARG(9)
00370 
00371 #define GZ_DYNAMIC_ATTRIBUTE_TYPE_LIST_IMP  GZ_DYN_ARG_TYPE(0),\
00372                                             GZ_DYN_ARG_TYPE(1),\
00373                                             GZ_DYN_ARG_TYPE(2),\
00374                                             GZ_DYN_ARG_TYPE(3),\
00375                                             GZ_DYN_ARG_TYPE(4),\
00376                                             GZ_DYN_ARG_TYPE(5),\
00377                                             GZ_DYN_ARG_TYPE(6),\
00378                                             GZ_DYN_ARG_TYPE(7),\
00379                                             GZ_DYN_ARG_TYPE(8),\
00380                                             GZ_DYN_ARG_TYPE(9)
00381 
00382 #define GZ_DYNAMIC_ATTRIBUTE_LIST_IMP_FORWARD       a0,a1,a2,a3,a4,a5,a6,a7,a8,a9
00383 #define GZ_DYNAMIC_ATTRIBUTE_TYPE_LIST_IMP_FORWARD  t0,t1,t2,t3,t4,t5,t6,t7,t8,t9
00384 
00385 #define GZ_DYA_9 gzDynamicTypeVoid()
00386 #define GZ_DYA_8 GZ_DYA_9,gzDynamicTypeVoid()
00387 #define GZ_DYA_7 GZ_DYA_8,gzDynamicTypeVoid()
00388 #define GZ_DYA_6 GZ_DYA_7,gzDynamicTypeVoid()
00389 #define GZ_DYA_5 GZ_DYA_6,gzDynamicTypeVoid()
00390 #define GZ_DYA_4 GZ_DYA_5,gzDynamicTypeVoid()
00391 #define GZ_DYA_3 GZ_DYA_4,gzDynamicTypeVoid()
00392 #define GZ_DYA_2 GZ_DYA_3,gzDynamicTypeVoid()
00393 #define GZ_DYA_1 GZ_DYA_2,gzDynamicTypeVoid()
00394 #define GZ_DYA_0 GZ_DYA_1,gzDynamicTypeVoid()
00395 
00396 #define GZ_DYT_9 GZ_DYNAMIC_TYPE_VOID
00397 #define GZ_DYT_8 GZ_DYT_9,GZ_DYNAMIC_TYPE_VOID
00398 #define GZ_DYT_7 GZ_DYT_8,GZ_DYNAMIC_TYPE_VOID
00399 #define GZ_DYT_6 GZ_DYT_7,GZ_DYNAMIC_TYPE_VOID
00400 #define GZ_DYT_5 GZ_DYT_6,GZ_DYNAMIC_TYPE_VOID
00401 #define GZ_DYT_4 GZ_DYT_5,GZ_DYNAMIC_TYPE_VOID
00402 #define GZ_DYT_3 GZ_DYT_4,GZ_DYNAMIC_TYPE_VOID
00403 #define GZ_DYT_2 GZ_DYT_3,GZ_DYNAMIC_TYPE_VOID
00404 #define GZ_DYT_1 GZ_DYT_2,GZ_DYNAMIC_TYPE_VOID
00405 #define GZ_DYT_0 GZ_DYT_1,GZ_DYNAMIC_TYPE_VOID
00406 
00407 class gzDynamicInvokeInterface; // Forward decl .
00408 
00409 typedef  gzDynamicType (GZ_CALLBACK  * gzDynamicMethod)(gzDynamicInvokeInterface *,GZ_DYNAMIC_ATTRIBUTE_LIST_IMP) ;
00410 
00411 const gzString GZ_UNDEFINED_METHOD_NAME =   "UnDefMethod";
00412 
00413 //******************************************************************************
00414 // Class    : gzDynamicMethodID
00415 //                                  
00416 // Purpose  : Dynamic invokation method identity
00417 //                                  
00418 // Notes    : - 
00419 //                                  
00420 // Revision History...                          
00421 //                                  
00422 // Who  Date    Description                     
00423 //                                  
00424 // AMO  000602  Created 
00425 //                                  
00426 //******************************************************************************
00427 class gzDynamicMethodID 
00428 {
00429 public:
00430     gzDynamicMethodID():IID_method(0),IIDS_method(GZ_UNDEFINED_METHOD_NAME),method(0){};
00431 
00432     gzBool operator==(const gzDynamicMethodID &right) { return IID_method==right.IID_method; }
00433     gzBool operator!=(const gzDynamicMethodID &right) { return IID_method!=right.IID_method; }
00434 
00435     gzULongLong         IID_method;         
00436     gzString            IIDS_method;        
00437     gzDynamicMethod     method;             
00438     gzString            description;        
00439     gzString            argTypeCheck[10];   
00440 };
00441 
00442 
00443 //******************************************************************************
00444 // Class    : gzDynamicEventData
00445 //                                  
00446 // Purpose  : Dynamic event response data
00447 //                                  
00448 // Notes    : - 
00449 //                                  
00450 // Revision History...                          
00451 //                                  
00452 // Who  Date    Description                     
00453 //                                  
00454 // AMO  000602  Created 
00455 //                                  
00456 //******************************************************************************
00457 class gzDynamicEventData : public gzReference
00458 {
00459 public:
00460 
00461     gzULongLong IID_event;
00462     gzDynamicType GZ_DYNAMIC_ATTRIBUTE_LIST_IMP_FORWARD;
00463 };
00464 
00465 
00466 class gzDynamicEventInterface; // Forward decl for slave interface
00467 
00468 //******************************************************************************
00469 // Class    : gzDynamicEventSubscriberInterface
00470 //                                  
00471 // Purpose  : Dynamic event response from dynamic interface
00472 //                                  
00473 // Notes    : - 
00474 //                                  
00475 // Revision History...                          
00476 //                                  
00477 // Who  Date    Description                     
00478 //                                  
00479 // AMO  000602  Created 
00480 //                                  
00481 //******************************************************************************
00482 class gzDynamicEventNotifyInterface : public gzNotifySlave<gzDynamicEventInterface,gzDynamicEventNotifyInterface,gzRefPointer<gzDynamicEventData> >
00483 {
00484 public:
00485 
00486     GZ_BASE_EXPORT virtual gzVoid onEvent( gzDynamicEventInterface * source , gzULongLong IID_event , GZ_DYNAMIC_ATTRIBUTE_LIST) = 0;
00487 
00488 private:
00489 
00490     friend class gzNotifyMaster<gzDynamicEventInterface,gzDynamicEventNotifyInterface,gzRefPointer<gzDynamicEventData> >;
00491     GZ_BASE_EXPORT virtual gzVoid onNotify(gzDynamicEventInterface *master,gzRefPointer<gzDynamicEventData> &data,gzULong senderClass);
00492 
00493 };
00494 
00495 GZ_BASE_EXPORT gzArray<gzDynamicType> gzGetStringArguments(const gzString &params);
00496 
00497 //******************************************************************************
00498 // Class    : gzDynamicInvokeInterface
00499 //                                  
00500 // Purpose  : Dynamic invokation
00501 //                                  
00502 // Notes    : - 
00503 //                                  
00504 // Revision History...                          
00505 //                                  
00506 // Who  Date    Description                     
00507 //                                  
00508 // AMO  000602  Created 
00509 //                                  
00510 //******************************************************************************
00511 class  gzDynamicInvokeInterface
00512 {
00513 public:
00514 
00515     //---------------------- dynamic object methods ----------------------------
00516     GZ_BASE_EXPORT virtual  gzDynamicType               invokeMethod(const gzString &IIDS_method,GZ_DYNAMIC_ATTRIBUTE_LIST);
00517     GZ_BASE_EXPORT virtual  gzDynamicType               invokeMethod(gzULongLong IID_method,GZ_DYNAMIC_ATTRIBUTE_LIST);
00518     GZ_BASE_EXPORT virtual  gzDynamicType               invokeStringParamsMethod(const gzString &IIDS_method,const gzString &params);
00519     GZ_BASE_EXPORT virtual  gzDynamicType               invokeStringParamsMethod(gzULongLong IID_method,const gzString &params);
00520     GZ_BASE_EXPORT virtual  gzBool                      supportMethod(gzULongLong IID_method);
00521     GZ_BASE_EXPORT virtual  gzULongLong                 getMethodIID(const gzString &IIDS_method);
00522     GZ_BASE_EXPORT virtual  gzDynamicMethod             getDirectMethod(gzULongLong IID_method);
00523     GZ_BASE_EXPORT virtual  gzString                    getDescription(gzULongLong IID_method); 
00524     GZ_BASE_EXPORT virtual  gzArray<gzDynamicMethodID>  queryAllMethodIID();
00525 };
00526 
00527 //******************************************************************************
00528 // Class    : gzDynamicEventInterface
00529 //                                  
00530 // Purpose  : Dynamic invokation
00531 //                                  
00532 // Notes    : - 
00533 //                                  
00534 // Revision History...                          
00535 //                                  
00536 // Who  Date    Description                     
00537 //                                  
00538 // AMO  000602  Created 
00539 //                                  
00540 //******************************************************************************
00541 class  gzDynamicEventInterface : public gzNotifyMaster<gzDynamicEventInterface,gzDynamicEventNotifyInterface,gzRefPointer<gzDynamicEventData> >
00542 {
00543 public:
00544 
00545     //---------------------- dynamic events ------------------------------------
00546 
00547     GZ_BASE_EXPORT gzVoid   sendEvent(gzULongLong IID_event , GZ_DYNAMIC_ATTRIBUTE_LIST);
00548 };
00549 
00550 
00551 //******************************************************************************
00552 // Class    : gzDynamicTypeCustom
00553 //                                  
00554 // Purpose  : Template for general purpose dynvars
00555 //                                  
00556 // Notes    : - 
00557 //                                  
00558 // Revision History...                          
00559 //                                  
00560 // Who  Date    Description                     
00561 //                                  
00562 // AMO  000624  Created 
00563 //                                  
00564 //******************************************************************************
00565 template <class T> class  gzDynamicTypeCustom : public gzDynamicType
00566 {
00567 public:
00568     gzDynamicTypeCustom(const T &data);
00569     gzDynamicTypeCustom(const gzDynamicType &copy);
00570     gzDynamicTypeCustom();
00571 
00572     operator T () const;
00573     const gzDynamicTypeCustom<T> & operator =(const T &data);
00574 };
00575 
00576 template <class T> inline gzDynamicTypeCustom<T>::gzDynamicTypeCustom(const T &data)
00577 {
00578     m_type=T::getDataTag();
00579 
00580     T & copy=(T &)data;
00581 
00582     m_data.setSize(copy.getDataSize());
00583 
00584     gzSerializeAdapterMemory mem(m_data.getAddress(),m_data.getSize());
00585 
00586     copy.write(&mem);
00587 }
00588 
00589 template <class T> inline gzDynamicTypeCustom<T>::gzDynamicTypeCustom(const gzDynamicType &copy)
00590 {
00591     if(copy.getDynamicType()!=T::getDataTag())
00592         gzThrowFatal("Can not convert dynamic argument type '%s' to gzDynamicTypeCustom type '%s'!!",(const char *)copy.getDynamicType(),(const char *)T::getDataTag());
00593 
00594     m_data=copy.getDynamicData();
00595     m_type=copy.getDynamicType();
00596 
00597     if(copy.hasDynamicReferences())
00598     {
00599         if(copy.getDynamicReferences().entries())
00600         {
00601             m_references.get()=copy.getDynamicReferences();
00602         }
00603     }
00604 }
00605 
00606 template <class T> inline gzDynamicTypeCustom<T>::gzDynamicTypeCustom()
00607 {
00608     m_type=T::getDataTag();
00609 
00610     T data;
00611 
00612     m_data.setSize(data.getDataSize());
00613 
00614     gzSerializeAdapterMemory mem(m_data.getAddress(),m_data.getSize());
00615 
00616     data.write(&mem);
00617 }
00618 
00619 template <class T> inline gzDynamicTypeCustom<T>::operator T () const
00620 {
00621     T data;
00622     
00623     gzSerializeAdapterMemory mem(((gzArray<unsigned char> &)m_data).getAddress(),m_data.getSize());
00624 
00625     data.read(&mem);
00626 
00627     return data;
00628 }
00629 
00630 template <class T> inline const gzDynamicTypeCustom<T>  & gzDynamicTypeCustom<T>::operator =(const T &data)
00631 {
00632     m_type=T::getDataTag();
00633 
00634     T & copy=(T &)data;
00635 
00636     m_data.setSize(copy.getDataSize());
00637 
00638     gzSerializeAdapterMemory mem(m_data.getAddress(),m_data.getSize());
00639 
00640     copy.write(&mem);
00641 
00642     return *this;
00643 }
00644 
00646 enum gzDynamicTypeEvent
00647 {
00648     GZ_DYNAMIC_EVENT_REMOVE_ATTRIBUTE,
00649     GZ_DYNAMIC_EVENT_SET_ATTRIBUTE,
00650     GZ_DYNAMIC_EVENT_REMOVE_ALL_ATTRIBUTES,
00651     GZ_DYNAMIC_EVENT_ADD_USERDATA,              
00652     GZ_DYNAMIC_EVENT_REMOVE_USERDATA            
00653 };
00654 
00655 //******************************************************************************
00656 // Class    : gzDynamicTypeContainer
00657 //                                  
00658 // Purpose  : A generic serializeable dictionary for gzDynamicTypes
00659 //                                  
00660 // Notes    : - 
00661 //                                  
00662 // Revision History...                          
00663 //                                  
00664 // Who  Date    Description                     
00665 //                                  
00666 // AMO  011026  Created 
00667 //                                  
00668 //******************************************************************************
00670 
00673 class gzDynamicTypeContainer : public gzSerializeData
00674 {
00675 public:
00676 
00677     // Creation
00678 
00679     GZ_BASE_EXPORT gzDynamicTypeContainer(gzULong hashsize=1);
00680 
00681     GZ_BASE_EXPORT virtual ~gzDynamicTypeContainer();
00682 
00683     GZ_BASE_EXPORT gzDynamicTypeContainer( const gzDynamicTypeContainer & copy);
00684 
00685     GZ_BASE_EXPORT gzDynamicTypeContainer & operator=(const gzDynamicTypeContainer & copy);
00686 
00687     // Attrib management
00688 
00689     GZ_BASE_EXPORT gzVoid setAttribute(const gzString &name , const gzDynamicType &attribute);
00690 
00691     GZ_BASE_EXPORT gzDynamicType getAttribute(const gzString &name) const;
00692 
00693     GZ_BASE_EXPORT gzBool hasAttribute(const gzString &name) const;
00694 
00695     GZ_BASE_EXPORT gzBool removeAttribute(const gzString &name);
00696 
00697     GZ_BASE_EXPORT gzVoid removeAllAttributes();
00698 
00699     GZ_BASE_EXPORT gzULong getNumberOfAttributes() const;
00700 
00701     GZ_BASE_EXPORT virtual gzVoid onAttributeEvent( gzDynamicTypeEvent reason , const gzString &name) {};
00702 
00703     // serializing
00704 
00705     GZ_BASE_EXPORT virtual gzVoid write(gzSerializeAdapter *adapter);
00706 
00707     GZ_BASE_EXPORT virtual gzVoid read(gzSerializeAdapter *adapter);
00708 
00709     GZ_BASE_EXPORT virtual gzVoid pushBack(gzSerializeAdapter *adapter);
00710 
00711     GZ_BASE_EXPORT virtual gzULong  getDataSize(gzSerializeAdapter *adapter=NULL) const;
00712 
00713     // dynamic info
00714 
00715     GZ_BASE_EXPORT static const gzString getDataTag() { return GZ_DYNAMIC_TYPE_CONTAINER; }
00716 
00717 private:
00718 
00719     friend class gzDynamicTypeContainerIterator;
00720 
00721     gzULong                                             m_hashSize;
00722 
00723     gzRefDict< gzString , gzRefData< gzDynamicType > > *m_dict;
00724 
00725 };
00726 
00727 //******************************************************************************
00728 // Class    : gzDynamicTypeContainerIterator
00729 //                                  
00730 // Purpose  : Utility to iterator over a dynamic container
00731 //                                  
00732 // Notes    : 
00733 //                                  
00734 // Revision History...                          
00735 //                                  
00736 // Who  Date    Description                     
00737 //                                  
00738 // AMO  011201  Created 
00739 //                                  
00740 //******************************************************************************
00741 class gzDynamicTypeContainerIterator 
00742 {
00743 public:
00744 
00745     GZ_BASE_EXPORT  gzDynamicTypeContainerIterator(const gzDynamicTypeContainer &container , const gzString &prefix="");
00746 
00747     GZ_BASE_EXPORT  virtual ~gzDynamicTypeContainerIterator();
00748 
00749     GZ_BASE_EXPORT  gzDynamicType *operator()(gzString *name=NULL);
00750 
00751     GZ_BASE_EXPORT  gzVoid reset();
00752 
00753     GZ_BASE_EXPORT  gzVoid remove();
00754 
00755     GZ_BASE_EXPORT  gzVoid setPrefix(const gzString &prefix);
00756 
00757 private:
00758 
00759     gzDynamicTypeContainer & m_owner;
00760 
00761     gzDictIterator<gzString , gzRefData< gzDynamicType > >  *m_iterator;
00762 
00763     gzString m_prefix;
00764 };
00765 
00766 typedef gzDynamicTypeCustom<gzDynamicTypeContainer> gzDynamicTypeContainerData;
00767 
00768 
00769 // Dynamic caster utilities
00770 
00771 //******************************************************************************
00772 // Class    : gzDynamic_Cast<CastToClass>
00773 //                                  
00774 // Purpose  : Utility to do a checked dynamic cast of dynamic typed data
00775 //                                  
00776 // Notes    : Throws exception if not possible  
00777 //                                  
00778 // Revision History...                          
00779 //                                  
00780 // Who  Date    Description                     
00781 //                                  
00782 // AMO  021201  Created 
00783 //                                  
00784 //******************************************************************************
00785 template<class T> inline T gzDynamic_Cast(const gzDynamicType &data)
00786 {
00787     return (T)(gzDynamicTypeCustom<T>)data;
00788 }
00789 
00790 //******************************************************************************
00791 // Class    : gzDynamic_Cast<CastToClass>
00792 //                                  
00793 // Purpose  : Utility