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
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074 #include "TXMLFile.h"
00075
00076 #include "TROOT.h"
00077 #include "TSystem.h"
00078 #include "TList.h"
00079 #include "TBrowser.h"
00080 #include "TObjArray.h"
00081 #include "TBufferXML.h"
00082 #include "TKeyXML.h"
00083 #include "TObjArray.h"
00084 #include "TArrayC.h"
00085 #include "TStreamerInfo.h"
00086 #include "TStreamerElement.h"
00087 #include "TProcessID.h"
00088 #include "TError.h"
00089 #include "TClass.h"
00090
00091 ClassImp(TXMLFile);
00092
00093
00094 TXMLFile::TXMLFile() :
00095 TFile(),
00096 TXMLSetup(),
00097 fDoc(0),
00098 fStreamerInfoNode(0),
00099 fXML(0),
00100 fKeyCounter(0)
00101 {
00102
00103
00104 SetBit(kBinaryFile, kFALSE);
00105 fIOVersion = TXMLFile::Class_Version();
00106 }
00107
00108
00109
00110 TXMLFile::TXMLFile(const char* filename, Option_t* option, const char* title, Int_t compression) :
00111 TFile(),
00112 TXMLSetup(),
00113 fDoc(0),
00114 fStreamerInfoNode(0),
00115 fXML(0),
00116 fKeyCounter(0)
00117 {
00118
00119
00120
00121
00122
00123
00124
00125
00126
00127
00128
00129
00130
00131
00132
00133
00134
00135
00136
00137
00138
00139 fXML = new TXMLEngine();
00140
00141 if (!gROOT)
00142 ::Fatal("TFile::TFile", "ROOT system not initialized");
00143
00144 if (filename && !strncmp(filename, "xml:", 4))
00145 filename += 4;
00146
00147 gDirectory = 0;
00148 SetName(filename);
00149 SetTitle(title);
00150 TDirectoryFile::Build(this, 0);
00151
00152 fD = -1;
00153 fFile = this;
00154 fFree = 0;
00155 fVersion = gROOT->GetVersionInt();
00156 fUnits = 4;
00157 fOption = option;
00158 SetCompressionLevel(compression);
00159 fWritten = 0;
00160 fSumBuffer = 0;
00161 fSum2Buffer = 0;
00162 fBytesRead = 0;
00163 fBytesWrite = 0;
00164 fClassIndex = 0;
00165 fSeekInfo = 0;
00166 fNbytesInfo = 0;
00167 fProcessIDs = 0;
00168 fNProcessIDs= 0;
00169 fIOVersion = TXMLFile::Class_Version();
00170 SetBit(kBinaryFile, kFALSE);
00171
00172 fOption = option;
00173 fOption.ToUpper();
00174
00175 if (fOption == "NEW") fOption = "CREATE";
00176
00177 Bool_t create = (fOption == "CREATE") ? kTRUE : kFALSE;
00178 Bool_t recreate = (fOption == "RECREATE") ? kTRUE : kFALSE;
00179 Bool_t update = (fOption == "UPDATE") ? kTRUE : kFALSE;
00180 Bool_t read = (fOption == "READ") ? kTRUE : kFALSE;
00181 Bool_t xmlsetup = IsValidXmlSetup(option);
00182 if (xmlsetup) recreate = kTRUE;
00183
00184 if (!create && !recreate && !update && !read) {
00185 read = kTRUE;
00186 fOption = "READ";
00187 }
00188
00189 Bool_t devnull = kFALSE;
00190 const char *fname = 0;
00191
00192 if (!filename || !strlen(filename)) {
00193 Error("TXMLFile", "file name is not specified");
00194 goto zombie;
00195 }
00196
00197
00198 if (!strcmp(filename, "/dev/null") &&
00199 !gSystem->AccessPathName(filename, kWritePermission)) {
00200 devnull = kTRUE;
00201 create = kTRUE;
00202 recreate = kFALSE;
00203 update = kFALSE;
00204 read = kFALSE;
00205 fOption = "CREATE";
00206 SetBit(TFile::kDevNull);
00207 }
00208
00209 gROOT->cd();
00210
00211 fname = gSystem->ExpandPathName(filename);
00212 if (fname) {
00213 SetName(fname);
00214 delete [] (char*)fname;
00215 fname = GetName();
00216 } else {
00217 Error("TXMLFile", "error expanding path %s", filename);
00218 goto zombie;
00219 }
00220
00221 if (recreate) {
00222 if (!gSystem->AccessPathName(fname, kFileExists))
00223 gSystem->Unlink(fname);
00224 recreate = kFALSE;
00225 create = kTRUE;
00226 fOption = "CREATE";
00227 }
00228
00229 if (create && !devnull && !gSystem->AccessPathName(fname, kFileExists)) {
00230 Error("TXMLFile", "file %s already exists", fname);
00231 goto zombie;
00232 }
00233
00234 if (update) {
00235 if (gSystem->AccessPathName(fname, kFileExists)) {
00236 update = kFALSE;
00237 create = kTRUE;
00238 }
00239 if (update && gSystem->AccessPathName(fname, kWritePermission)) {
00240 Error("TXMLFile", "no write permission, could not open file %s", fname);
00241 goto zombie;
00242 }
00243 }
00244
00245 if (read) {
00246 if (gSystem->AccessPathName(fname, kFileExists)) {
00247 Error("TXMLFile", "file %s does not exist", fname);
00248 goto zombie;
00249 }
00250 if (gSystem->AccessPathName(fname, kReadPermission)) {
00251 Error("TXMLFile", "no read permission, could not open file %s", fname);
00252 goto zombie;
00253 }
00254 }
00255
00256 fRealName = fname;
00257
00258 if (create || update)
00259 SetWritable(kTRUE);
00260 else
00261 SetWritable(kFALSE);
00262
00263 if (create) {
00264 if (xmlsetup)
00265 ReadSetupFromStr(option);
00266 else
00267 ReadSetupFromStr(TXMLSetup::DefaultXmlSetup());
00268 }
00269
00270 InitXmlFile(create);
00271
00272 return;
00273
00274 zombie:
00275 MakeZombie();
00276 gDirectory = gROOT;
00277 }
00278
00279
00280 void TXMLFile::InitXmlFile(Bool_t create)
00281 {
00282
00283
00284
00285 Int_t len = gROOT->GetListOfStreamerInfo()->GetSize()+1;
00286 if (len<5000) len = 5000;
00287 fClassIndex = new TArrayC(len);
00288 fClassIndex->Reset(0);
00289
00290 if (create) {
00291 fDoc = fXML->NewDoc();
00292 XMLNodePointer_t fRootNode = fXML->NewChild(0, 0, xmlio::Root, 0);
00293 fXML->DocSetRootElement(fDoc, fRootNode);
00294 } else {
00295 ReadFromFile();
00296 }
00297
00298 gROOT->GetListOfFiles()->Add(this);
00299 cd();
00300
00301 fNProcessIDs = 0;
00302 TKey* key = 0;
00303 TIter iter(fKeys);
00304 while ((key = (TKey*)iter())!=0) {
00305 if (!strcmp(key->GetClassName(),"TProcessID")) fNProcessIDs++;
00306 }
00307
00308 fProcessIDs = new TObjArray(fNProcessIDs+1);
00309 }
00310
00311
00312 void TXMLFile::Close(Option_t *option)
00313 {
00314
00315
00316
00317 if (!IsOpen()) return;
00318
00319 TString opt = option;
00320 if (opt.Length()>0)
00321 opt.ToLower();
00322
00323 if (IsWritable()) SaveToFile();
00324
00325 fWritable = kFALSE;
00326
00327 if (fDoc) {
00328 fXML->FreeDoc(fDoc);
00329 fDoc = 0;
00330 }
00331
00332 if (fClassIndex) {
00333 delete fClassIndex;
00334 fClassIndex = 0;
00335 }
00336
00337 if (fStreamerInfoNode) {
00338 fXML->FreeNode(fStreamerInfoNode);
00339 fStreamerInfoNode = 0;
00340 }
00341
00342 TDirectory *cursav = gDirectory;
00343 cd();
00344
00345 if (cursav == this || cursav->GetFile() == this) {
00346 cursav = 0;
00347 }
00348
00349
00350 TDirectoryFile::Close();
00351 cd();
00352
00353 if (cursav)
00354 cursav->cd();
00355 else {
00356 gFile = 0;
00357 gDirectory = gROOT;
00358 }
00359
00360
00361 TList pidDeleted;
00362 TIter next(fProcessIDs);
00363 TProcessID *pid;
00364 while ((pid = (TProcessID*)next())) {
00365 if (!pid->DecrementCount()) {
00366 if (pid != TProcessID::GetSessionProcessID()) pidDeleted.Add(pid);
00367 } else if(opt.Contains("r")) {
00368 pid->Clear();
00369 }
00370 }
00371 pidDeleted.Delete();
00372
00373 gROOT->GetListOfFiles()->Remove(this);
00374 }
00375
00376
00377 TXMLFile::~TXMLFile()
00378 {
00379
00380
00381 Close();
00382
00383 if (fXML!=0) {
00384 delete fXML;
00385 fXML = 0;
00386 }
00387 }
00388
00389
00390 void TXMLFile::operator=(const TXMLFile &)
00391 {
00392
00393 }
00394
00395
00396 Bool_t TXMLFile::IsOpen() const
00397 {
00398
00399
00400 return fDoc != 0;
00401 }
00402
00403
00404 Int_t TXMLFile::ReOpen(Option_t* mode)
00405 {
00406
00407
00408
00409 cd();
00410
00411 TString opt = mode;
00412 opt.ToUpper();
00413
00414 if (opt != "READ" && opt != "UPDATE") {
00415 Error("ReOpen", "mode must be either READ or UPDATE, not %s", opt.Data());
00416 return 1;
00417 }
00418
00419 if (opt == fOption || (opt == "UPDATE" && fOption == "CREATE"))
00420 return 1;
00421
00422 if (opt == "READ") {
00423
00424
00425 if (IsOpen() && IsWritable())
00426 SaveToFile();
00427 fOption = opt;
00428
00429 SetWritable(kFALSE);
00430
00431 } else {
00432 fOption = opt;
00433
00434 SetWritable(kTRUE);
00435 }
00436
00437 return 0;
00438 }
00439
00440
00441 TKey* TXMLFile::CreateKey(TDirectory* mother, const TObject* obj, const char* name, Int_t)
00442 {
00443
00444
00445 return new TKeyXML(mother, ++fKeyCounter, obj, name);
00446 }
00447
00448
00449 TKey* TXMLFile::CreateKey(TDirectory* mother, const void* obj, const TClass* cl, const char* name, Int_t)
00450 {
00451
00452
00453 return new TKeyXML(mother, ++fKeyCounter, obj, cl, name);
00454 }
00455
00456
00457 void TXMLFile::ProduceFileNames(const char* filename, TString& fname, TString& dtdname)
00458 {
00459
00460
00461 fname = filename;
00462 dtdname = filename;
00463
00464 Bool_t hasxmlext = kFALSE;
00465
00466 if (fname.Length()>4) {
00467 TString last = fname(fname.Length()-4,4);
00468 last.ToLower();
00469 hasxmlext = (last==".xml");
00470 }
00471
00472 if (hasxmlext) {
00473 dtdname.Replace(dtdname.Length()-4,4,".dtd");
00474 } else {
00475 fname+=".xml";
00476 dtdname+=".dtd";
00477 }
00478 }
00479
00480
00481 void TXMLFile::SaveToFile()
00482 {
00483
00484
00485
00486
00487
00488
00489
00490
00491 if (fDoc==0) return;
00492
00493 if (gDebug>1)
00494 Info("SaveToFile","File: %s",fRealName.Data());
00495
00496 XMLNodePointer_t fRootNode = fXML->DocGetRootElement(fDoc);
00497
00498 fXML->FreeAttr(fRootNode, xmlio::Setup);
00499 fXML->NewAttr(fRootNode, 0, xmlio::Setup, GetSetupAsString());
00500
00501 fXML->FreeAttr(fRootNode, xmlio::Ref);
00502 fXML->NewAttr(fRootNode, 0, xmlio::Ref, xmlio::Null);
00503
00504 if (GetIOVersion()>1) {
00505
00506 fXML->FreeAttr(fRootNode, xmlio::CreateTm);
00507 fXML->NewAttr(fRootNode, 0, xmlio::CreateTm, fDatimeC.AsSQLString());
00508
00509 fXML->FreeAttr(fRootNode, xmlio::ModifyTm);
00510 fXML->NewAttr(fRootNode, 0, xmlio::ModifyTm, fDatimeM.AsSQLString());
00511
00512 fXML->FreeAttr(fRootNode, xmlio::ObjectUUID);
00513 fXML->NewAttr(fRootNode, 0, xmlio::ObjectUUID, fUUID.AsString());
00514
00515 fXML->FreeAttr(fRootNode, xmlio::Title);
00516 if (strlen(GetTitle())>0)
00517 fXML->NewAttr(fRootNode, 0, xmlio::Title, GetTitle());
00518
00519 fXML->FreeAttr(fRootNode, xmlio::IOVersion);
00520 fXML->NewIntAttr(fRootNode, xmlio::IOVersion, GetIOVersion());
00521 }
00522
00523 TString fname, dtdname;
00524 ProduceFileNames(fRealName, fname, dtdname);
00525
00526
00527
00528
00529
00530
00531
00532
00533 CombineNodesTree(this, fRootNode, kTRUE);
00534
00535 WriteStreamerInfo();
00536
00537 if (fStreamerInfoNode)
00538 fXML->AddChild(fRootNode, fStreamerInfoNode);
00539
00540 Int_t layout = GetCompressionLevel()>5 ? 0 : 1;
00541
00542 fXML->SaveDoc(fDoc, fname, layout);
00543
00544
00545
00546
00547
00548 CombineNodesTree(this, fRootNode, kFALSE);
00549
00550 if (fStreamerInfoNode)
00551 fXML->UnlinkNode(fStreamerInfoNode);
00552 }
00553
00554
00555 void TXMLFile::CombineNodesTree(TDirectory* dir, XMLNodePointer_t topnode, Bool_t dolink)
00556 {
00557
00558
00559 if (dir==0) return;
00560
00561 TIter iter(dir->GetListOfKeys());
00562 TKeyXML* key = 0;
00563
00564 while ((key=(TKeyXML*)iter()) !=0) {
00565 if (dolink)
00566 fXML->AddChild(topnode, key->KeyNode());
00567 else
00568 fXML->UnlinkNode(key->KeyNode());
00569 if (key->IsSubdir())
00570 CombineNodesTree(FindKeyDir(dir, key->GetKeyId()), key->KeyNode(), dolink);
00571 }
00572 }
00573
00574
00575
00576 Bool_t TXMLFile::ReadFromFile()
00577 {
00578
00579
00580
00581
00582
00583 fDoc = fXML->ParseFile(fRealName);
00584 if (fDoc==0) return kFALSE;
00585
00586 XMLNodePointer_t fRootNode = fXML->DocGetRootElement(fDoc);
00587
00588 if ((fRootNode==0) || !fXML->ValidateVersion(fDoc)) {
00589 fXML->FreeDoc(fDoc);
00590 fDoc=0;
00591 return kFALSE;
00592 }
00593
00594 ReadSetupFromStr(fXML->GetAttr(fRootNode, xmlio::Setup));
00595
00596 if (fXML->HasAttr(fRootNode, xmlio::CreateTm)) {
00597 TDatime tm(fXML->GetAttr(fRootNode, xmlio::CreateTm));
00598 fDatimeC = tm;
00599 }
00600
00601 if (fXML->HasAttr(fRootNode, xmlio::ModifyTm)) {
00602 TDatime tm(fXML->GetAttr(fRootNode, xmlio::ModifyTm));
00603 fDatimeM = tm;
00604 }
00605
00606 if (fXML->HasAttr(fRootNode, xmlio::ObjectUUID)) {
00607 TUUID id(fXML->GetAttr(fRootNode, xmlio::ObjectUUID));
00608 fUUID = id;
00609 }
00610
00611 if (fXML->HasAttr(fRootNode, xmlio::Title))
00612 SetTitle(fXML->GetAttr(fRootNode, xmlio::Title));
00613
00614 if (fXML->HasAttr(fRootNode, xmlio::IOVersion))
00615 fIOVersion = fXML->GetIntAttr(fRootNode, xmlio::IOVersion);
00616 else
00617 fIOVersion = 1;
00618
00619 fStreamerInfoNode = fXML->GetChild(fRootNode);
00620 fXML->SkipEmpty(fStreamerInfoNode);
00621 while (fStreamerInfoNode!=0) {
00622 if (strcmp(xmlio::SInfos, fXML->GetNodeName(fStreamerInfoNode))==0) break;
00623 fXML->ShiftToNext(fStreamerInfoNode);
00624 }
00625 fXML->UnlinkNode(fStreamerInfoNode);
00626
00627 if (fStreamerInfoNode!=0)
00628 ReadStreamerInfo();
00629
00630 if (IsUseDtd())
00631 if (!fXML->ValidateDocument(fDoc, gDebug>0)) {
00632 fXML->FreeDoc(fDoc);
00633 fDoc=0;
00634 return kFALSE;
00635 }
00636
00637 ReadKeysList(this, fRootNode);
00638
00639 fXML->CleanNode(fRootNode);
00640
00641 return kTRUE;
00642 }
00643
00644
00645 Int_t TXMLFile::ReadKeysList(TDirectory* dir, XMLNodePointer_t topnode)
00646 {
00647
00648
00649 if ((dir==0) || (topnode==0)) return 0;
00650
00651 Int_t nkeys = 0;
00652
00653 XMLNodePointer_t keynode = fXML->GetChild(topnode);
00654 fXML->SkipEmpty(keynode);
00655 while (keynode!=0) {
00656 XMLNodePointer_t next = fXML->GetNext(keynode);
00657
00658 if (strcmp(xmlio::Xmlkey, fXML->GetNodeName(keynode))==0) {
00659 fXML->UnlinkNode(keynode);
00660
00661 TKeyXML* key = new TKeyXML(dir, ++fKeyCounter, keynode);
00662 dir->AppendKey(key);
00663
00664 if (gDebug>2)
00665 Info("ReadKeysList","Add key %s from node %s",key->GetName(), fXML->GetNodeName(keynode));
00666
00667 nkeys++;
00668 }
00669
00670 keynode = next;
00671 fXML->SkipEmpty(keynode);
00672 }
00673
00674 return nkeys;
00675 }
00676
00677
00678 void TXMLFile::WriteStreamerInfo()
00679 {
00680
00681
00682 if (fStreamerInfoNode) {
00683 fXML->FreeNode(fStreamerInfoNode);
00684 fStreamerInfoNode = 0;
00685 }
00686
00687 if (!IsStoreStreamerInfos()) return;
00688
00689 TObjArray list;
00690
00691 TIter iter(gROOT->GetListOfStreamerInfo());
00692
00693 TStreamerInfo* info = 0;
00694
00695 while ((info = (TStreamerInfo*) iter()) !=0 ) {
00696 Int_t uid = info->GetNumber();
00697 if (fClassIndex->fArray[uid])
00698 list.Add(info);
00699 }
00700
00701 if (list.GetSize()==0) return;
00702
00703 fStreamerInfoNode = fXML->NewChild(0, 0, xmlio::SInfos);
00704 for (int n=0;n<=list.GetLast();n++) {
00705 info = (TStreamerInfo*) list.At(n);
00706
00707 XMLNodePointer_t infonode = fXML->NewChild(fStreamerInfoNode, 0, "TStreamerInfo");
00708
00709 fXML->NewAttr(infonode, 0, "name", info->GetName());
00710 fXML->NewAttr(infonode, 0, "title", info->GetTitle());
00711
00712 fXML->NewIntAttr(infonode, "v", info->IsA()->GetClassVersion());
00713 fXML->NewIntAttr(infonode, "classversion", info->GetClassVersion());
00714 fXML->NewAttr(infonode, 0, "canoptimize", (info->TestBit(TStreamerInfo::kCannotOptimize) ? xmlio::False : xmlio::True));
00715 fXML->NewIntAttr(infonode, "checksum", info->GetCheckSum());
00716
00717 TIter iter2(info->GetElements());
00718 TStreamerElement* elem=0;
00719 while ((elem= (TStreamerElement*) iter2()) != 0) {
00720 StoreStreamerElement(infonode, elem);
00721 }
00722 }
00723 }
00724
00725
00726 TList* TXMLFile::GetStreamerInfoList()
00727 {
00728
00729
00730
00731 if (fStreamerInfoNode==0) return 0;
00732
00733 TList* list = new TList();
00734
00735 XMLNodePointer_t sinfonode = fXML->GetChild(fStreamerInfoNode);
00736 fXML->SkipEmpty(sinfonode);
00737
00738 while (sinfonode!=0) {
00739 if (strcmp("TStreamerInfo",fXML->GetNodeName(sinfonode))==0) {
00740 TString fname = fXML->GetAttr(sinfonode,"name");
00741 TString ftitle = fXML->GetAttr(sinfonode,"title");
00742
00743 TStreamerInfo* info = new TStreamerInfo(TClass::GetClass(fname));
00744 info->SetTitle(ftitle);
00745
00746 list->Add(info);
00747
00748 Int_t clversion = AtoI(fXML->GetAttr(sinfonode,"classversion"));
00749 info->SetClassVersion(clversion);
00750 Int_t checksum = AtoI(fXML->GetAttr(sinfonode,"checksum"));
00751 info->SetCheckSum(checksum);
00752
00753 const char* canoptimize = fXML->GetAttr(sinfonode,"canoptimize");
00754 if ((canoptimize==0) || (strcmp(canoptimize,xmlio::False)==0))
00755 info->SetBit(TStreamerInfo::kCannotOptimize);
00756 else
00757 info->ResetBit(TStreamerInfo::kCannotOptimize);
00758
00759 XMLNodePointer_t node = fXML->GetChild(sinfonode);
00760 fXML->SkipEmpty(node);
00761 while (node!=0) {
00762 ReadStreamerElement(node, info);
00763 fXML->ShiftToNext(node);
00764 }
00765 }
00766 fXML->ShiftToNext(sinfonode);
00767 }
00768
00769 list->SetOwner();
00770
00771 return list;
00772 }
00773
00774
00775 void TXMLFile::StoreStreamerElement(XMLNodePointer_t infonode, TStreamerElement* elem)
00776 {
00777
00778
00779 TClass* cl = elem->IsA();
00780
00781 XMLNodePointer_t node = fXML->NewChild(infonode, 0, cl->GetName());
00782
00783 char sbuf[100], namebuf[100];
00784
00785 fXML->NewAttr(node,0,"name",elem->GetName());
00786 if (strlen(elem->GetTitle())>0)
00787 fXML->NewAttr(node,0,"title",elem->GetTitle());
00788
00789 fXML->NewIntAttr(node, "v", cl->GetClassVersion());
00790
00791 fXML->NewIntAttr(node, "type", elem->GetType());
00792
00793 if (strlen(elem->GetTypeName())>0)
00794 fXML->NewAttr(node,0,"typename", elem->GetTypeName());
00795
00796 fXML->NewIntAttr(node, "size", elem->GetSize());
00797
00798 if (elem->GetArrayDim()>0) {
00799 fXML->NewIntAttr(node, "numdim", elem->GetArrayDim());
00800
00801 for (int ndim=0;ndim<elem->GetArrayDim();ndim++) {
00802 sprintf(namebuf, "dim%d", ndim);
00803 fXML->NewIntAttr(node, namebuf, elem->GetMaxIndex(ndim));
00804 }
00805 }
00806
00807 if (cl == TStreamerBase::Class()) {
00808 TStreamerBase* base = (TStreamerBase*) elem;
00809 sprintf(sbuf, "%d", base->GetBaseVersion());
00810 fXML->NewAttr(node,0, "baseversion", sbuf);
00811 } else
00812 if (cl == TStreamerBasicPointer::Class()) {
00813 TStreamerBasicPointer* bptr = (TStreamerBasicPointer*) elem;
00814 fXML->NewIntAttr(node, "countversion", bptr->GetCountVersion());
00815 fXML->NewAttr(node, 0, "countname", bptr->GetCountName());
00816 fXML->NewAttr(node, 0, "countclass", bptr->GetCountClass());
00817 } else
00818 if (cl == TStreamerLoop::Class()) {
00819 TStreamerLoop* loop = (TStreamerLoop*) elem;
00820 fXML->NewIntAttr(node, "countversion", loop->GetCountVersion());
00821 fXML->NewAttr(node, 0, "countname", loop->GetCountName());
00822 fXML->NewAttr(node, 0, "countclass", loop->GetCountClass());
00823 } else
00824 if ((cl == TStreamerSTL::Class()) || (cl == TStreamerSTLstring::Class())) {
00825 TStreamerSTL* stl = (TStreamerSTL*) elem;
00826 fXML->NewIntAttr(node, "STLtype", stl->GetSTLtype());
00827 fXML->NewIntAttr(node, "Ctype", stl->GetCtype());
00828 }
00829 }
00830
00831
00832 void TXMLFile::ReadStreamerElement(XMLNodePointer_t node, TStreamerInfo* info)
00833 {
00834
00835
00836 TClass* cl = TClass::GetClass(fXML->GetNodeName(node));
00837 if ((cl==0) || !cl->InheritsFrom(TStreamerElement::Class())) return;
00838
00839 TStreamerElement* elem = (TStreamerElement*) cl->New();
00840
00841 int elem_type = fXML->GetIntAttr(node,"type");
00842
00843 elem->SetName(fXML->GetAttr(node,"name"));
00844 elem->SetTitle(fXML->GetAttr(node,"title"));
00845 elem->SetType(elem_type);
00846 elem->SetTypeName(fXML->GetAttr(node,"typename"));
00847 elem->SetSize(fXML->GetIntAttr(node,"size"));
00848
00849
00850 if (cl == TStreamerBase::Class()) {
00851 int basever = fXML->GetIntAttr(node,"baseversion");
00852 ((TStreamerBase*) elem)->SetBaseVersion(basever);
00853 } else
00854 if (cl == TStreamerBasicPointer::Class()) {
00855 TString countname = fXML->GetAttr(node,"countname");
00856 TString countclass = fXML->GetAttr(node,"countclass");
00857 Int_t countversion = fXML->GetIntAttr(node, "countversion");
00858
00859 ((TStreamerBasicPointer*)elem)->SetCountVersion(countversion);
00860 ((TStreamerBasicPointer*)elem)->SetCountName(countname);
00861 ((TStreamerBasicPointer*)elem)->SetCountClass(countclass);
00862 } else
00863 if (cl == TStreamerLoop::Class()) {
00864 TString countname = fXML->GetAttr(node,"countname");
00865 TString countclass = fXML->GetAttr(node,"countclass");
00866 Int_t countversion = fXML->GetIntAttr(node,"countversion");
00867 ((TStreamerLoop*)elem)->SetCountVersion(countversion);
00868 ((TStreamerLoop*)elem)->SetCountName(countname);
00869 ((TStreamerLoop*)elem)->SetCountClass(countclass);
00870 } else
00871 if ((cl == TStreamerSTL::Class()) || (cl == TStreamerSTLstring::Class())) {
00872 int fSTLtype = fXML->GetIntAttr(node,"STLtype");
00873 int fCtype = fXML->GetIntAttr(node,"Ctype");
00874 ((TStreamerSTL*)elem)->SetSTLtype(fSTLtype);
00875 ((TStreamerSTL*)elem)->SetCtype(fCtype);
00876 }
00877
00878 char namebuf[100];
00879
00880 if (fXML->HasAttr(node, "numdim")) {
00881 int numdim = fXML->GetIntAttr(node,"numdim");
00882 elem->SetArrayDim(numdim);
00883 for (int ndim=0;ndim<numdim;ndim++) {
00884 sprintf(namebuf, "dim%d", ndim);
00885 int maxi = fXML->GetIntAttr(node, namebuf);
00886 elem->SetMaxIndex(ndim, maxi);
00887 }
00888 }
00889
00890 elem->SetType(elem_type);
00891 elem->SetNewType(elem_type);
00892
00893 info->GetElements()->Add(elem);
00894 }
00895
00896
00897 void TXMLFile::SetXmlLayout(EXMLLayout layout)
00898 {
00899
00900
00901
00902
00903
00904
00905
00906
00907
00908
00909
00910
00911
00912
00913
00914
00915
00916
00917
00918
00919
00920
00921
00922
00923 if (IsWritable() && (GetListOfKeys()->GetSize()==0))
00924 TXMLSetup::SetXmlLayout(layout);
00925 }
00926
00927
00928 void TXMLFile::SetStoreStreamerInfos(Bool_t iConvert)
00929 {
00930
00931
00932
00933
00934
00935 if (IsWritable() && (GetListOfKeys()->GetSize()==0))
00936 TXMLSetup::SetStoreStreamerInfos(iConvert);
00937 }
00938
00939
00940 void TXMLFile::SetUsedDtd(Bool_t use)
00941 {
00942
00943
00944
00945
00946 if (IsWritable() && (GetListOfKeys()->GetSize()==0))
00947 TXMLSetup::SetUsedDtd(use);
00948 }
00949
00950
00951 void TXMLFile::SetUseNamespaces(Bool_t iUseNamespaces)
00952 {
00953
00954
00955
00956
00957
00958
00959
00960
00961
00962
00963
00964
00965
00966 if (IsWritable() && (GetListOfKeys()->GetSize()==0))
00967 TXMLSetup::SetUseNamespaces(iUseNamespaces);
00968 }
00969
00970
00971 Bool_t TXMLFile::AddXmlComment(const char* comment)
00972 {
00973
00974
00975
00976
00977 if (!IsWritable() || (fXML==0)) return kFALSE;
00978
00979 return fXML->AddDocComment(fDoc, comment);
00980 }
00981
00982
00983
00984 Bool_t TXMLFile::AddXmlStyleSheet(const char* href,
00985 const char* type,
00986 const char* title,
00987 int alternate,
00988 const char* media,
00989 const char* charset)
00990 {
00991
00992
00993
00994
00995
00996
00997
00998
00999
01000 if (!IsWritable() || (fXML==0)) return kFALSE;
01001
01002 return fXML->AddDocStyleSheet(fDoc, href,type,title,alternate,media,charset);
01003 }
01004
01005
01006 Bool_t TXMLFile::AddXmlLine(const char* line)
01007 {
01008
01009
01010
01011
01012
01013
01014 if (!IsWritable() || (fXML==0)) return kFALSE;
01015
01016 return fXML->AddDocRawLine(fDoc, line);
01017 }
01018
01019
01020 Long64_t TXMLFile::DirCreateEntry(TDirectory* dir)
01021 {
01022
01023
01024 TDirectory* mother = dir->GetMotherDir();
01025 if (mother==0) mother = this;
01026
01027 TKeyXML* key = new TKeyXML(mother, ++fKeyCounter, dir, dir->GetName(), dir->GetTitle());
01028
01029 key->SetSubir();
01030
01031 return key->GetKeyId();
01032 }
01033
01034
01035 TKeyXML* TXMLFile::FindDirKey(TDirectory* dir)
01036 {
01037
01038
01039 TDirectory* motherdir = dir->GetMotherDir();
01040 if (motherdir==0) motherdir = this;
01041
01042 TIter next(motherdir->GetListOfKeys());
01043 TObject* obj = 0;
01044
01045 while ((obj = next())!=0) {
01046 TKeyXML* key = dynamic_cast<TKeyXML*> (obj);
01047
01048 if (key!=0)
01049 if (key->GetKeyId()==dir->GetSeekDir()) return key;
01050 }
01051
01052 return 0;
01053 }
01054
01055
01056
01057 TDirectory* TXMLFile::FindKeyDir(TDirectory* motherdir, Long64_t keyid)
01058 {
01059
01060 if (motherdir==0) motherdir = this;
01061
01062 TIter next(motherdir->GetList());
01063 TObject* obj = 0;
01064
01065 while ((obj = next())!=0) {
01066 TDirectory* dir = dynamic_cast<TDirectory*> (obj);
01067 if (dir!=0)
01068 if (dir->GetSeekDir()==keyid) return dir;
01069 }
01070
01071 return 0;
01072
01073 }
01074
01075
01076 Int_t TXMLFile::DirReadKeys(TDirectory* dir)
01077 {
01078
01079
01080
01081 TKeyXML* key = FindDirKey(dir);
01082 if (key==0) return 0;
01083
01084 return ReadKeysList(dir, key->KeyNode());
01085 }
01086
01087
01088 void TXMLFile::DirWriteKeys(TDirectory*)
01089 {
01090
01091
01092 TIter next(GetListOfKeys());
01093 TObject* obj = 0;
01094
01095 while ((obj = next())!=0) {
01096 TKeyXML* key = dynamic_cast<TKeyXML*> (obj);
01097 if (key!=0) key->UpdateAttributes();
01098 }
01099 }
01100
01101
01102 void TXMLFile::DirWriteHeader(TDirectory* dir)
01103 {
01104
01105 TKeyXML* key = FindDirKey(dir);
01106 if (key!=0)
01107 key->UpdateObject(dir);
01108 }