00001
00011 #ifdef CPLUSPLUS
00012 #undef CPLUSPLUS
00013 #endif
00014
00015 #include "gz_tool.h"
00016 #include "jbxl_state.h"
00017
00018
00019 #ifndef DISABLE_ZLIB
00020
00021
00023
00024
00033 Buffer gz_decode_data(Buffer enc)
00034 {
00035 Buffer dec = init_Buffer();
00036
00037 if (enc.buf==NULL) return dec;
00038
00039 z_stream zstrm;
00040 zstrm.zalloc = Z_NULL;
00041 zstrm.zfree = Z_NULL;
00042 zstrm.opaque = Z_NULL;
00043 zstrm.next_in = Z_NULL;
00044 zstrm.avail_in = 0;
00045
00046 int ret = inflateInit2(&zstrm, 47);
00047 if (ret!=Z_OK) return dec;
00048
00049
00050 dec = make_Buffer(enc.vldsz*5);
00051 Buffer wrk = make_Buffer(BUFSZ);
00052
00053 zstrm.next_in = enc.buf;
00054 zstrm.avail_in = (size_t)enc.vldsz;
00055
00056 do {
00057 zstrm.next_out = wrk.buf;
00058 zstrm.avail_out = (size_t)wrk.bufsz;
00059
00060 ret = inflate(&zstrm, Z_NO_FLUSH);
00061 if (ret!=Z_OK && ret!=Z_STREAM_END) {
00062 wrk.vldsz = wrk.bufsz - zstrm.avail_out;
00063 cat_Buffer(&wrk, &dec);
00064 inflateEnd(&zstrm);
00065 free_Buffer(&wrk);
00066
00067 DEBUG_MODE PRINT_MESG("GZ_DECODE_DATA: ERROR: inflate error = %d\n", ret);
00068 dec.state = JBXL_ERROR;
00069 return dec;
00070 }
00071
00072 wrk.vldsz = wrk.bufsz - zstrm.avail_out;
00073 cat_Buffer(&wrk, &dec);
00074
00075 if (ret==Z_STREAM_END && zstrm.avail_in!=0) {
00076 ret = inflateReset(&zstrm);
00077 }
00078
00079 } while (ret!=Z_STREAM_END && zstrm.avail_in>0);
00080
00081
00082 inflateEnd(&zstrm);
00083 free_Buffer(&wrk);
00084
00085 return dec;
00086 }
00087
00088
00100 void deflate2gzip(Buffer* def)
00101 {
00102 unsigned char gzip_header[] = { 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff};
00103 unsigned char gzip_tailer[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
00104
00105 Buffer gzp = init_Buffer();
00106
00107 if (def->buf[0]==GZIP_DEFLATE_ID1 && def->buf[1]==GZIP_DEFLATE_ID2) {
00108 gzp = make_Buffer(def->vldsz+16);
00109 cat_b2Buffer(gzip_header, &gzp, 10);
00110 cat_b2Buffer(def->buf+2, &gzp, def->vldsz-2);
00111 cat_b2Buffer(gzip_tailer, &gzp, 8);
00112 free_Buffer(def);
00113 *def = gzp;
00114 }
00115
00116 return;
00117 }
00118
00119
00120
00122
00123
00124
00134 int gz_decode_fp(FILE* infp, FILE* otfp)
00135 {
00136 if (infp==NULL || otfp==NULL) return 0;
00137
00138 int sz = 0;
00139 unsigned char inbuf[LBUF];
00140 unsigned char otbuf[BUFSZ];
00141
00142
00143 z_stream zstrm;
00144 zstrm.zalloc = Z_NULL;
00145 zstrm.zfree = Z_NULL;
00146 zstrm.opaque = Z_NULL;
00147 zstrm.next_in = Z_NULL;
00148 zstrm.avail_in = 0;
00149
00150 int ret = inflateInit2(&zstrm, 47);
00151 if (ret!=Z_OK) return JBXL_ERROR;
00152
00153 do {
00154 zstrm.next_in = inbuf;
00155 zstrm.avail_in = (int)fread(inbuf, 1, LBUF, infp);
00156
00157 do {
00158 zstrm.next_out = otbuf;
00159 zstrm.avail_out = BUFSZ;
00160
00161 ret = inflate(&zstrm, Z_NO_FLUSH);
00162 if (ret!=Z_OK && ret!=Z_STREAM_END) {
00163 fwrite(otbuf, BUFSZ-zstrm.avail_out, 1, otfp);
00164
00165 inflateEnd(&zstrm);
00166 DEBUG_MODE PRINT_MESG("GZ_DECODE_FP: ERROR: inflate error = %d\n", ret);
00167 if (sz==0) sz = JBXL_ERROR;
00168 return sz;
00169 }
00170
00171 int otsz = BUFSZ - zstrm.avail_out;
00172 fwrite(otbuf, otsz, 1, otfp);
00173 sz += otsz;
00174
00175 if (ret==Z_STREAM_END && zstrm.avail_in!=0) {
00176 ret = inflateReset(&zstrm);
00177 }
00178
00179 } while (ret!=Z_STREAM_END && zstrm.avail_in>0);
00180
00181 } while(!feof(infp));
00182
00183 inflateEnd(&zstrm);
00184
00185 return sz;
00186 }
00187
00188
00189
00190
00191
00192
00193
00194
00195
00196
00197
00198 int gz_encode_gzfp(FILE* fp, gzFile* gf)
00199 {
00200 size_t cc, sz;
00201 unsigned char buf[RECVBUFSZ];
00202
00203 if (*gf==NULL) return JBXL_ARGS_ERROR;
00204
00205 memset(buf, 0, RECVBUFSZ);
00206 sz = cc = (int)fread(buf, RECVBUFSZ, 1, fp);
00207 while(cc>0) {
00208 gzwrite(*gf, (voidp)buf, (unsigned int)cc);
00209 memset(buf, 0, cc);
00210 cc = fread(buf, RECVBUFSZ, 1, fp);
00211 sz += cc;
00212 }
00213
00214 return (int)sz;
00215 }
00216
00217
00227 int gz_decode_gzfp(gzFile* gf, FILE* fp)
00228 {
00229 int cc, sz;
00230 unsigned char buf[RECVBUFSZ];
00231
00232 if (*gf==NULL) return JBXL_ARGS_ERROR;
00233
00234 memset(buf, 0, RECVBUFSZ);
00235 sz = cc = gzread(*gf, (voidp)buf, RECVBUFSZ);
00236 while(cc>0) {
00237 fwrite(buf, cc, 1, fp);
00238 memset(buf, 0, cc);
00239 cc = gzread(*gf, (voidp)buf, RECVBUFSZ);
00240 sz += cc;
00241 }
00242
00243 return sz;
00244 }
00245
00246
00256 int gz_encode_file(const char* fmfn, const char* tofn)
00257 {
00258 size_t cc, sz;
00259 unsigned char buf[RECVBUFSZ];
00260 gzFile gf;
00261 FILE* fp;
00262
00263 fp = fopen(fmfn, "rb");
00264 if (fp==NULL) return JBXL_FILE_OPEN_ERROR;
00265
00266 gf = gzopen(tofn, "wb");
00267 if (gf==NULL) {
00268 fclose(fp);
00269 return JBXL_FILE_DESTOPEN_ERROR;
00270 }
00271
00272 memset(buf, 0, RECVBUFSZ);
00273 sz = cc = fread(buf, RECVBUFSZ, 1, fp);
00274 while(cc>0) {
00275 gzwrite(gf, (voidp)buf, (unsigned int)cc);
00276 memset(buf, 0, cc);
00277 cc = fread(buf, RECVBUFSZ, 1, fp);
00278 sz += cc;
00279 }
00280
00281 gzclose(gf);
00282 fclose(fp);
00283
00284 return (int)sz;
00285 }
00286
00287
00297 int gz_decode_file(const char* fmfn, const char* tofn)
00298 {
00299 FILE* infp;
00300 FILE* otfp;
00301
00302 infp = fopen(fmfn, "rb");
00303 if (infp==NULL) return JBXL_FILE_OPEN_ERROR;
00304
00305 otfp = fopen(tofn, "wb");
00306 if (otfp==NULL) {
00307 fclose(infp);
00308 return JBXL_FILE_DESTOPEN_ERROR;
00309 }
00310
00311 int sz = gz_decode_fp(infp, otfp);
00312
00313 fclose(infp);
00314 fclose(otfp);
00315
00316 return sz;
00317
00318
00319
00320
00321
00322
00323
00324
00325
00326
00327
00328
00329
00330
00331
00332
00333
00334
00335
00336
00337
00338
00339
00340
00341
00342
00343
00344
00345
00346
00347 }
00348
00349
00359 int gz_decode_file_replace(const char* fn, const char* tempdir)
00360 {
00361 int cc;
00362 char* tempfn;
00363
00364 tempfn = temp_filename(tempdir, 16);
00365 cc = gz_decode_file(fn, tempfn);
00366 if (cc<=0) {
00367 unlink(tempfn);
00368 free(tempfn);
00369 return cc;
00370 }
00371
00372 unlink(fn);
00373 rename(tempfn, fn);
00374 freeNull(tempfn);
00375
00376 return cc;
00377 }
00378
00379
00380 #endif