// KDat - a tar-based DAT archiver // Copyright (C) 1998-2000 Sean Vyain, svyain@mail.tds.net // Copyright (C) 2001-2002 Lawrence Widman, kdat@cardiothink.com // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA #ifndef _Archive_h_ #define _Archive_h_ #include #include #include #include "File.h" class Tape; /** * @short This class represents a single tar archive. */ class Archive { bool _stubbed; int _endBlock; int _ctime; FILE* _fptr; int _offset; TQString _name; TQPtrList _children; RangeList _ranges; Tape* _tape; public: /** * Create a new archive. * * @param tape The tape containing this archive. * @param ctime The create time of the archive. * @param name The name given to this archive by the user. */ Archive( Tape* tape, int ctime, const TQString & name ); /** * Create a new stubbed instance of an archive. The file pointer and * offset specify where the actual instance data can be found. The real * data is read on demand when one of the accessor functions is called. * * @param tape The tape containing this archive. * @param fptr The open index file containing this archive entry. The file * must be left open so that the archive entry information can * be read at a later time. * @param offset The offset that will be seeked to when reading the archive * entry information. */ Archive( Tape* tape, FILE* fptr, int offset ); /** * Destroy the archive entry and all of its children. */ ~Archive(); /** * Insure that all of the data fields for this archive entry have been read * in. If the archive entry is a stub then the actual data is read from the * index file. If the archive entry is not a stub then no action is taken. * * @param version The version of the old tape index. */ void read( int version = KDAT_INDEX_FILE_VERSION ); /** * Recursively read the instance data for this archive entry and all of its * children. This method is used when converting from an older index format. * * @param version The version of the old tape index. */ void readAll( int version ); /** * Write out the archive entry to the open file. Entries for each of its * children will also be written. */ void write( FILE* fptr ); /** * Get the creation time for this archive. * * @return The creation time in seconds since the Epoch. */ int getCTime(); /** * Get the last tape block of this archive. * * @return The last tape block used by this archive. */ int getEndBlock(); /** * Get the name of this archive. * * @return The name of this archive. */ TQString getName(); /** * Get the tape that contains this archive. * * @return A pointer to the tape containing this archive. */ Tape* getTape(); /** * Get the list of top-level files in this archive. * * @return A list of the immediate children of this archive. */ const TQPtrList& getChildren(); /** * Get the list of ranges of this file and all of its children. * * @return A list of ranges. */ const TQPtrList& getRanges(); /** * Set the ending tape block for this archive. * * @param endBlock The last tape block used by this archive. */ void setEndBlock( int endBlock ); /** * Set the name of this archive. * * @param name The new archive name. */ void setName( const TQString & name ); /** * Add a new top level file as a child of this archive. * * @param file The file to add. */ void addChild( File* file ); /** * Create a new file entry, and add it to the archive. Based on the * full path name of the file, an appropriate parent is found. The parent * may be this archive or another file entry. File entries will be created * on demand if some or all of the file's path does not yet exist in this * archive. * * @param size The size, in bytes, of the file. * @param mtime The last modification time for the file, in seconds since * the Epoch. * @param startRecord The first tar record number of this file. * @param endRecord The last tar record number of this file. * @param name The full path name for the file. * * @return A pointer to the newly created file entry. */ File* addFile( int size, int mtime, int startRecord, int endRecord, const TQString & filename ); /** * Recursively calculate the list of ranges for all of the archive's children. */ void calcRanges(); }; #endif