ISSerializableWrapper.h

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

Generated on Mon Feb 6 14:01:22 2006 for SCT DAQ/DCS Software - C++ by  doxygen 1.4.6