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