miniZip 라이브러리는 기본적으로 파일 IO 기반으로 만들어졌지만, 필요하면 사용자가 직접 IO를 핸들링할 수 있습니다. 사용자 IO 핸들링을 위해 함수 포인터로 구성된 구조체를 지원하면, 세부적인 구현 방식은 stdio에 있는 파일 IO와 유사한 규약을 따릅니다.
사용자 IO 핸들링을 사용하면 파일 형태로 저장하지 않고, 버퍼 레벨에서 압축하거나 압축된 결과를 해제할 수 있습니다.
예를 들어서 서버가 메모리 레벨에서 연산된 데이터를 메모리 레벨에서 압축한후 클라이언트로 보낼 수 있습니다. 또한 클라이언트는 서버에서 전달된 데이터를 파일 형태로 저장하지 않고, 메모리 레벨에서 압축해제한 후 내부 데이터를 사용할 수 있게 됩니다.
——-기반 클래스 만들기——–
Z_IO_Base.h 파일
#pragma  once
 
 #include  <LibZ/ioapi.h>
 
 class  Z_IO_Base:public  zlib_filefunc64_def
 {
 public:
     Z_IO_Base(void);
     ~Z_IO_Base(void);
 
 private:
    virtual  voidpf open(const  void* filename, int mode)=0;
    virtual  ZPOS64_T tell()=0;
    virtual  long seek(ZPOS64_T offset, int origin)=0;
    virtual  int close()=0;
 
    //압축을  풀때
    virtual  uLong read(void* buf, uLong size);
 
    //압축할  때
    virtual  uLong write(const  void* buf, uLong size);
    virtual  int error();
 
 private:
    static  voidpf open_fn(voidpf opaque, const  void* filename, int mode);
    static  uLong read_fn(voidpf opaque, voidpf stream, void* buf, uLong size);
    static  uLong write_fn(voidpf opaque, voidpf stream, const  void* buf, uLong size);
    static  ZPOS64_T tell_fn(voidpf opaque, voidpf stream);
    static  long seek_fn(voidpf opaque, voidpf stream, ZPOS64_T offset, int origin);
    static  int close_fn(voidpf opaque, voidpf stream);
    static  int error_fn(voidpf opaque, voidpf stream);
 };
 
 
Z_IO_Base.cpp 파일
#include  "Z_IO_Base.h"
 
 
 Z_IO_Base::Z_IO_Base(void)
 {
    this->opaque = this;
    this->zopen64_file = Z_IO_Base::open_fn;
    this->zread_file = Z_IO_Base::read_fn;
    this->zwrite_file = Z_IO_Base::write_fn;
    this->ztell64_file = Z_IO_Base::tell_fn;
    this->zclose_file = Z_IO_Base::close_fn;
    this->zerror_file = Z_IO_Base::error_fn;
    this->zseek64_file = Z_IO_Base::seek_fn;
 }
 
 
 Z_IO_Base::~Z_IO_Base(void)
 {
 }
 
 
 voidpf  
 Z_IO_Base::open_fn(voidpf  opaque, const  void* filename, int  mode){
    Z_IO_Base* obj= (Z_IO_Base*)opaque;
    return obj->open(filename, mode);
 }
 
 uLong  
 Z_IO_Base::read_fn(voidpf  opaque, voidpf  stream, void* buf, uLong  size){
    Z_IO_Base* obj= (Z_IO_Base*)opaque;
    return obj->read(buf, size);
 }
 
 uLong  
 Z_IO_Base::write_fn(voidpf  opaque, voidpf  stream, const  void* buf, uLong  size){
    Z_IO_Base* obj= (Z_IO_Base*)opaque;
    return obj->write(buf, size);
 }
 
 int  
 Z_IO_Base::close_fn(voidpf  opaque, voidpf  stream){
    Z_IO_Base* obj= (Z_IO_Base*)opaque;
    return obj->close();
 }
 
 
 ZPOS64_T 
 Z_IO_Base::tell_fn(voidpf  opaque, voidpf  stream){
    Z_IO_Base* obj= (Z_IO_Base*)opaque;
    return obj->tell();
 }
 
 long  
 Z_IO_Base::seek_fn(voidpf  opaque, voidpf  stream, ZPOS64_T  offset, int  origin){
    Z_IO_Base* obj= (Z_IO_Base*)opaque;
    return obj->seek(offset, origin);
 }
 
 
 int  
 Z_IO_Base::error_fn(voidpf  opaque, voidpf  stream){
    Z_IO_Base* obj= (Z_IO_Base*)opaque;
    return obj->error();
 }
 
 uLong  
 Z_IO_Base::read(void* buf, uLong  size){
    return  size;