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;