00001 #ifndef SCT_ISSERIALIZABLEWRAPPER_H 00002 #define SCT_ISSERIALIZABLEWRAPPER_H 00003 #include "Serializable.h" 00004 #include "SctNames.h" 00005 #include "IoExceptions.h" 00006 #include "is/info.h" 00007 #include <boost/shared_ptr.hpp> 00008 00009 using boost::shared_ptr; 00010 00011 namespace Sct{ 00013 class ISSerializableWrapperI : public virtual Serializable { 00014 public: 00016 virtual void publishWrappedObjectToServer(const string& isServerName)const =0; 00017 }; 00018 00028 template<class T> class ISSerializableWrapper : public ISSerializableWrapperI { 00029 public: 00031 ISSerializableWrapper() : ob(new T), m_uniqueID("unknown") { 00032 // std::cout << "SerWrap Default constructor " << std::endl; 00033 } 00039 ISSerializableWrapper(shared_ptr<T> ob) : ob(ob) { 00040 // std::cout << "SerWrap Non Default Contstructor" << std::endl; 00041 constructUniqueID(); 00042 } 00044 virtual ~ISSerializableWrapper() { /*std::cout << "~SerWrap" << std::endl;*/} 00046 virtual string getClassName() const; 00048 virtual Sct::UniqueID getUniqueID() const; 00050 shared_ptr<T> getWrappedObject() {return ob;} 00052 shared_ptr<const T> getWrappedObject() const {return ob;} 00057 virtual void publishWrappedObjectToServer(const string& isServerName) const; 00059 void constructUniqueID() const; 00060 private: 00061 shared_ptr<T> ob; 00062 mutable string m_uniqueID; 00063 }; 00065 template<class T> 00066 inline string ISSerializableWrapper<T>::getClassName() const { 00067 return ob->type().name(); 00068 } 00069 00070 template<class T> 00071 inline UniqueID ISSerializableWrapper<T>::getUniqueID() const { 00072 return m_uniqueID; 00073 } 00074 00075 template<class T> 00076 inline void ISSerializableWrapper<T>::publishWrappedObjectToServer(const string& serverName) const { 00077 // std::cout << "publish wrapped" << std::endl; 00078 constructUniqueID(); 00079 ISInfoDictionary& is = SctNames::getISDictionary(); 00080 string name=serverName; 00081 name+="."; 00082 name+=getClassName(); 00083 name+="."; 00084 name+=getUniqueID(); 00085 // std::cout << getUniqueID() << ", " << getClassName() << std::endl; 00086 ISInfo::Status s = is.insert(name.c_str(), const_cast<T&>(*getWrappedObject()) ); 00087 if (s != ISInfo::Success) throw IsException(s, name + " publish failed", __FILE__, __LINE__); 00088 } 00089 00090 } 00091 00092 #endif //SCT_ISSERIALIZABLEWRAPPER_H