c++ test Zlib_CompressFiles

This commit is contained in:
Kulikova Svetlana
2021-04-21 14:36:03 +03:00
parent d931a2d160
commit 1a75df8721
3 changed files with 30 additions and 10 deletions

View File

@ -164,6 +164,8 @@ unsigned char* Zlib_CompressFiles(Zlib* p, unsigned char* tree)
if (p && tree)
{
BUFFER_IO* buf = new BUFFER_IO;
buf->bGrow = 1;
buf->nCurrentPos = 0;
zipFile zip_file_handle = zipOpenHelp(buf);
unsigned int nLength = GetLength(tree);
@ -186,14 +188,15 @@ unsigned char* Zlib_CompressFiles(Zlib* p, unsigned char* tree)
zipClose(zip_file_handle, NULL);
return NULL;
}
i += nFileLength;
}
zipClose(zip_file_handle, NULL);
p->buffer = buf->buffer;
p->size = buf->nSize;
CData oRes;
oRes.WriteString(buf->buffer, buf->nSize);
return oRes.GetBuffer();
CData* oRes = new CData;
oRes->WriteString(buf->buffer, buf->nSize);
return oRes->GetBuffer();
}
return NULL;
}

View File

@ -10,21 +10,24 @@ static int ZCALLBACK error_buffer_func OF((voidpf opaque, voidpf stream));
voidpf ZCALLBACK open_buffer_func (voidpf opaque, const char* filename, int mode)
{
voidpf ret = NULL;
BUFFER_IO* hFile = NULL;
if (opaque != NULL)
hFile = (BUFFER_IO*)opaque;
if (hFile != NULL)
{
if (mode & ZLIB_FILEFUNC_MODE_CREATE)
{
if (hFile->bGrow)
{
hFile->nSize = 0xffff;
hFile->buffer = malloc(hFile->nSize);
}
hFile->nLimit = 0;
}
else
hFile->nLimit = hFile->nSize;
ret = malloc(sizeof(BUFFER_IO));
if (ret != NULL)
*((BUFFER_IO*)ret) = *hFile;
}
return ret;
return hFile;
}
uLong ZCALLBACK read_buffer_func (voidpf opaque, voidpf stream, void* buf, uLong size)
@ -54,13 +57,26 @@ uLong ZCALLBACK write_buffer_func(voidpf opaque, voidpf stream, const void* buf
if (hFile != NULL)
{
if (hFile->nCurrentPos + size > hFile->nSize)
ret = hFile->nSize - hFile->nCurrentPos;
{
if (hFile->bGrow)
{
uLong nNewSize = hFile->nSize + (size < 0xffff ? 0xffff : size);
unsigned char* NewBuffer = malloc(nNewSize);
memcpy(NewBuffer, hFile->buffer, hFile->nSize);
free(hFile->buffer);
hFile->buffer = NewBuffer;
hFile->nSize = nNewSize;
ret = size;
}
else
ret = hFile->nSize - hFile->nCurrentPos;
}
else
ret = size;
memcpy(hFile->buffer + hFile->nCurrentPos, buf, ret);
hFile->nCurrentPos += ret;
if (hFile->nCurrentPos > hFile->nLimit)
hFile->nLimit = hFile->nCurrentPos;
hFile->nLimit = hFile->nCurrentPos;
}
return ret;
}

View File

@ -13,6 +13,7 @@ typedef struct {
uLong nLimit;
uLong nCurrentPos;
int error;
int bGrow;
} BUFFER_IO;
void fill_buffer_filefunc OF((zlib_filefunc_def* pzlib_filefunc_def, BUFFER_IO* buffer));