Commit bf061cb6 authored by Sergey.Konovalov's avatar Sergey.Konovalov Committed by Alexander Trofimov

add ASCOfficeUtils lib

git-svn-id: svn://fileserver/activex/AVS/Sources/TeamlabOffice/trunk/ServerComponents@59103 954022d7-b5bf-4e40-9824-e11837661b57
parent 5d03e37d
...@@ -3013,6 +3013,7 @@ Test/Applications/SpreadsheetEditor/bin/release/spreadsheeteditor_ru.qm svn_mime ...@@ -3013,6 +3013,7 @@ Test/Applications/SpreadsheetEditor/bin/release/spreadsheeteditor_ru.qm svn_mime
Test/Applications/SpreadsheetEditor/bin/release/ssleay32.dll svn_mime_002dtype=application%2Foctet-stream Test/Applications/SpreadsheetEditor/bin/release/ssleay32.dll svn_mime_002dtype=application%2Foctet-stream
Test/Applications/SpreadsheetEditor/bin/release/zlibwapi.dll svn_mime_002dtype=application%2Foctet-stream Test/Applications/SpreadsheetEditor/bin/release/zlibwapi.dll svn_mime_002dtype=application%2Foctet-stream
Test/Applications/TeamlabDocControlService/TeamlabDocControlService/bin/Release/TeamlabDocControlService.exe svn_mime_002dtype=application%2Foctet-stream Test/Applications/TeamlabDocControlService/TeamlabDocControlService/bin/Release/TeamlabDocControlService.exe svn_mime_002dtype=application%2Foctet-stream
Test/Applications/TestASCOfficeUtils/test.zip svn_mime_002dtype=application%2Foctet-stream
Test/Applications/TestASCWord/ASCWord/ASCWord_big.bmp svn_mime_002dtype=application%2Foctet-stream Test/Applications/TestASCWord/ASCWord/ASCWord_big.bmp svn_mime_002dtype=application%2Foctet-stream
Test/Applications/TestASCWord/ASCWord/ASCWord_small.bmp svn_mime_002dtype=application%2Foctet-stream Test/Applications/TestASCWord/ASCWord/ASCWord_small.bmp svn_mime_002dtype=application%2Foctet-stream
Test/Applications/TestASCWord/ASCWord/PortableTools/TLBExtract.exe svn_mime_002dtype=application%2Foctet-stream Test/Applications/TestASCWord/ASCWord/PortableTools/TLBExtract.exe svn_mime_002dtype=application%2Foctet-stream
......
#include "ZipUtilsCP.h"
#include <memory>
#include "../../DesktopEditor/graphics/TemporaryCS.h"
#include "../../DesktopEditor/common/Directory.h"
#include "../../DesktopEditor/common/Path.h"
#define WRITEBUFFERSIZE 8192
#define READBUFFERSIZE 8192
// This class helps to lock/unlock critical section and defend any using code from deadlocks due to unhandled exceptions
class CSLocker
{
public:
CSLocker(NSCriticalSection::CRITICAL_SECTION &critical_section) : cs(critical_section)
{
cs.Enter();
}
~CSLocker(void)
{
cs.Leave();
}
private:
NSCriticalSection::CRITICAL_SECTION &cs;
};
namespace ZLibZipUtils
{
NSCriticalSection::CRITICAL_SECTION criticalSection;
/*This static functions are copies from ZLib miniunz.c with some changes.*/
static std::wstring codepage_issue_fixFromOEM( const char* sVal)
{
#ifdef _WIN32
int nBufferSize = MultiByteToWideChar( CP_OEMCP, 0, sVal, -1, NULL, 0 );
wchar_t* pBuffer = new wchar_t[nBufferSize];
MultiByteToWideChar( CP_OEMCP, 0, sVal, -1, pBuffer, nBufferSize );
std::wstring sRes(pBuffer, nBufferSize);
RELEASEARRAYOBJECTS(pBuffer);
return sRes;
#else
return NSFile::CUtf8Converter::GetUnicodeStringFromUTF8((BYTE*)sVal, strlen(sVal));
#endif
}
static std::string codepage_issue_fixToOEM(const std::wstring& sVal)
{
#ifdef _WIN32
const wchar_t* buffer = sVal.c_str();
int nBufferSize = WideCharToMultiByte( CP_OEMCP, 0, buffer, -1, NULL, 0, NULL, NULL );
char* pBuffer = new char[nBufferSize];
WideCharToMultiByte( CP_OEMCP, 0, buffer, -1, pBuffer, nBufferSize, NULL, NULL );
std::string sRes(pBuffer, nBufferSize);
RELEASEARRAYOBJECTS(pBuffer);
return sRes;
#else
return NSFile::CUtf8Converter::GetUtf8StringFromUnicode2(sVal.c_str(), sVal.length());
#endif
}
static void change_file_date( const wchar_t *filename, uLong dosdate, tm_unz tmu_date );
static int mymkdir( const wchar_t* dirname );
static int makedir( const wchar_t *newdir );
static int do_extract_currentfile( unzFile uf, const int* popt_extract_without_path, int* popt_overwrite, const char* password );
static int do_extract( unzFile uf, int opt_extract_without_path, int opt_overwrite, const char* password, const OnProgressCallback* progress );
static bool is_file_in_archive(unzFile uf, const wchar_t *filename);
static bool current_file_is_find(unzFile uf, const wchar_t *filename);
static bool get_file_in_archive(unzFile uf, const wchar_t *filePathInZip, BYTE** fileInBytes, ULONG& nFileSize);
static unsigned int get_files_count( const WCHAR* dirname );
/*========================================================================================================*/
/* change_file_date : change the date/time of a file
filename : the filename of the file where date/time must be modified
dosdate : the new date at the MSDos format (4 bytes)
tmu_date : the SAME new date at the tm_unz format */
static void change_file_date( const wchar_t *filename, uLong dosdate, tm_unz tmu_date )
{
#ifdef _WIN32
HANDLE hFile;
FILETIME ftm,ftLocal,ftCreate,ftLastAcc,ftLastWrite;
hFile = CreateFile(filename,GENERIC_READ | GENERIC_WRITE,
0,NULL,OPEN_EXISTING,0,NULL);
GetFileTime(hFile,&ftCreate,&ftLastAcc,&ftLastWrite);
DosDateTimeToFileTime((WORD)(dosdate>>16),(WORD)dosdate,&ftLocal);
LocalFileTimeToFileTime(&ftLocal,&ftm);
SetFileTime(hFile,&ftm,&ftLastAcc,&ftm);
CloseHandle(hFile);
#endif
}
/*========================================================================================================*/
/* mymkdir and change_file_date are not 100 % portable
As I don't know well Unix, I wait feedback for the unix portion */
static int mymkdir( const wchar_t* dirname )
{
//todo return
NSDirectory::CreateDirectory(dirname);
return 0;
}
/*========================================================================================================*/
static int makedir( const wchar_t *newdir )
{
wchar_t *buffer ;
wchar_t *p;
int len = (int)wcslen(newdir);
if (len <= 0)
return 0;
buffer = new wchar_t[len+1];
wcscpy(buffer, newdir);
if (buffer[len-1] == '/') {
buffer[len-1] = '\0';
}
if (mymkdir(buffer) == 0)
{
delete[] buffer;
return 1;
}
p = buffer+1;
while (1)
{
char hold;
while(*p && *p != '\\' && *p != '/')
p++;
hold = *p;
*p = 0;
if ((mymkdir(buffer) == -1) && (errno == ENOENT))
{
delete[] buffer;
return 0;
}
if (hold == 0)
break;
*p++ = hold;
}
delete[] buffer;
return 1;
}
/*========================================================================================================*/
static int do_extract_currentfile( unzFile uf, const int* popt_extract_without_path, int* popt_overwrite, const char* password )
{
char filename_inzipA[256];
wchar_t filename_inzip[256];
wchar_t* filename_withoutpath;
wchar_t* p;
int err=UNZ_OK;
NSFile::CFileBinary oFile;
FILE *fout=NULL;
void* buf;
uInt size_buf;
unz_file_info file_info;
uLong ratio=0;
err = unzGetCurrentFileInfo(uf,&file_info,filename_inzipA,sizeof(filename_inzipA),NULL,0,NULL,0);
std::wstring filenameW = codepage_issue_fixFromOEM(filename_inzipA);
wcscpy(filename_inzip , filenameW.c_str());
if (err!=UNZ_OK)
{
return err;
}
size_buf = WRITEBUFFERSIZE;
buf = (void*)malloc(size_buf);
if (buf==NULL)
{
return UNZ_INTERNALERROR;
}
p = filename_withoutpath = filename_inzip;
while ((*p) != '\0')
{
if (((*p)=='/') || ((*p)=='\\'))
filename_withoutpath = p+1;
p++;
}
if ((*filename_withoutpath)=='\0')
{
if ((*popt_extract_without_path)==0)
{
mymkdir(filename_inzip);
}
}
else
{
const wchar_t* write_filename;
int skip=0;
if ((*popt_extract_without_path)==0)
write_filename = filename_inzip;
else
write_filename = filename_withoutpath;
err = unzOpenCurrentFilePassword(uf,password);
if (((*popt_overwrite)==0) && (err==UNZ_OK))
{
char rep=0;
NSFile::CFileBinary oFileTemp;
if (oFileTemp.OpenFile(write_filename))
{
oFileTemp.CloseFile();
}
if (rep == 'N')
skip = 1;
if (rep == 'A')
*popt_overwrite=1;
}
if ((skip==0) && (err==UNZ_OK))
{
if(oFile.CreateFileW(write_filename))
fout = oFile.GetFileNative();
// some zipfile don't contain directory alone before file
if ((fout==NULL) && ((*popt_extract_without_path)==0) &&
(filename_withoutpath!=(wchar_t*)filename_inzip))
{
char c=*(filename_withoutpath-1);
*(filename_withoutpath-1)='\0';
makedir(write_filename);
*(filename_withoutpath-1)=c;
if(oFile.CreateFileW(write_filename))
fout = oFile.GetFileNative();
}
}
if (fout!=NULL)
{
do
{
err = unzReadCurrentFile(uf, buf, size_buf);
if (err<0)
{
break;
}
if (err>0)
if (fwrite(buf,err,1,fout)!=1)
{
err=UNZ_ERRNO;
break;
}
}
while (err>0);
//close вызовется в oFile
//if (fout)
// fclose(fout);
if (err==0)
change_file_date(write_filename,file_info.dosDate,
file_info.tmu_date);
}
if (err==UNZ_OK)
{
err = unzCloseCurrentFile (uf);
}
else
unzCloseCurrentFile(uf); // don't lose the error
}
free(buf);
return err;
}
/*========================================================================================================*/
static int do_extract( unzFile uf, int opt_extract_without_path, int opt_overwrite, const char* password, const OnProgressCallback* progress )
{
uLong i;
unz_global_info gi;
int err;
FILE* fout=NULL;
err = unzGetGlobalInfo (uf,&gi);
for (i=0;i<gi.number_entry;i++)
{
if (do_extract_currentfile(uf,&opt_extract_without_path,
&opt_overwrite,
password) != UNZ_OK)
break;
if ( progress != NULL )
{
short cancel = 0;
long progressValue = ( 1000000 / gi.number_entry * i );
if(NULL != progress)
(*progress)( UTILS_ONPROGRESSEVENT_ID, progressValue, &cancel );
if ( cancel != 0 )
{
return err;
}
}
if ((i+1)<gi.number_entry)
{
err = unzGoToNextFile(uf);
if (err!=UNZ_OK)
{
break;
}
}
}
if ( progress != NULL )
{
short cancel = 0;
long progressValue = 1000000;
if(NULL != progress)
(*progress)( UTILS_ONPROGRESSEVENT_ID, progressValue, &cancel );
}
return 0;
}
/*========================================================================================================*/
static bool is_file_in_archive(unzFile uf, const wchar_t *filename)
{
uLong i;
unz_global_info gi;
int err;
err = unzGetGlobalInfo (uf,&gi);
for (i = 0; i < gi.number_entry; i++)
{
if (current_file_is_find(uf, filename) == true)
return true;
if ((i + 1) < gi.number_entry)
{
err = unzGoToNextFile(uf);
if (err != UNZ_OK)
break;
}
}
return false;
}
/*========================================================================================================*/
static bool current_file_is_find(unzFile uf, const wchar_t *filename)
{
char filename_inzip[256];
int err = UNZ_OK;
unz_file_info file_info;
err = unzGetCurrentFileInfo(uf, &file_info, filename_inzip, sizeof(filename_inzip), NULL, 0, NULL, 0);
std::wstring filenameW = codepage_issue_fixFromOEM(filename_inzip);
if (wcscmp(filename, filenameW.c_str()))
return true;
return false;
}
/*========================================================================================================*/
static const std::wstring get_filename_from_unzfile(unzFile unzip_file_handle)
{
char filename_inzip[256];
int err = UNZ_OK;
if (UNZ_OK == unzGetCurrentFileInfo(unzip_file_handle, NULL, filename_inzip, sizeof(filename_inzip), NULL, 0, NULL, 0))
return codepage_issue_fixFromOEM(filename_inzip);
return std::wstring(L"");
}
/*========================================================================================================*/
static bool get_file(unzFile unzip_file_handle, BYTE* arr, uInt array_size)
{
if(UNZ_OK == unzOpenCurrentFile(unzip_file_handle))
{
int data_read_size = unzReadCurrentFile(unzip_file_handle, arr, array_size);
unzCloseCurrentFile(unzip_file_handle);
return data_read_size == array_size ? true : false;
}
return false;
}
/*========================================================================================================*/
static bool get_file_in_archive(unzFile unzip_file_handle, const wchar_t *filePathInZip, BYTE** fileInBytes, ULONG& nFileSize)
{
if(NULL == fileInBytes)
return false;
(*fileInBytes) = NULL;
do
{
if (current_file_is_find(unzip_file_handle, filePathInZip) == true)
{
unz_file_info file_info;
unzGetCurrentFileInfo(unzip_file_handle, &file_info, NULL, 0, NULL, 0, NULL, 0);
nFileSize = file_info.uncompressed_size;
(*fileInBytes) = new BYTE[nFileSize];
get_file(unzip_file_handle, (*fileInBytes), nFileSize);
return true;
}
// else just skip the erroneous file
} while (UNZ_OK == unzGoToNextFile(unzip_file_handle));
}
/*========================================================================================================*/
int ZipDir( const WCHAR* dir, const WCHAR* outputFile, const OnProgressCallback* progress, int compressionLevel )
{
criticalSection.Enter();
int err = -1;
if ( ( dir != NULL ) && ( outputFile != NULL ) )
{
deque<wstring> StringDeque;
deque<wstring> zipDeque;
StringDeque.push_back( wstring( dir ) );
wstring zipDir;
wstring file;
wstring zipFileName;
wstring szText;
zipFile zf = zipOpen( outputFile, APPEND_STATUS_CREATE );
zip_fileinfo zi;
zi.tmz_date.tm_sec = zi.tmz_date.tm_min = zi.tmz_date.tm_hour =
zi.tmz_date.tm_mday = zi.tmz_date.tm_mon = zi.tmz_date.tm_year = 0;
zi.dosDate = 0;
zi.internal_fa = 0;
zi.external_fa = 0;
#ifdef _WIN32
SYSTEMTIME currTime;
GetLocalTime( &currTime );
zi.tmz_date.tm_sec = currTime.wSecond;
zi.tmz_date.tm_min = currTime.wMinute;
zi.tmz_date.tm_hour = currTime.wHour;
zi.tmz_date.tm_mday = currTime.wDay;
zi.tmz_date.tm_mon = currTime.wMonth;
zi.tmz_date.tm_year = currTime.wYear;
#endif
unsigned int filesCount = get_files_count( dir );
unsigned int currentFileIndex = 0;
while ( !StringDeque.empty() )
{
szText = StringDeque.front();
StringDeque.pop_front();
if(zipDeque.size() > 0)
{
zipDir = zipDeque.front() + wstring( L"/" );
zipDeque.pop_front();
}
CArray<std::wstring> aCurFiles = NSDirectory::GetFiles(szText);
CArray<std::wstring> aCurDirectories = NSDirectory::GetDirectories(szText);
for(int i = 0; i < aCurDirectories.GetCount(); ++i)
{
std::wstring sCurDirectory = aCurDirectories[i];
std::wstring sDirName = NSSystemPath::GetFileName(sCurDirectory);
StringDeque.push_back( sCurDirectory );
zipDeque.push_back( zipDir + sDirName );
}
for(int i = 0; i < aCurFiles.GetCount(); ++i)
{
std::wstring cFilePath = aCurFiles[i];
std::wstring cFileName = NSSystemPath::GetFileName(cFilePath);
file = NSSystemPath::Combine(szText, cFileName);
zipFileName = zipDir + cFileName;
NSFile::CFileBinary oFile;
if(oFile.OpenFile(file))
{
DWORD dwSizeRead;
BYTE* pData = new BYTE[oFile.GetFileSize()];
if(oFile.ReadFile(pData, oFile.GetFileSize(), dwSizeRead))
{
std::string zipFileNameA = codepage_issue_fixToOEM(zipFileName);
err = zipOpenNewFileInZip( zf, zipFileNameA.c_str(), &zi, NULL, 0, NULL, 0, NULL, Z_DEFLATED, compressionLevel );
err = zipWriteInFileInZip( zf, pData, dwSizeRead );
err = zipCloseFileInZip( zf );
}
RELEASEARRAYOBJECTS(pData);
}
if ( progress != NULL )
{
short cancel = 0;
long progressValue = ( 1000000 / filesCount * currentFileIndex );
if(NULL != progress)
(*progress)( UTILS_ONPROGRESSEVENT_ID, progressValue, &cancel );
if ( cancel != 0 )
{
err = zipClose( zf, NULL );
return err;
}
}
currentFileIndex++;
}
}
err = zipClose( zf, NULL );
if ( progress != NULL )
{
short cancel = 0;
long progressValue = 1000000;
if(NULL != progress)
(*progress)( UTILS_ONPROGRESSEVENT_ID, progressValue, &cancel );
}
}
criticalSection.Leave();
return err;
}
/*========================================================================================================*/
int ZipFile( const WCHAR* inputFile, const WCHAR* outputFile, int compressionLevel )
{
criticalSection.Enter();
int err = -1;
if ( ( inputFile != NULL ) && ( outputFile != NULL ) )
{
NSFile::CFileBinary oFile;
if(oFile.OpenFile(inputFile))
{
DWORD dwSizeRead;
BYTE* pData = new BYTE[oFile.GetFileSize()];
if(oFile.ReadFile(pData, oFile.GetFileSize(), dwSizeRead))
{
zipFile zf = zipOpen( outputFile, APPEND_STATUS_CREATE );
zip_fileinfo zi;
zi.tmz_date.tm_sec = zi.tmz_date.tm_min = zi.tmz_date.tm_hour =
zi.tmz_date.tm_mday = zi.tmz_date.tm_mon = zi.tmz_date.tm_year = 0;
zi.dosDate = 0;
zi.internal_fa = 0;
zi.external_fa = 0;
#ifdef _WIN32
SYSTEMTIME currTime;
GetLocalTime( &currTime );
zi.tmz_date.tm_sec = currTime.wSecond;
zi.tmz_date.tm_min = currTime.wMinute;
zi.tmz_date.tm_hour = currTime.wHour;
zi.tmz_date.tm_mday = currTime.wDay;
zi.tmz_date.tm_mon = currTime.wMonth;
zi.tmz_date.tm_year = currTime.wYear;
#endif
wstring inputFileName( inputFile );
wstring::size_type pos = 0;
static const wstring::size_type npos = -1;
pos = inputFileName.find_last_of( L'\\' );
wstring zipFileName;
if ( pos != npos )
{
zipFileName = wstring( ( inputFileName.begin() + pos + 1 ), inputFileName.end() );
}
else
{
zipFileName = wstring( inputFileName.begin(), inputFileName.end() );
}
std::string zipFileNameA = codepage_issue_fixToOEM(zipFileName);
err = zipOpenNewFileInZip( zf, zipFileNameA.c_str(), &zi, NULL, 0, NULL, 0, NULL, Z_DEFLATED, compressionLevel );
err = zipWriteInFileInZip( zf, pData, dwSizeRead );
err = zipCloseFileInZip( zf );
err = zipClose( zf, NULL );
}
RELEASEARRAYOBJECTS(pData);
}
}
criticalSection.Leave();
return false;
}
/*========================================================================================================*/
bool ClearDirectory( const WCHAR* dir, bool delDir )
{
criticalSection.Enter();
bool result = false;
if ( dir != NULL )
{
unsigned int size = (unsigned int)wcslen( dir );
WCHAR* _dir = new WCHAR[size + 2];
wcsncpy( _dir, dir, size );
_dir[size++] = L'\0';
_dir[size] = L'\0';
NSDirectory::DeleteDirectory(_dir);
if ( !delDir )
{
NSDirectory::GetDirectories(dir);
}
if ( _dir != NULL )
{
delete []_dir;
_dir = NULL;
}
result = true;
}
else
{
result = false;
}
criticalSection.Leave();
return result;
}
/*========================================================================================================*/
int UnzipToDir( const WCHAR* zipFile, const WCHAR* unzipDir, const OnProgressCallback* progress, const WCHAR* password, bool opt_extract_without_path, bool clearOutputDirectory )
{
criticalSection.Enter();
unzFile uf = NULL;
int err = -1;
if ( ( zipFile != NULL ) && ( unzipDir != NULL ) )
{
uf = unzOpen (zipFile);
}
if ( uf != NULL )
{
if ( clearOutputDirectory )
{
ClearDirectory( unzipDir );
}
#ifdef WIN32
wchar_t* buffer = NULL;
buffer = _wgetcwd( NULL, 0 );
err = _wchdir (unzipDir);
#else
char* buffer = NULL;
buffer = getcwd( NULL, 0 );
BYTE* pUtf8 = NULL;
LONG lLen = 0;
NSFile::CUtf8Converter::GetUtf8StringFromUnicode(unzipDir, wcslen(unzipDir), pUtf8, lLen);
err = chdir ((char*)pUtf8);
RELEASEARRAYOBJECTS(pUtf8);
#endif
if ( err == 0 )
{
if(NULL != password)
{
std::string passwordA = codepage_issue_fixToOEM(password);
err = do_extract( uf, opt_extract_without_path, 1, passwordA.c_str(), progress );
}
else
err = do_extract( uf, opt_extract_without_path, 1, NULL, progress );
}
if ( err == UNZ_OK )
{
err = unzClose( uf );
}
if ( buffer != NULL )
{
#ifdef WIN32
err = _wchdir( buffer );
#else
err = chdir( buffer );
#endif
free( buffer );
buffer = NULL;
}
}
criticalSection.Leave();
return err;
}
/*========================================================================================================*/
int UncompressBytes( BYTE* destBuf, ULONG* destSize, const BYTE* sourceBuf, ULONG sourceSize )
{
criticalSection.Enter();
int err = -1;
err = uncompress( destBuf, destSize, sourceBuf, sourceSize );
criticalSection.Leave();
return err;
}
/*========================================================================================================*/
int CompressBytes( BYTE* destBuf, ULONG* destSize, const BYTE* sourceBuf, ULONG sourceSize, SHORT level )
{
criticalSection.Enter();
int err = -1;
err = compress2( destBuf, destSize, sourceBuf, sourceSize, level );
criticalSection.Leave();
return err;
}
/*========================================================================================================*/
bool IsArchive(const WCHAR* filename)
{
criticalSection.Enter();
unzFile uf = NULL;
bool isZIP = false;
if (( filename != NULL ))
uf = unzOpen( filename );
if ( uf != NULL )
{
isZIP = true;
unzClose( uf );
}
criticalSection.Leave();
return isZIP;
}
/*========================================================================================================*/
bool IsFileExistInArchive(const WCHAR* zipFile, const WCHAR* filePathInZip)
{
criticalSection.Enter();
unzFile uf = NULL;
bool isIn = false;
if ( ( zipFile != NULL ) && ( filePathInZip != NULL ) )
uf = unzOpen( zipFile );
if ( uf != NULL )
{
isIn = is_file_in_archive( uf, filePathInZip );
unzClose( uf );
}
criticalSection.Leave();
return isIn;
}
/*========================================================================================================*/
bool LoadFileFromArchive(const WCHAR* zipFile, const WCHAR* filePathInZip, BYTE** fileInBytes, ULONG& nFileSize)
{
criticalSection.Enter();
unzFile uf = NULL;
bool isIn = false;
if ( ( zipFile != NULL ) && ( filePathInZip != NULL ) )
uf = unzOpen( zipFile );
if ( uf != NULL )
{
isIn = get_file_in_archive( uf, filePathInZip, fileInBytes, nFileSize);
unzClose( uf );
}
criticalSection.Leave();
return isIn;
}
/*========================================================================================================*/
bool ExtractFiles(const wchar_t* zip_file_path, const ExtractedFileCallback& callback, void* pParam)
{
CSLocker locker(criticalSection);
unzFile unzip_file_handle = unzOpen(zip_file_path);
if ( unzip_file_handle != NULL )
{
do
{
unz_file_info file_info;
unzGetCurrentFileInfo(unzip_file_handle, &file_info, NULL, 0, NULL, 0, NULL, 0);
BYTE* pData = new BYTE[file_info.uncompressed_size];
if(file_info.uncompressed_size == 0 || get_file(unzip_file_handle, pData, file_info.uncompressed_size))
{
callback(get_filename_from_unzfile(unzip_file_handle), pData, file_info.uncompressed_size, pParam);
}
RELEASEARRAYOBJECTS(pData);
// else just skip the erroneous file
} while (UNZ_OK == unzGoToNextFile(unzip_file_handle));
unzClose( unzip_file_handle );
return true;
}
return false;
}
/*========================================================================================================*/
bool CompressFiles(const wchar_t* zip_file_path, const RequestFileCallback& callback, void* pParam, int compression_level)
{
CSLocker locker(criticalSection);
zipFile zip_file_handle = zipOpen(zip_file_path, APPEND_STATUS_CREATE);
if(NULL != zip_file_handle)
{
zip_fileinfo zi = {0};
#ifdef _WIN32
SYSTEMTIME currTime;
GetLocalTime( &currTime );
zi.tmz_date.tm_sec = currTime.wSecond;
zi.tmz_date.tm_min = currTime.wMinute;
zi.tmz_date.tm_hour = currTime.wHour;
zi.tmz_date.tm_mday = currTime.wDay;
zi.tmz_date.tm_mon = currTime.wMonth;
zi.tmz_date.tm_year = currTime.wYear;
#endif
BYTE* pData = NULL;
long nSize;
std::wstring in_zip_filename;
while(callback(in_zip_filename, pData, nSize, pParam))
{
std::string in_zip_filenameA = codepage_issue_fixToOEM(in_zip_filename);
if (ZIP_OK != zipOpenNewFileInZip( zip_file_handle, in_zip_filenameA.c_str(), &zi, NULL, 0, NULL, 0, NULL, Z_DEFLATED, compression_level ) ||
ZIP_OK != zipWriteInFileInZip(zip_file_handle, pData, nSize) ||
ZIP_OK != zipCloseFileInZip(zip_file_handle))
{
zipClose(zip_file_handle, NULL);
return false;
}
}
zipClose(zip_file_handle, NULL);
return true;
}
return false;
}
/*========================================================================================================*/
static unsigned int get_files_count( const WCHAR* dirname )
{
unsigned int filescount = 0;
if ( dirname != NULL )
{
deque<wstring> StringDeque;
StringDeque.push_back( dirname );
wstring file;
wstring szText;
while ( !StringDeque.empty() )
{
szText = StringDeque.front();
StringDeque.pop_front();
CArray<std::wstring> aCurFiles = NSDirectory::GetFiles(szText);
filescount += aCurFiles.GetCount();
CArray<std::wstring> aCurDirectories = NSDirectory::GetDirectories(szText);
for(int i = 0; i < aCurDirectories.GetCount(); ++i)
{
std::wstring sCurDirectory = aCurDirectories[i];
StringDeque.push_back( sCurDirectory );
}
}
}
return filescount;
}
}
#pragma once
#include <string>
#include <deque>
#include <fstream>
#include <vector>
#include <list>
#ifdef _WIN32
#include <direct.h>
#endif
#include "../ASCOfficeUtilsLib/OfficeUtilsCommon.h"
#include "../../DesktopEditor/common/Types.h"
using namespace std;
//#define ZLIB_WINAPI
//#define CODEPAGE_ISSUE_FIX
//#pragma comment(lib, "zlibstat.lib")
#include "unzip.h"
#include "zip.h"
namespace ZLibZipUtils
{
int ZipDir( const WCHAR* dir, const WCHAR* outputFile, const OnProgressCallback* progress, int compressionLevel = -1 );
int ZipFile( const WCHAR* inputFile, const WCHAR* outputFile, int compressionLevel = -1 );
bool ClearDirectory( const WCHAR* dir, bool delDir = false );
int UnzipToDir( const WCHAR* zipFile, const WCHAR* unzipDir, const OnProgressCallback* progress, const WCHAR* password = NULL, bool opt_extract_without_path = false, bool clearOutputDirectory = false );
int UncompressBytes( BYTE* destBuf, ULONG* destSize, const BYTE* sourceBuf, ULONG sourceSize );
int CompressBytes( BYTE* destBuf, ULONG* destSize, const BYTE* sourceBuf, ULONG sourceSize, SHORT level );
bool IsArchive(const WCHAR* filename);
bool IsFileExistInArchive(const WCHAR* zipFile, const WCHAR* filePathInZip);
bool LoadFileFromArchive(const WCHAR* zipFile, const WCHAR* filePathInZip, BYTE** fileInBytes, ULONG& nFileSize);
bool ExtractFiles(const WCHAR* zip_file_path, const ExtractedFileCallback& callback, void* pParam);
bool CompressFiles(const WCHAR* zip_file_path, const RequestFileCallback& callback, void* pParam, int compression_level);
}
#-------------------------------------------------
#
# Project created by QtCreator 2014-10-10T14:24:04
#
#-------------------------------------------------
QT -= core gui
TARGET = ASCOfficeUtilsLib
TEMPLATE = lib
CONFIG += staticlib
QMAKE_CXXFLAGS += -std=c++11 -Wall -Wno-ignored-qualifiers -g
DEFINES += UNICODE \
_UNICODE \
LINUX \
_LINUX_QT
INCLUDEPATH += \
../../ZLIB/zlib-1.2.3/contrib/minizip \
../../ZLIB/zlib-1.2.3
SOURCES += \
../OfficeUtils.cpp \
../../ZLIB/zlib-1.2.3/adler32.c \
../../ZLIB/zlib-1.2.3/compress.c \
../../ZLIB/zlib-1.2.3/crc32.c \
../../ZLIB/zlib-1.2.3/deflate.c \
../../ZLIB/zlib-1.2.3/example.c \
../../ZLIB/zlib-1.2.3/gzio.c \
../../ZLIB/zlib-1.2.3/infback.c \
../../ZLIB/zlib-1.2.3/inffast.c \
../../ZLIB/zlib-1.2.3/inflate.c \
../../ZLIB/zlib-1.2.3/inftrees.c \
../../ZLIB/zlib-1.2.3/minigzip.c \
../../ZLIB/zlib-1.2.3/trees.c \
../../ZLIB/zlib-1.2.3/uncompr.c \
../../ZLIB/zlib-1.2.3/zutil.c \
../../ZLIB/zlib-1.2.3/contrib/minizip/zip.c \
../../ZLIB/zlib-1.2.3/contrib/minizip/unzip.c \
../../ZLIB/zlib-1.2.3/contrib/minizip/mztools.c \
../../ZLIB/zlib-1.2.3/contrib/minizip/minizip.c \
../../ZLIB/zlib-1.2.3/contrib/minizip/miniunz.c \
../../ZLIB/zlib-1.2.3/contrib/minizip/ioapi.c \
../../ASCOfficeUtils/ZipUtilsCP.cpp
HEADERS += \
../OfficeUtilsCommon.h \
../OfficeUtils.h \
../../ZLIB/zlib-1.2.3/zutil.h \
../../ZLIB/zlib-1.2.3/zlib.h \
../../ZLIB/zlib-1.2.3/zconf.in.h \
../../ZLIB/zlib-1.2.3/zconf.h \
../../ZLIB/zlib-1.2.3/trees.h \
../../ZLIB/zlib-1.2.3/inftrees.h \
../../ZLIB/zlib-1.2.3/inflate.h \
../../ZLIB/zlib-1.2.3/inffixed.h \
../../ZLIB/zlib-1.2.3/inffast.h \
../../ZLIB/zlib-1.2.3/deflate.h \
../../ZLIB/zlib-1.2.3/crc32.h \
../../ZLIB/zlib-1.2.3/contrib/minizip/crypt.h \
../../ZLIB/zlib-1.2.3/contrib/minizip/ioapi.h \
../../ZLIB/zlib-1.2.3/contrib/minizip/mztools.h \
../../ZLIB/zlib-1.2.3/contrib/minizip/unzip.h \
../../ZLIB/zlib-1.2.3/contrib/minizip/zip.h \
../../ASCOfficeUtils/ZipUtilsCP.h
unix {
target.path = /usr/lib
INSTALLS += target
}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE QtCreatorProject>
<!-- Written by QtCreator 3.2.1, 2014-10-21T23:10:20. -->
<qtcreator>
<data>
<variable>EnvironmentId</variable>
<value type="QByteArray">{74081711-99cf-4519-b633-b3b4f90c599c}</value>
</data>
<data>
<variable>ProjectExplorer.Project.ActiveTarget</variable>
<value type="int">0</value>
</data>
<data>
<variable>ProjectExplorer.Project.EditorSettings</variable>
<valuemap type="QVariantMap">
<value type="bool" key="EditorConfiguration.AutoIndent">true</value>
<value type="bool" key="EditorConfiguration.AutoSpacesForTabs">false</value>
<value type="bool" key="EditorConfiguration.CamelCaseNavigation">true</value>
<valuemap type="QVariantMap" key="EditorConfiguration.CodeStyle.0">
<value type="QString" key="language">Cpp</value>
<valuemap type="QVariantMap" key="value">
<value type="QByteArray" key="CurrentPreferences">CppGlobal</value>
</valuemap>
</valuemap>
<valuemap type="QVariantMap" key="EditorConfiguration.CodeStyle.1">
<value type="QString" key="language">QmlJS</value>
<valuemap type="QVariantMap" key="value">
<value type="QByteArray" key="CurrentPreferences">QmlJSGlobal</value>
</valuemap>
</valuemap>
<value type="int" key="EditorConfiguration.CodeStyle.Count">2</value>
<value type="QByteArray" key="EditorConfiguration.Codec">UTF-8</value>
<value type="bool" key="EditorConfiguration.ConstrainTooltips">false</value>
<value type="int" key="EditorConfiguration.IndentSize">4</value>
<value type="bool" key="EditorConfiguration.KeyboardTooltips">false</value>
<value type="int" key="EditorConfiguration.MarginColumn">80</value>
<value type="bool" key="EditorConfiguration.MouseHiding">true</value>
<value type="bool" key="EditorConfiguration.MouseNavigation">true</value>
<value type="int" key="EditorConfiguration.PaddingMode">1</value>
<value type="bool" key="EditorConfiguration.ScrollWheelZooming">true</value>
<value type="bool" key="EditorConfiguration.ShowMargin">false</value>
<value type="int" key="EditorConfiguration.SmartBackspaceBehavior">0</value>
<value type="bool" key="EditorConfiguration.SpacesForTabs">true</value>
<value type="int" key="EditorConfiguration.TabKeyBehavior">0</value>
<value type="int" key="EditorConfiguration.TabSize">8</value>
<value type="bool" key="EditorConfiguration.UseGlobal">true</value>
<value type="int" key="EditorConfiguration.Utf8BomBehavior">1</value>
<value type="bool" key="EditorConfiguration.addFinalNewLine">true</value>
<value type="bool" key="EditorConfiguration.cleanIndentation">true</value>
<value type="bool" key="EditorConfiguration.cleanWhitespace">true</value>
<value type="bool" key="EditorConfiguration.inEntireDocument">false</value>
</valuemap>
</data>
<data>
<variable>ProjectExplorer.Project.PluginSettings</variable>
<valuemap type="QVariantMap"/>
</data>
<data>
<variable>ProjectExplorer.Project.Target.0</variable>
<valuemap type="QVariantMap">
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Desktop Qt 5.3 GCC 32bit</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Desktop Qt 5.3 GCC 32bit</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">qt.53.gcc_kit</value>
<value type="int" key="ProjectExplorer.Target.ActiveBuildConfiguration">0</value>
<value type="int" key="ProjectExplorer.Target.ActiveDeployConfiguration">0</value>
<value type="int" key="ProjectExplorer.Target.ActiveRunConfiguration">0</value>
<valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.0">
<value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">/home/iekmuf/Documents/ServerComponents/ServerComponents/ASCOfficePPTXFile/PPTXLib/Linux/build-PPTXFormatLib-Desktop_Qt_5_3_0_GCC_32bit-Debug</value>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">qmake</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">QtProjectManager.QMakeBuildStep</value>
<value type="bool" key="QtProjectManager.QMakeBuildStep.LinkQmlDebuggingLibrary">false</value>
<value type="bool" key="QtProjectManager.QMakeBuildStep.LinkQmlDebuggingLibraryAuto">true</value>
<value type="QString" key="QtProjectManager.QMakeBuildStep.QMakeArguments"></value>
<value type="bool" key="QtProjectManager.QMakeBuildStep.QMakeForced">false</value>
</valuemap>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.1">
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Make</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
<valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.AutomaticallyAddedMakeArguments">
<value type="QString">-w</value>
<value type="QString">-r</value>
</valuelist>
<value type="bool" key="Qt4ProjectManager.MakeStep.Clean">false</value>
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments"></value>
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value>
</valuemap>
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">2</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Build</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value>
</valuemap>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1">
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Make</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
<valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.AutomaticallyAddedMakeArguments">
<value type="QString">-w</value>
<value type="QString">-r</value>
</valuelist>
<value type="bool" key="Qt4ProjectManager.MakeStep.Clean">true</value>
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments">clean</value>
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value>
</valuemap>
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Clean</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value>
</valuemap>
<value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value>
<value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value>
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Debug</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4BuildConfiguration</value>
<value type="int" key="Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration">2</value>
<value type="bool" key="Qt4ProjectManager.Qt4BuildConfiguration.UseShadowBuild">true</value>
</valuemap>
<valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.1">
<value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">/home/iekmuf/Documents/ServerComponents/ServerComponents/ASCOfficePPTXFile/PPTXLib/Linux/build-PPTXFormatLib-Desktop_Qt_5_3_0_GCC_32bit-Release</value>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">qmake</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">QtProjectManager.QMakeBuildStep</value>
<value type="bool" key="QtProjectManager.QMakeBuildStep.LinkQmlDebuggingLibrary">false</value>
<value type="bool" key="QtProjectManager.QMakeBuildStep.LinkQmlDebuggingLibraryAuto">true</value>
<value type="QString" key="QtProjectManager.QMakeBuildStep.QMakeArguments"></value>
<value type="bool" key="QtProjectManager.QMakeBuildStep.QMakeForced">false</value>
</valuemap>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.1">
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Make</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
<valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.AutomaticallyAddedMakeArguments">
<value type="QString">-w</value>
<value type="QString">-r</value>
</valuelist>
<value type="bool" key="Qt4ProjectManager.MakeStep.Clean">false</value>
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments"></value>
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value>
</valuemap>
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">2</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Build</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value>
</valuemap>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1">
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Make</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
<valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.AutomaticallyAddedMakeArguments">
<value type="QString">-w</value>
<value type="QString">-r</value>
</valuelist>
<value type="bool" key="Qt4ProjectManager.MakeStep.Clean">true</value>
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments">clean</value>
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value>
</valuemap>
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Clean</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value>
</valuemap>
<value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value>
<value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value>
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Release</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4BuildConfiguration</value>
<value type="int" key="Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration">0</value>
<value type="bool" key="Qt4ProjectManager.Qt4BuildConfiguration.UseShadowBuild">true</value>
</valuemap>
<value type="int" key="ProjectExplorer.Target.BuildConfigurationCount">2</value>
<valuemap type="QVariantMap" key="ProjectExplorer.Target.DeployConfiguration.0">
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">0</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Deploy</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Deploy</value>
</valuemap>
<value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">1</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Deploy locally</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.DefaultDeployConfiguration</value>
</valuemap>
<value type="int" key="ProjectExplorer.Target.DeployConfigurationCount">1</value>
<valuemap type="QVariantMap" key="ProjectExplorer.Target.PluginSettings"/>
<valuemap type="QVariantMap" key="ProjectExplorer.Target.RunConfiguration.0">
<valuelist type="QVariantList" key="Analyzer.Valgrind.AddedSuppressionFiles"/>
<value type="bool" key="Analyzer.Valgrind.Callgrind.CollectBusEvents">false</value>
<value type="bool" key="Analyzer.Valgrind.Callgrind.CollectSystime">false</value>
<value type="bool" key="Analyzer.Valgrind.Callgrind.EnableBranchSim">false</value>
<value type="bool" key="Analyzer.Valgrind.Callgrind.EnableCacheSim">false</value>
<value type="bool" key="Analyzer.Valgrind.Callgrind.EnableEventToolTips">true</value>
<value type="double" key="Analyzer.Valgrind.Callgrind.MinimumCostRatio">0.01</value>
<value type="double" key="Analyzer.Valgrind.Callgrind.VisualisationMinimumCostRatio">10</value>
<value type="bool" key="Analyzer.Valgrind.FilterExternalIssues">true</value>
<value type="int" key="Analyzer.Valgrind.LeakCheckOnFinish">1</value>
<value type="int" key="Analyzer.Valgrind.NumCallers">25</value>
<valuelist type="QVariantList" key="Analyzer.Valgrind.RemovedSuppressionFiles"/>
<value type="int" key="Analyzer.Valgrind.SelfModifyingCodeDetection">1</value>
<value type="bool" key="Analyzer.Valgrind.Settings.UseGlobalSettings">true</value>
<value type="bool" key="Analyzer.Valgrind.ShowReachable">false</value>
<value type="bool" key="Analyzer.Valgrind.TrackOrigins">true</value>
<value type="QString" key="Analyzer.Valgrind.ValgrindExecutable">valgrind</value>
<valuelist type="QVariantList" key="Analyzer.Valgrind.VisibleErrorKinds">
<value type="int">0</value>
<value type="int">1</value>
<value type="int">2</value>
<value type="int">3</value>
<value type="int">4</value>
<value type="int">5</value>
<value type="int">6</value>
<value type="int">7</value>
<value type="int">8</value>
<value type="int">9</value>
<value type="int">10</value>
<value type="int">11</value>
<value type="int">12</value>
<value type="int">13</value>
<value type="int">14</value>
</valuelist>
<value type="int" key="PE.EnvironmentAspect.Base">2</value>
<valuelist type="QVariantList" key="PE.EnvironmentAspect.Changes"/>
<value type="QString" key="ProjectExplorer.CustomExecutableRunConfiguration.Arguments"></value>
<value type="QString" key="ProjectExplorer.CustomExecutableRunConfiguration.Executable"></value>
<value type="bool" key="ProjectExplorer.CustomExecutableRunConfiguration.UseTerminal">false</value>
<value type="QString" key="ProjectExplorer.CustomExecutableRunConfiguration.WorkingDirectory">%{buildDir}</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Custom Executable</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.CustomExecutableRunConfiguration</value>
<value type="uint" key="RunConfiguration.QmlDebugServerPort">3768</value>
<value type="bool" key="RunConfiguration.UseCppDebugger">false</value>
<value type="bool" key="RunConfiguration.UseCppDebuggerAuto">true</value>
<value type="bool" key="RunConfiguration.UseMultiProcess">false</value>
<value type="bool" key="RunConfiguration.UseQmlDebugger">false</value>
<value type="bool" key="RunConfiguration.UseQmlDebuggerAuto">true</value>
</valuemap>
<value type="int" key="ProjectExplorer.Target.RunConfigurationCount">1</value>
</valuemap>
</data>
<data>
<variable>ProjectExplorer.Project.TargetCount</variable>
<value type="int">1</value>
</data>
<data>
<variable>ProjectExplorer.Project.Updater.FileVersion</variable>
<value type="int">16</value>
</data>
<data>
<variable>Version</variable>
<value type="int">16</value>
</data>
</qtcreator>
#include "OfficeUtils.h"
#include "../ASCOfficeUtils/ZipUtilsCP.h"
#include "../../DesktopEditor/common/File.h"
#include "../../DesktopEditor/common/Directory.h"
COfficeUtils::COfficeUtils(OnProgressCallback* fCallback)
{
m_fCallback = fCallback;
}
HRESULT COfficeUtils::ExtractToDirectory(const std::wstring& zipFile, const std::wstring& unzipDir, wchar_t* password, SHORT extract_without_path)
{
if( ZLibZipUtils::UnzipToDir( zipFile.c_str(), unzipDir.c_str(), m_fCallback, password, ( extract_without_path > 0 ) ? (true) : (false) ) == 0 )
{
return S_OK;
}
else
{
return S_FALSE;
}
}
HRESULT COfficeUtils::CompressFileOrDirectory(const std::wstring& name, const std::wstring& outputFile, SHORT level)
{
HRESULT result = S_FALSE;
if(NSDirectory::Exists(name))
{
if ( ZLibZipUtils::ZipDir( name.c_str(), outputFile.c_str(), m_fCallback, level ) == 0 )
{
result = S_OK;
}
else
{
result = S_FALSE;
}
}
else if(NSFile::CFileBinary::Exists(name))
{
if ( ZLibZipUtils::ZipFile( name.c_str(), outputFile.c_str(), level ) == 0 )
{
result = S_OK;
}
else
{
result = S_FALSE;
}
}
return result;
}
HRESULT COfficeUtils::Uncompress(BYTE* destBuf, ULONG* destSize, BYTE* sourceBuf, ULONG sourceSize)
{
if ( ZLibZipUtils::UncompressBytes( destBuf, destSize, sourceBuf, sourceSize ) == Z_OK )
{
return S_OK;
}
else
{
return S_FALSE;
}
}
HRESULT COfficeUtils::Compress(BYTE* destBuf, ULONG* destSize, BYTE* sourceBuf, ULONG sourceSize, SHORT level)
{
if ( ZLibZipUtils::CompressBytes( destBuf, destSize, sourceBuf, sourceSize, level ) == Z_OK )
{
return S_OK;
}
else
{
return S_FALSE;
}
}
HRESULT COfficeUtils::IsArchive(const std::wstring& filename)
{
if( ZLibZipUtils::IsArchive(filename.c_str()) )
{
return S_OK;
}
else
{
return S_FALSE;
}
}
HRESULT COfficeUtils::IsFileExistInArchive(const std::wstring& zipFile, const std::wstring& filePath)
{
if( ZLibZipUtils::IsFileExistInArchive( zipFile.c_str(), filePath.c_str()) )
{
return S_OK;
}
else
{
return S_FALSE;
}
}
HRESULT COfficeUtils::LoadFileFromArchive(const std::wstring& zipFile, const std::wstring& filePath, BYTE** fileInBytes, ULONG& nFileSize)
{
if( ZLibZipUtils::LoadFileFromArchive( zipFile.c_str(), filePath.c_str(), fileInBytes, nFileSize))
{
return S_OK;
}
else
{
return S_FALSE;
}
}
HRESULT COfficeUtils::ExtractFilesToMemory(const std::wstring& zipFile, const ExtractedFileCallback& data_receiver, void* pParam, bool* result)
{
*result = ZLibZipUtils::ExtractFiles(zipFile.c_str(), data_receiver, pParam) ? true : false;
return S_OK;
}
HRESULT COfficeUtils::CompressFilesFromMemory(const std::wstring& zipFile, const RequestFileCallback& data_source, void* pParam, SHORT compression_level, bool* result)
{
*result = ZLibZipUtils::CompressFiles(zipFile.c_str(), data_source, pParam, compression_level) ? true : false;
return S_OK;
}
#ifndef OFFICE_UTILS_H
#define OFFICE_UTILS_H
#include "OfficeUtilsCommon.h"
class COfficeUtils
{
private:
OnProgressCallback* m_fCallback;
public:
COfficeUtils(OnProgressCallback* fCallback);
public:
HRESULT ExtractToDirectory(const std::wstring& zipFile, const std::wstring& unzipDir, wchar_t* password, SHORT extract_without_path);
HRESULT CompressFileOrDirectory(const std::wstring& name, const std::wstring& outputFile, SHORT level);
HRESULT Uncompress(BYTE* destBuf, ULONG* destSize, BYTE* sourceBuf, ULONG sourceSize);
HRESULT Compress(BYTE* destBuf, ULONG* destSize, BYTE* sourceBuf, ULONG sourceSize, SHORT level);
HRESULT IsArchive(const std::wstring& filename);
HRESULT IsFileExistInArchive(const std::wstring& zipFile, const std::wstring& filePath);
HRESULT LoadFileFromArchive(const std::wstring& zipFile, const std::wstring& filePath, BYTE** fileInBytes, ULONG& nFileSize);
HRESULT ExtractFilesToMemory(const std::wstring& zipFile, const ExtractedFileCallback& data_receiver, void* pParam, bool* result);
HRESULT CompressFilesFromMemory(const std::wstring& zipFile, const RequestFileCallback& data_source, void* pParam, SHORT compression_level, bool* result);
};
#endif
#ifndef OFFICE_UTILS_COMMON_H
#define OFFICE_UTILS_COMMON_H
#include <string>
#include "../../DesktopEditor/common/Types.h"
static const long UTILS_ONPROGRESSEVENT_ID = 0;
typedef void (*OnProgressCallback)( long nID, long nPercent, short* Cancel );
typedef void (*ExtractedFileCallback)( const std::wstring& file_name, BYTE* pData, const long& nSize, void* pParam );
typedef bool (*RequestFileCallback)( std::wstring& file_name, BYTE*& pData, long& nSize, void* pParam );
#endif
\ No newline at end of file

Microsoft Visual Studio Solution File, Format Version 9.00
# Visual C++ Express 2005
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ASCOfficeUtilsLib", "ASCOfficeUtilsLib.vcproj", "{3F3CB5A1-BB01-49C1-9342-4A69E30F9EF6}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Win32 = Debug|Win32
Release|Win32 = Release|Win32
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{3F3CB5A1-BB01-49C1-9342-4A69E30F9EF6}.Debug|Win32.ActiveCfg = Debug|Win32
{3F3CB5A1-BB01-49C1-9342-4A69E30F9EF6}.Debug|Win32.Build.0 = Debug|Win32
{3F3CB5A1-BB01-49C1-9342-4A69E30F9EF6}.Release|Win32.ActiveCfg = Release|Win32
{3F3CB5A1-BB01-49C1-9342-4A69E30F9EF6}.Release|Win32.Build.0 = Release|Win32
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
EndGlobal
<?xml version="1.0" encoding="windows-1251"?>
<VisualStudioProject
ProjectType="Visual C++"
Version="8.00"
Name="ASCOfficeUtilsLib"
ProjectGUID="{3F3CB5A1-BB01-49C1-9342-4A69E30F9EF6}"
RootNamespace="ASCOfficeUtilsLib"
>
<Platforms>
<Platform
Name="Win32"
/>
</Platforms>
<ToolFiles>
</ToolFiles>
<Configurations>
<Configuration
Name="Debug|Win32"
OutputDirectory="$(SolutionDir)$(ConfigurationName)"
IntermediateDirectory="$(ConfigurationName)"
ConfigurationType="4"
CharacterSet="1"
>
<Tool
Name="VCPreBuildEventTool"
/>
<Tool
Name="VCCustomBuildTool"
/>
<Tool
Name="VCXMLDataGeneratorTool"
/>
<Tool
Name="VCWebServiceProxyGeneratorTool"
/>
<Tool
Name="VCMIDLTool"
/>
<Tool
Name="VCCLCompilerTool"
Optimization="0"
AdditionalIncludeDirectories="&quot;..\..\ZLIB\zlib-1.2.3\contrib\minizip&quot;;&quot;..\..\ZLIB\zlib-1.2.3&quot;"
PreprocessorDefinitions="WIN32;_WINDOWS;_DEBUG"
MinimalRebuild="true"
BasicRuntimeChecks="3"
RuntimeLibrary="3"
WarningLevel="3"
Detect64BitPortabilityProblems="true"
DebugInformationFormat="4"
/>
<Tool
Name="VCManagedResourceCompilerTool"
/>
<Tool
Name="VCResourceCompilerTool"
/>
<Tool
Name="VCPreLinkEventTool"
/>
<Tool
Name="VCLibrarianTool"
/>
<Tool
Name="VCALinkTool"
/>
<Tool
Name="VCXDCMakeTool"
/>
<Tool
Name="VCBscMakeTool"
/>
<Tool
Name="VCFxCopTool"
/>
<Tool
Name="VCPostBuildEventTool"
/>
</Configuration>
<Configuration
Name="Release|Win32"
OutputDirectory="$(SolutionDir)$(ConfigurationName)"
IntermediateDirectory="$(ConfigurationName)"
ConfigurationType="4"
CharacterSet="1"
WholeProgramOptimization="1"
>
<Tool
Name="VCPreBuildEventTool"
/>
<Tool
Name="VCCustomBuildTool"
/>
<Tool
Name="VCXMLDataGeneratorTool"
/>
<Tool
Name="VCWebServiceProxyGeneratorTool"
/>
<Tool
Name="VCMIDLTool"
/>
<Tool
Name="VCCLCompilerTool"
AdditionalIncludeDirectories="&quot;..\..\ZLIB\zlib-1.2.3\contrib\minizip&quot;;&quot;..\..\ZLIB\zlib-1.2.3&quot;"
PreprocessorDefinitions="WIN32;_WINDOWS;NDEBUG"
RuntimeLibrary="2"
WarningLevel="3"
Detect64BitPortabilityProblems="true"
DebugInformationFormat="3"
/>
<Tool
Name="VCManagedResourceCompilerTool"
/>
<Tool
Name="VCResourceCompilerTool"
/>
<Tool
Name="VCPreLinkEventTool"
/>
<Tool
Name="VCLibrarianTool"
/>
<Tool
Name="VCALinkTool"
/>
<Tool
Name="VCXDCMakeTool"
/>
<Tool
Name="VCBscMakeTool"
/>
<Tool
Name="VCFxCopTool"
/>
<Tool
Name="VCPostBuildEventTool"
/>
</Configuration>
</Configurations>
<References>
</References>
<Files>
<Filter
Name="Source Files"
Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
>
<File
RelativePath="..\OfficeUtils.cpp"
>
</File>
<File
RelativePath="..\..\ASCOfficeUtils\ZipUtilsCP.cpp"
>
</File>
</Filter>
<Filter
Name="Header Files"
Filter="h;hpp;hxx;hm;inl;inc;xsd"
UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
>
<File
RelativePath="..\OfficeUtils.h"
>
</File>
<File
RelativePath="..\OfficeUtilsCommon.h"
>
</File>
<File
RelativePath="..\..\ASCOfficeUtils\ZipUtilsCP.h"
>
</File>
</Filter>
<Filter
Name="minizip"
>
<File
RelativePath="..\..\ZLIB\zlib-1.2.3\contrib\minizip\crypt.h"
>
</File>
<File
RelativePath="..\..\ZLIB\zlib-1.2.3\contrib\minizip\ioapi.c"
>
</File>
<File
RelativePath="..\..\ZLIB\zlib-1.2.3\contrib\minizip\ioapi.h"
>
</File>
<File
RelativePath="..\..\ZLIB\zlib-1.2.3\contrib\minizip\iowin32.c"
>
</File>
<File
RelativePath="..\..\ZLIB\zlib-1.2.3\contrib\minizip\iowin32.h"
>
</File>
<File
RelativePath="..\..\ZLIB\zlib-1.2.3\contrib\minizip\miniunz.c"
>
</File>
<File
RelativePath="..\..\ZLIB\zlib-1.2.3\contrib\minizip\minizip.c"
>
</File>
<File
RelativePath="..\..\ZLIB\zlib-1.2.3\contrib\minizip\mztools.c"
>
</File>
<File
RelativePath="..\..\ZLIB\zlib-1.2.3\contrib\minizip\mztools.h"
>
</File>
<File
RelativePath="..\..\ZLIB\zlib-1.2.3\contrib\minizip\unzip.c"
>
</File>
<File
RelativePath="..\..\ZLIB\zlib-1.2.3\contrib\minizip\unzip.h"
>
</File>
<File
RelativePath="..\..\ZLIB\zlib-1.2.3\contrib\minizip\zip.c"
>
</File>
<File
RelativePath="..\..\ZLIB\zlib-1.2.3\contrib\minizip\zip.h"
>
</File>
</Filter>
<Filter
Name="zlib"
>
<File
RelativePath="..\..\ZLIB\zlib-1.2.3\adler32.c"
>
</File>
<File
RelativePath="..\..\ZLIB\zlib-1.2.3\compress.c"
>
</File>
<File
RelativePath="..\..\ZLIB\zlib-1.2.3\crc32.c"
>
</File>
<File
RelativePath="..\..\ZLIB\zlib-1.2.3\crc32.h"
>
</File>
<File
RelativePath="..\..\ZLIB\zlib-1.2.3\deflate.c"
>
</File>
<File
RelativePath="..\..\ZLIB\zlib-1.2.3\deflate.h"
>
</File>
<File
RelativePath="..\..\ZLIB\zlib-1.2.3\example.c"
>
</File>
<File
RelativePath="..\..\ZLIB\zlib-1.2.3\gzio.c"
>
</File>
<File
RelativePath="..\..\ZLIB\zlib-1.2.3\infback.c"
>
</File>
<File
RelativePath="..\..\ZLIB\zlib-1.2.3\inffast.c"
>
</File>
<File
RelativePath="..\..\ZLIB\zlib-1.2.3\inffast.h"
>
</File>
<File
RelativePath="..\..\ZLIB\zlib-1.2.3\inffixed.h"
>
</File>
<File
RelativePath="..\..\ZLIB\zlib-1.2.3\inflate.c"
>
</File>
<File
RelativePath="..\..\ZLIB\zlib-1.2.3\inflate.h"
>
</File>
<File
RelativePath="..\..\ZLIB\zlib-1.2.3\inftrees.c"
>
</File>
<File
RelativePath="..\..\ZLIB\zlib-1.2.3\inftrees.h"
>
</File>
<File
RelativePath="..\..\ZLIB\zlib-1.2.3\minigzip.c"
>
</File>
<File
RelativePath="..\..\ZLIB\zlib-1.2.3\trees.c"
>
</File>
<File
RelativePath="..\..\ZLIB\zlib-1.2.3\trees.h"
>
</File>
<File
RelativePath="..\..\ZLIB\zlib-1.2.3\uncompr.c"
>
</File>
<File
RelativePath="..\..\ZLIB\zlib-1.2.3\zconf.h"
>
</File>
<File
RelativePath="..\..\ZLIB\zlib-1.2.3\zconf.in.h"
>
</File>
<File
RelativePath="..\..\ZLIB\zlib-1.2.3\zlib.h"
>
</File>
<File
RelativePath="..\..\ZLIB\zlib-1.2.3\zutil.c"
>
</File>
<File
RelativePath="..\..\ZLIB\zlib-1.2.3\zutil.h"
>
</File>
</Filter>
</Files>
<Globals>
</Globals>
</VisualStudioProject>
/* zip.c -- IO on .zip files using zlib /* zip.c -- IO on .zip files using zlib
Version 1.01e, February 12th, 2005 Version 1.01e, February 12th, 2005
27 Dec 2004 Rolf Kalbermatter 27 Dec 2004 Rolf Kalbermatter
Modification to zipOpen2 to support globalComment retrieval. Modification to zipOpen2 to support globalComment retrieval.
Copyright (C) 1998-2005 Gilles Vollant Copyright (C) 1998-2005 Gilles Vollant
Read zip.h for more info Read zip.h for more info
*/ */
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#include <time.h> #include <time.h>
#include "zlib.h" #include "zlib.h"
#include "zip.h" #include "zip.h"
#ifdef STDC #ifdef STDC
# include <stddef.h> # include <stddef.h>
# include <string.h> # include <string.h>
# include <stdlib.h> # include <stdlib.h>
#endif #endif
#ifdef NO_ERRNO_H #ifdef NO_ERRNO_H
extern int errno; extern int errno;
#else #else
# include <errno.h> # include <errno.h>
#endif #endif
#ifndef local #ifndef local
# define local static # define local static
#endif #endif
/* compile with -Dlocal if your debugger can't find static symbols */ /* compile with -Dlocal if your debugger can't find static symbols */
#ifndef VERSIONMADEBY #ifndef VERSIONMADEBY
# define VERSIONMADEBY (0x0) /* platform depedent */ # define VERSIONMADEBY (0x0) /* platform depedent */
#endif #endif
#ifndef Z_BUFSIZE #ifndef Z_BUFSIZE
#define Z_BUFSIZE (16384) #define Z_BUFSIZE (16384)
#endif #endif
#ifndef Z_MAXFILENAMEINZIP #ifndef Z_MAXFILENAMEINZIP
#define Z_MAXFILENAMEINZIP (256) #define Z_MAXFILENAMEINZIP (256)
#endif #endif
#ifndef ALLOC #ifndef ALLOC
# define ALLOC(size) (malloc(size)) # define ALLOC(size) (malloc(size))
#endif #endif
#ifndef TRYFREE #ifndef TRYFREE
# define TRYFREE(p) {if (p) free(p);} # define TRYFREE(p) {if (p) free(p);}
#endif #endif
/* /*
#define SIZECENTRALDIRITEM (0x2e) #define SIZECENTRALDIRITEM (0x2e)
#define SIZEZIPLOCALHEADER (0x1e) #define SIZEZIPLOCALHEADER (0x1e)
*/ */
/* I've found an old Unix (a SunOS 4.1.3_U1) without all SEEK_* defined.... */ /* I've found an old Unix (a SunOS 4.1.3_U1) without all SEEK_* defined.... */
#ifndef SEEK_CUR #ifndef SEEK_CUR
#define SEEK_CUR 1 #define SEEK_CUR 1
#endif #endif
#ifndef SEEK_END #ifndef SEEK_END
#define SEEK_END 2 #define SEEK_END 2
#endif #endif
#ifndef SEEK_SET #ifndef SEEK_SET
#define SEEK_SET 0 #define SEEK_SET 0
#endif #endif
#ifndef DEF_MEM_LEVEL #ifndef DEF_MEM_LEVEL
#if MAX_MEM_LEVEL >= 8 #if MAX_MEM_LEVEL >= 8
# define DEF_MEM_LEVEL 8 # define DEF_MEM_LEVEL 8
#else #else
# define DEF_MEM_LEVEL MAX_MEM_LEVEL # define DEF_MEM_LEVEL MAX_MEM_LEVEL
#endif #endif
#endif #endif
const char zip_copyright[] = const char zip_copyright[] =
" zip 1.01 Copyright 1998-2004 Gilles Vollant - http://www.winimage.com/zLibDll"; " zip 1.01 Copyright 1998-2004 Gilles Vollant - http://www.winimage.com/zLibDll";
#define SIZEDATA_INDATABLOCK (4096-(4*4)) #define SIZEDATA_INDATABLOCK (4096-(4*4))
#define LOCALHEADERMAGIC (0x04034b50) #define LOCALHEADERMAGIC (0x04034b50)
#define CENTRALHEADERMAGIC (0x02014b50) #define CENTRALHEADERMAGIC (0x02014b50)
#define ENDHEADERMAGIC (0x06054b50) #define ENDHEADERMAGIC (0x06054b50)
#define FLAG_LOCALHEADER_OFFSET (0x06) #define FLAG_LOCALHEADER_OFFSET (0x06)
#define CRC_LOCALHEADER_OFFSET (0x0e) #define CRC_LOCALHEADER_OFFSET (0x0e)
#define SIZECENTRALHEADER (0x2e) /* 46 */ #define SIZECENTRALHEADER (0x2e) /* 46 */
typedef struct linkedlist_datablock_internal_s typedef struct linkedlist_datablock_internal_s
{ {
struct linkedlist_datablock_internal_s* next_datablock; struct linkedlist_datablock_internal_s* next_datablock;
uLong avail_in_this_block; uLong avail_in_this_block;
uLong filled_in_this_block; uLong filled_in_this_block;
uLong unused; /* for future use and alignement */ uLong unused; /* for future use and alignement */
unsigned char data[SIZEDATA_INDATABLOCK]; unsigned char data[SIZEDATA_INDATABLOCK];
} linkedlist_datablock_internal; } linkedlist_datablock_internal;
typedef struct linkedlist_data_s typedef struct linkedlist_data_s
{ {
linkedlist_datablock_internal* first_block; linkedlist_datablock_internal* first_block;
linkedlist_datablock_internal* last_block; linkedlist_datablock_internal* last_block;
} linkedlist_data; } linkedlist_data;
typedef struct typedef struct
{ {
z_stream stream; /* zLib stream structure for inflate */ z_stream stream; /* zLib stream structure for inflate */
int stream_initialised; /* 1 is stream is initialised */ int stream_initialised; /* 1 is stream is initialised */
uInt pos_in_buffered_data; /* last written byte in buffered_data */ uInt pos_in_buffered_data; /* last written byte in buffered_data */
uLong pos_local_header; /* offset of the local header of the file uLong pos_local_header; /* offset of the local header of the file
currenty writing */ currenty writing */
char* central_header; /* central header data for the current file */ char* central_header; /* central header data for the current file */
uLong size_centralheader; /* size of the central header for cur file */ uLong size_centralheader; /* size of the central header for cur file */
uLong flag; /* flag of the file currently writing */ uLong flag; /* flag of the file currently writing */
int method; /* compression method of file currenty wr.*/ int method; /* compression method of file currenty wr.*/
int raw; /* 1 for directly writing raw data */ int raw; /* 1 for directly writing raw data */
Byte buffered_data[Z_BUFSIZE];/* buffer contain compressed data to be writ*/ Byte buffered_data[Z_BUFSIZE];/* buffer contain compressed data to be writ*/
uLong dosDate; uLong dosDate;
uLong crc32; uLong crc32;
int encrypt; int encrypt;
#ifndef NOCRYPT #ifndef NOCRYPT
unsigned long keys[3]; /* keys defining the pseudo-random sequence */ unsigned long keys[3]; /* keys defining the pseudo-random sequence */
const unsigned long* pcrc_32_tab; const unsigned long* pcrc_32_tab;
int crypt_header_size; int crypt_header_size;
#endif #endif
} curfile_info; } curfile_info;
typedef struct typedef struct
{ {
zlib_filefunc_def z_filefunc; zlib_filefunc_def z_filefunc;
voidpf filestream; /* io structore of the zipfile */ voidpf filestream; /* io structore of the zipfile */
linkedlist_data central_dir;/* datablock with central dir in construction*/ linkedlist_data central_dir;/* datablock with central dir in construction*/
int in_opened_file_inzip; /* 1 if a file in the zip is currently writ.*/ int in_opened_file_inzip; /* 1 if a file in the zip is currently writ.*/
curfile_info ci; /* info on the file curretly writing */ curfile_info ci; /* info on the file curretly writing */
uLong begin_pos; /* position of the beginning of the zipfile */ uLong begin_pos; /* position of the beginning of the zipfile */
uLong add_position_when_writting_offset; uLong add_position_when_writting_offset;
uLong number_entry; uLong number_entry;
#ifndef NO_ADDFILEINEXISTINGZIP #ifndef NO_ADDFILEINEXISTINGZIP
char *globalcomment; char *globalcomment;
#endif #endif
} zip_internal; } zip_internal;
#ifndef NOCRYPT #ifndef NOCRYPT
#define INCLUDECRYPTINGCODE_IFCRYPTALLOWED #define INCLUDECRYPTINGCODE_IFCRYPTALLOWED
#include "crypt.h" #include "crypt.h"
#endif #endif
local linkedlist_datablock_internal* allocate_new_datablock() local linkedlist_datablock_internal* allocate_new_datablock()
{ {
linkedlist_datablock_internal* ldi; linkedlist_datablock_internal* ldi;
ldi = (linkedlist_datablock_internal*) ldi = (linkedlist_datablock_internal*)
ALLOC(sizeof(linkedlist_datablock_internal)); ALLOC(sizeof(linkedlist_datablock_internal));
if (ldi!=NULL) if (ldi!=NULL)
{ {
ldi->next_datablock = NULL ; ldi->next_datablock = NULL ;
ldi->filled_in_this_block = 0 ; ldi->filled_in_this_block = 0 ;
ldi->avail_in_this_block = SIZEDATA_INDATABLOCK ; ldi->avail_in_this_block = SIZEDATA_INDATABLOCK ;
} }
return ldi; return ldi;
} }
local void free_datablock(ldi) local void free_datablock(ldi)
linkedlist_datablock_internal* ldi; linkedlist_datablock_internal* ldi;
{ {
while (ldi!=NULL) while (ldi!=NULL)
{ {
linkedlist_datablock_internal* ldinext = ldi->next_datablock; linkedlist_datablock_internal* ldinext = ldi->next_datablock;
TRYFREE(ldi); TRYFREE(ldi);
ldi = ldinext; ldi = ldinext;
} }
} }
local void init_linkedlist(ll) local void init_linkedlist(ll)
linkedlist_data* ll; linkedlist_data* ll;
{ {
ll->first_block = ll->last_block = NULL; ll->first_block = ll->last_block = NULL;
} }
local void free_linkedlist(ll) local void free_linkedlist(ll)
linkedlist_data* ll; linkedlist_data* ll;
{ {
free_datablock(ll->first_block); free_datablock(ll->first_block);
ll->first_block = ll->last_block = NULL; ll->first_block = ll->last_block = NULL;
} }
local int add_data_in_datablock(ll,buf,len) local int add_data_in_datablock(ll,buf,len)
linkedlist_data* ll; linkedlist_data* ll;
const void* buf; const void* buf;
uLong len; uLong len;
{ {
linkedlist_datablock_internal* ldi; linkedlist_datablock_internal* ldi;
const unsigned char* from_copy; const unsigned char* from_copy;
if (ll==NULL) if (ll==NULL)
return ZIP_INTERNALERROR; return ZIP_INTERNALERROR;
if (ll->last_block == NULL) if (ll->last_block == NULL)
{ {
ll->first_block = ll->last_block = allocate_new_datablock(); ll->first_block = ll->last_block = allocate_new_datablock();
if (ll->first_block == NULL) if (ll->first_block == NULL)
return ZIP_INTERNALERROR; return ZIP_INTERNALERROR;
} }
ldi = ll->last_block; ldi = ll->last_block;
from_copy = (unsigned char*)buf; from_copy = (unsigned char*)buf;
while (len>0) while (len>0)
{ {
uInt copy_this; uInt copy_this;
uInt i; uInt i;
unsigned char* to_copy; unsigned char* to_copy;
if (ldi->avail_in_this_block==0) if (ldi->avail_in_this_block==0)
{ {
ldi->next_datablock = allocate_new_datablock(); ldi->next_datablock = allocate_new_datablock();
if (ldi->next_datablock == NULL) if (ldi->next_datablock == NULL)
return ZIP_INTERNALERROR; return ZIP_INTERNALERROR;
ldi = ldi->next_datablock ; ldi = ldi->next_datablock ;
ll->last_block = ldi; ll->last_block = ldi;
} }
if (ldi->avail_in_this_block < len) if (ldi->avail_in_this_block < len)
copy_this = (uInt)ldi->avail_in_this_block; copy_this = (uInt)ldi->avail_in_this_block;
else else
copy_this = (uInt)len; copy_this = (uInt)len;
to_copy = &(ldi->data[ldi->filled_in_this_block]); to_copy = &(ldi->data[ldi->filled_in_this_block]);
for (i=0;i<copy_this;i++) for (i=0;i<copy_this;i++)
*(to_copy+i)=*(from_copy+i); *(to_copy+i)=*(from_copy+i);
ldi->filled_in_this_block += copy_this; ldi->filled_in_this_block += copy_this;
ldi->avail_in_this_block -= copy_this; ldi->avail_in_this_block -= copy_this;
from_copy += copy_this ; from_copy += copy_this ;
len -= copy_this; len -= copy_this;
} }
return ZIP_OK; return ZIP_OK;
} }
/****************************************************************************/ /****************************************************************************/
#ifndef NO_ADDFILEINEXISTINGZIP #ifndef NO_ADDFILEINEXISTINGZIP
/* =========================================================================== /* ===========================================================================
Inputs a long in LSB order to the given file Inputs a long in LSB order to the given file
nbByte == 1, 2 or 4 (byte, short or long) nbByte == 1, 2 or 4 (byte, short or long)
*/ */
local int ziplocal_putValue OF((const zlib_filefunc_def* pzlib_filefunc_def, local int ziplocal_putValue OF((const zlib_filefunc_def* pzlib_filefunc_def,
voidpf filestream, uLong x, int nbByte)); voidpf filestream, uLong x, int nbByte));
local int ziplocal_putValue (pzlib_filefunc_def, filestream, x, nbByte) local int ziplocal_putValue (pzlib_filefunc_def, filestream, x, nbByte)
const zlib_filefunc_def* pzlib_filefunc_def; const zlib_filefunc_def* pzlib_filefunc_def;
voidpf filestream; voidpf filestream;
uLong x; uLong x;
int nbByte; int nbByte;
{ {
unsigned char buf[4]; unsigned char buf[4];
int n; int n;
for (n = 0; n < nbByte; n++) for (n = 0; n < nbByte; n++)
{ {
buf[n] = (unsigned char)(x & 0xff); buf[n] = (unsigned char)(x & 0xff);
x >>= 8; x >>= 8;
} }
if (x != 0) if (x != 0)
{ /* data overflow - hack for ZIP64 (X Roche) */ { /* data overflow - hack for ZIP64 (X Roche) */
for (n = 0; n < nbByte; n++) for (n = 0; n < nbByte; n++)
{ {
buf[n] = 0xff; buf[n] = 0xff;
} }
} }
if (ZWRITE(*pzlib_filefunc_def,filestream,buf,nbByte)!=(uLong)nbByte) if (ZWRITE(*pzlib_filefunc_def,filestream,buf,nbByte)!=(uLong)nbByte)
return ZIP_ERRNO; return ZIP_ERRNO;
else else
return ZIP_OK; return ZIP_OK;
} }
local void ziplocal_putValue_inmemory OF((void* dest, uLong x, int nbByte)); local void ziplocal_putValue_inmemory OF((void* dest, uLong x, int nbByte));
local void ziplocal_putValue_inmemory (dest, x, nbByte) local void ziplocal_putValue_inmemory (dest, x, nbByte)
void* dest; void* dest;
uLong x; uLong x;
int nbByte; int nbByte;
{ {
unsigned char* buf=(unsigned char*)dest; unsigned char* buf=(unsigned char*)dest;
int n; int n;
for (n = 0; n < nbByte; n++) { for (n = 0; n < nbByte; n++) {
buf[n] = (unsigned char)(x & 0xff); buf[n] = (unsigned char)(x & 0xff);
x >>= 8; x >>= 8;
} }
if (x != 0) if (x != 0)
{ /* data overflow - hack for ZIP64 */ { /* data overflow - hack for ZIP64 */
for (n = 0; n < nbByte; n++) for (n = 0; n < nbByte; n++)
{ {
buf[n] = 0xff; buf[n] = 0xff;
} }
} }
} }
/****************************************************************************/ /****************************************************************************/
local uLong ziplocal_TmzDateToDosDate(ptm,dosDate) local uLong ziplocal_TmzDateToDosDate(ptm,dosDate)
const tm_zip* ptm; const tm_zip* ptm;
uLong dosDate; uLong dosDate;
{ {
uLong year = (uLong)ptm->tm_year; uLong year = (uLong)ptm->tm_year;
if (year>1980) if (year>1980)
year-=1980; year-=1980;
else if (year>80) else if (year>80)
year-=80; year-=80;
return return
(uLong) (((ptm->tm_mday) + (32 * (ptm->tm_mon+1)) + (512 * year)) << 16) | (uLong) (((ptm->tm_mday) + (32 * (ptm->tm_mon+1)) + (512 * year)) << 16) |
((ptm->tm_sec/2) + (32* ptm->tm_min) + (2048 * (uLong)ptm->tm_hour)); ((ptm->tm_sec/2) + (32* ptm->tm_min) + (2048 * (uLong)ptm->tm_hour));
} }
/****************************************************************************/ /****************************************************************************/
local int ziplocal_getByte OF(( local int ziplocal_getByte OF((
const zlib_filefunc_def* pzlib_filefunc_def, const zlib_filefunc_def* pzlib_filefunc_def,
voidpf filestream, voidpf filestream,
int *pi)); int *pi));
local int ziplocal_getByte(pzlib_filefunc_def,filestream,pi) local int ziplocal_getByte(pzlib_filefunc_def,filestream,pi)
const zlib_filefunc_def* pzlib_filefunc_def; const zlib_filefunc_def* pzlib_filefunc_def;
voidpf filestream; voidpf filestream;
int *pi; int *pi;
{ {
unsigned char c; unsigned char c;
int err = (int)ZREAD(*pzlib_filefunc_def,filestream,&c,1); int err = (int)ZREAD(*pzlib_filefunc_def,filestream,&c,1);
if (err==1) if (err==1)
{ {
*pi = (int)c; *pi = (int)c;
return ZIP_OK; return ZIP_OK;
} }
else else
{ {
if (ZERROR(*pzlib_filefunc_def,filestream)) if (ZERROR(*pzlib_filefunc_def,filestream))
return ZIP_ERRNO; return ZIP_ERRNO;
else else
return ZIP_EOF; return ZIP_EOF;
} }
} }
/* =========================================================================== /* ===========================================================================
Reads a long in LSB order from the given gz_stream. Sets Reads a long in LSB order from the given gz_stream. Sets
*/ */
local int ziplocal_getShort OF(( local int ziplocal_getShort OF((
const zlib_filefunc_def* pzlib_filefunc_def, const zlib_filefunc_def* pzlib_filefunc_def,
voidpf filestream, voidpf filestream,
uLong *pX)); uLong *pX));
local int ziplocal_getShort (pzlib_filefunc_def,filestream,pX) local int ziplocal_getShort (pzlib_filefunc_def,filestream,pX)
const zlib_filefunc_def* pzlib_filefunc_def; const zlib_filefunc_def* pzlib_filefunc_def;
voidpf filestream; voidpf filestream;
uLong *pX; uLong *pX;
{ {
uLong x ; uLong x ;
int i; int i;
int err; int err;
err = ziplocal_getByte(pzlib_filefunc_def,filestream,&i); err = ziplocal_getByte(pzlib_filefunc_def,filestream,&i);
x = (uLong)i; x = (uLong)i;
if (err==ZIP_OK) if (err==ZIP_OK)
err = ziplocal_getByte(pzlib_filefunc_def,filestream,&i); err = ziplocal_getByte(pzlib_filefunc_def,filestream,&i);
x += ((uLong)i)<<8; x += ((uLong)i)<<8;
if (err==ZIP_OK) if (err==ZIP_OK)
*pX = x; *pX = x;
else else
*pX = 0; *pX = 0;
return err; return err;
} }
local int ziplocal_getLong OF(( local int ziplocal_getLong OF((
const zlib_filefunc_def* pzlib_filefunc_def, const zlib_filefunc_def* pzlib_filefunc_def,
voidpf filestream, voidpf filestream,
uLong *pX)); uLong *pX));
local int ziplocal_getLong (pzlib_filefunc_def,filestream,pX) local int ziplocal_getLong (pzlib_filefunc_def,filestream,pX)
const zlib_filefunc_def* pzlib_filefunc_def; const zlib_filefunc_def* pzlib_filefunc_def;
voidpf filestream; voidpf filestream;
uLong *pX; uLong *pX;
{ {
uLong x ; uLong x ;
int i; int i;
int err; int err;
err = ziplocal_getByte(pzlib_filefunc_def,filestream,&i); err = ziplocal_getByte(pzlib_filefunc_def,filestream,&i);
x = (uLong)i; x = (uLong)i;
if (err==ZIP_OK) if (err==ZIP_OK)
err = ziplocal_getByte(pzlib_filefunc_def,filestream,&i); err = ziplocal_getByte(pzlib_filefunc_def,filestream,&i);
x += ((uLong)i)<<8; x += ((uLong)i)<<8;
if (err==ZIP_OK) if (err==ZIP_OK)
err = ziplocal_getByte(pzlib_filefunc_def,filestream,&i); err = ziplocal_getByte(pzlib_filefunc_def,filestream,&i);
x += ((uLong)i)<<16; x += ((uLong)i)<<16;
if (err==ZIP_OK) if (err==ZIP_OK)
err = ziplocal_getByte(pzlib_filefunc_def,filestream,&i); err = ziplocal_getByte(pzlib_filefunc_def,filestream,&i);
x += ((uLong)i)<<24; x += ((uLong)i)<<24;
if (err==ZIP_OK) if (err==ZIP_OK)
*pX = x; *pX = x;
else else
*pX = 0; *pX = 0;
return err; return err;
} }
#ifndef BUFREADCOMMENT #ifndef BUFREADCOMMENT
#define BUFREADCOMMENT (0x400) #define BUFREADCOMMENT (0x400)
#endif #endif
/* /*
Locate the Central directory of a zipfile (at the end, just before Locate the Central directory of a zipfile (at the end, just before
the global comment) the global comment)
*/ */
local uLong ziplocal_SearchCentralDir OF(( local uLong ziplocal_SearchCentralDir OF((
const zlib_filefunc_def* pzlib_filefunc_def, const zlib_filefunc_def* pzlib_filefunc_def,
voidpf filestream)); voidpf filestream));
local uLong ziplocal_SearchCentralDir(pzlib_filefunc_def,filestream) local uLong ziplocal_SearchCentralDir(pzlib_filefunc_def,filestream)
const zlib_filefunc_def* pzlib_filefunc_def; const zlib_filefunc_def* pzlib_filefunc_def;
voidpf filestream; voidpf filestream;
{ {
unsigned char* buf; unsigned char* buf;
uLong uSizeFile; uLong uSizeFile;
uLong uBackRead; uLong uBackRead;
uLong uMaxBack=0xffff; /* maximum size of global comment */ uLong uMaxBack=0xffff; /* maximum size of global comment */
uLong uPosFound=0; uLong uPosFound=0;
if (ZSEEK(*pzlib_filefunc_def,filestream,0,ZLIB_FILEFUNC_SEEK_END) != 0) if (ZSEEK(*pzlib_filefunc_def,filestream,0,ZLIB_FILEFUNC_SEEK_END) != 0)
return 0; return 0;
uSizeFile = ZTELL(*pzlib_filefunc_def,filestream); uSizeFile = ZTELL(*pzlib_filefunc_def,filestream);
if (uMaxBack>uSizeFile) if (uMaxBack>uSizeFile)
uMaxBack = uSizeFile; uMaxBack = uSizeFile;
buf = (unsigned char*)ALLOC(BUFREADCOMMENT+4); buf = (unsigned char*)ALLOC(BUFREADCOMMENT+4);
if (buf==NULL) if (buf==NULL)
return 0; return 0;
uBackRead = 4; uBackRead = 4;
while (uBackRead<uMaxBack) while (uBackRead<uMaxBack)
{ {
uLong uReadSize,uReadPos ; uLong uReadSize,uReadPos ;
int i; int i;
if (uBackRead+BUFREADCOMMENT>uMaxBack) if (uBackRead+BUFREADCOMMENT>uMaxBack)
uBackRead = uMaxBack; uBackRead = uMaxBack;
else else
uBackRead+=BUFREADCOMMENT; uBackRead+=BUFREADCOMMENT;
uReadPos = uSizeFile-uBackRead ; uReadPos = uSizeFile-uBackRead ;
uReadSize = ((BUFREADCOMMENT+4) < (uSizeFile-uReadPos)) ? uReadSize = ((BUFREADCOMMENT+4) < (uSizeFile-uReadPos)) ?
(BUFREADCOMMENT+4) : (uSizeFile-uReadPos); (BUFREADCOMMENT+4) : (uSizeFile-uReadPos);
if (ZSEEK(*pzlib_filefunc_def,filestream,uReadPos,ZLIB_FILEFUNC_SEEK_SET)!=0) if (ZSEEK(*pzlib_filefunc_def,filestream,uReadPos,ZLIB_FILEFUNC_SEEK_SET)!=0)
break; break;
if (ZREAD(*pzlib_filefunc_def,filestream,buf,uReadSize)!=uReadSize) if (ZREAD(*pzlib_filefunc_def,filestream,buf,uReadSize)!=uReadSize)
break; break;
for (i=(int)uReadSize-3; (i--)>0;) for (i=(int)uReadSize-3; (i--)>0;)
if (((*(buf+i))==0x50) && ((*(buf+i+1))==0x4b) && if (((*(buf+i))==0x50) && ((*(buf+i+1))==0x4b) &&
((*(buf+i+2))==0x05) && ((*(buf+i+3))==0x06)) ((*(buf+i+2))==0x05) && ((*(buf+i+3))==0x06))
{ {
uPosFound = uReadPos+i; uPosFound = uReadPos+i;
break; break;
} }
if (uPosFound!=0) if (uPosFound!=0)
break; break;
} }
TRYFREE(buf); TRYFREE(buf);
return uPosFound; return uPosFound;
} }
#endif /* !NO_ADDFILEINEXISTINGZIP*/ #endif /* !NO_ADDFILEINEXISTINGZIP*/
/************************************************************/ /************************************************************/
extern zipFile ZEXPORT zipOpen2 (pathname, append, globalcomment, pzlib_filefunc_def) extern zipFile ZEXPORT zipOpen2 (pathname, append, globalcomment, pzlib_filefunc_def)
const char *pathname; const wchar_t *pathname;
int append; int append;
zipcharpc* globalcomment; zipcharpc* globalcomment;
zlib_filefunc_def* pzlib_filefunc_def; zlib_filefunc_def* pzlib_filefunc_def;
{ {
zip_internal ziinit; zip_internal ziinit;
zip_internal* zi; zip_internal* zi;
int err=ZIP_OK; int err=ZIP_OK;
if (pzlib_filefunc_def==NULL) if (pzlib_filefunc_def==NULL)
fill_fopen_filefunc(&ziinit.z_filefunc); fill_fopen_filefunc(&ziinit.z_filefunc);
else else
ziinit.z_filefunc = *pzlib_filefunc_def; ziinit.z_filefunc = *pzlib_filefunc_def;
ziinit.filestream = (*(ziinit.z_filefunc.zopen_file)) ziinit.filestream = (*(ziinit.z_filefunc.zopen_file))
(ziinit.z_filefunc.opaque, (ziinit.z_filefunc.opaque,
pathname, pathname,
(append == APPEND_STATUS_CREATE) ? (append == APPEND_STATUS_CREATE) ?
(ZLIB_FILEFUNC_MODE_READ | ZLIB_FILEFUNC_MODE_WRITE | ZLIB_FILEFUNC_MODE_CREATE) : (ZLIB_FILEFUNC_MODE_READ | ZLIB_FILEFUNC_MODE_WRITE | ZLIB_FILEFUNC_MODE_CREATE) :
(ZLIB_FILEFUNC_MODE_READ | ZLIB_FILEFUNC_MODE_WRITE | ZLIB_FILEFUNC_MODE_EXISTING)); (ZLIB_FILEFUNC_MODE_READ | ZLIB_FILEFUNC_MODE_WRITE | ZLIB_FILEFUNC_MODE_EXISTING));
if (ziinit.filestream == NULL) if (ziinit.filestream == NULL)
return NULL; return NULL;
ziinit.begin_pos = ZTELL(ziinit.z_filefunc,ziinit.filestream); ziinit.begin_pos = ZTELL(ziinit.z_filefunc,ziinit.filestream);
ziinit.in_opened_file_inzip = 0; ziinit.in_opened_file_inzip = 0;
ziinit.ci.stream_initialised = 0; ziinit.ci.stream_initialised = 0;
ziinit.number_entry = 0; ziinit.number_entry = 0;
ziinit.add_position_when_writting_offset = 0; ziinit.add_position_when_writting_offset = 0;
init_linkedlist(&(ziinit.central_dir)); init_linkedlist(&(ziinit.central_dir));
zi = (zip_internal*)ALLOC(sizeof(zip_internal)); zi = (zip_internal*)ALLOC(sizeof(zip_internal));
if (zi==NULL) if (zi==NULL)
{ {
ZCLOSE(ziinit.z_filefunc,ziinit.filestream); ZCLOSE(ziinit.z_filefunc,ziinit.filestream);
return NULL; return NULL;
} }
/* now we add file in a zipfile */ /* now we add file in a zipfile */
# ifndef NO_ADDFILEINEXISTINGZIP # ifndef NO_ADDFILEINEXISTINGZIP
ziinit.globalcomment = NULL; ziinit.globalcomment = NULL;
if (append == APPEND_STATUS_ADDINZIP) if (append == APPEND_STATUS_ADDINZIP)
{ {
uLong byte_before_the_zipfile;/* byte before the zipfile, (>0 for sfx)*/ uLong byte_before_the_zipfile;/* byte before the zipfile, (>0 for sfx)*/
uLong size_central_dir; /* size of the central directory */ uLong size_central_dir; /* size of the central directory */
uLong offset_central_dir; /* offset of start of central directory */ uLong offset_central_dir; /* offset of start of central directory */
uLong central_pos,uL; uLong central_pos,uL;
uLong number_disk; /* number of the current dist, used for uLong number_disk; /* number of the current dist, used for
spaning ZIP, unsupported, always 0*/ spaning ZIP, unsupported, always 0*/
uLong number_disk_with_CD; /* number the the disk with central dir, used uLong number_disk_with_CD; /* number the the disk with central dir, used
for spaning ZIP, unsupported, always 0*/ for spaning ZIP, unsupported, always 0*/
uLong number_entry; uLong number_entry;
uLong number_entry_CD; /* total number of entries in uLong number_entry_CD; /* total number of entries in
the central dir the central dir
(same than number_entry on nospan) */ (same than number_entry on nospan) */
uLong size_comment; uLong size_comment;
central_pos = ziplocal_SearchCentralDir(&ziinit.z_filefunc,ziinit.filestream); central_pos = ziplocal_SearchCentralDir(&ziinit.z_filefunc,ziinit.filestream);
if (central_pos==0) if (central_pos==0)
err=ZIP_ERRNO; err=ZIP_ERRNO;
if (ZSEEK(ziinit.z_filefunc, ziinit.filestream, if (ZSEEK(ziinit.z_filefunc, ziinit.filestream,
central_pos,ZLIB_FILEFUNC_SEEK_SET)!=0) central_pos,ZLIB_FILEFUNC_SEEK_SET)!=0)
err=ZIP_ERRNO; err=ZIP_ERRNO;
/* the signature, already checked */ /* the signature, already checked */
if (ziplocal_getLong(&ziinit.z_filefunc, ziinit.filestream,&uL)!=ZIP_OK) if (ziplocal_getLong(&ziinit.z_filefunc, ziinit.filestream,&uL)!=ZIP_OK)
err=ZIP_ERRNO; err=ZIP_ERRNO;
/* number of this disk */ /* number of this disk */
if (ziplocal_getShort(&ziinit.z_filefunc, ziinit.filestream,&number_disk)!=ZIP_OK) if (ziplocal_getShort(&ziinit.z_filefunc, ziinit.filestream,&number_disk)!=ZIP_OK)
err=ZIP_ERRNO; err=ZIP_ERRNO;
/* number of the disk with the start of the central directory */ /* number of the disk with the start of the central directory */
if (ziplocal_getShort(&ziinit.z_filefunc, ziinit.filestream,&number_disk_with_CD)!=ZIP_OK) if (ziplocal_getShort(&ziinit.z_filefunc, ziinit.filestream,&number_disk_with_CD)!=ZIP_OK)
err=ZIP_ERRNO; err=ZIP_ERRNO;
/* total number of entries in the central dir on this disk */ /* total number of entries in the central dir on this disk */
if (ziplocal_getShort(&ziinit.z_filefunc, ziinit.filestream,&number_entry)!=ZIP_OK) if (ziplocal_getShort(&ziinit.z_filefunc, ziinit.filestream,&number_entry)!=ZIP_OK)
err=ZIP_ERRNO; err=ZIP_ERRNO;
/* total number of entries in the central dir */ /* total number of entries in the central dir */
if (ziplocal_getShort(&ziinit.z_filefunc, ziinit.filestream,&number_entry_CD)!=ZIP_OK) if (ziplocal_getShort(&ziinit.z_filefunc, ziinit.filestream,&number_entry_CD)!=ZIP_OK)
err=ZIP_ERRNO; err=ZIP_ERRNO;
if ((number_entry_CD!=number_entry) || if ((number_entry_CD!=number_entry) ||
(number_disk_with_CD!=0) || (number_disk_with_CD!=0) ||
(number_disk!=0)) (number_disk!=0))
err=ZIP_BADZIPFILE; err=ZIP_BADZIPFILE;
/* size of the central directory */ /* size of the central directory */
if (ziplocal_getLong(&ziinit.z_filefunc, ziinit.filestream,&size_central_dir)!=ZIP_OK) if (ziplocal_getLong(&ziinit.z_filefunc, ziinit.filestream,&size_central_dir)!=ZIP_OK)
err=ZIP_ERRNO; err=ZIP_ERRNO;
/* offset of start of central directory with respect to the /* offset of start of central directory with respect to the
starting disk number */ starting disk number */
if (ziplocal_getLong(&ziinit.z_filefunc, ziinit.filestream,&offset_central_dir)!=ZIP_OK) if (ziplocal_getLong(&ziinit.z_filefunc, ziinit.filestream,&offset_central_dir)!=ZIP_OK)
err=ZIP_ERRNO; err=ZIP_ERRNO;
/* zipfile global comment length */ /* zipfile global comment length */
if (ziplocal_getShort(&ziinit.z_filefunc, ziinit.filestream,&size_comment)!=ZIP_OK) if (ziplocal_getShort(&ziinit.z_filefunc, ziinit.filestream,&size_comment)!=ZIP_OK)
err=ZIP_ERRNO; err=ZIP_ERRNO;
if ((central_pos<offset_central_dir+size_central_dir) && if ((central_pos<offset_central_dir+size_central_dir) &&
(err==ZIP_OK)) (err==ZIP_OK))
err=ZIP_BADZIPFILE; err=ZIP_BADZIPFILE;
if (err!=ZIP_OK) if (err!=ZIP_OK)
{ {
ZCLOSE(ziinit.z_filefunc, ziinit.filestream); ZCLOSE(ziinit.z_filefunc, ziinit.filestream);
return NULL; return NULL;
} }
if (size_comment>0) if (size_comment>0)
{ {
ziinit.globalcomment = ALLOC(size_comment+1); ziinit.globalcomment = ALLOC(size_comment+1);
if (ziinit.globalcomment) if (ziinit.globalcomment)
{ {
size_comment = ZREAD(ziinit.z_filefunc, ziinit.filestream,ziinit.globalcomment,size_comment); size_comment = ZREAD(ziinit.z_filefunc, ziinit.filestream,ziinit.globalcomment,size_comment);
ziinit.globalcomment[size_comment]=0; ziinit.globalcomment[size_comment]=0;
} }
} }
byte_before_the_zipfile = central_pos - byte_before_the_zipfile = central_pos -
(offset_central_dir+size_central_dir); (offset_central_dir+size_central_dir);
ziinit.add_position_when_writting_offset = byte_before_the_zipfile; ziinit.add_position_when_writting_offset = byte_before_the_zipfile;
{ {
uLong size_central_dir_to_read = size_central_dir; uLong size_central_dir_to_read = size_central_dir;
size_t buf_size = SIZEDATA_INDATABLOCK; size_t buf_size = SIZEDATA_INDATABLOCK;
void* buf_read = (void*)ALLOC(buf_size); void* buf_read = (void*)ALLOC(buf_size);
if (ZSEEK(ziinit.z_filefunc, ziinit.filestream, if (ZSEEK(ziinit.z_filefunc, ziinit.filestream,
offset_central_dir + byte_before_the_zipfile, offset_central_dir + byte_before_the_zipfile,
ZLIB_FILEFUNC_SEEK_SET) != 0) ZLIB_FILEFUNC_SEEK_SET) != 0)
err=ZIP_ERRNO; err=ZIP_ERRNO;
while ((size_central_dir_to_read>0) && (err==ZIP_OK)) while ((size_central_dir_to_read>0) && (err==ZIP_OK))
{ {
uLong read_this = SIZEDATA_INDATABLOCK; uLong read_this = SIZEDATA_INDATABLOCK;
if (read_this > size_central_dir_to_read) if (read_this > size_central_dir_to_read)
read_this = size_central_dir_to_read; read_this = size_central_dir_to_read;
if (ZREAD(ziinit.z_filefunc, ziinit.filestream,buf_read,read_this) != read_this) if (ZREAD(ziinit.z_filefunc, ziinit.filestream,buf_read,read_this) != read_this)
err=ZIP_ERRNO; err=ZIP_ERRNO;
if (err==ZIP_OK) if (err==ZIP_OK)
err = add_data_in_datablock(&ziinit.central_dir,buf_read, err = add_data_in_datablock(&ziinit.central_dir,buf_read,
(uLong)read_this); (uLong)read_this);
size_central_dir_to_read-=read_this; size_central_dir_to_read-=read_this;
} }
TRYFREE(buf_read); TRYFREE(buf_read);
} }
ziinit.begin_pos = byte_before_the_zipfile; ziinit.begin_pos = byte_before_the_zipfile;
ziinit.number_entry = number_entry_CD; ziinit.number_entry = number_entry_CD;
if (ZSEEK(ziinit.z_filefunc, ziinit.filestream, if (ZSEEK(ziinit.z_filefunc, ziinit.filestream,
offset_central_dir+byte_before_the_zipfile,ZLIB_FILEFUNC_SEEK_SET)!=0) offset_central_dir+byte_before_the_zipfile,ZLIB_FILEFUNC_SEEK_SET)!=0)
err=ZIP_ERRNO; err=ZIP_ERRNO;
} }
if (globalcomment) if (globalcomment)
{ {
*globalcomment = ziinit.globalcomment; *globalcomment = ziinit.globalcomment;
} }
# endif /* !NO_ADDFILEINEXISTINGZIP*/ # endif /* !NO_ADDFILEINEXISTINGZIP*/
if (err != ZIP_OK) if (err != ZIP_OK)
{ {
# ifndef NO_ADDFILEINEXISTINGZIP # ifndef NO_ADDFILEINEXISTINGZIP
TRYFREE(ziinit.globalcomment); TRYFREE(ziinit.globalcomment);
# endif /* !NO_ADDFILEINEXISTINGZIP*/ # endif /* !NO_ADDFILEINEXISTINGZIP*/
TRYFREE(zi); TRYFREE(zi);
return NULL; return NULL;
} }
else else
{ {
*zi = ziinit; *zi = ziinit;
return (zipFile)zi; return (zipFile)zi;
} }
} }
extern zipFile ZEXPORT zipOpen (pathname, append) extern zipFile ZEXPORT zipOpen (pathname, append)
const char *pathname; const wchar_t *pathname;
int append; int append;
{ {
return zipOpen2(pathname,append,NULL,NULL); return zipOpen2(pathname,append,NULL,NULL);
} }
extern int ZEXPORT zipOpenNewFileInZip3 (file, filename, zipfi, extern int ZEXPORT zipOpenNewFileInZip3 (file, filename, zipfi,
extrafield_local, size_extrafield_local, extrafield_local, size_extrafield_local,
extrafield_global, size_extrafield_global, extrafield_global, size_extrafield_global,
comment, method, level, raw, comment, method, level, raw,
windowBits, memLevel, strategy, windowBits, memLevel, strategy,
password, crcForCrypting) password, crcForCrypting)
zipFile file; zipFile file;
const char* filename; const char* filename;
const zip_fileinfo* zipfi; const zip_fileinfo* zipfi;
const void* extrafield_local; const void* extrafield_local;
uInt size_extrafield_local; uInt size_extrafield_local;
const void* extrafield_global; const void* extrafield_global;
uInt size_extrafield_global; uInt size_extrafield_global;
const char* comment; const char* comment;
int method; int method;
int level; int level;
int raw; int raw;
int windowBits; int windowBits;
int memLevel; int memLevel;
int strategy; int strategy;
const char* password; const char* password;
uLong crcForCrypting; uLong crcForCrypting;
{ {
zip_internal* zi; zip_internal* zi;
uInt size_filename; uInt size_filename;
uInt size_comment; uInt size_comment;
uInt i; uInt i;
int err = ZIP_OK; int err = ZIP_OK;
# ifdef NOCRYPT # ifdef NOCRYPT
if (password != NULL) if (password != NULL)
return ZIP_PARAMERROR; return ZIP_PARAMERROR;
# endif # endif
if (file == NULL) if (file == NULL)
return ZIP_PARAMERROR; return ZIP_PARAMERROR;
if ((method!=0) && (method!=Z_DEFLATED)) if ((method!=0) && (method!=Z_DEFLATED))
return ZIP_PARAMERROR; return ZIP_PARAMERROR;
zi = (zip_internal*)file; zi = (zip_internal*)file;
if (zi->in_opened_file_inzip == 1) if (zi->in_opened_file_inzip == 1)
{ {
err = zipCloseFileInZip (file); err = zipCloseFileInZip (file);
if (err != ZIP_OK) if (err != ZIP_OK)
return err; return err;
} }
if (filename==NULL) if (filename==NULL)
filename="-"; filename="-";
if (comment==NULL) if (comment==NULL)
size_comment = 0; size_comment = 0;
else else
size_comment = (uInt)strlen(comment); size_comment = (uInt)strlen(comment);
size_filename = (uInt)strlen(filename); size_filename = (uInt)strlen(filename);
if (zipfi == NULL) if (zipfi == NULL)
zi->ci.dosDate = 0; zi->ci.dosDate = 0;
else else
{ {
if (zipfi->dosDate != 0) if (zipfi->dosDate != 0)
zi->ci.dosDate = zipfi->dosDate; zi->ci.dosDate = zipfi->dosDate;
else zi->ci.dosDate = ziplocal_TmzDateToDosDate(&zipfi->tmz_date,zipfi->dosDate); else zi->ci.dosDate = ziplocal_TmzDateToDosDate(&zipfi->tmz_date,zipfi->dosDate);
} }
zi->ci.flag = 0; zi->ci.flag = 0;
if ((level==8) || (level==9)) if ((level==8) || (level==9))
zi->ci.flag |= 2; zi->ci.flag |= 2;
if ((level==2)) if ((level==2))
zi->ci.flag |= 4; zi->ci.flag |= 4;
if ((level==1)) if ((level==1))
zi->ci.flag |= 6; zi->ci.flag |= 6;
if (password != NULL) if (password != NULL)
zi->ci.flag |= 1; zi->ci.flag |= 1;
zi->ci.crc32 = 0; zi->ci.crc32 = 0;
zi->ci.method = method; zi->ci.method = method;
zi->ci.encrypt = 0; zi->ci.encrypt = 0;
zi->ci.stream_initialised = 0; zi->ci.stream_initialised = 0;
zi->ci.pos_in_buffered_data = 0; zi->ci.pos_in_buffered_data = 0;
zi->ci.raw = raw; zi->ci.raw = raw;
zi->ci.pos_local_header = ZTELL(zi->z_filefunc,zi->filestream) ; zi->ci.pos_local_header = ZTELL(zi->z_filefunc,zi->filestream) ;
zi->ci.size_centralheader = SIZECENTRALHEADER + size_filename + zi->ci.size_centralheader = SIZECENTRALHEADER + size_filename +
size_extrafield_global + size_comment; size_extrafield_global + size_comment;
zi->ci.central_header = (char*)ALLOC((uInt)zi->ci.size_centralheader); zi->ci.central_header = (char*)ALLOC((uInt)zi->ci.size_centralheader);
ziplocal_putValue_inmemory(zi->ci.central_header,(uLong)CENTRALHEADERMAGIC,4); ziplocal_putValue_inmemory(zi->ci.central_header,(uLong)CENTRALHEADERMAGIC,4);
/* version info */ /* version info */
ziplocal_putValue_inmemory(zi->ci.central_header+4,(uLong)VERSIONMADEBY,2); ziplocal_putValue_inmemory(zi->ci.central_header+4,(uLong)VERSIONMADEBY,2);
ziplocal_putValue_inmemory(zi->ci.central_header+6,(uLong)20,2); ziplocal_putValue_inmemory(zi->ci.central_header+6,(uLong)20,2);
ziplocal_putValue_inmemory(zi->ci.central_header+8,(uLong)zi->ci.flag,2); ziplocal_putValue_inmemory(zi->ci.central_header+8,(uLong)zi->ci.flag,2);
ziplocal_putValue_inmemory(zi->ci.central_header+10,(uLong)zi->ci.method,2); ziplocal_putValue_inmemory(zi->ci.central_header+10,(uLong)zi->ci.method,2);
ziplocal_putValue_inmemory(zi->ci.central_header+12,(uLong)zi->ci.dosDate,4); ziplocal_putValue_inmemory(zi->ci.central_header+12,(uLong)zi->ci.dosDate,4);
ziplocal_putValue_inmemory(zi->ci.central_header+16,(uLong)0,4); /*crc*/ ziplocal_putValue_inmemory(zi->ci.central_header+16,(uLong)0,4); /*crc*/
ziplocal_putValue_inmemory(zi->ci.central_header+20,(uLong)0,4); /*compr size*/ ziplocal_putValue_inmemory(zi->ci.central_header+20,(uLong)0,4); /*compr size*/
ziplocal_putValue_inmemory(zi->ci.central_header+24,(uLong)0,4); /*uncompr size*/ ziplocal_putValue_inmemory(zi->ci.central_header+24,(uLong)0,4); /*uncompr size*/
ziplocal_putValue_inmemory(zi->ci.central_header+28,(uLong)size_filename,2); ziplocal_putValue_inmemory(zi->ci.central_header+28,(uLong)size_filename,2);
ziplocal_putValue_inmemory(zi->ci.central_header+30,(uLong)size_extrafield_global,2); ziplocal_putValue_inmemory(zi->ci.central_header+30,(uLong)size_extrafield_global,2);
ziplocal_putValue_inmemory(zi->ci.central_header+32,(uLong)size_comment,2); ziplocal_putValue_inmemory(zi->ci.central_header+32,(uLong)size_comment,2);
ziplocal_putValue_inmemory(zi->ci.central_header+34,(uLong)0,2); /*disk nm start*/ ziplocal_putValue_inmemory(zi->ci.central_header+34,(uLong)0,2); /*disk nm start*/
if (zipfi==NULL) if (zipfi==NULL)
ziplocal_putValue_inmemory(zi->ci.central_header+36,(uLong)0,2); ziplocal_putValue_inmemory(zi->ci.central_header+36,(uLong)0,2);
else else
ziplocal_putValue_inmemory(zi->ci.central_header+36,(uLong)zipfi->internal_fa,2); ziplocal_putValue_inmemory(zi->ci.central_header+36,(uLong)zipfi->internal_fa,2);
if (zipfi==NULL) if (zipfi==NULL)
ziplocal_putValue_inmemory(zi->ci.central_header+38,(uLong)0,4); ziplocal_putValue_inmemory(zi->ci.central_header+38,(uLong)0,4);
else else
ziplocal_putValue_inmemory(zi->ci.central_header+38,(uLong)zipfi->external_fa,4); ziplocal_putValue_inmemory(zi->ci.central_header+38,(uLong)zipfi->external_fa,4);
ziplocal_putValue_inmemory(zi->ci.central_header+42,(uLong)zi->ci.pos_local_header- zi->add_position_when_writting_offset,4); ziplocal_putValue_inmemory(zi->ci.central_header+42,(uLong)zi->ci.pos_local_header- zi->add_position_when_writting_offset,4);
for (i=0;i<size_filename;i++) for (i=0;i<size_filename;i++)
*(zi->ci.central_header+SIZECENTRALHEADER+i) = *(filename+i); *(zi->ci.central_header+SIZECENTRALHEADER+i) = *(filename+i);
for (i=0;i<size_extrafield_global;i++) for (i=0;i<size_extrafield_global;i++)
*(zi->ci.central_header+SIZECENTRALHEADER+size_filename+i) = *(zi->ci.central_header+SIZECENTRALHEADER+size_filename+i) =
*(((const char*)extrafield_global)+i); *(((const char*)extrafield_global)+i);
for (i=0;i<size_comment;i++) for (i=0;i<size_comment;i++)
*(zi->ci.central_header+SIZECENTRALHEADER+size_filename+ *(zi->ci.central_header+SIZECENTRALHEADER+size_filename+
size_extrafield_global+i) = *(comment+i); size_extrafield_global+i) = *(comment+i);
if (zi->ci.central_header == NULL) if (zi->ci.central_header == NULL)
return ZIP_INTERNALERROR; return ZIP_INTERNALERROR;
/* write the local header */ /* write the local header */
err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)LOCALHEADERMAGIC,4); err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)LOCALHEADERMAGIC,4);
if (err==ZIP_OK) if (err==ZIP_OK)
err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)20,2);/* version needed to extract */ err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)20,2);/* version needed to extract */
if (err==ZIP_OK) if (err==ZIP_OK)
err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)zi->ci.flag,2); err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)zi->ci.flag,2);
if (err==ZIP_OK) if (err==ZIP_OK)
err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)zi->ci.method,2); err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)zi->ci.method,2);
if (err==ZIP_OK) if (err==ZIP_OK)
err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)zi->ci.dosDate,4); err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)zi->ci.dosDate,4);
if (err==ZIP_OK) if (err==ZIP_OK)
err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)0,4); /* crc 32, unknown */ err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)0,4); /* crc 32, unknown */
if (err==ZIP_OK) if (err==ZIP_OK)
err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)0,4); /* compressed size, unknown */ err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)0,4); /* compressed size, unknown */
if (err==ZIP_OK) if (err==ZIP_OK)
err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)0,4); /* uncompressed size, unknown */ err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)0,4); /* uncompressed size, unknown */
if (err==ZIP_OK) if (err==ZIP_OK)
err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)size_filename,2); err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)size_filename,2);
if (err==ZIP_OK) if (err==ZIP_OK)
err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)size_extrafield_local,2); err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)size_extrafield_local,2);
if ((err==ZIP_OK) && (size_filename>0)) if ((err==ZIP_OK) && (size_filename>0))
if (ZWRITE(zi->z_filefunc,zi->filestream,filename,size_filename)!=size_filename) if (ZWRITE(zi->z_filefunc,zi->filestream,filename,size_filename)!=size_filename)
err = ZIP_ERRNO; err = ZIP_ERRNO;
if ((err==ZIP_OK) && (size_extrafield_local>0)) if ((err==ZIP_OK) && (size_extrafield_local>0))
if (ZWRITE(zi->z_filefunc,zi->filestream,extrafield_local,size_extrafield_local) if (ZWRITE(zi->z_filefunc,zi->filestream,extrafield_local,size_extrafield_local)
!=size_extrafield_local) !=size_extrafield_local)
err = ZIP_ERRNO; err = ZIP_ERRNO;
zi->ci.stream.avail_in = (uInt)0; zi->ci.stream.avail_in = (uInt)0;
zi->ci.stream.avail_out = (uInt)Z_BUFSIZE; zi->ci.stream.avail_out = (uInt)Z_BUFSIZE;
zi->ci.stream.next_out = zi->ci.buffered_data; zi->ci.stream.next_out = zi->ci.buffered_data;
zi->ci.stream.total_in = 0; zi->ci.stream.total_in = 0;
zi->ci.stream.total_out = 0; zi->ci.stream.total_out = 0;
if ((err==ZIP_OK) && (zi->ci.method == Z_DEFLATED) && (!zi->ci.raw)) if ((err==ZIP_OK) && (zi->ci.method == Z_DEFLATED) && (!zi->ci.raw))
{ {
zi->ci.stream.zalloc = (alloc_func)0; zi->ci.stream.zalloc = (alloc_func)0;
zi->ci.stream.zfree = (free_func)0; zi->ci.stream.zfree = (free_func)0;
zi->ci.stream.opaque = (voidpf)0; zi->ci.stream.opaque = (voidpf)0;
if (windowBits>0) if (windowBits>0)
windowBits = -windowBits; windowBits = -windowBits;
err = deflateInit2(&zi->ci.stream, level, err = deflateInit2(&zi->ci.stream, level,
Z_DEFLATED, windowBits, memLevel, strategy); Z_DEFLATED, windowBits, memLevel, strategy);
if (err==Z_OK) if (err==Z_OK)
zi->ci.stream_initialised = 1; zi->ci.stream_initialised = 1;
} }
# ifndef NOCRYPT # ifndef NOCRYPT
zi->ci.crypt_header_size = 0; zi->ci.crypt_header_size = 0;
if ((err==Z_OK) && (password != NULL)) if ((err==Z_OK) && (password != NULL))
{ {
unsigned char bufHead[RAND_HEAD_LEN]; unsigned char bufHead[RAND_HEAD_LEN];
unsigned int sizeHead; unsigned int sizeHead;
zi->ci.encrypt = 1; zi->ci.encrypt = 1;
zi->ci.pcrc_32_tab = get_crc_table(); zi->ci.pcrc_32_tab = get_crc_table();
/*init_keys(password,zi->ci.keys,zi->ci.pcrc_32_tab);*/ /*init_keys(password,zi->ci.keys,zi->ci.pcrc_32_tab);*/
sizeHead=crypthead(password,bufHead,RAND_HEAD_LEN,zi->ci.keys,zi->ci.pcrc_32_tab,crcForCrypting); sizeHead=crypthead(password,bufHead,RAND_HEAD_LEN,zi->ci.keys,zi->ci.pcrc_32_tab,crcForCrypting);
zi->ci.crypt_header_size = sizeHead; zi->ci.crypt_header_size = sizeHead;
if (ZWRITE(zi->z_filefunc,zi->filestream,bufHead,sizeHead) != sizeHead) if (ZWRITE(zi->z_filefunc,zi->filestream,bufHead,sizeHead) != sizeHead)
err = ZIP_ERRNO; err = ZIP_ERRNO;
} }
# endif # endif
if (err==Z_OK) if (err==Z_OK)
zi->in_opened_file_inzip = 1; zi->in_opened_file_inzip = 1;
return err; return err;
} }
extern int ZEXPORT zipOpenNewFileInZip2(file, filename, zipfi, extern int ZEXPORT zipOpenNewFileInZip2(file, filename, zipfi,
extrafield_local, size_extrafield_local, extrafield_local, size_extrafield_local,
extrafield_global, size_extrafield_global, extrafield_global, size_extrafield_global,
comment, method, level, raw) comment, method, level, raw)
zipFile file; zipFile file;
const char* filename; const char* filename;
const zip_fileinfo* zipfi; const zip_fileinfo* zipfi;
const void* extrafield_local; const void* extrafield_local;
uInt size_extrafield_local; uInt size_extrafield_local;
const void* extrafield_global; const void* extrafield_global;
uInt size_extrafield_global; uInt size_extrafield_global;
const char* comment; const char* comment;
int method; int method;
int level; int level;
int raw; int raw;
{ {
return zipOpenNewFileInZip3 (file, filename, zipfi, return zipOpenNewFileInZip3 (file, filename, zipfi,
extrafield_local, size_extrafield_local, extrafield_local, size_extrafield_local,
extrafield_global, size_extrafield_global, extrafield_global, size_extrafield_global,
comment, method, level, raw, comment, method, level, raw,
-MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY, -MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY,
NULL, 0); NULL, 0);
} }
extern int ZEXPORT zipOpenNewFileInZip (file, filename, zipfi, extern int ZEXPORT zipOpenNewFileInZip (file, filename, zipfi,
extrafield_local, size_extrafield_local, extrafield_local, size_extrafield_local,
extrafield_global, size_extrafield_global, extrafield_global, size_extrafield_global,
comment, method, level) comment, method, level)
zipFile file; zipFile file;
const char* filename; const char* filename;
const zip_fileinfo* zipfi; const zip_fileinfo* zipfi;
const void* extrafield_local; const void* extrafield_local;
uInt size_extrafield_local; uInt size_extrafield_local;
const void* extrafield_global; const void* extrafield_global;
uInt size_extrafield_global; uInt size_extrafield_global;
const char* comment; const char* comment;
int method; int method;
int level; int level;
{ {
return zipOpenNewFileInZip2 (file, filename, zipfi, return zipOpenNewFileInZip2 (file, filename, zipfi,
extrafield_local, size_extrafield_local, extrafield_local, size_extrafield_local,
extrafield_global, size_extrafield_global, extrafield_global, size_extrafield_global,
comment, method, level, 0); comment, method, level, 0);
} }
local int zipFlushWriteBuffer(zi) local int zipFlushWriteBuffer(zi)
zip_internal* zi; zip_internal* zi;
{ {
int err=ZIP_OK; int err=ZIP_OK;
if (zi->ci.encrypt != 0) if (zi->ci.encrypt != 0)
{ {
#ifndef NOCRYPT #ifndef NOCRYPT
uInt i; uInt i;
int t; int t;
for (i=0;i<zi->ci.pos_in_buffered_data;i++) for (i=0;i<zi->ci.pos_in_buffered_data;i++)
zi->ci.buffered_data[i] = zencode(zi->ci.keys, zi->ci.pcrc_32_tab, zi->ci.buffered_data[i] = zencode(zi->ci.keys, zi->ci.pcrc_32_tab,
zi->ci.buffered_data[i],t); zi->ci.buffered_data[i],t);
#endif #endif
} }
if (ZWRITE(zi->z_filefunc,zi->filestream,zi->ci.buffered_data,zi->ci.pos_in_buffered_data) if (ZWRITE(zi->z_filefunc,zi->filestream,zi->ci.buffered_data,zi->ci.pos_in_buffered_data)
!=zi->ci.pos_in_buffered_data) !=zi->ci.pos_in_buffered_data)
err = ZIP_ERRNO; err = ZIP_ERRNO;
zi->ci.pos_in_buffered_data = 0; zi->ci.pos_in_buffered_data = 0;
return err; return err;
} }
extern int ZEXPORT zipWriteInFileInZip (file, buf, len) extern int ZEXPORT zipWriteInFileInZip (file, buf, len)
zipFile file; zipFile file;
const void* buf; const void* buf;
unsigned len; unsigned len;
{ {
zip_internal* zi; zip_internal* zi;
int err=ZIP_OK; int err=ZIP_OK;
if (file == NULL) if (file == NULL)
return ZIP_PARAMERROR; return ZIP_PARAMERROR;
zi = (zip_internal*)file; zi = (zip_internal*)file;
if (zi->in_opened_file_inzip == 0) if (zi->in_opened_file_inzip == 0)
return ZIP_PARAMERROR; return ZIP_PARAMERROR;
zi->ci.stream.next_in = (void*)buf; zi->ci.stream.next_in = (void*)buf;
zi->ci.stream.avail_in = len; zi->ci.stream.avail_in = len;
zi->ci.crc32 = crc32(zi->ci.crc32,buf,len); zi->ci.crc32 = crc32(zi->ci.crc32,buf,len);
while ((err==ZIP_OK) && (zi->ci.stream.avail_in>0)) while ((err==ZIP_OK) && (zi->ci.stream.avail_in>0))
{ {
if (zi->ci.stream.avail_out == 0) if (zi->ci.stream.avail_out == 0)
{ {
if (zipFlushWriteBuffer(zi) == ZIP_ERRNO) if (zipFlushWriteBuffer(zi) == ZIP_ERRNO)
err = ZIP_ERRNO; err = ZIP_ERRNO;
zi->ci.stream.avail_out = (uInt)Z_BUFSIZE; zi->ci.stream.avail_out = (uInt)Z_BUFSIZE;
zi->ci.stream.next_out = zi->ci.buffered_data; zi->ci.stream.next_out = zi->ci.buffered_data;
} }
if(err != ZIP_OK) if(err != ZIP_OK)
break; break;
if ((zi->ci.method == Z_DEFLATED) && (!zi->ci.raw)) if ((zi->ci.method == Z_DEFLATED) && (!zi->ci.raw))
{ {
uLong uTotalOutBefore = zi->ci.stream.total_out; uLong uTotalOutBefore = zi->ci.stream.total_out;
err=deflate(&zi->ci.stream, Z_NO_FLUSH); err=deflate(&zi->ci.stream, Z_NO_FLUSH);
zi->ci.pos_in_buffered_data += (uInt)(zi->ci.stream.total_out - uTotalOutBefore) ; zi->ci.pos_in_buffered_data += (uInt)(zi->ci.stream.total_out - uTotalOutBefore) ;
} }
else else
{ {
uInt copy_this,i; uInt copy_this,i;
if (zi->ci.stream.avail_in < zi->ci.stream.avail_out) if (zi->ci.stream.avail_in < zi->ci.stream.avail_out)
copy_this = zi->ci.stream.avail_in; copy_this = zi->ci.stream.avail_in;
else else
copy_this = zi->ci.stream.avail_out; copy_this = zi->ci.stream.avail_out;
for (i=0;i<copy_this;i++) for (i=0;i<copy_this;i++)
*(((char*)zi->ci.stream.next_out)+i) = *(((char*)zi->ci.stream.next_out)+i) =
*(((const char*)zi->ci.stream.next_in)+i); *(((const char*)zi->ci.stream.next_in)+i);
{ {
zi->ci.stream.avail_in -= copy_this; zi->ci.stream.avail_in -= copy_this;
zi->ci.stream.avail_out-= copy_this; zi->ci.stream.avail_out-= copy_this;
zi->ci.stream.next_in+= copy_this; zi->ci.stream.next_in+= copy_this;
zi->ci.stream.next_out+= copy_this; zi->ci.stream.next_out+= copy_this;
zi->ci.stream.total_in+= copy_this; zi->ci.stream.total_in+= copy_this;
zi->ci.stream.total_out+= copy_this; zi->ci.stream.total_out+= copy_this;
zi->ci.pos_in_buffered_data += copy_this; zi->ci.pos_in_buffered_data += copy_this;
} }
} }
} }
return err; return err;
} }
extern int ZEXPORT zipCloseFileInZipRaw (file, uncompressed_size, crc32) extern int ZEXPORT zipCloseFileInZipRaw (file, uncompressed_size, crc32)
zipFile file; zipFile file;
uLong uncompressed_size; uLong uncompressed_size;
uLong crc32; uLong crc32;
{ {
zip_internal* zi; zip_internal* zi;
uLong compressed_size; uLong compressed_size;
int err=ZIP_OK; int err=ZIP_OK;
if (file == NULL) if (file == NULL)
return ZIP_PARAMERROR; return ZIP_PARAMERROR;
zi = (zip_internal*)file; zi = (zip_internal*)file;
if (zi->in_opened_file_inzip == 0) if (zi->in_opened_file_inzip == 0)
return ZIP_PARAMERROR; return ZIP_PARAMERROR;
zi->ci.stream.avail_in = 0; zi->ci.stream.avail_in = 0;
if ((zi->ci.method == Z_DEFLATED) && (!zi->ci.raw)) if ((zi->ci.method == Z_DEFLATED) && (!zi->ci.raw))
while (err==ZIP_OK) while (err==ZIP_OK)
{ {
uLong uTotalOutBefore; uLong uTotalOutBefore;
if (zi->ci.stream.avail_out == 0) if (zi->ci.stream.avail_out == 0)
{ {
if (zipFlushWriteBuffer(zi) == ZIP_ERRNO) if (zipFlushWriteBuffer(zi) == ZIP_ERRNO)
err = ZIP_ERRNO; err = ZIP_ERRNO;
zi->ci.stream.avail_out = (uInt)Z_BUFSIZE; zi->ci.stream.avail_out = (uInt)Z_BUFSIZE;
zi->ci.stream.next_out = zi->ci.buffered_data; zi->ci.stream.next_out = zi->ci.buffered_data;
} }
uTotalOutBefore = zi->ci.stream.total_out; uTotalOutBefore = zi->ci.stream.total_out;
err=deflate(&zi->ci.stream, Z_FINISH); err=deflate(&zi->ci.stream, Z_FINISH);
zi->ci.pos_in_buffered_data += (uInt)(zi->ci.stream.total_out - uTotalOutBefore) ; zi->ci.pos_in_buffered_data += (uInt)(zi->ci.stream.total_out - uTotalOutBefore) ;
} }
if (err==Z_STREAM_END) if (err==Z_STREAM_END)
err=ZIP_OK; /* this is normal */ err=ZIP_OK; /* this is normal */
if ((zi->ci.pos_in_buffered_data>0) && (err==ZIP_OK)) if ((zi->ci.pos_in_buffered_data>0) && (err==ZIP_OK))
if (zipFlushWriteBuffer(zi)==ZIP_ERRNO) if (zipFlushWriteBuffer(zi)==ZIP_ERRNO)
err = ZIP_ERRNO; err = ZIP_ERRNO;
if ((zi->ci.method == Z_DEFLATED) && (!zi->ci.raw)) if ((zi->ci.method == Z_DEFLATED) && (!zi->ci.raw))
{ {
err=deflateEnd(&zi->ci.stream); err=deflateEnd(&zi->ci.stream);
zi->ci.stream_initialised = 0; zi->ci.stream_initialised = 0;
} }
if (!zi->ci.raw) if (!zi->ci.raw)
{ {
crc32 = (uLong)zi->ci.crc32; crc32 = (uLong)zi->ci.crc32;
uncompressed_size = (uLong)zi->ci.stream.total_in; uncompressed_size = (uLong)zi->ci.stream.total_in;
} }
compressed_size = (uLong)zi->ci.stream.total_out; compressed_size = (uLong)zi->ci.stream.total_out;
# ifndef NOCRYPT # ifndef NOCRYPT
compressed_size += zi->ci.crypt_header_size; compressed_size += zi->ci.crypt_header_size;
# endif # endif
ziplocal_putValue_inmemory(zi->ci.central_header+16,crc32,4); /*crc*/ ziplocal_putValue_inmemory(zi->ci.central_header+16,crc32,4); /*crc*/
ziplocal_putValue_inmemory(zi->ci.central_header+20, ziplocal_putValue_inmemory(zi->ci.central_header+20,
compressed_size,4); /*compr size*/ compressed_size,4); /*compr size*/
if (zi->ci.stream.data_type == Z_ASCII) if (zi->ci.stream.data_type == Z_ASCII)
ziplocal_putValue_inmemory(zi->ci.central_header+36,(uLong)Z_ASCII,2); ziplocal_putValue_inmemory(zi->ci.central_header+36,(uLong)Z_ASCII,2);
ziplocal_putValue_inmemory(zi->ci.central_header+24, ziplocal_putValue_inmemory(zi->ci.central_header+24,
uncompressed_size,4); /*uncompr size*/ uncompressed_size,4); /*uncompr size*/
if (err==ZIP_OK) if (err==ZIP_OK)
err = add_data_in_datablock(&zi->central_dir,zi->ci.central_header, err = add_data_in_datablock(&zi->central_dir,zi->ci.central_header,
(uLong)zi->ci.size_centralheader); (uLong)zi->ci.size_centralheader);
free(zi->ci.central_header); free(zi->ci.central_header);
if (err==ZIP_OK) if (err==ZIP_OK)
{ {
long cur_pos_inzip = ZTELL(zi->z_filefunc,zi->filestream); long cur_pos_inzip = ZTELL(zi->z_filefunc,zi->filestream);
if (ZSEEK(zi->z_filefunc,zi->filestream, if (ZSEEK(zi->z_filefunc,zi->filestream,
zi->ci.pos_local_header + 14,ZLIB_FILEFUNC_SEEK_SET)!=0) zi->ci.pos_local_header + 14,ZLIB_FILEFUNC_SEEK_SET)!=0)
err = ZIP_ERRNO; err = ZIP_ERRNO;
if (err==ZIP_OK) if (err==ZIP_OK)
err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,crc32,4); /* crc 32, unknown */ err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,crc32,4); /* crc 32, unknown */
if (err==ZIP_OK) /* compressed size, unknown */ if (err==ZIP_OK) /* compressed size, unknown */
err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,compressed_size,4); err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,compressed_size,4);
if (err==ZIP_OK) /* uncompressed size, unknown */ if (err==ZIP_OK) /* uncompressed size, unknown */
err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,uncompressed_size,4); err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,uncompressed_size,4);
if (ZSEEK(zi->z_filefunc,zi->filestream, if (ZSEEK(zi->z_filefunc,zi->filestream,
cur_pos_inzip,ZLIB_FILEFUNC_SEEK_SET)!=0) cur_pos_inzip,ZLIB_FILEFUNC_SEEK_SET)!=0)
err = ZIP_ERRNO; err = ZIP_ERRNO;
} }
zi->number_entry ++; zi->number_entry ++;
zi->in_opened_file_inzip = 0; zi->in_opened_file_inzip = 0;
return err; return err;
} }
extern int ZEXPORT zipCloseFileInZip (file) extern int ZEXPORT zipCloseFileInZip (file)
zipFile file; zipFile file;
{ {
return zipCloseFileInZipRaw (file,0,0); return zipCloseFileInZipRaw (file,0,0);
} }
extern int ZEXPORT zipClose (file, global_comment) extern int ZEXPORT zipClose (file, global_comment)
zipFile file; zipFile file;
const char* global_comment; const char* global_comment;
{ {
zip_internal* zi; zip_internal* zi;
int err = 0; int err = 0;
uLong size_centraldir = 0; uLong size_centraldir = 0;
uLong centraldir_pos_inzip; uLong centraldir_pos_inzip;
uInt size_global_comment; uInt size_global_comment;
if (file == NULL) if (file == NULL)
return ZIP_PARAMERROR; return ZIP_PARAMERROR;
zi = (zip_internal*)file; zi = (zip_internal*)file;
if (zi->in_opened_file_inzip == 1) if (zi->in_opened_file_inzip == 1)
{ {
err = zipCloseFileInZip (file); err = zipCloseFileInZip (file);
} }
#ifndef NO_ADDFILEINEXISTINGZIP #ifndef NO_ADDFILEINEXISTINGZIP
if (global_comment==NULL) if (global_comment==NULL)
global_comment = zi->globalcomment; global_comment = zi->globalcomment;
#endif #endif
if (global_comment==NULL) if (global_comment==NULL)
size_global_comment = 0; size_global_comment = 0;
else else
size_global_comment = (uInt)strlen(global_comment); size_global_comment = (uInt)strlen(global_comment);
centraldir_pos_inzip = ZTELL(zi->z_filefunc,zi->filestream); centraldir_pos_inzip = ZTELL(zi->z_filefunc,zi->filestream);
if (err==ZIP_OK) if (err==ZIP_OK)
{ {
linkedlist_datablock_internal* ldi = zi->central_dir.first_block ; linkedlist_datablock_internal* ldi = zi->central_dir.first_block ;
while (ldi!=NULL) while (ldi!=NULL)
{ {
if ((err==ZIP_OK) && (ldi->filled_in_this_block>0)) if ((err==ZIP_OK) && (ldi->filled_in_this_block>0))
if (ZWRITE(zi->z_filefunc,zi->filestream, if (ZWRITE(zi->z_filefunc,zi->filestream,
ldi->data,ldi->filled_in_this_block) ldi->data,ldi->filled_in_this_block)
!=ldi->filled_in_this_block ) !=ldi->filled_in_this_block )
err = ZIP_ERRNO; err = ZIP_ERRNO;
size_centraldir += ldi->filled_in_this_block; size_centraldir += ldi->filled_in_this_block;
ldi = ldi->next_datablock; ldi = ldi->next_datablock;
} }
} }
free_datablock(zi->central_dir.first_block); free_datablock(zi->central_dir.first_block);
if (err==ZIP_OK) /* Magic End */ if (err==ZIP_OK) /* Magic End */
err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)ENDHEADERMAGIC,4); err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)ENDHEADERMAGIC,4);
if (err==ZIP_OK) /* number of this disk */ if (err==ZIP_OK) /* number of this disk */
err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)0,2); err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)0,2);
if (err==ZIP_OK) /* number of the disk with the start of the central directory */ if (err==ZIP_OK) /* number of the disk with the start of the central directory */
err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)0,2); err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)0,2);
if (err==ZIP_OK) /* total number of entries in the central dir on this disk */ if (err==ZIP_OK) /* total number of entries in the central dir on this disk */
err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)zi->number_entry,2); err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)zi->number_entry,2);
if (err==ZIP_OK) /* total number of entries in the central dir */ if (err==ZIP_OK) /* total number of entries in the central dir */
err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)zi->number_entry,2); err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)zi->number_entry,2);
if (err==ZIP_OK) /* size of the central directory */ if (err==ZIP_OK) /* size of the central directory */
err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)size_centraldir,4); err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)size_centraldir,4);
if (err==ZIP_OK) /* offset of start of central directory with respect to the if (err==ZIP_OK) /* offset of start of central directory with respect to the
starting disk number */ starting disk number */
err = ziplocal_putValue(&zi->z_filefunc,zi->filestream, err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,
(uLong)(centraldir_pos_inzip - zi->add_position_when_writting_offset),4); (uLong)(centraldir_pos_inzip - zi->add_position_when_writting_offset),4);
if (err==ZIP_OK) /* zipfile comment length */ if (err==ZIP_OK) /* zipfile comment length */
err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)size_global_comment,2); err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)size_global_comment,2);
if ((err==ZIP_OK) && (size_global_comment>0)) if ((err==ZIP_OK) && (size_global_comment>0))
if (ZWRITE(zi->z_filefunc,zi->filestream, if (ZWRITE(zi->z_filefunc,zi->filestream,
global_comment,size_global_comment) != size_global_comment) global_comment,size_global_comment) != size_global_comment)
err = ZIP_ERRNO; err = ZIP_ERRNO;
if (ZCLOSE(zi->z_filefunc,zi->filestream) != 0) if (ZCLOSE(zi->z_filefunc,zi->filestream) != 0)
if (err == ZIP_OK) if (err == ZIP_OK)
err = ZIP_ERRNO; err = ZIP_ERRNO;
#ifndef NO_ADDFILEINEXISTINGZIP #ifndef NO_ADDFILEINEXISTINGZIP
TRYFREE(zi->globalcomment); TRYFREE(zi->globalcomment);
#endif #endif
TRYFREE(zi); TRYFREE(zi);
return err; return err;
} }
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment