Diana Software
QGlobalReaderDispatcher.cc
Go to the documentation of this file.
2 #include "QGlobalRWFactory.hh"
3 #include "QGlobalReader.hh"
4 #include "QMessage.hh"
5 #include "QError.hh"
6 
7 using namespace Diana;
8 
10 {
11  static QGlobalReaderDispatcher dispatcher;
12  return dispatcher;
13 }
14 
15 
17 {
18  fLastReader = NULL;
20 }
21 
23 {
24  err = QERR_SUCCESS;
25  err.SetDescription("");
26  std::string fname = filename;
27  // check for already open files
28  bool isReader = false;
29  if(fname.find(Q_CURRENT_READER,0) != std::string::npos) {
30  if(!fCurrentReaderFilename.empty())
31  fname = fCurrentReaderFilename;
32  else {
34  err.SetDescription("No files being read by the reader in this sequence");
35  }
36  isReader = true;
37  }
38 
39  /* deprecated
40  if(fname == "same") {
41  if(!fLastReader) QMessageHandler::Error(GetName(), std::string("Cannot read from the \"same\" file, as none has been previously well defined!"));
42  return fLastReader;
43  } else */
44  if(fReaders.find(fname) != fReaders.end()) {
45  fLastReader = fReaders[fname];
46  return fLastReader;
47  }
48 
49  // Create the GlobalReader for fname checking its extension
50  fLastReader = NULL;
51  size_t dotpos = fname.find_last_of(".");
52  std::string fileExtension = "";
53  if(dotpos != std::string::npos)
54  fileExtension = fname.substr( dotpos );
55 
56  std::list<const QGlobalReaderFactory*> readerFactories = QGlobalRWFactory::GetInstance().GetListOfGlobalReaders();
57  std::list<const QGlobalReaderFactory*>::iterator iter;
58  for(iter = readerFactories.begin(); iter!= readerFactories.end(); iter++)
59  if((*iter)->GetExt() == fileExtension)
61  // defaults
62  if(fLastReader == 0) {
63  if(fileExtension == ".root") {
64  QGlobalRWFactory::GetInstance().LoadPlugin("LRootGlobalReader");
65  QMessageHandler::Info(GetName(), std::string("loaded default g-reader LRootGlobalReader"));
66  }
67  else if(fileExtension == ".txt") {
68  QGlobalRWFactory::GetInstance().LoadPlugin("LASCIIGlobalReader");
69  QMessageHandler::Info(GetName(), std::string("loaded default g-reader LASCIIGlobalReader"));
70  }
71  else if(fileExtension == ".hdr") {
72  QGlobalRWFactory::GetInstance().LoadPlugin("LHDRGlobalReader");
73  QMessageHandler::Info(GetName(), std::string("loaded default g-reader LHDRGlobalReader"));
74  }
75 
76  else if(fileExtension == ".gui") {
77  QGlobalRWFactory::GetInstance().LoadPlugin("LGuiSessionReader");
78  QMessageHandler::Info(GetName(), std::string("loaded default g-reader LGUISessionReader"));
79  }
80  std::list<const QGlobalReaderFactory*> readerFactories = QGlobalRWFactory::GetInstance().GetListOfGlobalReaders();
81  for(iter = readerFactories.begin(); iter!= readerFactories.end(); iter++)
82  if((*iter)->GetExt() == fileExtension)
84  }
85 
86  // no reader found
87  if(fLastReader == NULL) {
89  err.SetDescription(GetName(),__LINE__, std::string("No reader found for extension: \"") + fileExtension + "\"" + " (file: "+ fname +")");
90  return NULL;
91  }
92 
93  // open file and register it
94  if(isReader)
95  err = fLastReader->Open(fname, "CURRENT_READER");
96  else
97  err = fLastReader->Open(fname);
98  if(err != QERR_SUCCESS) {
99  delete fLastReader;
100  return NULL;
101  }
102  fReaders[fname] = fLastReader;
103  return fLastReader;
104 }
105 
107 {
108  Clear();
109 }
110 
111 
113 {
114  std::map<std::string, QGlobalReader*>::iterator iter;
115  for(iter=fReaders.begin(); iter!=fReaders.end(); iter++) {
116  (*iter).second->Close();
117  if((*iter).second) delete (*iter).second;
118  (*iter).second = 0;
119  }
120  fReaders.clear();
121  fLastReader = NULL;
122 }
err
Definition: CheckOF.C:114
#define Q_CURRENT_READER
Definition: QDiana.hh:42
@ QERR_CANNOT_OPEN_FILE
Definition: QError.hh:33
@ QERR_SUCCESS
Definition: QError.hh:27
error class with error type and description
Definition: QError.hh:115
std::list< const QGlobalReaderFactory * > GetListOfGlobalReaders() const
QGlobalReader * CreateGlobalReader(const std::string &name)
static QGlobalRWFactory & GetInstance()
void LoadPlugin(const std::string &name)
Class that returns a pointer to the reader matching the given input filename.
std::map< std::string, QGlobalReader * > fReaders
QGlobalReader * GetReader(const std::string &filename, QError &err)
get reader
static QGlobalReaderDispatcher & GetInstance()
Abstract class for global readers.
virtual QError Open(const std::string &filename, const std::string &opt="")=0
Open file, called by QGlobalReaderDispatcher.
static void Info(const std::string &sender, const std::string &msg)
Definition: QMessage.hh:40
base class for anything that has a name
Definition: QNamed.hh:14
const std::string & GetName() const
Definition: QNamed.hh:19
the Diana namespace is needed because sometimes we use Qt libraries, that use same class names of our...