TXMLSetup.cxx

Go to the documentation of this file.
00001 // @(#)root/xml:$Id: TXMLSetup.cxx 35763 2010-09-27 07:43:23Z rdm $
00002 // Author: Sergey Linev  10.05.2004
00003 
00004 /*************************************************************************
00005  * Copyright (C) 1995-2004, Rene Brun and Fons Rademakers.               *
00006  * All rights reserved.                                                  *
00007  *                                                                       *
00008  * For the licensing terms see $ROOTSYS/LICENSE.                         *
00009  * For the list of contributors see $ROOTSYS/README/CREDITS.             *
00010  *************************************************************************/
00011 
00012 //________________________________________________________________________
00013 //
00014 // Class TXMLSetup is used as storage of xml file settings
00015 // This class is used in TXMLFile and in TXmlBuffer classes.
00016 // Xml settings can be codded via a string in following format
00017 //
00018 //   "2xoo"
00019 //    ||| \ .
00020 //    || \ usage of name spaces.
00021 //    | \ usage of DTD;
00022 //     \ storage of TStreamerInfo objects in file;
00023 //      layout of xml file (= 2 - specialized (default), = 3 - generic)
00024 //
00025 // For last three boolean parameters "x" means true, "o" - false
00026 //
00027 // Such string can be set as argument of TXMLFile constructor. In that
00028 // case new TXMLFile with such parameters will be created.
00029 // These settings automatically stored in xml file.
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    // return default value for XML setup
00104 
00105    return TString("2xoo");
00106 }
00107 
00108 //______________________________________________________________________________
00109 void TXMLSetup::SetNameSpaceBase(const char* namespacebase)
00110 {
00111    // set namespace base
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    // defaule constructor of TXMLSetup class
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    // contsruct TXMLSetup object getting values from string
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    // copy sonstructor of TXMLSetup class
00149 
00150 }
00151 
00152 //______________________________________________________________________________
00153 TXMLSetup::~TXMLSetup()
00154 {
00155    // TXMLSetup class destructor
00156 }
00157 
00158 //______________________________________________________________________________
00159 TString TXMLSetup::GetSetupAsString()
00160 {
00161    // return setup values as string
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    // checks if string is valid setup
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    // get values from string
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    // show setup values
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    // convert class name to exclude any special symbols like ':', '<' '>' ',' and spaces
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    // produce string which used as reference in class namespace definition
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    //  return converted name for TStreamerElement
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    // get item name for given element
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    // define class for the converted class name, where
00268    // special symbols were replaced by '_'
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    // converts string to integer.
00285    // if error, returns default value
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 }

Generated on Tue Jul 5 14:30:39 2011 for ROOT_528-00b_version by  doxygen 1.5.1