/** ******************************************************************************* @file /net/compress.cpp @brief Nastroje na kompresi a dekompresi @author Vta @version 1.0 ******************************************************************************/ #include #include #include #include "net/compress.h" #include "common/xml/strda.h" #include "common/Log.h" #include "common/exc.h" #include "zlib/zlib.h" char bu_outC[COMPRESS_BUFFER]; int MyCompress(char * source, DA * dest, int level) { int ret, flush; unsigned have; z_stream strm; // pouziti defautlnich funkci, inicializace strm strm.zalloc = Z_NULL; strm.zfree = Z_NULL; strm.opaque = Z_NULL; ret = deflateInit(&strm, level); if (ret != Z_OK) return ret; strm.avail_in = strlen(source); flush = Z_FINISH; strm.next_in = (unsigned char*)source; // pousti se deflate() na vstup dokud neni vystupni buffer plny do { strm.avail_out = COMPRESS_BUFFER; strm.next_out = (unsigned char*)bu_outC; ret = deflate(&strm, flush); if (ret==Z_STREAM_ERROR) { GLOBALLOGID(PRIORITY_COMPRESSION,"Chyba pri kompresi"); THROW(E_8K_COMPRESSION,"Chyba pri kompresi"); } have = COMPRESS_BUFFER - strm.avail_out; addtodanum(dest,bu_outC,0,have); } while (strm.avail_out == 0); // konci, kdyz uz vsechny vstupni data byla prectena // ukoncit strm (void)deflateEnd(&strm); return Z_OK; } char bu_outD[COMPRESS_BUFFER]; int MyDecompress(char * source, int size, DA * dest) { int ret; unsigned have; z_stream strm; // inicializace strm strm.zalloc = Z_NULL; strm.zfree = Z_NULL; strm.opaque = Z_NULL; strm.avail_in = 0; strm.next_in = Z_NULL; ret = inflateInit(&strm); if (ret != Z_OK) return ret; strm.avail_in = size; strm.next_in = (unsigned char*)source; // vlastni cteni vstupu do { strm.avail_out = COMPRESS_BUFFER; strm.next_out = (unsigned char*)bu_outD; ret = inflate(&strm, Z_NO_FLUSH); if (ret==Z_STREAM_ERROR) { GLOBALLOGID(PRIORITY_COMPRESSION,"Compression error"); THROW(E_8K_COMPRESSION,"Compression error"); } switch (ret) { case Z_NEED_DICT: ret = Z_DATA_ERROR; // a ukonci case Z_DATA_ERROR: case Z_MEM_ERROR: (void)inflateEnd(&strm); return ret; } have = COMPRESS_BUFFER - strm.avail_out; addtodanum(dest,bu_outD,0,have); } while (strm.avail_out == 0); // konec, kdyz uz na vstupu nic neni // ukonceni strm (void)inflateEnd(&strm); return ret == Z_STREAM_END ? Z_OK : Z_DATA_ERROR; }