123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225 |
- // -*- mode: cpp; mode: fold -*-
- // Description /*{{{*/
- // $Id: filelist.h,v 1.10 1999/12/26 06:59:00 jgg Exp $
- /* ######################################################################
-
- File List structures
-
- These structures represent the uncompacted binary records from the
- file list file. Functions are provided to compact and decompact these
- structures for reading and writing.
- The dsFList class can be instantiated to get get a general 'all records'
- storage. It also has a member to read the next record from the IO and
- to print out a record summary.
-
- Be sure to read filelist.sgml which contains the precise meaning of
- the feilds and the compaction technique used.
- ##################################################################### */
- /*}}}*/
- #ifndef DSYNC_FILELIST
- #define DSYNC_FILELIST
- #ifdef __GNUG__
- #pragma interface "dsync/filelist.h"
- #endif
- #include <string>
- using namespace std;
- class dsFList
- {
- public:
-
- class IO;
- struct Header
- {
- unsigned long Tag;
- unsigned long Signature;
- unsigned long MajorVersion;
- unsigned long MinorVersion;
- unsigned long Epoch;
-
- unsigned long FlagCount;
- unsigned long Flags[15];
- bool Read(IO &IO);
- bool Write(IO &IO);
-
- Header();
- };
-
- struct DirEntity
- {
- unsigned long Tag;
- signed long ModTime;
- unsigned long Permissions;
- unsigned long User;
- unsigned long Group;
- string Name;
- enum EntFlags {FlPerm = (1<<0), FlOwner = (1<<1)};
-
- /* You know what? egcs-2.91.60 will not call the destructor for Name
- if this in not here. I can't reproduce this in a simpler context
- either. - Jgg [time passes] serious egcs bug, it was mislinking
- the string classes :< */
- ~DirEntity() {};
- };
-
- struct Directory : public DirEntity
- {
- bool Read(IO &IO);
- bool Write(IO &IO);
- };
-
- struct NormalFile : public DirEntity
- {
- unsigned long Size;
- unsigned char MD5[16];
-
- enum Flags {FlMD5 = (1<<2)};
-
- bool Read(IO &IO);
- bool Write(IO &IO);
- };
-
- struct Symlink : public DirEntity
- {
- unsigned long Compress;
- string To;
-
- bool Read(IO &IO);
- bool Write(IO &IO);
- };
-
- struct DeviceSpecial : public DirEntity
- {
- unsigned long Dev;
-
- bool Read(IO &IO);
- bool Write(IO &IO);
- };
-
- struct Filter
- {
- unsigned long Tag;
- unsigned long Type;
- string Pattern;
-
- enum Types {Include=1, Exclude=2};
-
- bool Read(IO &IO);
- bool Write(IO &IO);
- };
-
- struct UidGidMap
- {
- unsigned long Tag;
- unsigned long FileID;
- unsigned long RealID;
- string Name;
-
- enum Flags {FlRealID = (1<<0)};
-
- bool Read(IO &IO);
- bool Write(IO &IO);
- };
-
- struct HardLink : public NormalFile
- {
- unsigned long Serial;
-
- bool Read(IO &IO);
- bool Write(IO &IO);
- };
-
- struct Trailer
- {
- unsigned long Tag;
- unsigned long Signature;
-
- bool Read(IO &IO);
- bool Write(IO &IO);
- Trailer();
- };
-
- struct RSyncChecksum
- {
- unsigned long Tag;
- unsigned long BlockSize;
- unsigned long FileSize;
- // Array of 160 bit values (20 bytes) stored in Network byte order
- unsigned char *Sums;
-
- bool Read(IO &IO);
- bool Write(IO &IO);
- RSyncChecksum();
- ~RSyncChecksum();
- };
-
- struct AggregateFile
- {
- unsigned long Tag;
- string File;
-
- bool Read(IO &IO);
- bool Write(IO &IO);
- };
-
-
- enum Types {tHeader=0, tDirMarker=1, tDirStart=2, tDirEnd=3, tNormalFile=4,
- tSymlink=5, tDeviceSpecial=6, tDirectory=7, tFilter=8,
- tUidMap=9, tGidMap=10, tHardLink=11, tTrailer=12, tRSyncChecksum=13,
- tAggregateFile=14, tRSyncEnd=15};
- unsigned long Tag;
- Header Head;
- Directory Dir;
- NormalFile NFile;
- Symlink SLink;
- DeviceSpecial DevSpecial;
- Filter Filt;
- UidGidMap UMap;
- HardLink HLink;
- Trailer Trail;
- DirEntity *Entity;
- NormalFile *File;
- RSyncChecksum RChk;
- AggregateFile AgFile;
-
- bool Step(IO &IO);
- bool Print(ostream &out);
- };
- class dsFList::IO
- {
- public:
- string LastSymlink;
- dsFList::Header Header;
- bool NoStrings;
-
- virtual bool Read(void *Buf,unsigned long Len) = 0;
- virtual bool Write(const void *Buf,unsigned long Len) = 0;
- virtual bool Seek(unsigned long Bytes) = 0;
- virtual unsigned long Tell() = 0;
-
- bool ReadNum(unsigned long &Number);
- bool WriteNum(unsigned long Number);
- bool ReadInt(unsigned long &Number,unsigned char Count);
- bool WriteInt(unsigned long Number,unsigned char Count);
- bool ReadInt(signed long &Number,unsigned char Count);
- bool WriteInt(signed long Number,unsigned char Count);
- bool ReadString(string &Foo);
- bool WriteString(string const &Foo);
-
- IO();
- virtual ~IO() {};
- };
- #endif
|