00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #ifndef VRS_CORE_SHAREDOBJ_H
00019 #define VRS_CORE_SHAREDOBJ_H
00020
00021 #include <vrs/config.h>
00022 #include <vrs/serializationmacros.h>
00023 #include <vrs/transactionno.h>
00024 #include <vrs/typeinfo.h>
00025 #include <vrs/visitor.h>
00026
00027 namespace VRS {
00028
00029 class CallbackBase;
00030 template<typename T> class Callback1;
00031 template<typename T> class Iterator;
00032 template<class T> class SO;
00033 class WeakPointerBase;
00034 template<class T> class WO;
00035
00037 class VRS_CORE_API SharedObj :
00038 public Visitable
00039 {
00040 public:
00041 SharedObj();
00042 SharedObj(const SharedObj& other);
00043 virtual ~SharedObj();
00048
00049
00050
00051
00052
00053
00054 virtual bool isEqual(const SharedObj* other) const;
00055 static bool IsEqual(const SharedObj* obj1, const SharedObj* obj2);
00056 bool operator==(const SharedObj& other) const;
00057
00058 static const ClassInfo* ClassInfoVRS();
00059 virtual const ClassInfo* classInfoVRS() const;
00061
00062 static const ID& ClassNameVRS();
00063 const ID& classNameVRS() const;
00064 bool isA(const ID& id) const;
00071 void ref(const void* debugPointerHolder = NULL) const;
00072 void unref(const void* debugPointerHolder = NULL) const;
00073 long references() const;
00079 void trackReferences();
00080 void outputReferences() const;
00081 static void outputAllTrackedObjectReferences();
00091 void setObjectName(const char* objName);
00092 void setObjectName(const std::string& objName);
00093 std::string getObjectName() const;
00094 static SO<SharedObj> getObjectByName(const std::string& objName);
00104 void setClientData(void* clientData);
00105 void* getClientData() const;
00107
00108 virtual void modified();
00109 virtual const TransactionNo& lastTransactionNo() const;
00110 static const TransactionNo& currentTransactionNo();
00122 void registerDestructionCB(SO<Callback1<SharedObj*> > cb);
00123 void registerModificationCB(SO<Callback1<SharedObj*> > cb);
00124 void unregisterDestructionCB(SO<Callback1<SharedObj*> > cb);
00125 void unregisterModificationCB(SO<Callback1<SharedObj*> > cb);
00134 typedef SharedObj VRS_ThisClass;
00135 VRS_SERIALIZABLE(SharedObj);
00136 VRS_VISITABLE_BASE;
00137
00138 protected:
00139 void registerCB(const ID& service, SO<CallbackBase> cb);
00141
00142 bool unregisterCB(const ID& service, SO<CallbackBase> cb);
00146 SO<Iterator<SO<CallbackBase> > > callbacks(const ID& service) const;
00148
00149 protected:
00150 friend class WeakPointerBase;
00151
00152 void registerWO(const WeakPointerBase* wo) const;
00153 void unregisterWO(const WeakPointerBase* wo) const;
00154
00155 private:
00156 SharedObj& operator=(const SharedObj&);
00157
00158 TransactionNo m_transactionNo;
00159 mutable long m_references;
00160
00161 class AdditionalData;
00162 mutable int m_additionalDataFlags;
00163 mutable AdditionalData* m_additionalData;
00164 };
00165
00166 }
00167
00168
00169 #include <vrs/serializationmanager.h>
00170 #include <vrs/so.h>
00171 #include <vrs/errorhandler.h>
00172
00173 #endif // VRS_SHAREDOBJ_H