00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034 #include "TXMLSetup.h"
00035
00036 #include "TROOT.h"
00037 #include "TClass.h"
00038 #include "TStreamerElement.h"
00039
00040 #include "Riostream.h"
00041 #include <stdlib.h>
00042
00043 ClassImp(TXMLSetup);
00044
00045 namespace xmlio {
00046
00047 const char* Root = "root";
00048 const char* Setup = "setup";
00049 const char* ClassVersion= "version";
00050 const char* IOVersion = "version";
00051 const char* OnlyVersion = "Version";
00052 const char* Ptr = "ptr";
00053 const char* Ref = "ref";
00054 const char* Null = "null";
00055 const char* IdBase = "id";
00056 const char* Size = "size";
00057 const char* Xmlobject = "XmlObject";
00058 const char* Xmlkey = "XmlKey";
00059 const char* Cycle = "cycle";
00060 const char* XmlBlock = "XmlBlock";
00061 const char* Zip = "zip";
00062 const char* Object = "Object";
00063 const char* ObjClass = "class";
00064 const char* Class = "Class";
00065 const char* Member = "Member";
00066 const char* Item = "Item";
00067 const char* Name = "name";
00068 const char* Title = "title";
00069 const char* CreateTm = "created";
00070 const char* ModifyTm = "modified";
00071 const char* ObjectUUID = "uuid";
00072 const char* Type = "type";
00073 const char* Value = "value";
00074 const char* v = "v";
00075 const char* cnt = "cnt";
00076 const char* True = "true";
00077 const char* False = "false";
00078 const char* SInfos = "StreamerInfos";
00079
00080 const char* Array = "Array";
00081 const char* Bool = "Bool_t";
00082 const char* Char = "Char_t";
00083 const char* Short = "Short_t";
00084 const char* Int = "Int_t";
00085 const char* Long = "Long_t";
00086 const char* Long64 = "Long64_t";
00087 const char* Float = "Float_t";
00088 const char* Double = "Double_t";
00089 const char* UChar = "UChar_t";
00090 const char* UShort = "UShort_t";
00091 const char* UInt = "UInt_t";
00092 const char* ULong = "ULong_t";
00093 const char* ULong64 = "ULong64_t";
00094 const char* String = "string";
00095 const char* CharStar = "CharStar";
00096 };
00097
00098 TString TXMLSetup::fgNameSpaceBase = "http://root.cern.ch/root/htmldoc/";
00099
00100
00101 TString TXMLSetup::DefaultXmlSetup()
00102 {
00103
00104
00105 return TString("2xoo");
00106 }
00107
00108
00109 void TXMLSetup::SetNameSpaceBase(const char* namespacebase)
00110 {
00111
00112
00113 fgNameSpaceBase = namespacebase;
00114 }
00115
00116
00117 TXMLSetup::TXMLSetup() :
00118 fXmlLayout(kSpecialized),
00119 fStoreStreamerInfos(kTRUE),
00120 fUseDtd(kFALSE),
00121 fUseNamespaces(kFALSE),
00122 fRefCounter(0)
00123 {
00124
00125 }
00126
00127
00128 TXMLSetup::TXMLSetup(const char* opt) :
00129 fXmlLayout(kSpecialized),
00130 fStoreStreamerInfos(kTRUE),
00131 fUseDtd(kFALSE),
00132 fUseNamespaces(kFALSE),
00133 fRefCounter(0)
00134 {
00135
00136
00137 ReadSetupFromStr(opt);
00138 }
00139
00140
00141 TXMLSetup::TXMLSetup(const TXMLSetup& src) :
00142 fXmlLayout(src.fXmlLayout),
00143 fStoreStreamerInfos(src.fStoreStreamerInfos),
00144 fUseDtd(src.fUseDtd),
00145 fUseNamespaces(src.fUseNamespaces),
00146 fRefCounter(0)
00147 {
00148
00149
00150 }
00151
00152
00153 TXMLSetup::~TXMLSetup()
00154 {
00155
00156 }
00157
00158
00159 TString TXMLSetup::GetSetupAsString()
00160 {
00161
00162
00163 char setupstr[10] = "2xxx";
00164
00165 setupstr[0] = char(48+fXmlLayout);
00166 setupstr[1] = fStoreStreamerInfos ? 'x' : 'o';
00167 setupstr[2] = fUseDtd ? 'x' : 'o';
00168 setupstr[3] = fUseNamespaces ? 'x' : 'o';
00169
00170 return TString(setupstr);
00171 }
00172
00173
00174 Bool_t TXMLSetup::IsValidXmlSetup(const char* setupstr)
00175 {
00176
00177
00178 if ((setupstr==0) || (strlen(setupstr)!=4)) return kFALSE;
00179 TString str = setupstr;
00180 str.ToLower();
00181 if ((str[0]<48) || (str[0]>53)) return kFALSE;
00182 for (int n=1;n<4;n++)
00183 if ((str[n]!='o') && (str[n]!='x')) return kFALSE;
00184 return kTRUE;
00185 }
00186
00187
00188 Bool_t TXMLSetup::ReadSetupFromStr(const char* setupstr)
00189 {
00190
00191
00192 if ((setupstr==0) || (strlen(setupstr)<4)) return kFALSE;
00193 Int_t lay = EXMLLayout(setupstr[0] - 48);
00194 if (lay==kGeneralized) fXmlLayout = kGeneralized;
00195 else fXmlLayout = kSpecialized;
00196
00197 fStoreStreamerInfos = setupstr[1]=='x';
00198 fUseDtd = kFALSE;
00199 fUseNamespaces = setupstr[3]=='x';
00200 return kTRUE;
00201 }
00202
00203
00204 void TXMLSetup::PrintSetup()
00205 {
00206
00207
00208 cout << " *** Setup printout ***" << endl;
00209 cout << "Attribute mode = " << fXmlLayout << endl;
00210 cout << "Store streamer infos = " << (fStoreStreamerInfos ? "true" : "false") << endl;
00211 cout << "Use dtd = " << (fUseDtd ? "true" : "false") << endl;
00212 cout << "Use name spaces = " << (fUseNamespaces ? "true" : "false") << endl;
00213 }
00214
00215
00216 const char* TXMLSetup::XmlConvertClassName(const char* clname)
00217 {
00218
00219
00220 fStrBuf = clname;
00221 fStrBuf.ReplaceAll("<","_");
00222 fStrBuf.ReplaceAll(">","_");
00223 fStrBuf.ReplaceAll(",","_");
00224 fStrBuf.ReplaceAll(" ","_");
00225 fStrBuf.ReplaceAll(":","_");
00226 return fStrBuf.Data();
00227 }
00228
00229
00230 const char* TXMLSetup::XmlClassNameSpaceRef(const TClass* cl)
00231 {
00232
00233
00234 TString clname = XmlConvertClassName(cl->GetName());
00235 fStrBuf = fgNameSpaceBase;
00236 fStrBuf += clname;
00237 if (fgNameSpaceBase == "http://root.cern.ch/root/htmldoc/")
00238 fStrBuf += ".html";
00239 return fStrBuf.Data();
00240 }
00241
00242
00243 const char* TXMLSetup::XmlGetElementName(const TStreamerElement* el)
00244 {
00245
00246
00247 if (el==0) return 0;
00248 if (!el->InheritsFrom(TStreamerSTL::Class())) return el->GetName();
00249 if (strcmp(el->GetName(), el->GetClassPointer()->GetName())!=0) return el->GetName();
00250 return XmlConvertClassName(el->GetName());
00251 }
00252
00253
00254 const char* TXMLSetup::GetElItemName(TStreamerElement* el)
00255 {
00256
00257
00258 if (el==0) return 0;
00259 fStrBuf = el->GetName();
00260 fStrBuf+="_item";
00261 return fStrBuf.Data();
00262 }
00263
00264
00265 TClass* TXMLSetup::XmlDefineClass(const char* xmlClassName)
00266 {
00267
00268
00269
00270 if (strchr(xmlClassName,'_')==0) return TClass::GetClass(xmlClassName);
00271
00272 TIter iter(gROOT->GetListOfClasses());
00273 TClass* cl = 0;
00274 while ((cl = (TClass*) iter()) != 0) {
00275 const char* name = XmlConvertClassName(cl->GetName());
00276 if (strcmp(xmlClassName,name)==0) return cl;
00277 }
00278 return 0;
00279 }
00280
00281
00282 Int_t TXMLSetup::AtoI(const char* sbuf, Int_t def, const char* errinfo)
00283 {
00284
00285
00286
00287 if (sbuf) return atoi(sbuf);
00288 if (errinfo)
00289 cerr << "<Error in TXMLSetup::AtoI>" << errinfo << " not valid integer: sbuf <NULL>" << endl;
00290 return def;
00291 }