#include "TFileInfo.h"
#include "Riostream.h"
#include "TSystem.h"
#include "TRegexp.h"
#include "TError.h"
ClassImp(TFileInfo)
TFileInfo::TFileInfo(const char *url , Long64_t size, const char *uuid,
   const char *md5, Long64_t entries, Long64_t first, Long64_t last,
   TObject *meta) : fCurrentUrl(0), fUrlList(0), fSize(size), fUUID(0),
   fMD5(0), fEntries(entries), fFirst(first), fLast(last), fMetaDataObject(meta)
{
   
   if (uuid)
      fUUID = new TUUID(uuid);
   else
      fUUID = new TUUID;
   if (md5)
      fMD5 = new TMD5((const UChar_t*)md5);
   else
      fMD5 = new TMD5;
   
   SetName(fUUID->AsString());
   SetTitle("TFileInfo");
   fCurrentUrl = 0;
   if (url) {
      fUrlList = new TList();
      fUrlList->SetOwner();
      
      AddUrl(url);
   }
}
TFileInfo::~TFileInfo()
{
   
   SafeDelete(fMetaDataObject);
   SafeDelete(fUUID);
   SafeDelete(fMD5);
   SafeDelete(fUrlList);
}
TUrl *TFileInfo::NextUrl()
{
   
   
   
   if (fCurrentUrl && (fCurrentUrl == fUrlList->First())) {
      TUrl *returl = GetCurrentUrl();
      fCurrentUrl = (TUrl*)fUrlList->After((TObject*)fCurrentUrl);
      return returl;
   }
   if (fCurrentUrl)
      fCurrentUrl = (TUrl*)fUrlList->After((TObject*)fCurrentUrl);
   return GetCurrentUrl();
}
TUrl *TFileInfo::FindByUrl(const char *url)
{
   
   TIter nextUrl(fUrlList);
   TUrl *urlelement;
   while  ( (urlelement = (TUrl*) nextUrl() ) ) {
      if ( TString(urlelement->GetUrl()) == TString(url) ) {
         return urlelement;
      }
   }
   return 0;
}
Bool_t TFileInfo::AddUrl(const char *url)
{
   
   if (FindByUrl(url)) {
      return kFALSE;
   }
   TUrl *newurl = new TUrl(url);
   
   if (fUrlList->GetSize() == 0) {
      fCurrentUrl = newurl;
   }
   fUrlList->Add( newurl );
   return kTRUE;
}
Bool_t TFileInfo::RemoveUrl(const char *url)
{
   
   TUrl *lurl;
   if ((lurl=(TUrl*)FindByUrl(url))) {
      fUrlList->Remove((TObject*) lurl);
      return kTRUE;
   }
   return kFALSE;
}
void TFileInfo::AddMetaDataObject(TObject *obj)
{
   
   if (obj) {
      if (fMetaDataObject)
         delete fMetaDataObject;
      fMetaDataObject = obj;
   }
}
void TFileInfo::RemoveMetaDataObject()
{
   
   if (fMetaDataObject) {
      delete fMetaDataObject;
      fMetaDataObject = 0;
   }
}
Int_t TFileInfo::Compare(const TObject *obj) const
{
   
   if (this == obj) return 0;
   if (TFileInfo::Class() != obj->IsA()) return -1;
   return (GetFirstUrl()->Compare(((TFileInfo*)obj)->GetFirstUrl()));
}
void TFileInfo::Print(Option_t * ) const
{
   
   cout << "UUID: " << GetUUID()->AsString() << " Size: " << GetSize() << " MD5: " << GetMD5()->AsString() << endl;
   TIter next(fUrlList);
   TObject* obj;
   while ( (obj = next() ) ){
      const char *url = ((TUrl*)obj)->GetUrl();
      cout << " URL: " << url << endl;
   }
}
TList *TFileInfo::CreateList(const char *file)
{
   
   
   
   
   Int_t fileCount = 0;
   ifstream f;
   TList* fileList = 0;
   f.open(gSystem->ExpandPathName(file), ifstream::out);
   if (f.is_open()) {
      fileList = new TList;
      while (f.good()) {
         TString line;
         line.ReadToDelim(f);
         if (!line.IsWhitespace()) {
            fileList->Add(new TFileInfo(line.Data()));
            fileCount++;
         }
      }
      f.close();
   } else {
      ::Error("TFileInfo::CreateList", "unable to open file %s", file);
   }
   return fileList;
}
TList *TFileInfo::CreateListMatching(const char *files)
{
   
   
   
   
   if (!files || strlen(files) <= 0) {
      ::Info("TFileInfo::CreateListMatching", "input path undefined");
      return 0;
   }
   
   TList *fileList = new TList();
   fileList->SetOwner();
   FileStat_t st;
   
   if (gSystem->GetPathInfo(files, st) == 0) {
      if (R_ISREG(st.fMode)) {
         
         fileList->Add(new TFileInfo(files));
         return fileList;
      }
   } else {
      void *dataSetDir = gSystem->OpenDirectory(gSystem->DirName(files));
      if (!dataSetDir) {
         
         ::Error("TFileInfo::CreateListMatching",
                 "directory %s cannot be open", gSystem->DirName(files));
      } else {
         const char* ent;
         TString filesExp(gSystem->BaseName(files));
         filesExp.ReplaceAll("*",".*");
         TRegexp rg(filesExp);
         while ((ent = gSystem->GetDirEntry(dataSetDir))) {
            TString entryString(ent);
            if (entryString.Index(rg) != kNPOS) {
               
               TString fn(Form("%s/%s",gSystem->DirName(files), ent));
               gSystem->GetPathInfo(fn, st);
               if (R_ISREG(st.fMode))
                  
                  fileList->Add(new TFileInfo(fn));
            }
         }
         
         gSystem->FreeDirectory(dataSetDir);
      }
   }
   if (fileList->GetSize() == 0) {
      ::Error("TFileInfo::CreateListMatching",
              "no files match your selection, the list was not created");
      delete fileList;
      return 0;
   }
   
   return fileList;
}
This page has been automatically generated. If you have any comments or suggestions about the page layout send a mail to ROOT support, or contact the developers with any questions or problems regarding ROOT.