Main Page   Modules   Namespace List   Class Hierarchy   Data Structures   File List   Namespace Members   Data Fields   Globals   Related Pages  

IOManager.cpp

Go to the documentation of this file.
00001 #include "IOManager.h"
00002 #include "Streamer.h"
00003 #include "Streamable.h"
00004 #include "Serializable.h"
00005 #include "IStream.h"
00006 #include "OStream.h"
00007 #include "SctNames.h"
00008 #include <sstream>
00009 
00010 using namespace std;
00011 
00012 namespace Sct {
00013 
00014 typedef map<string, shared_ptr<Streamer> > StreamerMap;
00015     
00016 bool IOManager::addToMap(const string& className, std::auto_ptr<Streamer> s) throw() {
00017     StreamerMap& map = getMap();
00018     if (map.find(className) != map.end())
00019         return false;
00020     map[className] = s;
00021     return true;
00022 }
00023 
00024 StreamerMap& IOManager::getMap() throw() {
00025     static StreamerMap map;
00026     return map;
00027 }
00028 
00029 Streamer& IOManager::getStreamer(const string& className) const {
00030     StreamerMap& map = getMap();
00031     if (map.find(className) == map.end()) {
00032     ostringstream oss;      
00033     oss << "Known streamers:" << endl;
00034     for (StreamerMap::const_iterator it=map.begin();
00035          it!=map.end();
00036          ++it){
00037         oss << (*it).first << endl; 
00038     }
00039     string diag = oss.str();
00040     SctNames::Mrs() << "SCT_IO" << MRS_TEXT(diag) << MRS_DIAGNOSTIC << ENDM;
00041     throw NoSuchStreamerException(className, "IOManager can't find a Streamer", __FILE__, __LINE__);
00042     }
00043     return *(*map.find(className)).second;
00044 }
00045 
00046 void IOManager::writeImpl(OStream& out, const Streamable& ob, bool bWriteClassName) const {
00047     Streamer& s = getStreamer(ob.getClassName());
00048     if (bWriteClassName) writeClassName(out, ob.getClassName());
00049     s.write(out, ob, *this);
00050 }
00051 
00052 shared_ptr<Streamable> IOManager::readImpl(IStream& in) const {
00053     string className = readClassName(in);
00054     Streamer& s = getStreamer(className);
00055     return s.read(in, *this);
00056 }
00057 
00058 shared_ptr<Streamable> IOManager::readImpl(IStream& in, const string& className) const {
00059     Streamer& s = getStreamer(className);
00060     return s.read(in, *this);    
00061 }
00062 
00063 void IOManager::readImpl(IStream& in, Streamable& ob, bool bReadClassName) const {
00064     if (bReadClassName) {
00065     string className = readClassName(in);
00066     if (className != ob.getClassName()) {
00067         string str = "Can't read: ";
00068         str += ob.getClassName();
00069         str += " from stream because stream contains a: ";
00070         str += className;
00071         throw StreamCorruptedException(str, __FILE__, __LINE__);
00072     }
00073     }
00074     Streamer& s = getStreamer(ob.getClassName());
00075     s.read(in, ob, *this);
00076 }
00077 
00078 void IOManager::writeClassName(OStream& out, const string& className) const {
00079     out << "SctClassName:" + className;
00080 }
00081 
00082 string IOManager::readClassName(IStream& in) const {
00083     string className = "";
00084     in >> className;
00085     if (className.find("SctClassName:") == 0) {
00086     return className.substr(13);
00087     } 
00088     throw StreamCorruptedException("Read string but it wasn't a className.  Got: " + className, __FILE__, __LINE__);
00089 }
00090 
00091     
00092 
00093 }

Generated on Mon Dec 15 19:36:04 2003 for SCT DAQ/DCS Software by doxygen1.3-rc3