PageRenderTime 55ms CodeModel.GetById 24ms RepoModel.GetById 0ms app.codeStats 0ms

/root-5.34.01/io/xml/src/TXMLSetup.cxx

#
C++ | 291 lines | 183 code | 46 blank | 62 comment | 23 complexity | 64c5d5533f42d422804dc173d423e1f5 MD5 | raw file
Possible License(s): LGPL-2.1, BSD-2-Clause, LGPL-2.0, JSON, GPL-2.0, BSD-3-Clause
  1. // @(#)root/xml:$Id: TXMLSetup.cxx 35763 2010-09-27 07:43:23Z rdm $
  2. // Author: Sergey Linev 10.05.2004
  3. /*************************************************************************
  4. * Copyright (C) 1995-2004, Rene Brun and Fons Rademakers. *
  5. * All rights reserved. *
  6. * *
  7. * For the licensing terms see $ROOTSYS/LICENSE. *
  8. * For the list of contributors see $ROOTSYS/README/CREDITS. *
  9. *************************************************************************/
  10. //________________________________________________________________________
  11. //
  12. // Class TXMLSetup is used as storage of xml file settings
  13. // This class is used in TXMLFile and in TXmlBuffer classes.
  14. // Xml settings can be codded via a string in following format
  15. //
  16. // "2xoo"
  17. // ||| \ .
  18. // || \ usage of name spaces.
  19. // | \ usage of DTD;
  20. // \ storage of TStreamerInfo objects in file;
  21. // layout of xml file (= 2 - specialized (default), = 3 - generic)
  22. //
  23. // For last three boolean parameters "x" means true, "o" - false
  24. //
  25. // Such string can be set as argument of TXMLFile constructor. In that
  26. // case new TXMLFile with such parameters will be created.
  27. // These settings automatically stored in xml file.
  28. //________________________________________________________________________
  29. #include "TXMLSetup.h"
  30. #include "TROOT.h"
  31. #include "TClass.h"
  32. #include "TStreamerElement.h"
  33. #include "Riostream.h"
  34. #include <stdlib.h>
  35. ClassImp(TXMLSetup);
  36. namespace xmlio {
  37. const char* Root = "root";
  38. const char* Setup = "setup";
  39. const char* ClassVersion= "version";
  40. const char* IOVersion = "version";
  41. const char* OnlyVersion = "Version";
  42. const char* Ptr = "ptr";
  43. const char* Ref = "ref";
  44. const char* Null = "null";
  45. const char* IdBase = "id";
  46. const char* Size = "size";
  47. const char* Xmlobject = "XmlObject";
  48. const char* Xmlkey = "XmlKey";
  49. const char* Cycle = "cycle";
  50. const char* XmlBlock = "XmlBlock";
  51. const char* Zip = "zip";
  52. const char* Object = "Object";
  53. const char* ObjClass = "class";
  54. const char* Class = "Class";
  55. const char* Member = "Member";
  56. const char* Item = "Item";
  57. const char* Name = "name";
  58. const char* Title = "title";
  59. const char* CreateTm = "created";
  60. const char* ModifyTm = "modified";
  61. const char* ObjectUUID = "uuid";
  62. const char* Type = "type";
  63. const char* Value = "value";
  64. const char* v = "v";
  65. const char* cnt = "cnt";
  66. const char* True = "true";
  67. const char* False = "false";
  68. const char* SInfos = "StreamerInfos";
  69. const char* Array = "Array";
  70. const char* Bool = "Bool_t";
  71. const char* Char = "Char_t";
  72. const char* Short = "Short_t";
  73. const char* Int = "Int_t";
  74. const char* Long = "Long_t";
  75. const char* Long64 = "Long64_t";
  76. const char* Float = "Float_t";
  77. const char* Double = "Double_t";
  78. const char* UChar = "UChar_t";
  79. const char* UShort = "UShort_t";
  80. const char* UInt = "UInt_t";
  81. const char* ULong = "ULong_t";
  82. const char* ULong64 = "ULong64_t";
  83. const char* String = "string";
  84. const char* CharStar = "CharStar";
  85. };
  86. TString TXMLSetup::fgNameSpaceBase = "http://root.cern.ch/root/htmldoc/";
  87. //______________________________________________________________________________
  88. TString TXMLSetup::DefaultXmlSetup()
  89. {
  90. // return default value for XML setup
  91. return TString("2xoo");
  92. }
  93. //______________________________________________________________________________
  94. void TXMLSetup::SetNameSpaceBase(const char* namespacebase)
  95. {
  96. // set namespace base
  97. fgNameSpaceBase = namespacebase;
  98. }
  99. //______________________________________________________________________________
  100. TXMLSetup::TXMLSetup() :
  101. fXmlLayout(kSpecialized),
  102. fStoreStreamerInfos(kTRUE),
  103. fUseDtd(kFALSE),
  104. fUseNamespaces(kFALSE),
  105. fRefCounter(0)
  106. {
  107. // defaule constructor of TXMLSetup class
  108. }
  109. //______________________________________________________________________________
  110. TXMLSetup::TXMLSetup(const char* opt) :
  111. fXmlLayout(kSpecialized),
  112. fStoreStreamerInfos(kTRUE),
  113. fUseDtd(kFALSE),
  114. fUseNamespaces(kFALSE),
  115. fRefCounter(0)
  116. {
  117. // contsruct TXMLSetup object getting values from string
  118. ReadSetupFromStr(opt);
  119. }
  120. //______________________________________________________________________________
  121. TXMLSetup::TXMLSetup(const TXMLSetup& src) :
  122. fXmlLayout(src.fXmlLayout),
  123. fStoreStreamerInfos(src.fStoreStreamerInfos),
  124. fUseDtd(src.fUseDtd),
  125. fUseNamespaces(src.fUseNamespaces),
  126. fRefCounter(0)
  127. {
  128. // copy sonstructor of TXMLSetup class
  129. }
  130. //______________________________________________________________________________
  131. TXMLSetup::~TXMLSetup()
  132. {
  133. // TXMLSetup class destructor
  134. }
  135. //______________________________________________________________________________
  136. TString TXMLSetup::GetSetupAsString()
  137. {
  138. // return setup values as string
  139. char setupstr[10] = "2xxx";
  140. setupstr[0] = char(48+fXmlLayout);
  141. setupstr[1] = fStoreStreamerInfos ? 'x' : 'o';
  142. setupstr[2] = fUseDtd ? 'x' : 'o';
  143. setupstr[3] = fUseNamespaces ? 'x' : 'o';
  144. return TString(setupstr);
  145. }
  146. //______________________________________________________________________________
  147. Bool_t TXMLSetup::IsValidXmlSetup(const char* setupstr)
  148. {
  149. // checks if string is valid setup
  150. if ((setupstr==0) || (strlen(setupstr)!=4)) return kFALSE;
  151. TString str = setupstr;
  152. str.ToLower();
  153. if ((str[0]<48) || (str[0]>53)) return kFALSE;
  154. for (int n=1;n<4;n++)
  155. if ((str[n]!='o') && (str[n]!='x')) return kFALSE;
  156. return kTRUE;
  157. }
  158. //______________________________________________________________________________
  159. Bool_t TXMLSetup::ReadSetupFromStr(const char* setupstr)
  160. {
  161. // get values from string
  162. if ((setupstr==0) || (strlen(setupstr)<4)) return kFALSE;
  163. Int_t lay = EXMLLayout(setupstr[0] - 48);
  164. if (lay==kGeneralized) fXmlLayout = kGeneralized;
  165. else fXmlLayout = kSpecialized;
  166. fStoreStreamerInfos = setupstr[1]=='x';
  167. fUseDtd = kFALSE;
  168. fUseNamespaces = setupstr[3]=='x';
  169. return kTRUE;
  170. }
  171. //______________________________________________________________________________
  172. void TXMLSetup::PrintSetup()
  173. {
  174. // show setup values
  175. cout << " *** Setup printout ***" << endl;
  176. cout << "Attribute mode = " << fXmlLayout << endl;
  177. cout << "Store streamer infos = " << (fStoreStreamerInfos ? "true" : "false") << endl;
  178. cout << "Use dtd = " << (fUseDtd ? "true" : "false") << endl;
  179. cout << "Use name spaces = " << (fUseNamespaces ? "true" : "false") << endl;
  180. }
  181. //______________________________________________________________________________
  182. const char* TXMLSetup::XmlConvertClassName(const char* clname)
  183. {
  184. // convert class name to exclude any special symbols like ':', '<' '>' ',' and spaces
  185. fStrBuf = clname;
  186. fStrBuf.ReplaceAll("<","_");
  187. fStrBuf.ReplaceAll(">","_");
  188. fStrBuf.ReplaceAll(",","_");
  189. fStrBuf.ReplaceAll(" ","_");
  190. fStrBuf.ReplaceAll(":","_");
  191. return fStrBuf.Data();
  192. }
  193. //______________________________________________________________________________
  194. const char* TXMLSetup::XmlClassNameSpaceRef(const TClass* cl)
  195. {
  196. // produce string which used as reference in class namespace definition
  197. TString clname = XmlConvertClassName(cl->GetName());
  198. fStrBuf = fgNameSpaceBase;
  199. fStrBuf += clname;
  200. if (fgNameSpaceBase == "http://root.cern.ch/root/htmldoc/")
  201. fStrBuf += ".html";
  202. return fStrBuf.Data();
  203. }
  204. //______________________________________________________________________________
  205. const char* TXMLSetup::XmlGetElementName(const TStreamerElement* el)
  206. {
  207. // return converted name for TStreamerElement
  208. if (el==0) return 0;
  209. if (!el->InheritsFrom(TStreamerSTL::Class())) return el->GetName();
  210. if (strcmp(el->GetName(), el->GetClassPointer()->GetName())!=0) return el->GetName();
  211. return XmlConvertClassName(el->GetName());
  212. }
  213. //______________________________________________________________________________
  214. const char* TXMLSetup::GetElItemName(TStreamerElement* el)
  215. {
  216. // get item name for given element
  217. if (el==0) return 0;
  218. fStrBuf = el->GetName();
  219. fStrBuf+="_item";
  220. return fStrBuf.Data();
  221. }
  222. //______________________________________________________________________________
  223. TClass* TXMLSetup::XmlDefineClass(const char* xmlClassName)
  224. {
  225. // define class for the converted class name, where
  226. // special symbols were replaced by '_'
  227. if (strchr(xmlClassName,'_')==0) return TClass::GetClass(xmlClassName);
  228. TIter iter(gROOT->GetListOfClasses());
  229. TClass* cl = 0;
  230. while ((cl = (TClass*) iter()) != 0) {
  231. const char* name = XmlConvertClassName(cl->GetName());
  232. if (strcmp(xmlClassName,name)==0) return cl;
  233. }
  234. return 0;
  235. }
  236. //______________________________________________________________________________
  237. Int_t TXMLSetup::AtoI(const char* sbuf, Int_t def, const char* errinfo)
  238. {
  239. // converts string to integer.
  240. // if error, returns default value
  241. if (sbuf) return atoi(sbuf);
  242. if (errinfo)
  243. cerr << "<Error in TXMLSetup::AtoI>" << errinfo << " not valid integer: sbuf <NULL>" << endl;
  244. return def;
  245. }