00001 #include "RootOutputFileManager.h"
00002 #include "RootIOSvc/RootIOIncident.h"
00003 #include "GaudiKernel/IIncidentSvc.h"
00004
00005 #include "TFile.h"
00006
00007 using namespace std;
00008
00009 RootOutputFileManager::RootOutputFileManager()
00010 : m_incsvc(0)
00011 {
00012 }
00013
00014 RootOutputFileManager::~RootOutputFileManager()
00015 {
00016 if (m_incsvc) {
00017 m_incsvc->release();
00018 }
00019 m_incsvc = 0;
00020 }
00021
00022 RootOutputFileManager& RootOutputFileManager::get()
00023 {
00024 static RootOutputFileManager* me = 0;
00025 if (!me) me = new RootOutputFileManager;
00026 return *me;
00027 }
00028
00029
00030 void RootOutputFileManager::setIncidentSvc(IIncidentSvc* incsvc)
00031 {
00032 if (m_incsvc) {
00033 m_incsvc->release();
00034 m_incsvc = 0;
00035 }
00036 m_incsvc = incsvc;
00037 if (m_incsvc) {
00038 m_incsvc->addRef();
00039 }
00040 }
00041
00042 TFile*& RootOutputFileManager::file(FileMap::iterator& it)
00043 {
00044 return it->second.second;
00045 }
00046
00047 int& RootOutputFileManager::count(FileMap::iterator& it)
00048 {
00049 return it->second.first;
00050 }
00051
00052 void RootOutputFileManager::fire(const std::string& filename, RootIOIncident::FileState state)
00053 {
00054 if (!m_incsvc) {
00055 return;
00056 }
00057
00058 m_incsvc->fireIncident(RootIOIncident("RootOutputFileManager","RootIOIncident",filename,state));
00059 }
00060
00061 TFile* RootOutputFileManager::get_file(const string& filename) {
00062 FileMap::iterator it = m_filemap.find(filename);
00063 if (it == m_filemap.end()) {
00064
00065 TFile* file = TFile::Open(filename.c_str(),"recreate","RootOutputStream file");
00066 m_filemap[filename] = pair<int,TFile*>(1,file);
00067 this->fire(filename,RootIOIncident::opened_output);
00068 return file;
00069 }
00070
00071 ++count(it);
00072 return file(it);
00073 }
00074
00075 void RootOutputFileManager::close_file(TFile*& tfile) {
00076 string filename = tfile->GetName();
00077 tfile = 0;
00078 FileMap::iterator it = m_filemap.find(filename);
00079 if (it == m_filemap.end()) {
00080 return;
00081 }
00082
00083 --count(it);
00084 if (count(it)) return;
00085
00086 this->fire(filename,RootIOIncident::closing_output);
00087 file(it)->Close();
00088 this->fire(filename,RootIOIncident::closed_output);
00089 delete file(it);
00090 file(it) = 0;
00091 m_filemap.erase(it);
00092 }
00093