46 BLOCKING
bool open_read(
const Filename &multifile_name,
const std::streampos &offset = 0);
47 BLOCKING
bool open_read(
IStreamWrapper *multifile_stream,
bool owns_pointer =
false,
const std::streampos &offset = 0);
48 BLOCKING
bool open_write(
const Filename &multifile_name);
49 BLOCKING
bool open_write(std::ostream *multifile_stream,
bool owns_pointer =
false);
50 BLOCKING
bool open_read_write(
const Filename &multifile_name);
51 BLOCKING
bool open_read_write(std::iostream *multifile_stream,
bool owns_pointer =
false);
52 BLOCKING
void close();
54 INLINE
const Filename &get_multifile_name()
const;
55 INLINE
void set_multifile_name(
const Filename &multifile_name);
57 INLINE
bool is_read_valid()
const;
58 INLINE
bool is_write_valid()
const;
59 INLINE
bool needs_repack()
const;
61 INLINE time_t get_timestamp()
const;
62 INLINE
void set_timestamp(time_t timestamp);
64 INLINE
void set_record_timestamp(
bool record_timestamp);
65 INLINE
bool get_record_timestamp()
const;
67 void set_scale_factor(
size_t scale_factor);
68 INLINE
size_t get_scale_factor()
const;
70 INLINE
void set_encryption_flag(
bool flag);
71 INLINE
bool get_encryption_flag()
const;
72 INLINE
void set_encryption_password(
const std::string &encryption_password);
73 INLINE
const std::string &get_encryption_password()
const;
75 INLINE
void set_encryption_algorithm(
const std::string &encryption_algorithm);
76 INLINE
const std::string &get_encryption_algorithm()
const;
77 INLINE
void set_encryption_key_length(
int encryption_key_length);
78 INLINE
int get_encryption_key_length()
const;
79 INLINE
void set_encryption_iteration_count(
int encryption_iteration_count);
80 INLINE
int get_encryption_iteration_count()
const;
82 std::string add_subfile(
const std::string &subfile_name,
const Filename &filename,
83 int compression_level);
84 std::string add_subfile(
const std::string &subfile_name, std::istream *subfile_data,
85 int compression_level);
86 std::string update_subfile(
const std::string &subfile_name,
const Filename &filename,
87 int compression_level);
90 bool add_signature(
const Filename &certificate,
93 const std::string &password =
"");
94 bool add_signature(
const Filename &composite,
95 const std::string &password =
"");
97 int get_num_signatures()
const;
98 std::string get_signature_subject_name(
int n)
const;
99 std::string get_signature_friendly_name(
int n)
const;
100 std::string get_signature_public_key(
int n)
const;
101 void print_signature_certificate(
int n, std::ostream &out)
const;
102 void write_signature_certificate(
int n, std::ostream &out)
const;
104 int validate_signature_certificate(
int n)
const;
107 BLOCKING
bool flush();
108 BLOCKING
bool repack();
110 int get_num_subfiles()
const;
111 int find_subfile(
const std::string &subfile_name)
const;
112 bool has_directory(
const std::string &subfile_name)
const;
113 bool scan_directory(vector_string &contents,
114 const std::string &subfile_name)
const;
115 void remove_subfile(
int index);
116 INLINE
bool remove_subfile(
const std::string &subfile_name);
117 const std::string &get_subfile_name(
int index)
const;
118 MAKE_SEQ(get_subfile_names, get_num_subfiles, get_subfile_name);
119 size_t get_subfile_length(
int index)
const;
120 time_t get_subfile_timestamp(
int index)
const;
121 bool is_subfile_compressed(
int index)
const;
122 bool is_subfile_encrypted(
int index)
const;
123 bool is_subfile_text(
int index)
const;
125 std::streampos get_index_end()
const;
126 std::streampos get_subfile_internal_start(
int index)
const;
127 size_t get_subfile_internal_length(
int index)
const;
129 BLOCKING INLINE vector_uchar read_subfile(
int index);
130 BLOCKING std::istream *open_read_subfile(
int index);
131 BLOCKING
static void close_read_subfile(std::istream *stream);
132 BLOCKING
bool extract_subfile(
int index,
const Filename &filename);
133 BLOCKING
bool extract_subfile_to(
int index, std::ostream &out);
134 BLOCKING
bool compare_subfile(
int index,
const Filename &filename);
136 void output(std::ostream &out)
const;
137 void ls(std::ostream &out = std::cout)
const;
139 static INLINE std::string get_magic_number();
140 MAKE_PROPERTY(magic_number, get_magic_number);
142 void set_header_prefix(
const std::string &header_prefix);
143 INLINE
const std::string &get_header_prefix()
const;
149 INLINE CertRecord(X509 *cert);
150 INLINE CertRecord(
const CertRecord ©);
151 INLINE ~CertRecord();
152 INLINE
void operator = (
const CertRecord &other);
157 bool add_signature(
const CertChain &chain, EVP_PKEY *pkey);
159 const CertChain &get_signature(
int n)
const;
162 bool read_subfile(
int index, std::string &result);
163 bool read_subfile(
int index, vector_uchar &result);
168 SF_index_invalid = 0x0002,
169 SF_data_invalid = 0x0004,
170 SF_compressed = 0x0008,
171 SF_encrypted = 0x0010,
172 SF_signature = 0x0020,
179 INLINE
bool operator < (
const Subfile &other)
const;
180 std::streampos read_index(std::istream &read, std::streampos fpos,
182 std::streampos write_index(std::ostream &write, std::streampos fpos,
184 std::streampos write_data(std::ostream &write, std::istream *read, std::streampos fpos,
186 void rewrite_index_data_start(std::ostream &write,
Multifile *multifile);
187 void rewrite_index_flags(std::ostream &write);
188 INLINE
bool is_deleted()
const;
189 INLINE
bool is_index_invalid()
const;
190 INLINE
bool is_data_invalid()
const;
191 INLINE
bool is_cert_special()
const;
192 INLINE std::streampos get_last_byte_pos()
const;
195 std::streampos _index_start;
196 size_t _index_length;
197 std::streampos _data_start;
199 size_t _uncompressed_length;
201 std::istream *_source;
204 int _compression_level;
210 INLINE std::streampos word_to_streampos(
size_t word)
const;
211 INLINE
size_t streampos_to_word(std::streampos fpos)
const;
212 INLINE std::streampos normalize_streampos(std::streampos fpos)
const;
213 std::streampos pad_to_streampos(std::streampos fpos);
215 void add_new_subfile(Subfile *subfile,
int compression_level);
216 std::istream *open_read_subfile(Subfile *subfile);
217 std::string standardize_subfile_name(
const std::string &subfile_name)
const;
219 void clear_subfiles();
223 void check_signatures();
225 static INLINE
char tohex(
unsigned int nibble);
230 PendingSubfiles _new_subfiles;
231 PendingSubfiles _removed_subfiles;
232 PendingSubfiles _cert_special;
236 Certificates _signatures;
239 std::streampos _offset;
241 std::ostream *_write;
243 std::streampos _next_index;
244 std::streampos _last_index;
245 std::streampos _last_data_byte;
249 bool _timestamp_dirty;
250 bool _record_timestamp;
251 size_t _scale_factor;
252 size_t _new_scale_factor;
254 bool _encryption_flag;
255 std::string _encryption_password;
256 std::string _encryption_algorithm;
257 int _encryption_key_length;
258 int _encryption_iteration_count;
260 pifstream _read_file;
262 pofstream _write_file;
263 pfstream _read_write_file;
266 std::string _header_prefix;
271 static const char _header[];
272 static const size_t _header_size;
273 static const int _current_major_ver;
274 static const int _current_minor_ver;
276 static const char _encrypt_header[];
277 static const size_t _encrypt_header_size;
279 friend class Subfile;