usbloadergx/source/ZipFile.cpp

142 lines
3.6 KiB
C++
Raw Normal View History

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"
#include "listfiles.h"
#include "ZipFile.h"
#include "language/gettext.h"
ZipFile::ZipFile( const char *filepath )
{
File = unzOpen( filepath );
if ( File )
2009-12-13 10:26:34 +01:00
this->LoadList();
}
ZipFile::~ZipFile()
{
unzClose( File );
2009-12-13 10:26:34 +01:00
}
bool ZipFile::LoadList()
{
2009-12-13 10:26:34 +01:00
return true;
}
bool ZipFile::ExtractAll( const char *dest )
{
if ( !File )
2009-12-13 10:26:34 +01:00
return false;
bool Stop = false;
u32 blocksize = 1024 * 50;
2009-12-13 10:26:34 +01:00
u8 *buffer = new u8[blocksize];
if ( !buffer )
2009-12-13 10:26:34 +01:00
return false;
char writepath[MAXPATHLEN];
char filename[MAXPATHLEN];
memset( filename, 0, sizeof( filename ) );
2009-12-13 10:26:34 +01:00
int ret = unzGoToFirstFile( File );
if ( ret != UNZ_OK )
2009-12-13 10:26:34 +01:00
Stop = true;
while ( !Stop )
{
if ( unzGetCurrentFileInfo( File, &cur_file_info, filename, sizeof( filename ), NULL, NULL, NULL, NULL ) != UNZ_OK )
2009-12-13 10:26:34 +01:00
Stop = true;
if ( !Stop && filename[strlen( filename )-1] != '/' )
{
2009-12-13 10:26:34 +01:00
u32 uncompressed_size = cur_file_info.uncompressed_size;
u32 done = 0;
char *pointer = NULL;
ret = unzOpenCurrentFile( File );
2009-12-13 10:26:34 +01:00
snprintf( writepath, sizeof( writepath ), "%s/%s", dest, filename );
2009-12-13 10:26:34 +01:00
pointer = strrchr( writepath, '/' );
int position = pointer - writepath + 2;
2009-12-13 10:26:34 +01:00
char temppath[strlen( writepath )];
snprintf( temppath, position, "%s", writepath );
2009-12-13 10:26:34 +01:00
subfoldercreate( temppath );
2009-12-13 10:26:34 +01:00
if ( ret == UNZ_OK )
{
FILE *pfile = fopen( writepath, "wb" );
2009-12-13 10:26:34 +01:00
do
{
ShowProgress( tr( "Extracting files..." ), 0, pointer + 1, done, uncompressed_size );
2009-12-13 10:26:34 +01:00
if ( uncompressed_size - done < blocksize )
2009-12-13 10:26:34 +01:00
blocksize = uncompressed_size - done;
ret = unzReadCurrentFile( File, buffer, blocksize );
2009-12-13 10:26:34 +01:00
if ( ret == 0 )
2009-12-13 10:26:34 +01:00
break;
fwrite( buffer, 1, blocksize, pfile );
2009-12-13 10:26:34 +01:00
done += ret;
}
while ( done < uncompressed_size );
2009-12-13 10:26:34 +01:00
fclose( pfile );
unzCloseCurrentFile( File );
2009-12-13 10:26:34 +01:00
}
}
if ( unzGoToNextFile( File ) != UNZ_OK )
2009-12-13 10:26:34 +01:00
Stop = true;
}
delete [] buffer;
buffer = NULL;
ProgressStop();
return true;
}