mirror of
https://github.com/panda3d/panda3d.git
synced 2025-10-03 02:15:43 -04:00
*** empty log message ***
This commit is contained in:
parent
b9b3cd0435
commit
4d8da3cc5a
@ -107,7 +107,7 @@ initiate(Filename &source_file, Filename &dest_file) {
|
|||||||
|
|
||||||
if (_initiated == true) {
|
if (_initiated == true) {
|
||||||
downloader_cat.error()
|
downloader_cat.error()
|
||||||
<< "Decompressor::run() - Decompression has already been initiated"
|
<< "Decompressor::initiate() - Decompression has already been initiated"
|
||||||
<< endl;
|
<< endl;
|
||||||
return EU_error_abort;
|
return EU_error_abort;
|
||||||
}
|
}
|
||||||
@ -117,7 +117,7 @@ initiate(Filename &source_file, Filename &dest_file) {
|
|||||||
_source_file.set_binary();
|
_source_file.set_binary();
|
||||||
if (!_source_file.open_read(_read_stream)) {
|
if (!_source_file.open_read(_read_stream)) {
|
||||||
downloader_cat.error()
|
downloader_cat.error()
|
||||||
<< "Decompressor::decompress() - Error opening source file: "
|
<< "Decompressor::initiate() - Error opening source file: "
|
||||||
<< _source_file << " : " << strerror(errno) << endl;
|
<< _source_file << " : " << strerror(errno) << endl;
|
||||||
return get_write_error();
|
return get_write_error();
|
||||||
}
|
}
|
||||||
@ -127,7 +127,7 @@ initiate(Filename &source_file, Filename &dest_file) {
|
|||||||
_source_file_length = _read_stream.tellg();
|
_source_file_length = _read_stream.tellg();
|
||||||
if (_source_file_length == 0) {
|
if (_source_file_length == 0) {
|
||||||
downloader_cat.warning()
|
downloader_cat.warning()
|
||||||
<< "Decompressor::decompress() - Zero length file: "
|
<< "Decompressor::initiate() - Zero length file: "
|
||||||
<< source_file << " : " << strerror(errno) << endl;
|
<< source_file << " : " << strerror(errno) << endl;
|
||||||
return get_write_error();
|
return get_write_error();
|
||||||
}
|
}
|
||||||
@ -137,7 +137,7 @@ initiate(Filename &source_file, Filename &dest_file) {
|
|||||||
dest_file.set_binary();
|
dest_file.set_binary();
|
||||||
if (!dest_file.open_write(_write_stream)) {
|
if (!dest_file.open_write(_write_stream)) {
|
||||||
downloader_cat.error()
|
downloader_cat.error()
|
||||||
<< "Decompressor::decompress() - Error opening dest file: "
|
<< "Decompressor::initiate() - Error opening dest file: "
|
||||||
<< source_file << " : " << strerror(errno) << endl;
|
<< source_file << " : " << strerror(errno) << endl;
|
||||||
return get_write_error();
|
return get_write_error();
|
||||||
}
|
}
|
||||||
@ -150,6 +150,49 @@ initiate(Filename &source_file, Filename &dest_file) {
|
|||||||
_source_buffer_length = 0;
|
_source_buffer_length = 0;
|
||||||
_initiated = true;
|
_initiated = true;
|
||||||
_decompressor = new ZDecompressor();
|
_decompressor = new ZDecompressor();
|
||||||
|
_decompress_to_ram = false;
|
||||||
|
return EU_success;
|
||||||
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
// Function: Decompressor::initiate
|
||||||
|
// Access: Public
|
||||||
|
// Description:
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
int Decompressor::
|
||||||
|
initiate(Ramfile &source_file) {
|
||||||
|
|
||||||
|
if (_initiated == true) {
|
||||||
|
downloader_cat.error()
|
||||||
|
<< "Decompressor::initiate() - Decompression has already been initiated"
|
||||||
|
<< endl;
|
||||||
|
return EU_error_abort;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Open source file
|
||||||
|
_read_string_stream = new istringstream(source_file._data);
|
||||||
|
|
||||||
|
// Determine source file length
|
||||||
|
_source_file_length = source_file._data.length();
|
||||||
|
if (_source_file_length == 0) {
|
||||||
|
downloader_cat.warning()
|
||||||
|
<< "Decompressor::initiate() - Zero length file: "
|
||||||
|
<< strerror(errno) << endl;
|
||||||
|
return get_write_error();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Open destination file
|
||||||
|
_write_string_stream = new ostringstream();
|
||||||
|
|
||||||
|
// Read from the source file into the first half of the buffer,
|
||||||
|
// decompress into the second half of the buffer, write the second
|
||||||
|
// half of the buffer to disk, and repeat.
|
||||||
|
_total_bytes_read = 0;
|
||||||
|
_read_all_input = false;
|
||||||
|
_source_buffer_length = 0;
|
||||||
|
_initiated = true;
|
||||||
|
_decompressor = new ZDecompressor();
|
||||||
|
_decompress_to_ram = true;
|
||||||
return EU_success;
|
return EU_success;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -172,6 +215,7 @@ cleanup(void) {
|
|||||||
_decompressor = NULL;
|
_decompressor = NULL;
|
||||||
_read_stream.close();
|
_read_stream.close();
|
||||||
_write_stream.close();
|
_write_stream.close();
|
||||||
|
if (_decompress_to_ram == false)
|
||||||
_source_file.unlink();
|
_source_file.unlink();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -191,6 +235,7 @@ run(void) {
|
|||||||
|
|
||||||
// See if there is anything left in the source file
|
// See if there is anything left in the source file
|
||||||
if (_read_all_input == false) {
|
if (_read_all_input == false) {
|
||||||
|
if (_decompress_to_ram == false) {
|
||||||
_read_stream.read(_buffer->_buffer, _half_buffer_length);
|
_read_stream.read(_buffer->_buffer, _half_buffer_length);
|
||||||
_source_buffer_length = _read_stream.gcount();
|
_source_buffer_length = _read_stream.gcount();
|
||||||
_total_bytes_read += _source_buffer_length;
|
_total_bytes_read += _source_buffer_length;
|
||||||
@ -198,6 +243,15 @@ run(void) {
|
|||||||
nassertr(_total_bytes_read == _source_file_length, false);
|
nassertr(_total_bytes_read == _source_file_length, false);
|
||||||
_read_all_input = true;
|
_read_all_input = true;
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
_read_string_stream->read(_buffer->_buffer, _half_buffer_length);
|
||||||
|
_source_buffer_length = _read_string_stream->gcount();
|
||||||
|
_total_bytes_read += _source_buffer_length;
|
||||||
|
if (_read_string_stream->eof()) {
|
||||||
|
nassertr(_total_bytes_read == _source_file_length, false);
|
||||||
|
_read_all_input = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
char *next_in = _buffer->_buffer;
|
char *next_in = _buffer->_buffer;
|
||||||
@ -209,9 +263,15 @@ run(void) {
|
|||||||
nassertr(avail_out > 0 && avail_in > 0, false);
|
nassertr(avail_out > 0 && avail_in > 0, false);
|
||||||
|
|
||||||
while (avail_in > 0) {
|
while (avail_in > 0) {
|
||||||
int ret = _decompressor->decompress_to_stream(next_in, avail_in,
|
int ret;
|
||||||
|
if (_decompress_to_ram == false)
|
||||||
|
ret = _decompressor->decompress_to_stream(next_in, avail_in,
|
||||||
next_out, avail_out, dest_buffer,
|
next_out, avail_out, dest_buffer,
|
||||||
dest_buffer_length, _write_stream);
|
dest_buffer_length, _write_stream);
|
||||||
|
else
|
||||||
|
ret = _decompressor->decompress_to_stream(next_in, avail_in,
|
||||||
|
next_out, avail_out, dest_buffer,
|
||||||
|
dest_buffer_length, *_write_string_stream);
|
||||||
if (ret == ZCompressorBase::S_error)
|
if (ret == ZCompressorBase::S_error)
|
||||||
return EU_error_zlib;
|
return EU_error_zlib;
|
||||||
if ((int)_decompressor->get_total_in() == _source_file_length &&
|
if ((int)_decompressor->get_total_in() == _source_file_length &&
|
||||||
@ -243,3 +303,28 @@ decompress(Filename &source_file) {
|
|||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
// Function: Decompressor::decompress
|
||||||
|
// Access: Public
|
||||||
|
// Description:
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
bool Decompressor::
|
||||||
|
decompress(Ramfile &source_file) {
|
||||||
|
int ret = initiate(source_file);
|
||||||
|
if (ret < 0)
|
||||||
|
return false;
|
||||||
|
for (;;) {
|
||||||
|
ret = run();
|
||||||
|
if (ret == EU_success) {
|
||||||
|
source_file._data = _write_string_stream->str();
|
||||||
|
delete _read_string_stream;
|
||||||
|
_read_string_stream = NULL;
|
||||||
|
delete _write_string_stream;
|
||||||
|
_write_string_stream = NULL;
|
||||||
|
return true;
|
||||||
|
} else if (ret < 0)
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
@ -27,9 +27,11 @@ PUBLISHED:
|
|||||||
|
|
||||||
int initiate(Filename &source_file);
|
int initiate(Filename &source_file);
|
||||||
int initiate(Filename &source_file, Filename &dest_file);
|
int initiate(Filename &source_file, Filename &dest_file);
|
||||||
|
int initiate(Ramfile &source_file);
|
||||||
int run(void);
|
int run(void);
|
||||||
|
|
||||||
bool decompress(Filename &source_file);
|
bool decompress(Filename &source_file);
|
||||||
|
bool decompress(Ramfile &source_file);
|
||||||
|
|
||||||
INLINE float get_progress(void) const;
|
INLINE float get_progress(void) const;
|
||||||
|
|
||||||
@ -45,12 +47,15 @@ private:
|
|||||||
Filename _source_file;
|
Filename _source_file;
|
||||||
ifstream _read_stream;
|
ifstream _read_stream;
|
||||||
ofstream _write_stream;
|
ofstream _write_stream;
|
||||||
|
istringstream *_read_string_stream;
|
||||||
|
ostringstream *_write_string_stream;
|
||||||
int _source_file_length;
|
int _source_file_length;
|
||||||
int _total_bytes_read;
|
int _total_bytes_read;
|
||||||
bool _read_all_input;
|
bool _read_all_input;
|
||||||
bool _handled_all_input;
|
bool _handled_all_input;
|
||||||
int _source_buffer_length;
|
int _source_buffer_length;
|
||||||
ZDecompressor *_decompressor;
|
ZDecompressor *_decompressor;
|
||||||
|
bool _decompress_to_ram;
|
||||||
};
|
};
|
||||||
|
|
||||||
#include "decompressor.I"
|
#include "decompressor.I"
|
||||||
|
@ -21,12 +21,10 @@ PN_uint32 DownloadDb::_magic_number = 0xfeedfeed;
|
|||||||
// Description: Create a download db with these client and server dbs
|
// Description: Create a download db with these client and server dbs
|
||||||
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
||||||
DownloadDb::
|
DownloadDb::
|
||||||
DownloadDb(Filename &server_file, Filename &client_file) {
|
DownloadDb(Ramfile &server_file, Filename &client_file) {
|
||||||
_client_db = read_db(client_file);
|
_client_db = read_db(client_file);
|
||||||
_client_db._filename = client_file;
|
_client_db._filename = client_file;
|
||||||
_server_db = read_db(server_file);
|
_server_db = read_db(server_file);
|
||||||
_server_db._filename = server_file;
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
||||||
@ -209,6 +207,30 @@ read_db(Filename &file) {
|
|||||||
return db;
|
return db;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
// Function: DownloadDb::
|
||||||
|
// Access: Public
|
||||||
|
// Description:
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
DownloadDb::Db DownloadDb::
|
||||||
|
read_db(Ramfile &file) {
|
||||||
|
// Open the multifile for reading
|
||||||
|
istringstream read_stream(file._data);
|
||||||
|
Db db;
|
||||||
|
|
||||||
|
if (!db.read(read_stream)) {
|
||||||
|
downloader_cat.error()
|
||||||
|
<< "DownloadDb::read() - Read failed" << endl;
|
||||||
|
return db;
|
||||||
|
}
|
||||||
|
if (!read_version_map(read_stream)) {
|
||||||
|
downloader_cat.error()
|
||||||
|
<< "DownloadDb::read() - read_version_map() failed" << endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
return db;
|
||||||
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
||||||
// Function: DownloadDb::
|
// Function: DownloadDb::
|
||||||
// Access: Public
|
// Access: Public
|
||||||
@ -630,7 +652,7 @@ parse_fr(uchar *start, int size) {
|
|||||||
// Description:
|
// Description:
|
||||||
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
||||||
bool DownloadDb::Db::
|
bool DownloadDb::Db::
|
||||||
read(ifstream &read_stream) {
|
read(istream &read_stream) {
|
||||||
|
|
||||||
// Make a little buffer to read the header into
|
// Make a little buffer to read the header into
|
||||||
uchar *header_buf = new uchar[_header_length];
|
uchar *header_buf = new uchar[_header_length];
|
||||||
@ -986,7 +1008,7 @@ write_version_map(ofstream &write_stream) {
|
|||||||
// Description:
|
// Description:
|
||||||
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
||||||
bool DownloadDb::
|
bool DownloadDb::
|
||||||
read_version_map(ifstream &read_stream) {
|
read_version_map(istream &read_stream) {
|
||||||
_master_datagram.clear();
|
_master_datagram.clear();
|
||||||
char *buffer = new char[sizeof(PN_uint64)];
|
char *buffer = new char[sizeof(PN_uint64)];
|
||||||
read_stream.read(buffer, sizeof(PN_int32));
|
read_stream.read(buffer, sizeof(PN_int32));
|
||||||
|
@ -20,6 +20,7 @@
|
|||||||
#include <map>
|
#include <map>
|
||||||
|
|
||||||
#include "hashVal.h"
|
#include "hashVal.h"
|
||||||
|
#include <buffer.h>
|
||||||
|
|
||||||
/*
|
/*
|
||||||
//////////////////////////////////////////////////
|
//////////////////////////////////////////////////
|
||||||
@ -58,7 +59,7 @@ PUBLISHED:
|
|||||||
};
|
};
|
||||||
|
|
||||||
DownloadDb(void);
|
DownloadDb(void);
|
||||||
DownloadDb(Filename &server_file, Filename &client_file);
|
DownloadDb(Ramfile &server_file, Filename &client_file);
|
||||||
~DownloadDb(void);
|
~DownloadDb(void);
|
||||||
|
|
||||||
void output(ostream &out) const;
|
void output(ostream &out) const;
|
||||||
@ -155,7 +156,7 @@ public:
|
|||||||
int parse_record_header(uchar *start, int size);
|
int parse_record_header(uchar *start, int size);
|
||||||
PT(MultifileRecord) parse_mfr(uchar *start, int size);
|
PT(MultifileRecord) parse_mfr(uchar *start, int size);
|
||||||
PT(FileRecord) parse_fr(uchar *start, int size);
|
PT(FileRecord) parse_fr(uchar *start, int size);
|
||||||
bool read(ifstream &read_stream);
|
bool read(istream &read_stream);
|
||||||
bool write(ofstream &write_stream);
|
bool write(ofstream &write_stream);
|
||||||
Filename _filename;
|
Filename _filename;
|
||||||
MultifileRecords _mfile_records;
|
MultifileRecords _mfile_records;
|
||||||
@ -170,6 +171,7 @@ public:
|
|||||||
|
|
||||||
PUBLISHED:
|
PUBLISHED:
|
||||||
Db read_db(Filename &file);
|
Db read_db(Filename &file);
|
||||||
|
Db read_db(Ramfile &file);
|
||||||
bool write_db(Filename &file, Db db);
|
bool write_db(Filename &file, Db db);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
@ -191,7 +193,7 @@ PUBLISHED:
|
|||||||
|
|
||||||
protected:
|
protected:
|
||||||
void write_version_map(ofstream &write_stream);
|
void write_version_map(ofstream &write_stream);
|
||||||
bool read_version_map(ifstream &read_stream);
|
bool read_version_map(istream &read_stream);
|
||||||
VersionMap _versions;
|
VersionMap _versions;
|
||||||
Datagram _master_datagram;
|
Datagram _master_datagram;
|
||||||
};
|
};
|
||||||
|
@ -349,6 +349,55 @@ initiate(const string &file_name, Filename file_dest,
|
|||||||
_got_any_data = false;
|
_got_any_data = false;
|
||||||
_initiated = true;
|
_initiated = true;
|
||||||
_ever_initiated = true;
|
_ever_initiated = true;
|
||||||
|
_download_to_ram = false;
|
||||||
|
return EU_success;
|
||||||
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
// Function: Downloader::initiate
|
||||||
|
// Access: Published
|
||||||
|
// Description: Initiate the download of a file from a server.
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
int Downloader::
|
||||||
|
initiate(const string &file_name) {
|
||||||
|
if (_initiated == true) {
|
||||||
|
downloader_cat.error()
|
||||||
|
<< "Downloader::initiate() - Download has already been initiated"
|
||||||
|
<< endl;
|
||||||
|
return EU_error_abort;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Connect to the server
|
||||||
|
int connect_ret = connect_to_server();
|
||||||
|
if (connect_ret < 0)
|
||||||
|
return connect_ret;
|
||||||
|
|
||||||
|
// Send an HTTP request for the file to the server
|
||||||
|
string request = "GET ";
|
||||||
|
request += file_name;
|
||||||
|
request += " HTTP/1.1\012Host: ";
|
||||||
|
request += _server_name;
|
||||||
|
request += "\012Connection: close";
|
||||||
|
request += "\012\012";
|
||||||
|
int outlen = request.size();
|
||||||
|
if (downloader_cat.is_debug())
|
||||||
|
downloader_cat.debug()
|
||||||
|
<< "Downloader::initiate() - Sending request:\n" << request << endl;
|
||||||
|
int send_ret = safe_send(_socket, request.c_str(), outlen,
|
||||||
|
(long)downloader_timeout);
|
||||||
|
if (send_ret < 0)
|
||||||
|
return send_ret;
|
||||||
|
|
||||||
|
// Create a download status to maintain download progress information
|
||||||
|
_current_status = new DownloadStatus(_buffer->_buffer, 0, 0, 0, false);
|
||||||
|
|
||||||
|
_tfirst = 0.0;
|
||||||
|
_tlast = 0.0;
|
||||||
|
_got_any_data = false;
|
||||||
|
_initiated = true;
|
||||||
|
_ever_initiated = true;
|
||||||
|
_download_to_ram = true;
|
||||||
|
_dest_string_stream = new ostringstream();
|
||||||
return EU_success;
|
return EU_success;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -395,6 +444,9 @@ run(void) {
|
|||||||
if (connect_ret < 0)
|
if (connect_ret < 0)
|
||||||
return connect_ret;
|
return connect_ret;
|
||||||
|
|
||||||
|
if (_download_to_ram == true)
|
||||||
|
return run_to_ram();
|
||||||
|
|
||||||
int ret = EU_ok;
|
int ret = EU_ok;
|
||||||
int write_ret;
|
int write_ret;
|
||||||
double t0 = _clock.get_real_time();
|
double t0 = _clock.get_real_time();
|
||||||
@ -508,6 +560,124 @@ run(void) {
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
// Function: Downloader::run_to_ram
|
||||||
|
// Access: Private
|
||||||
|
// Description:
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
int Downloader::
|
||||||
|
run_to_ram(void) {
|
||||||
|
int ret = EU_ok;
|
||||||
|
int write_ret;
|
||||||
|
|
||||||
|
double t0 = _clock.get_real_time();
|
||||||
|
if (_tfirst == 0.0) {
|
||||||
|
_tfirst = t0;
|
||||||
|
}
|
||||||
|
if (t0 - _tlast < _frequency)
|
||||||
|
return EU_ok;
|
||||||
|
|
||||||
|
// Recompute the buffer size if necessary
|
||||||
|
if (_recompute_buffer == true) {
|
||||||
|
if (downloader_cat.is_debug())
|
||||||
|
downloader_cat.debug()
|
||||||
|
<< "Downloader::run_to_ram() - Recomputing the buffer" << endl;
|
||||||
|
|
||||||
|
// Flush the current buffer if it holds any data
|
||||||
|
if (_current_status->_bytes_in_buffer > 0) {
|
||||||
|
write_ret = write_to_ram(_current_status);
|
||||||
|
if (write_ret < 0)
|
||||||
|
return write_ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Allocate a new buffer
|
||||||
|
_buffer.clear();
|
||||||
|
_receive_size = (ulong)(_frequency * _byte_rate);
|
||||||
|
_disk_buffer_size = _receive_size * _disk_write_frequency;
|
||||||
|
_buffer = new Buffer(_disk_buffer_size);
|
||||||
|
_current_status->_buffer = _buffer->_buffer;
|
||||||
|
_current_status->reset();
|
||||||
|
// Reset the flag
|
||||||
|
_recompute_buffer = false;
|
||||||
|
// Reset the statistics
|
||||||
|
_tfirst = t0;
|
||||||
|
_current_status->_total_bytes = 0;
|
||||||
|
|
||||||
|
} else if (_current_status->_bytes_in_buffer + _receive_size >
|
||||||
|
_disk_buffer_size) {
|
||||||
|
|
||||||
|
// Flush the current buffer if the next request would overflow it
|
||||||
|
if (downloader_cat.is_debug())
|
||||||
|
downloader_cat.debug()
|
||||||
|
<< "Downloader::run_to_ram() - Flushing buffer" << endl;
|
||||||
|
write_ret = write_to_ram(_current_status);
|
||||||
|
if (write_ret < 0)
|
||||||
|
return write_ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Attempt to receive the bytes from the socket
|
||||||
|
int fret;
|
||||||
|
// Handle the case of a fast connection
|
||||||
|
if (_receive_size > MAX_RECEIVE_BYTES) {
|
||||||
|
int repeat = (int)(_receive_size / MAX_RECEIVE_BYTES);
|
||||||
|
int remain = (int)fmod((double)_receive_size, (double)MAX_RECEIVE_BYTES);
|
||||||
|
if (downloader_cat.is_debug())
|
||||||
|
downloader_cat.debug()
|
||||||
|
<< "Downloader::run_to_ram() - fast connection - repeat: " << repeat
|
||||||
|
<< " remain: " << remain << endl;
|
||||||
|
// Make multiple requests at once but do not exceed MAX_RECEIVE_BYTES
|
||||||
|
// for any single request
|
||||||
|
for (int i = 0; i <= repeat; i++) {
|
||||||
|
if (i < repeat)
|
||||||
|
fret = fast_receive(_socket, _current_status, MAX_RECEIVE_BYTES);
|
||||||
|
else if (remain > 0)
|
||||||
|
fret = fast_receive(_socket, _current_status, remain);
|
||||||
|
if (fret == EU_eof || fret < 0) {
|
||||||
|
break;
|
||||||
|
} else if (fret == EU_success) {
|
||||||
|
_got_any_data = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else { // Handle the normal speed connection case
|
||||||
|
if (downloader_cat.is_debug())
|
||||||
|
downloader_cat.debug()
|
||||||
|
<< "Downloader::run_to_ram() - normal connection" << endl;
|
||||||
|
fret = fast_receive(_socket, _current_status, _receive_size);
|
||||||
|
}
|
||||||
|
_tlast = _clock.get_real_time();
|
||||||
|
|
||||||
|
// Check for end of file
|
||||||
|
if (fret == EU_eof) {
|
||||||
|
if (_got_any_data == true) {
|
||||||
|
if (_current_status->_bytes_in_buffer > 0) {
|
||||||
|
write_ret = write_to_ram(_current_status);
|
||||||
|
if (write_ret < 0)
|
||||||
|
return write_ret;
|
||||||
|
}
|
||||||
|
if (downloader_cat.is_debug())
|
||||||
|
downloader_cat.debug()
|
||||||
|
<< "Downloader::run_to_ram() - Got eof" << endl;
|
||||||
|
cleanup();
|
||||||
|
return EU_success;
|
||||||
|
} else {
|
||||||
|
if (downloader_cat.is_debug())
|
||||||
|
downloader_cat.debug()
|
||||||
|
<< "Downloader::run_to_ram() - Got 0 bytes" << endl;
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
} else if (fret == EU_network_no_data) {
|
||||||
|
if (downloader_cat.is_debug())
|
||||||
|
downloader_cat.debug()
|
||||||
|
<< "Downloader::run_to_ram() - No data" << endl;
|
||||||
|
return ret;
|
||||||
|
} else if (fret < 0) {
|
||||||
|
return fret;
|
||||||
|
}
|
||||||
|
|
||||||
|
_got_any_data = true;
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
||||||
// Function: Downloader::parse_http_response
|
// Function: Downloader::parse_http_response
|
||||||
// Access: Private
|
// Access: Private
|
||||||
@ -710,6 +880,60 @@ write_to_disk(DownloadStatus *status) {
|
|||||||
return EU_success;
|
return EU_success;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
// Function: Downloader::write_to_ram
|
||||||
|
// Access: Private
|
||||||
|
// Description: Writes a download to memory. If there is a header,
|
||||||
|
// the pointer and size are adjusted so the header
|
||||||
|
// is excluded. Function returns false on error
|
||||||
|
// condition.
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
int Downloader::
|
||||||
|
write_to_ram(DownloadStatus *status) {
|
||||||
|
nassertr(status != NULL, EU_error_abort);
|
||||||
|
|
||||||
|
// Ensure the header has been parsed successfully first
|
||||||
|
int parse_ret = parse_header(status);
|
||||||
|
if (parse_ret < 0)
|
||||||
|
return parse_ret;
|
||||||
|
|
||||||
|
if (status->_header_is_complete == false) {
|
||||||
|
downloader_cat.error()
|
||||||
|
<< "Downloader::write_to_ram() - Incomplete HTTP header - "
|
||||||
|
<< "(or header was larger than download buffer) - "
|
||||||
|
<< "try increasing download-buffer-size" << endl;
|
||||||
|
return EU_error_abort;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Write what we have so far to memory
|
||||||
|
if (status->_bytes_in_buffer > 0) {
|
||||||
|
if (downloader_cat.is_debug())
|
||||||
|
downloader_cat.debug()
|
||||||
|
<< "Downloader::write_to_ram() - Writing "
|
||||||
|
<< status->_bytes_in_buffer << " to memory" << endl;
|
||||||
|
|
||||||
|
_dest_string_stream->write(status->_start, status->_bytes_in_buffer);
|
||||||
|
status->_total_bytes_written += status->_bytes_in_buffer;
|
||||||
|
}
|
||||||
|
|
||||||
|
status->reset();
|
||||||
|
|
||||||
|
return EU_success;
|
||||||
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
// Function: Downloader::get_ramfile
|
||||||
|
// Access: Published
|
||||||
|
// Description:
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
bool Downloader::
|
||||||
|
get_ramfile(Ramfile &rfile) {
|
||||||
|
rfile._data = _dest_string_stream->str();
|
||||||
|
delete _dest_string_stream;
|
||||||
|
_dest_string_stream = NULL;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
||||||
// Function: Downloader::DownloadStatus::constructor
|
// Function: Downloader::DownloadStatus::constructor
|
||||||
// Access: Private
|
// Access: Private
|
||||||
|
@ -41,8 +41,11 @@ PUBLISHED:
|
|||||||
int initiate(const string &file_name, Filename file_dest,
|
int initiate(const string &file_name, Filename file_dest,
|
||||||
int first_byte, int last_byte, int total_bytes,
|
int first_byte, int last_byte, int total_bytes,
|
||||||
bool partial_content = true);
|
bool partial_content = true);
|
||||||
|
int initiate(const string &file_name);
|
||||||
int run(void);
|
int run(void);
|
||||||
|
|
||||||
|
bool get_ramfile(Ramfile &rfile);
|
||||||
|
|
||||||
INLINE void set_frequency(float frequency);
|
INLINE void set_frequency(float frequency);
|
||||||
INLINE float get_frequency(void) const;
|
INLINE float get_frequency(void) const;
|
||||||
INLINE void set_byte_rate(float bytes);
|
INLINE void set_byte_rate(float bytes);
|
||||||
@ -82,6 +85,8 @@ private:
|
|||||||
int parse_http_response(const string &resp);
|
int parse_http_response(const string &resp);
|
||||||
int parse_header(DownloadStatus *status);
|
int parse_header(DownloadStatus *status);
|
||||||
int write_to_disk(DownloadStatus *status);
|
int write_to_disk(DownloadStatus *status);
|
||||||
|
int run_to_ram(void);
|
||||||
|
int write_to_ram(DownloadStatus *status);
|
||||||
|
|
||||||
void cleanup(void);
|
void cleanup(void);
|
||||||
|
|
||||||
@ -101,11 +106,13 @@ private:
|
|||||||
ulong _receive_size;
|
ulong _receive_size;
|
||||||
int _disk_buffer_size;
|
int _disk_buffer_size;
|
||||||
ofstream _dest_stream;
|
ofstream _dest_stream;
|
||||||
|
ostringstream *_dest_string_stream;
|
||||||
bool _recompute_buffer;
|
bool _recompute_buffer;
|
||||||
|
|
||||||
DownloadStatus *_current_status;
|
DownloadStatus *_current_status;
|
||||||
bool _got_any_data;
|
bool _got_any_data;
|
||||||
int _total_bytes_written;
|
int _total_bytes_written;
|
||||||
|
bool _download_to_ram;
|
||||||
|
|
||||||
double _tlast;
|
double _tlast;
|
||||||
double _tfirst;
|
double _tfirst;
|
||||||
|
@ -142,7 +142,7 @@ decompress(char *&next_in, int &avail_in, char *&next_out, int &avail_out,
|
|||||||
int ZDecompressor::
|
int ZDecompressor::
|
||||||
decompress_to_stream(char *&next_in, int &avail_in, char *&next_out,
|
decompress_to_stream(char *&next_in, int &avail_in, char *&next_out,
|
||||||
int &avail_out, char *out_buffer,
|
int &avail_out, char *out_buffer,
|
||||||
int out_buffer_length, ofstream &write_stream,
|
int out_buffer_length, ostream &write_stream,
|
||||||
bool finish) {
|
bool finish) {
|
||||||
int ret = decompress(next_in, avail_in, next_out, avail_out, finish);
|
int ret = decompress(next_in, avail_in, next_out, avail_out, finish);
|
||||||
if (ret == S_error)
|
if (ret == S_error)
|
||||||
|
@ -70,7 +70,7 @@ public:
|
|||||||
int &avail_out, bool finish = false);
|
int &avail_out, bool finish = false);
|
||||||
int decompress_to_stream(char *&next_in, int &avail_in, char *&next_out,
|
int decompress_to_stream(char *&next_in, int &avail_in, char *&next_out,
|
||||||
int &avail_out, char *out_buffer, int out_buffer_length,
|
int &avail_out, char *out_buffer, int out_buffer_length,
|
||||||
ofstream &write_stream, bool finish = false);
|
ostream &write_stream, bool finish = false);
|
||||||
};
|
};
|
||||||
|
|
||||||
#include "zcompressor.I"
|
#include "zcompressor.I"
|
||||||
|
@ -84,6 +84,8 @@
|
|||||||
|
|
||||||
#begin bin_target
|
#begin bin_target
|
||||||
#define TARGET test_downloader
|
#define TARGET test_downloader
|
||||||
|
#define TARGET_IF_ZLIB yes
|
||||||
|
#define USE_ZLIB yes
|
||||||
|
|
||||||
#define SOURCES \
|
#define SOURCES \
|
||||||
test_downloader.cxx
|
test_downloader.cxx
|
||||||
|
@ -1,33 +1,40 @@
|
|||||||
#include <pandabase.h>
|
#include <pandabase.h>
|
||||||
#include <downloader.h>
|
#include <downloader.h>
|
||||||
#include <error_utils.h>
|
#include <error_utils.h>
|
||||||
|
#include <decompressor.h>
|
||||||
|
|
||||||
int
|
int
|
||||||
main(int argc, char *argv[]) {
|
main(int argc, char *argv[]) {
|
||||||
|
|
||||||
if (argc < 4) {
|
//if (argc < 4) {
|
||||||
cerr << "Usage: test_downloader <server> <source file> <dest file>"
|
if (argc < 3) {
|
||||||
|
//cerr << "Usage: test_downloader <server> <source file> <dest file>"
|
||||||
|
cerr << "Usage: test_downloader <server> <source file>"
|
||||||
<< endl;
|
<< endl;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
string server_name = argv[1];
|
string server_name = argv[1];
|
||||||
Filename src_file = argv[2];
|
Filename src_file = argv[2];
|
||||||
Filename dest_file = argv[3];
|
//Filename dest_file = argv[3];
|
||||||
|
|
||||||
Downloader dl;
|
Downloader dl;
|
||||||
if (dl.connect_to_server(server_name) == false)
|
if (dl.connect_to_server(server_name) == false)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
int ret = dl.initiate(src_file, dest_file);
|
//int ret = dl.initiate(src_file, dest_file);
|
||||||
|
int ret = dl.initiate(src_file);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
for (;;) {
|
//for (;;) {
|
||||||
|
bool done = false;
|
||||||
|
while (!done) {
|
||||||
ret = dl.run();
|
ret = dl.run();
|
||||||
if (ret == EU_success) {
|
if (ret == EU_success) {
|
||||||
cerr << "bytes per second: " << dl.get_bytes_per_second() << endl;
|
cerr << "bytes per second: " << dl.get_bytes_per_second() << endl;
|
||||||
return 1;
|
//return 1;
|
||||||
|
done = true;
|
||||||
} else if (ret == EU_write) {
|
} else if (ret == EU_write) {
|
||||||
cerr << "bytes per second: " << dl.get_bytes_per_second() << endl;
|
cerr << "bytes per second: " << dl.get_bytes_per_second() << endl;
|
||||||
} else if (ret < 0) {
|
} else if (ret < 0) {
|
||||||
@ -35,5 +42,14 @@ main(int argc, char *argv[]) {
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
cerr << "download to memory complete" << endl;
|
||||||
|
Ramfile rfile;
|
||||||
|
dl.get_ramfile(rfile);
|
||||||
|
cerr << "ram file length: " << rfile._data.length() << endl;
|
||||||
|
Decompressor dc;
|
||||||
|
dc.decompress(rfile);
|
||||||
|
cerr << "ram file length: " << rfile._data.length() << endl;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -12,3 +12,12 @@ INLINE int Buffer::
|
|||||||
get_length(void) const {
|
get_length(void) const {
|
||||||
return _length;
|
return _length;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
// Function: Ramfile::constructor
|
||||||
|
// Access: Published
|
||||||
|
// Description:
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
INLINE Ramfile::
|
||||||
|
Ramfile(void) {
|
||||||
|
}
|
||||||
|
@ -34,6 +34,18 @@ private:
|
|||||||
int _length;
|
int _length;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
// Class : Ramfile
|
||||||
|
// Description :
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
class EXPCL_PANDAEXPRESS Ramfile {
|
||||||
|
PUBLISHED:
|
||||||
|
INLINE Ramfile(void);
|
||||||
|
|
||||||
|
public:
|
||||||
|
string _data;
|
||||||
|
};
|
||||||
|
|
||||||
#include "buffer.I"
|
#include "buffer.I"
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
x
Reference in New Issue
Block a user