1    	// @(#)root/io:$Id$
2    	// Author: Rene Brun   22/01/2007
3    	
4    	/*************************************************************************
5    	 * Copyright (C) 1995-2007, Rene Brun and Fons Rademakers.               *
6    	 * All rights reserved.                                                  *
7    	 *                                                                       *
8    	 * For the licensing terms see $ROOTSYS/LICENSE.                         *
9    	 * For the list of contributors see $ROOTSYS/README/CREDITS.             *
10   	 *************************************************************************/
11   	
12   	#ifndef ROOT_TDirectoryFile
13   	#define ROOT_TDirectoryFile
14   	
15   	
16   	//////////////////////////////////////////////////////////////////////////
17   	//                                                                      //
18   	// TDirectoryFile                                                       //
19   	//                                                                      //
20   	// Describe directory structure in a ROOT file.                         //
21   	//                                                                      //
22   	//////////////////////////////////////////////////////////////////////////
23   	
24   	#ifndef ROOT_TDirectory
25   	#include "TDirectory.h"
26   	#endif
27   	
28   	class TList;
29   	class TBrowser;
30   	class TKey;
31   	class TFile;
32   	
33   	class TDirectoryFile : public TDirectory {
34   	
35   	protected:
36   	   Bool_t      fModified;        //true if directory has been modified
37   	   Bool_t      fWritable;        //true if directory is writable
38   	   TDatime     fDatimeC;         //Date and time when directory is created
39   	   TDatime     fDatimeM;         //Date and time of last modification
40   	   Int_t       fNbytesKeys;      //Number of bytes for the keys
41   	   Int_t       fNbytesName;      //Number of bytes in TNamed at creation time
42   	   Int_t       fBufferSize;      //Default buffer size to create new TKeys
43   	   Long64_t    fSeekDir;         //Location of directory on file
44   	   Long64_t    fSeekParent;      //Location of parent directory on file
45   	   Long64_t    fSeekKeys;        //Location of Keys record on file
46   	   TFile      *fFile;            //pointer to current file in memory
47   	   TList      *fKeys;            //Pointer to keys list in memory
48   	
49   	   virtual void         CleanTargets();
50   	   void Init(TClass *cl = 0);
51   	
52   	private:
53   	   TDirectoryFile(const TDirectoryFile &directory);  //Directories cannot be copied
54   	   void operator=(const TDirectoryFile &); //Directories cannot be copied
55   	
56   	public:
57   	   // TDirectory status bits
58   	   enum { kCloseDirectory = BIT(7) };
59   	
60   	   TDirectoryFile();
61   	   TDirectoryFile(const char *name, const char *title, Option_t *option="", TDirectory* motherDir = 0);
62   	   virtual ~TDirectoryFile();
63   	   virtual void        Append(TObject *obj, Bool_t replace = kFALSE);
64   	           void        Add(TObject *obj, Bool_t replace = kFALSE) { Append(obj,replace); }
65   	           Int_t       AppendKey(TKey *key);
66   	   virtual void        Browse(TBrowser *b);
67   	           void        Build(TFile* motherFile = 0, TDirectory* motherDir = 0);
68   	   virtual TObject    *CloneObject(const TObject *obj, Bool_t autoadd = kTRUE);
69   	   virtual void        Close(Option_t *option="");
70   	   virtual void        Copy(TObject &) const { MayNotUse("Copy(TObject &)"); }
71   	   virtual Bool_t      cd(const char *path = 0);
72   	   virtual void        Delete(const char *namecycle="");
73   	   virtual void        FillBuffer(char *&buffer);
74   	   virtual TKey       *FindKey(const char *keyname) const;
75   	   virtual TKey       *FindKeyAny(const char *keyname) const;
76   	   virtual TObject    *FindObjectAny(const char *name) const;
77   	   virtual TObject    *FindObjectAnyFile(const char *name) const;
78   	   virtual TObject    *Get(const char *namecycle);
79   	   virtual TDirectory *GetDirectory(const char *apath, Bool_t printError = false, const char *funcname = "GetDirectory");
80   	   template <class T> inline void GetObject(const char* namecycle, T*& ptr) // See TDirectory::Get for information
81   	      {
82   	         ptr = (T*)GetObjectChecked(namecycle,TBuffer::GetClass(typeid(T)));
83   	      }
84   	   virtual void       *GetObjectChecked(const char *namecycle, const char* classname);
85   	   virtual void       *GetObjectChecked(const char *namecycle, const TClass* cl);
86   	   virtual void       *GetObjectUnchecked(const char *namecycle);
87   	   virtual Int_t       GetBufferSize() const;
88   	   const TDatime      &GetCreationDate() const { return fDatimeC; }
89   	   virtual TFile      *GetFile() const { return fFile; }
90   	   virtual TKey       *GetKey(const char *name, Short_t cycle=9999) const;
91   	   virtual TList      *GetListOfKeys() const { return fKeys; }
92   	   const TDatime      &GetModificationDate() const { return fDatimeM; }
93   	   virtual Int_t       GetNbytesKeys() const { return fNbytesKeys; }
94   	   virtual Int_t       GetNkeys() const { return fKeys->GetSize(); }
95   	   virtual Long64_t    GetSeekDir() const { return fSeekDir; }
96   	   virtual Long64_t    GetSeekParent() const { return fSeekParent; }
97   	   virtual Long64_t    GetSeekKeys() const { return fSeekKeys; }
98   	   Bool_t              IsModified() const { return fModified; }
99   	   Bool_t              IsWritable() const { return fWritable; }
100  	   virtual void        ls(Option_t *option="") const;
101  	   virtual TDirectory *mkdir(const char *name, const char *title="");
102  	   virtual TFile      *OpenFile(const char *name, Option_t *option= "",
103  	                            const char *ftitle = "", Int_t compress = 1,
104  	                            Int_t netopt = 0);
105  	   virtual void        Purge(Short_t nkeep=1);
106  	   virtual void        ReadAll(Option_t *option="");
107  	   virtual Int_t       ReadKeys(Bool_t forceRead=kTRUE);
108  	   virtual Int_t       ReadTObject(TObject *obj, const char *keyname);
109  	   virtual void        ResetAfterMerge(TFileMergeInfo *);
110  	   virtual void        rmdir(const char *name);
111  	   virtual void        Save();
112  	   virtual void        SaveSelf(Bool_t force = kFALSE);
113  	   virtual Int_t       SaveObjectAs(const TObject *obj, const char *filename="", Option_t *option="") const;
114  	   virtual void        SetBufferSize(Int_t bufsize);
115  	   void                SetModified() {fModified = kTRUE;}
116  	   void                SetSeekDir(Long64_t v) { fSeekDir = v; }
117  	   virtual void        SetTRefAction(TObject *ref, TObject *parent);
118  	   void                SetWritable(Bool_t writable=kTRUE);
119  	   virtual Int_t       Sizeof() const;
120  	   virtual Int_t       Write(const char *name=0, Int_t opt=0, Int_t bufsize=0);
121  	   virtual Int_t       Write(const char *name=0, Int_t opt=0, Int_t bufsize=0) const ;
122  	   virtual Int_t       WriteTObject(const TObject *obj, const char *name=0, Option_t *option="", Int_t bufsize=0);
123  	   virtual Int_t       WriteObjectAny(const void *obj, const char *classname, const char *name, Option_t *option="", Int_t bufsize=0);
124  	   virtual Int_t       WriteObjectAny(const void *obj, const TClass *cl, const char *name, Option_t *option="", Int_t bufsize=0);
125  	   virtual void        WriteDirHeader();
126  	   virtual void        WriteKeys();
127  	
128  	   ClassDef(TDirectoryFile,5)  //Describe directory structure in a ROOT file
129  	};
130  	
131  	#endif
132