15 #include "pandabase.h" 19 #include "config_downloader.h" 21 #include "error_utils.h" 25 #include "config_express.h" 26 #include "trueClock.h" 28 #include "decompressor.h" 64 initiate(
const Filename &source_file) {
66 if (extension ==
"pz") {
69 return initiate(source_file, dest_file);
72 if (downloader_cat.is_debug()) {
73 downloader_cat.debug()
74 <<
"Unknown file extension for decompressor: ." 77 return EU_error_abort;
92 _source_filename =
Filename(source_file);
93 _source_filename.set_binary();
95 pifstream *source_pfstream =
new pifstream;
96 _source = source_pfstream;
97 if (!_source_filename.open_read(*source_pfstream)) {
98 downloader_cat.error()
99 <<
"Unable to read " << _source_filename <<
"\n";
100 return get_write_error();
104 source_pfstream->seekg(0, ios::end);
105 _source_length = source_pfstream->tellg();
106 if (_source_length == 0) {
107 downloader_cat.warning()
108 <<
"Zero length file: " << source_file <<
"\n";
109 return EU_error_file_empty;
111 source_pfstream->seekg(0, ios::beg);
115 dest_filename.set_binary();
117 pofstream *dest_pfstream =
new pofstream;
118 _dest = dest_pfstream;
119 if (dest_filename.exists()) {
120 downloader_cat.info()
121 << dest_filename <<
" already exists, removing.\n";
122 if (!dest_filename.unlink()) {
123 downloader_cat.error()
124 <<
"Unable to remove old " << dest_filename <<
"\n";
125 return get_write_error();
128 if (downloader_cat.is_debug()) {
129 downloader_cat.debug()
130 << dest_filename <<
" does not already exist.\n";
133 if (!dest_filename.open_write(*dest_pfstream,
true)) {
134 downloader_cat.error()
135 <<
"Unable to write to " << dest_filename <<
"\n";
136 return get_write_error();
140 _decompress =
new IDecompressStream(_source,
false);
155 if (_decompress == (istream *)NULL) {
161 double now = clock->get_short_time();
162 double finish = now + decompressor_step_time;
164 static const size_t buffer_size = 1024;
165 char buffer[buffer_size];
167 _decompress->read(buffer, buffer_size);
168 size_t count = _decompress->gcount();
170 _dest->write(buffer, count);
172 now = clock->get_short_time();
178 _decompress->read(buffer, buffer_size);
179 count = _decompress->gcount();
184 if (!keep_temporary_files) {
185 _source_filename.unlink();
198 decompress(
const Filename &source_file) {
199 int ret = initiate(source_file);
203 int ch = _decompress->get();
204 while (!_decompress->eof() && !_decompress->fail()) {
206 ch = _decompress->get();
210 if (!keep_temporary_files) {
211 _source_filename.unlink();
224 decompress(
Ramfile &source_and_dest_file) {
228 IDecompressStream decompress(&source,
false);
230 int ch = decompress.get();
231 while (!decompress.eof() && !decompress.fail()) {
233 ch = decompress.get();
236 source_and_dest_file._pos = 0;
237 source_and_dest_file._data = dest.str();
247 PN_stdfloat Decompressor::
248 get_progress()
const {
249 if (_decompress == (istream *)NULL) {
254 nassertr(_source_length > 0, 0.0);
255 size_t source_pos = _source->tellg();
259 return (0.99f * (PN_stdfloat)source_pos / (PN_stdfloat)_source_length);
270 if (_source != (istream *)NULL) {
274 if (_dest != (ostream *)NULL) {
278 if (_decompress != (istream *)NULL) {
static TrueClock * get_global_ptr()
Returns a pointer to the one TrueClock object in the world.
string get_extension() const
Returns the file extension.
The name of a file, such as a texture file or an Egg file.
An in-memory buffer specifically designed for downloading files to memory.
An interface to whatever real-time clock we might have available in the current environment.
string get_fullpath_wo_extension() const
Returns the full filename–directory and basename parts–except for the extension.