mirror of
https://github.com/ONLYOFFICE/core.git
synced 2026-04-07 13:55:33 +08:00
c++ test Zlib_CompressFiles
This commit is contained in:
@ -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;
|
||||
}
|
||||
|
||||
@ -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;
|
||||
}
|
||||
|
||||
@ -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));
|
||||
|
||||
Reference in New Issue
Block a user