00001 #ifndef IOPool_Streamer_StreamerInputFile_h 00002 #define IOPool_Streamer_StreamerInputFile_h 00003 00004 #include "IOPool/Streamer/interface/InitMessage.h" 00005 #include "IOPool/Streamer/interface/EventMessage.h" 00006 #include "IOPool/Streamer/interface/MsgTools.h" 00007 #include "Utilities/StorageFactory/interface/IOTypes.h" 00008 #include "Utilities/StorageFactory/interface/Storage.h" 00009 00010 #include <boost/shared_ptr.hpp> 00011 00012 #include<string> 00013 #include<vector> 00014 00015 namespace edm { 00016 class EventSkipperByID; 00017 class StreamerInputFile { 00018 public: 00019 00021 explicit StreamerInputFile(std::string const& name, 00022 int* numberOfEventsToSkip = 0, 00023 boost::shared_ptr<EventSkipperByID> eventSkipperByID = boost::shared_ptr<EventSkipperByID>()); 00024 00026 explicit StreamerInputFile(std::vector<std::string> const& names, 00027 int* numberOfEventsToSkip = 0, 00028 boost::shared_ptr<EventSkipperByID> eventSkipperByID = boost::shared_ptr<EventSkipperByID>()); 00029 00030 ~StreamerInputFile(); 00031 00032 bool next(); 00034 InitMsgView const* startMessage() const { return startMsg_.get(); } 00037 EventMsgView const* currentRecord() const { return currentEvMsg_.get(); } 00040 bool const newHeader() { bool tmp = newHeader_; newHeader_ = false; return tmp;} 00043 private: 00044 00045 void openStreamerFile(std::string const& name); 00046 IOSize readBytes(char* buf, IOSize nBytes); 00047 IOOffset skipBytes(IOSize nBytes); 00048 00049 void readStartMessage(); 00050 int readEventMessage(); 00051 00052 bool openNextFile(); 00055 bool compareHeader(); 00056 00057 void logFileAction(char const* msg); 00058 00059 boost::shared_ptr<InitMsgView> startMsg_; 00060 boost::shared_ptr<EventMsgView> currentEvMsg_; 00061 00062 std::vector<char> headerBuf_; 00063 std::vector<char> eventBuf_; 00065 unsigned int currentFile_; 00066 std::vector<std::string> streamerNames_; 00067 bool multiStreams_; 00068 std::string currentFileName_; 00069 bool currentFileOpen_; 00070 00071 boost::shared_ptr<EventSkipperByID> eventSkipperByID_; 00072 00073 int* numberOfEventsToSkip_; 00074 00075 uint32 currRun_; 00076 uint32 currProto_; 00077 00078 bool newHeader_; 00079 00080 boost::shared_ptr<Storage> storage_; 00081 00082 bool endOfFile_; 00083 }; 00084 } 00085 00086 #endif