2009-12-13 10:26:34 +01:00
|
|
|
/****************************************************************************
|
|
|
|
* Copyright (C) 2009
|
|
|
|
* by Dimok
|
|
|
|
*
|
|
|
|
* This software is provided 'as-is', without any express or implied
|
|
|
|
* warranty. In no event will the authors be held liable for any
|
|
|
|
* damages arising from the use of this software.
|
|
|
|
*
|
|
|
|
* Permission is granted to anyone to use this software for any
|
|
|
|
* purpose, including commercial applications, and to alter it and
|
|
|
|
* redistribute it freely, subject to the following restrictions:
|
|
|
|
*
|
|
|
|
* 1. The origin of this software must not be misrepresented; you
|
|
|
|
* must not claim that you wrote the original software. If you use
|
|
|
|
* this software in a product, an acknowledgment in the product
|
|
|
|
* documentation would be appreciated but is not required.
|
|
|
|
*
|
|
|
|
* 2. Altered source versions must be plainly marked as such, and
|
|
|
|
* must not be misrepresented as being the original software.
|
|
|
|
*
|
|
|
|
* 3. This notice may not be removed or altered from any source
|
|
|
|
* distribution.
|
|
|
|
*
|
|
|
|
* ZipFile.cpp
|
|
|
|
*
|
|
|
|
* ZipFile Class
|
|
|
|
* for Wii-FileXplorer 2009
|
|
|
|
*
|
|
|
|
* STILL UNCOMPLETE AND UNDER CONSTRUCTION
|
|
|
|
***************************************************************************/
|
|
|
|
#include <ogcsys.h>
|
|
|
|
#include <stdio.h>
|
|
|
|
#include <stdlib.h>
|
|
|
|
#include <string.h>
|
|
|
|
#include <malloc.h>
|
|
|
|
|
|
|
|
#include "prompts/ProgressWindow.h"
|
2010-09-25 08:54:27 +02:00
|
|
|
#include "FileOperations/fileops.h"
|
2009-12-13 10:26:34 +01:00
|
|
|
#include "ZipFile.h"
|
|
|
|
#include "language/gettext.h"
|
|
|
|
|
2010-09-24 02:48:03 +02:00
|
|
|
ZipFile::ZipFile(const char *filepath)
|
2010-02-09 11:59:55 +01:00
|
|
|
{
|
2011-07-26 00:28:22 +02:00
|
|
|
File = unzOpen(filepath);
|
|
|
|
if (File) this->LoadList();
|
2009-12-13 10:26:34 +01:00
|
|
|
}
|
|
|
|
|
2010-02-09 11:59:55 +01:00
|
|
|
ZipFile::~ZipFile()
|
|
|
|
{
|
2011-07-26 00:28:22 +02:00
|
|
|
unzClose(File);
|
2009-12-13 10:26:34 +01:00
|
|
|
}
|
|
|
|
|
2010-02-09 11:59:55 +01:00
|
|
|
bool ZipFile::LoadList()
|
|
|
|
{
|
2011-07-26 00:28:22 +02:00
|
|
|
return true;
|
2009-12-13 10:26:34 +01:00
|
|
|
}
|
|
|
|
|
2011-02-05 15:46:06 +01:00
|
|
|
bool ZipFile::FindFile(const char *file)
|
|
|
|
{
|
2011-07-26 00:28:22 +02:00
|
|
|
if (!File) return false;
|
2011-02-05 15:46:06 +01:00
|
|
|
|
2011-07-26 00:28:22 +02:00
|
|
|
char filename[MAXPATHLEN];
|
2011-02-05 15:46:06 +01:00
|
|
|
|
2011-07-26 00:28:22 +02:00
|
|
|
int ret = unzGoToFirstFile(File);
|
|
|
|
if (ret != UNZ_OK) return false;
|
2011-02-05 15:46:06 +01:00
|
|
|
|
2011-07-26 00:28:22 +02:00
|
|
|
do
|
|
|
|
{
|
|
|
|
if(unzGetCurrentFileInfo(File, &cur_file_info, filename, sizeof(filename), NULL, 0, NULL, 0) != UNZ_OK)
|
|
|
|
continue;
|
2011-02-05 15:46:06 +01:00
|
|
|
|
2011-07-26 00:28:22 +02:00
|
|
|
const char *realfilename = strrchr(filename, '/');
|
|
|
|
if(!realfilename || strlen(realfilename) == 0)
|
|
|
|
realfilename = filename;
|
2011-02-05 15:46:06 +01:00
|
|
|
|
2011-07-26 00:28:22 +02:00
|
|
|
if(strcasecmp(realfilename, file) == 0)
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
while(unzGoToNextFile(File) == UNZ_OK);
|
2011-02-05 15:46:06 +01:00
|
|
|
|
2011-07-26 00:28:22 +02:00
|
|
|
return false;
|
2011-02-05 15:46:06 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
bool ZipFile::FindFilePart(const char *partfilename, std::string &realname)
|
|
|
|
{
|
2011-07-26 00:28:22 +02:00
|
|
|
if (!File) return false;
|
2011-02-05 15:46:06 +01:00
|
|
|
|
2011-07-26 00:28:22 +02:00
|
|
|
char filename[MAXPATHLEN];
|
2011-02-05 15:46:06 +01:00
|
|
|
|
2011-07-26 00:28:22 +02:00
|
|
|
int ret = unzGoToFirstFile(File);
|
|
|
|
if (ret != UNZ_OK) return false;
|
2011-02-05 15:46:06 +01:00
|
|
|
|
2011-07-26 00:28:22 +02:00
|
|
|
do
|
|
|
|
{
|
|
|
|
if(unzGetCurrentFileInfo(File, &cur_file_info, filename, sizeof(filename), NULL, 0, NULL, 0) != UNZ_OK)
|
|
|
|
continue;
|
2011-02-05 15:46:06 +01:00
|
|
|
|
2011-07-26 00:28:22 +02:00
|
|
|
if(strcasestr(filename, partfilename) != 0)
|
|
|
|
{
|
|
|
|
realname = filename;
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
while(unzGoToNextFile(File) == UNZ_OK);
|
2011-02-05 15:46:06 +01:00
|
|
|
|
2011-07-26 00:28:22 +02:00
|
|
|
return false;
|
2011-02-05 15:46:06 +01:00
|
|
|
}
|
|
|
|
|
2010-09-24 02:48:03 +02:00
|
|
|
bool ZipFile::ExtractAll(const char *dest)
|
2010-02-09 11:59:55 +01:00
|
|
|
{
|
2011-07-26 00:28:22 +02:00
|
|
|
if (!File) return false;
|
2009-12-13 10:26:34 +01:00
|
|
|
|
2011-07-26 00:28:22 +02:00
|
|
|
bool Stop = false;
|
2009-12-13 10:26:34 +01:00
|
|
|
|
2011-07-26 00:28:22 +02:00
|
|
|
u32 blocksize = 1024 * 50;
|
|
|
|
u8 *buffer = new u8[blocksize];
|
2009-12-13 10:26:34 +01:00
|
|
|
|
2011-07-26 00:28:22 +02:00
|
|
|
if (!buffer) return false;
|
2009-12-13 10:26:34 +01:00
|
|
|
|
2011-07-26 00:28:22 +02:00
|
|
|
char writepath[MAXPATHLEN];
|
|
|
|
char filename[MAXPATHLEN];
|
|
|
|
memset(filename, 0, sizeof(filename));
|
2009-12-13 10:26:34 +01:00
|
|
|
|
2011-07-26 00:28:22 +02:00
|
|
|
int ret = unzGoToFirstFile(File);
|
|
|
|
if (ret != UNZ_OK) Stop = true;
|
2009-12-13 10:26:34 +01:00
|
|
|
|
2012-05-06 12:59:58 +02:00
|
|
|
ProgressCancelEnable(true);
|
|
|
|
|
2011-07-26 00:28:22 +02:00
|
|
|
while (!Stop)
|
|
|
|
{
|
|
|
|
if (unzGetCurrentFileInfo(File, &cur_file_info, filename, sizeof(filename), NULL, 0, NULL, 0) != UNZ_OK) Stop
|
|
|
|
= true;
|
2009-12-13 10:26:34 +01:00
|
|
|
|
2011-07-26 00:28:22 +02:00
|
|
|
if (!Stop && filename[strlen(filename) - 1] != '/')
|
|
|
|
{
|
|
|
|
u32 uncompressed_size = cur_file_info.uncompressed_size;
|
2009-12-13 10:26:34 +01:00
|
|
|
|
2011-07-26 00:28:22 +02:00
|
|
|
u32 done = 0;
|
|
|
|
char *pointer = NULL;
|
2009-12-13 10:26:34 +01:00
|
|
|
|
2011-07-26 00:28:22 +02:00
|
|
|
ret = unzOpenCurrentFile(File);
|
2009-12-13 10:26:34 +01:00
|
|
|
|
2011-07-26 00:28:22 +02:00
|
|
|
snprintf(writepath, sizeof(writepath), "%s/%s", dest, filename);
|
2009-12-13 10:26:34 +01:00
|
|
|
|
2011-07-26 00:28:22 +02:00
|
|
|
pointer = strrchr(writepath, '/');
|
|
|
|
int position = pointer - writepath + 2;
|
2009-12-13 10:26:34 +01:00
|
|
|
|
2011-07-26 00:28:22 +02:00
|
|
|
char temppath[strlen(writepath)];
|
|
|
|
snprintf(temppath, position, "%s", writepath);
|
2009-12-13 10:26:34 +01:00
|
|
|
|
2011-07-26 00:28:22 +02:00
|
|
|
CreateSubfolder(temppath);
|
2009-12-13 10:26:34 +01:00
|
|
|
|
2011-07-26 00:28:22 +02:00
|
|
|
if (ret == UNZ_OK)
|
|
|
|
{
|
|
|
|
FILE *pfile = fopen(writepath, "wb");
|
2009-12-13 10:26:34 +01:00
|
|
|
|
2011-07-26 00:28:22 +02:00
|
|
|
do
|
|
|
|
{
|
2012-05-06 12:59:58 +02:00
|
|
|
if(ProgressCanceled()) {
|
|
|
|
Stop = true;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
ShowProgress(tr( "Extracting files..." ), 0, pointer + 1, done, uncompressed_size, true, false);
|
2009-12-13 10:26:34 +01:00
|
|
|
|
2011-07-26 00:28:22 +02:00
|
|
|
if (uncompressed_size - done < blocksize) blocksize = uncompressed_size - done;
|
2009-12-13 10:26:34 +01:00
|
|
|
|
2011-07-26 00:28:22 +02:00
|
|
|
ret = unzReadCurrentFile(File, buffer, blocksize);
|
2009-12-13 10:26:34 +01:00
|
|
|
|
2011-07-26 00:28:22 +02:00
|
|
|
if (ret == 0) break;
|
2009-12-13 10:26:34 +01:00
|
|
|
|
2011-07-26 00:28:22 +02:00
|
|
|
fwrite(buffer, 1, blocksize, pfile);
|
2009-12-13 10:26:34 +01:00
|
|
|
|
2011-07-26 00:28:22 +02:00
|
|
|
done += ret;
|
2009-12-13 10:26:34 +01:00
|
|
|
|
2011-07-26 00:28:22 +02:00
|
|
|
} while (done < uncompressed_size);
|
2009-12-13 10:26:34 +01:00
|
|
|
|
2011-07-26 00:28:22 +02:00
|
|
|
fclose(pfile);
|
|
|
|
unzCloseCurrentFile(File);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (unzGoToNextFile(File) != UNZ_OK) Stop = true;
|
|
|
|
}
|
2009-12-13 10:26:34 +01:00
|
|
|
|
2011-07-26 00:28:22 +02:00
|
|
|
delete[] buffer;
|
|
|
|
buffer = NULL;
|
2009-12-13 10:26:34 +01:00
|
|
|
|
2011-07-26 00:28:22 +02:00
|
|
|
ProgressStop();
|
2012-05-06 12:59:58 +02:00
|
|
|
ProgressCancelEnable(false);
|
2009-12-13 10:26:34 +01:00
|
|
|
|
2011-07-26 00:28:22 +02:00
|
|
|
return true;
|
2009-12-13 10:26:34 +01:00
|
|
|
}
|