00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
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
00033
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
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
00067
00068 const gzString GZ_DYNAMIC_TYPE_STRING =gzUniqueString("str" ,GZ_DYNAMIC_TYPE_STRING_UNIQUE_ID);
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);
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
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100 class gzDynRefList : public gzList<gzReference>
00101 {
00102 public:
00103
00104 gzDynRefList(){};
00105
00106 gzDynRefList( const gzDynRefList © ):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
00119
00120
00121
00122
00123
00124
00125
00126
00127
00128
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
00191
00192
00193
00194
00195
00196
00197
00198
00199
00200
00201
00202
00203 class gzDynamicTypeVoid : public gzDynamicType
00204 {
00205 public:
00206 GZ_BASE_EXPORT gzDynamicTypeVoid();
00207 GZ_BASE_EXPORT gzDynamicTypeVoid(const gzDynamicType ©);
00208 };
00209
00210
00211
00212
00213
00214
00215
00216
00217
00218
00219
00220
00221
00222
00223
00225 class gzDynamicTypeChain : public gzDynamicType
00226 {
00227 public:
00228 GZ_BASE_EXPORT gzDynamicTypeChain();
00229 GZ_BASE_EXPORT gzDynamicTypeChain(const gzDynamicType ©);
00230 };
00231
00232
00233
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
00243
00244
00245
00246
00247
00248
00249
00250
00251
00252
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 ©);
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
00269
00270
00271
00272
00273
00274
00275
00276
00277
00278
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 ©);
00286
00287 GZ_BASE_EXPORT gzLongLong getLongLong() const;
00288 GZ_BASE_EXPORT operator gzLongLong () const { return getLongLong(); }
00289 };
00290
00291
00292
00293
00294
00295
00296
00297
00298
00299
00300
00301
00302
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 ©);
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);
00325 GZ_BASE_EXPORT gzBool GZ_TEST_FAIL (const gzDynamicType &result);
00326 GZ_BASE_EXPORT gzBool GZ_SUCCESS (const gzDynamicType &result);
00327 GZ_BASE_EXPORT gzBool GZ_TEST_SUCCESS (const gzDynamicType &result);
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;
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
00415
00416
00417
00418
00419
00420
00421
00422
00423
00424
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
00445
00446
00447
00448
00449
00450
00451
00452
00453
00454
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;
00467
00468
00469
00470
00471
00472
00473
00474
00475
00476
00477
00478
00479
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 ¶ms);
00496
00497
00498
00499
00500
00501
00502
00503
00504
00505
00506
00507
00508
00509
00510
00511 class gzDynamicInvokeInterface
00512 {
00513 public:
00514
00515
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 ¶ms);
00519 GZ_BASE_EXPORT virtual gzDynamicType invokeStringParamsMethod(gzULongLong IID_method,const gzString ¶ms);
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
00529
00530
00531
00532
00533
00534
00535
00536
00537
00538
00539
00540
00541 class gzDynamicEventInterface : public gzNotifyMaster<gzDynamicEventInterface,gzDynamicEventNotifyInterface,gzRefPointer<gzDynamicEventData> >
00542 {
00543 public:
00544
00545
00546
00547 GZ_BASE_EXPORT gzVoid sendEvent(gzULongLong IID_event , GZ_DYNAMIC_ATTRIBUTE_LIST);
00548 };
00549
00550
00551
00552
00553
00554
00555
00556
00557
00558
00559
00560
00561
00562
00563
00564
00565 template <class T> class gzDynamicTypeCustom : public gzDynamicType
00566 {
00567 public:
00568 gzDynamicTypeCustom(const T &data);
00569 gzDynamicTypeCustom(const gzDynamicType ©);
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 ©)
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
00657
00658
00659
00660
00661
00662
00663
00664
00665
00666
00667
00668
00670
00673 class gzDynamicTypeContainer : public gzSerializeData
00674 {
00675 public:
00676
00677
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
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
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
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
00729
00730
00731
00732
00733
00734
00735
00736
00737
00738
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
00770
00771
00772
00773
00774
00775
00776
00777
00778
00779
00780
00781
00782
00783
00784
00785 template<class T> inline T gzDynamic_Cast(const gzDynamicType &data)
00786 {
00787 return (T)(gzDynamicTypeCustom<T>)data;
00788 }
00789
00790
00791
00792
00793