root/branches/3.00/src/archive.h

Revision 644, 3.0 kB (checked in by fujii, 3 years ago)

Add new netinstall source.

Line 
1 /*
2  * Copyright (c) 2001, Robert Collins.
3  *
4  *     This program is free software; you can redistribute it and/or modify
5  *     it under the terms of the GNU General Public License as published by
6  *     the Free Software Foundation; either version 2 of the License, or
7  *     (at your option) any later version.
8  *
9  *     A copy of the GNU General Public License can be found at
10  *     http://www.gnu.org/
11  *
12  * Written by Robert Collins  <rbtcollins@hotmail.com>
13  *
14  */
15
16 #ifndef SETUP_ARCHIVE_H
17 #define SETUP_ARCHIVE_H
18
19 /* this is the parent class for all archive IO operations.
20  * It
21  */
22
23 #include "String++.h"
24
25 /* The read/write the archive stream to get the archive data is flawed.
26  * The problem is that you then need a *different* gzip etc class to be able
27  * to ungzip a gzip from within an archive.
28  * The correct way is to
29  * 1) retrieve the file name.
30  * 2) the user creates their own output object.
31  * 3) the user calls extract_file (output strea,).
32  */
33
34 typedef enum
35 {
36   ARCHIVE_FILE_INVALID,
37   ARCHIVE_FILE_REGULAR,
38   ARCHIVE_FILE_HARDLINK,
39   ARCHIVE_FILE_SYMLINK,
40   ARCHIVE_FILE_DIRECTORY
41 }
42 archive_file_t;
43
44
45 class archive:public io_stream
46 {
47 public:
48   /* get an archive child class from an io_stream */
49   static archive *extract (io_stream *);
50   /* get an ouput stream for the next files from the archive.
51    * returns NULL on failure.
52    * The stream is not taken over - it will not be automatically deleted
53    */
54   virtual io_stream *extract_file () = 0;
55   /* extract the next file to the given prefixURL+Path in one step, and name it with the
56    * given suffix.
57    * returns 1 on failure.
58    */
59   static int extract_file (archive *, String const &, String const &, String const = String());
60
61   /*
62    * To create a stream that will be compressed, you should open the url, and then get a new stream
63    * from compress::compress.
64    */
65   /* read data - not valid for archives (duh!)
66    * Could be made valid via the read-child-directly model
67    */
68 //  virtual ssize_t read(void *buffer, size_t len) {return -1;};
69   /* provide data to (double duh!) */
70 //  virtual ssize_t write(void *buffer, size_t len) { return -1;};
71   /* read data without removing it from the class's internal buffer */
72 //  virtual ssize_t peek(void *buffer, size_t len);
73 //  virtual long tell ();
74   /* try guessing this one */
75 //  virtual int error ();
76   /* Find out the next stream name -
77    * ie for foo.tar.gz, at offset 0, next_file_name = foo.tar
78    * for foobar that is an compress, next_file_name is the next
79    * extractable filename.
80    * The way this works is that when read returns 0, you are at the end of *a* file.
81    * next_file_name will allow read to be called again, if it returns !NULL
82    */
83   virtual String const next_file_name () = 0;
84   virtual archive_file_t next_file_type () = 0;
85   virtual String const linktarget () = 0;
86   virtual int skip_file () = 0;
87   /* if you are still needing these hints... give up now! */
88   virtual ~archive() = 0;
89 protected:
90   void operator= (const archive &);
91   archive () {};
92   archive (const archive &);
93 private:
94 //  archive () {};
95 };
96
97 #endif /* SETUP_ARCHIVE_H */
Note: See TracBrowser for help on using the browser.