summaryrefslogtreecommitdiffstats
path: root/kdat/File.h
diff options
context:
space:
mode:
Diffstat (limited to 'kdat/File.h')
-rw-r--r--kdat/File.h201
1 files changed, 201 insertions, 0 deletions
diff --git a/kdat/File.h b/kdat/File.h
new file mode 100644
index 0000000..0dda512
--- /dev/null
+++ b/kdat/File.h
@@ -0,0 +1,201 @@
+// 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 File_H
+#define File_H
+
+#include <stdio.h>
+
+#include <qptrlist.h>
+#include <qstring.h>
+
+#include "Range.h"
+#include "kdat.h"
+
+/**
+ * @short This class represents a single file or directory in a tar file.
+ */
+class File {
+ bool _stubbed;
+ union {
+ struct {
+ int _size;
+ int _mtime;
+ int _startRecord;
+ int _endRecord;
+ } _data;
+ struct {
+ FILE* _fptr;
+ int _offset;
+ } _stub;
+ } _union;
+ QString _name;
+ File* _parent;
+ QPtrList<File> _children;
+ RangeList _ranges;
+public:
+ /**
+ * Create a new file entry.
+ *
+ * @param parent The directory file entry that contains this file.
+ * @param size The size of the file in bytes.
+ * @param mtime The last modification time of the file in seconds since
+ * the Epoch.
+ * @param startRecord The first tar record number in the file.
+ * @param endRecord The last tar record number in the file.
+ * @param name The file name. If the file name ends with a '/' then it
+ * is assumed to be a directory name. Only the last part of
+ * the file's path name should be passed in. The rest of the
+ * path is determined by this file entry's ancestors.
+ */
+ File( File* parent, int size, int mtime, int startRecord, int endRecord, const QString & name );
+
+ /**
+ * Create a new stubbed instance of a file entry. 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 parent The directory file entry that contains this file.
+ * @param fptr The open index file containing this file entry. The file
+ * must be left open so that the file entry information can
+ * be read at a later time.
+ * @param offset The offset that will be seeked to when reading the file
+ * entry information.
+ */
+ File( File* parent, FILE* fptr, int offset );
+
+ /**
+ * Destroy the file entry and all of its children.
+ */
+ ~File();
+
+ /**
+ * Insure that all of the data fields for this file entry have been read
+ * in. If the file entry is a stub then the actual data is read from the
+ * index file. If the file 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 for this file entry and all of it's
+ * 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 file entry to the open file. Entries for each of its
+ * children will also be written.
+ */
+ void write( FILE* fptr );
+
+ /**
+ * Determine whether this file entry represents a directory. If the file
+ * name ends in a '/' then it is assumed that it is a directory.
+ *
+ * @return TRUE if the file represents a directory, or FALSE if it is an
+ * ordinary file.
+ */
+ bool isDirectory();
+
+ /**
+ * Get the size of the file.
+ *
+ * @return The size, in bytes, of the file.
+ */
+ int getSize();
+
+ /**
+ * Get the last modification time for the file.
+ *
+ * @ return The last time the file was modified, in seconds since the Epoch.
+ */
+ int getMTime();
+
+ /**
+ * Get the tar record number for the file. This is the number of 512-byte
+ * tar blocks that must be read before getting to this file.
+ *
+ * @return The tar record number for the file.
+ */
+ int getStartRecord();
+
+ /**
+ * Get the tar record number that is just past the end of the file. This
+ * number minus the start record gives the number of 512-byte tar blocks
+ * that this file occupies in the archive.
+ *
+ * @return The last tar record number for the file.
+ */
+ int getEndRecord();
+
+ /**
+ * Get the name of this file. Only the last component of the full path
+ * name is returned.
+ *
+ * @return The file's name.
+ */
+ QString getName();
+
+ /**
+ * Get the full path name of the file.
+ *
+ * @return The full path to the file.
+ */
+ QString getFullPathName();
+
+ /**
+ * Get the file entry's parent. A NULL parent indicates that this is one
+ * of (possibly) many top level directories within the tar archive.
+ *
+ * @return A pointer to the file entry that contains this file entry.
+ */
+ File* getParent();
+
+ /**
+ * Get the children of this file entry. A normal file will never have any
+ * children. A directory may or may not have children.
+ *
+ * @return A list of the immediate children of this file entry.
+ */
+ const QPtrList<File>& getChildren();
+
+ /**
+ * Get the list of ranges of this file and all of its children.
+ *
+ * @return A list of ranges.
+ */
+ const QPtrList<Range>& getRanges();
+
+ /**
+ * Add a new file entry as a child of this file entry.
+ *
+ * @param file The file to add.
+ */
+ void addChild( File* file );
+
+ /**
+ * Recursively calculate the list of ranges for all of the file's children.
+ */
+ void calcRanges();
+};
+
+#endif