// @(#)root/io:$Id$
// Author: Fons Rademakers   30/6/04

/*************************************************************************
 * Copyright (C) 1995-2004, Rene Brun and Fons Rademakers.               *
 * All rights reserved.                                                  *
 *                                                                       *
 * For the licensing terms see $ROOTSYS/LICENSE.                         *
 * For the list of contributors see $ROOTSYS/README/CREDITS.             *
 *************************************************************************/

#ifndef ROOT_TArchiveFile
#define ROOT_TArchiveFile


//////////////////////////////////////////////////////////////////////////
//                                                                      //
// TArchiveFile                                                         //
//                                                                      //
// This is an abstract class that describes an archive file containing  //
// multiple sub-files, like a ZIP or TAR archive.                       //
//                                                                      //
//////////////////////////////////////////////////////////////////////////

#ifndef ROOT_TObject
#include "TObject.h"
#endif
#ifndef ROOT_TString
#include "TString.h"
#endif
#ifndef ROOT_TDatime
#include "TDatime.h"
#endif

class TFile;
class TArchiveMember;
class TObjArray;


class TArchiveFile : public TObject {

private:
   TArchiveFile(const TArchiveFile&);            // Not implemented because TArchiveFile can not be copied.
   TArchiveFile& operator=(const TArchiveFile&); // Not implemented because TArchiveFile can not be copied.

protected:
   TString         fArchiveName;  // Archive file name
   TString         fMemberName;   // Sub-file name
   Int_t           fMemberIndex;  // Index of sub-file in archive
   TFile          *fFile;         // File stream used to access the archive
   TObjArray      *fMembers;      // Members in this archive
   TArchiveMember *fCurMember;    // Current archive member

   static Bool_t ParseUrl(const char *url, TString &archive, TString &member, TString &type);

public:
   TArchiveFile() : fArchiveName(""), fMemberName(""), fMemberIndex(-1), fFile(0), fMembers(0), fCurMember(0) { }
   TArchiveFile(const char *archive, const char *member, TFile *file);
   virtual ~TArchiveFile();

   virtual Int_t   OpenArchive() = 0;
   virtual Int_t   SetCurrentMember() = 0;
   virtual Int_t   SetMember(const char *member);
   virtual Int_t   SetMember(Int_t idx);

   Long64_t        GetMemberFilePosition() const;
   TArchiveMember *GetMember() const { return fCurMember; }
   TObjArray      *GetMembers() const { return fMembers; }
   Int_t           GetNumberOfMembers() const;

   const char     *GetArchiveName() const { return fArchiveName; }
   const char     *GetMemberName() const { return fMemberName; }
   Int_t           GetMemberIndex() const { return fMemberIndex; }

   static TArchiveFile *Open(const char *url, TFile *file);

   ClassDef(TArchiveFile,1)  //An archive file containing multiple sub-files (like a ZIP archive)
};


class TArchiveMember : public TObject {

friend class TArchiveFile;

protected:
   TString    fName;          // Name of member
   TString    fComment;       // Comment field
   TDatime    fModTime;       // Modification time
   Long64_t   fPosition;      // Byte position in archive
   Long64_t   fFilePosition;  // Byte position in archive where member data starts
   Long64_t   fCsize;         // Compressed size
   Long64_t   fDsize;         // Decompressed size
   Bool_t     fDirectory;     // Flag indicating this is a directory

public:
   TArchiveMember();
   TArchiveMember(const char *name);
   TArchiveMember(const TArchiveMember &member);
   TArchiveMember &operator=(const TArchiveMember &rhs);
   virtual ~TArchiveMember() { }

   const char *GetName() const { return fName; }
   const char *GetComment() const { return fComment; }
   TDatime     GetModTime() const { return fModTime; }
   Long64_t    GetPosition() const { return fPosition; }
   Long64_t    GetFilePosition() const { return fFilePosition; }
   Long64_t    GetCompressedSize() const { return fCsize; }
   Long64_t    GetDecompressedSize() const { return fDsize; }
   Bool_t      IsDirectory() const { return fDirectory; }

   ClassDef(TArchiveMember,1)  //An archive member file
};

#endif
 TArchiveFile.h:1
 TArchiveFile.h:2
 TArchiveFile.h:3
 TArchiveFile.h:4
 TArchiveFile.h:5
 TArchiveFile.h:6
 TArchiveFile.h:7
 TArchiveFile.h:8
 TArchiveFile.h:9
 TArchiveFile.h:10
 TArchiveFile.h:11
 TArchiveFile.h:12
 TArchiveFile.h:13
 TArchiveFile.h:14
 TArchiveFile.h:15
 TArchiveFile.h:16
 TArchiveFile.h:17
 TArchiveFile.h:18
 TArchiveFile.h:19
 TArchiveFile.h:20
 TArchiveFile.h:21
 TArchiveFile.h:22
 TArchiveFile.h:23
 TArchiveFile.h:24
 TArchiveFile.h:25
 TArchiveFile.h:26
 TArchiveFile.h:27
 TArchiveFile.h:28
 TArchiveFile.h:29
 TArchiveFile.h:30
 TArchiveFile.h:31
 TArchiveFile.h:32
 TArchiveFile.h:33
 TArchiveFile.h:34
 TArchiveFile.h:35
 TArchiveFile.h:36
 TArchiveFile.h:37
 TArchiveFile.h:38
 TArchiveFile.h:39
 TArchiveFile.h:40
 TArchiveFile.h:41
 TArchiveFile.h:42
 TArchiveFile.h:43
 TArchiveFile.h:44
 TArchiveFile.h:45
 TArchiveFile.h:46
 TArchiveFile.h:47
 TArchiveFile.h:48
 TArchiveFile.h:49
 TArchiveFile.h:50
 TArchiveFile.h:51
 TArchiveFile.h:52
 TArchiveFile.h:53
 TArchiveFile.h:54
 TArchiveFile.h:55
 TArchiveFile.h:56
 TArchiveFile.h:57
 TArchiveFile.h:58
 TArchiveFile.h:59
 TArchiveFile.h:60
 TArchiveFile.h:61
 TArchiveFile.h:62
 TArchiveFile.h:63
 TArchiveFile.h:64
 TArchiveFile.h:65
 TArchiveFile.h:66
 TArchiveFile.h:67
 TArchiveFile.h:68
 TArchiveFile.h:69
 TArchiveFile.h:70
 TArchiveFile.h:71
 TArchiveFile.h:72
 TArchiveFile.h:73
 TArchiveFile.h:74
 TArchiveFile.h:75
 TArchiveFile.h:76
 TArchiveFile.h:77
 TArchiveFile.h:78
 TArchiveFile.h:79
 TArchiveFile.h:80
 TArchiveFile.h:81
 TArchiveFile.h:82
 TArchiveFile.h:83
 TArchiveFile.h:84
 TArchiveFile.h:85
 TArchiveFile.h:86
 TArchiveFile.h:87
 TArchiveFile.h:88
 TArchiveFile.h:89
 TArchiveFile.h:90
 TArchiveFile.h:91
 TArchiveFile.h:92
 TArchiveFile.h:93
 TArchiveFile.h:94
 TArchiveFile.h:95
 TArchiveFile.h:96
 TArchiveFile.h:97
 TArchiveFile.h:98
 TArchiveFile.h:99
 TArchiveFile.h:100
 TArchiveFile.h:101
 TArchiveFile.h:102
 TArchiveFile.h:103
 TArchiveFile.h:104
 TArchiveFile.h:105
 TArchiveFile.h:106
 TArchiveFile.h:107
 TArchiveFile.h:108
 TArchiveFile.h:109
 TArchiveFile.h:110
 TArchiveFile.h:111
 TArchiveFile.h:112
 TArchiveFile.h:113
 TArchiveFile.h:114