|
@@ -183,8 +183,9 @@ read(const Filename &name) {
|
|
|
return false;
|
|
return false;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- express_cat.debug()
|
|
|
|
|
- << "Reading file: " << name << endl;
|
|
|
|
|
|
|
+ if (express_cat.is_debug())
|
|
|
|
|
+ express_cat.debug()
|
|
|
|
|
+ << "Multifile::Memfile::read() - Reading file: " << name << endl;
|
|
|
|
|
|
|
|
_header_length = name.length() + sizeof(_header_length) +
|
|
_header_length = name.length() + sizeof(_header_length) +
|
|
|
sizeof(_buffer_length);
|
|
sizeof(_buffer_length);
|
|
@@ -203,7 +204,7 @@ read(const Filename &name) {
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
////////////////////////////////////////////////////////////////////
|
|
|
-// Function: Multifile::Memfile::read_multi
|
|
|
|
|
|
|
+// Function: Multifile::Memfile::read_from_multifile
|
|
|
// Access: Public
|
|
// Access: Public
|
|
|
// Description: Reads a Memfile from an open Multifile ifstream
|
|
// Description: Reads a Memfile from an open Multifile ifstream
|
|
|
////////////////////////////////////////////////////////////////////
|
|
////////////////////////////////////////////////////////////////////
|
|
@@ -297,15 +298,11 @@ write_to_multifile(ofstream &write_stream) {
|
|
|
// written to disk.
|
|
// written to disk.
|
|
|
// Advances the start pointer as it writes.
|
|
// Advances the start pointer as it writes.
|
|
|
////////////////////////////////////////////////////////////////////
|
|
////////////////////////////////////////////////////////////////////
|
|
|
-bool Multifile::Memfile::
|
|
|
|
|
|
|
+int Multifile::Memfile::
|
|
|
write(char *&start, int &size, const Filename &rel_path) {
|
|
write(char *&start, int &size, const Filename &rel_path) {
|
|
|
// Make sure we've got a complete header first
|
|
// Make sure we've got a complete header first
|
|
|
if (parse_header(start, size) == false) {
|
|
if (parse_header(start, size) == false) {
|
|
|
- if (express_cat.is_debug())
|
|
|
|
|
- express_cat.debug()
|
|
|
|
|
- << "Multifile::Memfile::write() - parse_header() == false"
|
|
|
|
|
- << endl;
|
|
|
|
|
- return false;
|
|
|
|
|
|
|
+ return MF_ok;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
// Try to open the file for writing
|
|
// Try to open the file for writing
|
|
@@ -321,19 +318,19 @@ write(char *&start, int &size, const Filename &rel_path) {
|
|
|
express_cat.error()
|
|
express_cat.error()
|
|
|
<< "Multfile::Memfile::write() - Couldn't open file: "
|
|
<< "Multfile::Memfile::write() - Couldn't open file: "
|
|
|
<< name << endl;
|
|
<< name << endl;
|
|
|
- return false;
|
|
|
|
|
|
|
+ return MF_error_write;
|
|
|
}
|
|
}
|
|
|
_file_open = true;
|
|
_file_open = true;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
// Don't write more than the buffer length
|
|
// Don't write more than the buffer length
|
|
|
- bool done = false;
|
|
|
|
|
|
|
+ int done = MF_ok;
|
|
|
int tsize = size;
|
|
int tsize = size;
|
|
|
nassertr(_buffer_length >= _bytes_written, false);
|
|
nassertr(_buffer_length >= _bytes_written, false);
|
|
|
int missing_bytes = _buffer_length - _bytes_written;
|
|
int missing_bytes = _buffer_length - _bytes_written;
|
|
|
if (size >= missing_bytes) {
|
|
if (size >= missing_bytes) {
|
|
|
tsize = missing_bytes;
|
|
tsize = missing_bytes;
|
|
|
- done = true;
|
|
|
|
|
|
|
+ done = MF_success;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
_write_stream.write(start, tsize);
|
|
_write_stream.write(start, tsize);
|
|
@@ -342,7 +339,7 @@ write(char *&start, int &size, const Filename &rel_path) {
|
|
|
nassertr(size >= tsize, false);
|
|
nassertr(size >= tsize, false);
|
|
|
size -= tsize;
|
|
size -= tsize;
|
|
|
|
|
|
|
|
- if (done == true) {
|
|
|
|
|
|
|
+ if (done == MF_success) {
|
|
|
_write_stream.close();
|
|
_write_stream.close();
|
|
|
express_cat.debug()
|
|
express_cat.debug()
|
|
|
<< "Multifile::Memfile::write() - Closing mem file" << endl;
|
|
<< "Multifile::Memfile::write() - Closing mem file" << endl;
|
|
@@ -409,16 +406,16 @@ evaluate(const char *start, int size) {
|
|
|
// Access: Public
|
|
// Access: Public
|
|
|
// Description: Returns true when a complete header has been parsed.
|
|
// Description: Returns true when a complete header has been parsed.
|
|
|
////////////////////////////////////////////////////////////////////
|
|
////////////////////////////////////////////////////////////////////
|
|
|
-bool Multifile::
|
|
|
|
|
|
|
+int Multifile::
|
|
|
parse_header(char *&start, int &size) {
|
|
parse_header(char *&start, int &size) {
|
|
|
if (_header_parsed == true)
|
|
if (_header_parsed == true)
|
|
|
- return true;
|
|
|
|
|
|
|
+ return MF_success;
|
|
|
|
|
|
|
|
int dgramsize = _datagram.get_length();
|
|
int dgramsize = _datagram.get_length();
|
|
|
int tsize = size;
|
|
int tsize = size;
|
|
|
|
|
|
|
|
// Make sure we don't exceed the length of the header
|
|
// Make sure we don't exceed the length of the header
|
|
|
- nassertr(_header_length >= dgramsize, false);
|
|
|
|
|
|
|
+ nassertr(_header_length >= dgramsize, MF_error_abort);
|
|
|
int missing_bytes = _header_length - dgramsize;
|
|
int missing_bytes = _header_length - dgramsize;
|
|
|
if (size >= missing_bytes) {
|
|
if (size >= missing_bytes) {
|
|
|
tsize = missing_bytes;
|
|
tsize = missing_bytes;
|
|
@@ -436,13 +433,14 @@ parse_header(char *&start, int &size) {
|
|
|
express_cat.error()
|
|
express_cat.error()
|
|
|
<< "Multifile::parse_header() - Invalid magic number: "
|
|
<< "Multifile::parse_header() - Invalid magic number: "
|
|
|
<< magic_number << " (" << _magic_number << ")" << endl;
|
|
<< magic_number << " (" << _magic_number << ")" << endl;
|
|
|
- return false;
|
|
|
|
|
|
|
+ return MF_error_abort;
|
|
|
}
|
|
}
|
|
|
_num_mfiles = di.get_int32();
|
|
_num_mfiles = di.get_int32();
|
|
|
if (_num_mfiles <= 0) {
|
|
if (_num_mfiles <= 0) {
|
|
|
express_cat.debug()
|
|
express_cat.debug()
|
|
|
<< "Multifile::parse_header() - No memfiles in multifile"
|
|
<< "Multifile::parse_header() - No memfiles in multifile"
|
|
|
<< endl;
|
|
<< endl;
|
|
|
|
|
+ return MF_error_empty;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
// Advance start pointer to the end of the header
|
|
// Advance start pointer to the end of the header
|
|
@@ -450,9 +448,10 @@ parse_header(char *&start, int &size) {
|
|
|
nassertr(size >= tsize, false);
|
|
nassertr(size >= tsize, false);
|
|
|
size -= tsize;
|
|
size -= tsize;
|
|
|
_datagram.clear();
|
|
_datagram.clear();
|
|
|
|
|
+ return MF_success;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- return _header_parsed;
|
|
|
|
|
|
|
+ return MF_ok;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
////////////////////////////////////////////////////////////////////
|
|
@@ -521,10 +520,13 @@ read(Filename &name) {
|
|
|
read_stream.read(buffer, _header_length);
|
|
read_stream.read(buffer, _header_length);
|
|
|
char *start = buffer;
|
|
char *start = buffer;
|
|
|
int len = _header_length;
|
|
int len = _header_length;
|
|
|
- bool ret = parse_header(start, len);
|
|
|
|
|
|
|
+ int ret = parse_header(start, len);
|
|
|
delete buffer;
|
|
delete buffer;
|
|
|
- if (ret == false)
|
|
|
|
|
|
|
+ if (ret < 0) {
|
|
|
|
|
+ express_cat.error()
|
|
|
|
|
+ << "Multifile::read() - invalid header" << endl;
|
|
|
return false;
|
|
return false;
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
if (_num_mfiles <= 0) {
|
|
if (_num_mfiles <= 0) {
|
|
|
express_cat.error()
|
|
express_cat.error()
|
|
@@ -586,25 +588,35 @@ write(Filename name) {
|
|
|
// written.
|
|
// written.
|
|
|
// Advances the start pointer as it writes.
|
|
// Advances the start pointer as it writes.
|
|
|
////////////////////////////////////////////////////////////////////
|
|
////////////////////////////////////////////////////////////////////
|
|
|
-bool Multifile::
|
|
|
|
|
|
|
+int Multifile::
|
|
|
write(char *&start, int &size, const Filename &rel_path) {
|
|
write(char *&start, int &size, const Filename &rel_path) {
|
|
|
// Make sure we have a complete header first
|
|
// Make sure we have a complete header first
|
|
|
- if (parse_header(start, size) == false)
|
|
|
|
|
- return false;
|
|
|
|
|
|
|
+ int parse_ret = parse_header(start, size);
|
|
|
|
|
+ if (parse_ret < 0) {
|
|
|
|
|
+ express_cat.error()
|
|
|
|
|
+ << "Multifile::write() - bad header" << endl;
|
|
|
|
|
+ return parse_ret;
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
while (_num_mfiles > 0) {
|
|
while (_num_mfiles > 0) {
|
|
|
if (_current_mfile == NULL) {
|
|
if (_current_mfile == NULL) {
|
|
|
_current_mfile = new Memfile;
|
|
_current_mfile = new Memfile;
|
|
|
}
|
|
}
|
|
|
- if (_current_mfile->write(start, size, rel_path) == true) {
|
|
|
|
|
|
|
+ int write_ret = _current_mfile->write(start, size, rel_path);
|
|
|
|
|
+ if (write_ret == MF_success) {
|
|
|
_num_mfiles--;
|
|
_num_mfiles--;
|
|
|
delete _current_mfile;
|
|
delete _current_mfile;
|
|
|
_current_mfile = NULL;
|
|
_current_mfile = NULL;
|
|
|
- } else
|
|
|
|
|
- return false;
|
|
|
|
|
|
|
+ } else {
|
|
|
|
|
+ if (write_ret < 0) {
|
|
|
|
|
+ express_cat.error()
|
|
|
|
|
+ << "Multifile::write() - bad write: " << write_ret << endl;
|
|
|
|
|
+ }
|
|
|
|
|
+ return write_ret;
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- return true;
|
|
|
|
|
|
|
+ return MF_success;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
////////////////////////////////////////////////////////////////////
|
|
@@ -615,7 +627,8 @@ write(char *&start, int &size, const Filename &rel_path) {
|
|
|
////////////////////////////////////////////////////////////////////
|
|
////////////////////////////////////////////////////////////////////
|
|
|
bool Multifile::
|
|
bool Multifile::
|
|
|
write_extract(char *&start, int &size, const Filename &rel_path) {
|
|
write_extract(char *&start, int &size, const Filename &rel_path) {
|
|
|
- if (parse_header(start, size) == false)
|
|
|
|
|
|
|
+ int parse_ret = parse_header(start, size);
|
|
|
|
|
+ if (parse_ret < 0)
|
|
|
return false;
|
|
return false;
|
|
|
if (_current_mfile == (Memfile *)0L)
|
|
if (_current_mfile == (Memfile *)0L)
|
|
|
_current_mfile = new Memfile;
|
|
_current_mfile = new Memfile;
|