00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015 #include "compress_string.h"
00016
00017 #ifdef HAVE_ZLIB
00018 #include "zStream.h"
00019 #include "virtualFileSystem.h"
00020 #include "config_express.h"
00021
00022
00023
00024
00025
00026
00027
00028
00029 string
00030 compress_string(const string &source, int compression_level) {
00031 ostringstream dest;
00032
00033 {
00034 OCompressStream compress;
00035 compress.open(&dest, false, compression_level);
00036 compress.write(source.data(), source.length());
00037
00038 if (compress.fail()) {
00039 return string();
00040 }
00041 }
00042
00043 return dest.str();
00044 }
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056 string
00057 decompress_string(const string &source) {
00058 istringstream source_stream(source);
00059 ostringstream dest_stream;
00060
00061 if (!decompress_stream(source_stream, dest_stream)) {
00062 return string();
00063 }
00064
00065 return dest_stream.str();
00066 }
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078 EXPCL_PANDAEXPRESS bool
00079 compress_file(const Filename &source, const Filename &dest, int compression_level) {
00080 VirtualFileSystem *vfs = VirtualFileSystem::get_global_ptr();
00081 Filename source_filename = source;
00082 if (!source_filename.is_binary_or_text()) {
00083
00084 source_filename.set_binary();
00085 }
00086 istream *source_stream = vfs->open_read_file(source_filename, false);
00087 if (source_stream == NULL) {
00088 express_cat.info() << "Couldn't open file " << source_filename << "\n";
00089 return false;
00090 }
00091
00092 Filename dest_filename = Filename::binary_filename(dest);
00093 ostream *dest_stream = vfs->open_write_file(dest_filename, false, true);
00094 if (dest_stream == NULL) {
00095 express_cat.info() << "Couldn't open file " << dest_filename << "\n";
00096 vfs->close_read_file(source_stream);
00097 return false;
00098 }
00099
00100 bool result = compress_stream(*source_stream, *dest_stream, compression_level);
00101 vfs->close_read_file(source_stream);
00102 vfs->close_write_file(dest_stream);
00103 return result;
00104 }
00105
00106
00107
00108
00109
00110
00111
00112
00113
00114
00115
00116
00117
00118
00119 EXPCL_PANDAEXPRESS bool
00120 decompress_file(const Filename &source, const Filename &dest) {
00121 Filename source_filename = Filename::binary_filename(source);
00122 VirtualFileSystem *vfs = VirtualFileSystem::get_global_ptr();
00123 istream *source_stream = vfs->open_read_file(source_filename, false);
00124 if (source_stream == NULL) {
00125 express_cat.info() << "Couldn't open file " << source_filename << "\n";
00126 return false;
00127 }
00128
00129 Filename dest_filename = dest;
00130 if (!dest_filename.is_binary_or_text()) {
00131
00132 dest_filename.set_binary();
00133 }
00134 ostream *dest_stream = vfs->open_write_file(dest_filename, false, true);
00135 if (dest_stream == NULL) {
00136 express_cat.info() << "Couldn't open file " << dest_filename << "\n";
00137 vfs->close_read_file(source_stream);
00138 return false;
00139 }
00140
00141 bool result = decompress_stream(*source_stream, *dest_stream);
00142 vfs->close_read_file(source_stream);
00143 vfs->close_write_file(dest_stream);
00144 return result;
00145 }
00146
00147
00148
00149
00150
00151
00152
00153
00154
00155
00156
00157 bool
00158 compress_stream(istream &source, ostream &dest, int compression_level) {
00159 OCompressStream compress;
00160 compress.open(&dest, false, compression_level);
00161
00162 static const size_t buffer_size = 4096;
00163 char buffer[buffer_size];
00164
00165 source.read(buffer, buffer_size);
00166 size_t count = source.gcount();
00167 while (count != 0) {
00168 compress.write(buffer, count);
00169 source.read(buffer, buffer_size);
00170 count = source.gcount();
00171 }
00172 compress.close();
00173
00174 return (!source.fail() || source.eof()) && (!compress.fail());
00175 }
00176
00177
00178
00179
00180
00181
00182
00183
00184
00185
00186
00187
00188
00189
00190
00191 bool
00192 decompress_stream(istream &source, ostream &dest) {
00193 IDecompressStream decompress(&source, false);
00194
00195 static const size_t buffer_size = 4096;
00196 char buffer[buffer_size];
00197
00198 decompress.read(buffer, buffer_size);
00199 size_t count = decompress.gcount();
00200 while (count != 0) {
00201 dest.write(buffer, count);
00202 decompress.read(buffer, buffer_size);
00203 count = decompress.gcount();
00204 }
00205
00206 return (!decompress.fail() || decompress.eof()) && (!dest.fail());
00207 }
00208
00209 #endif // HAVE_ZLIB