diff --git a/Makefile.ps3 b/Makefile.ps3 index 4f9f774945..e169729416 100644 --- a/Makefile.ps3 +++ b/Makefile.ps3 @@ -84,7 +84,7 @@ endif PPU_LDLIBS = -ldbgfont $(GL_LIBS) -lcgc -lgcm_cmd -lgcm_sys_stub -lresc_stub -lm -lio_stub -lfs_stub -lsysutil_stub -lsysutil_game_stub -lsysutil_screenshot_stub -lsysutil_np_stub -lpngdec_stub -ljpgdec_stub -lsysmodule_stub -laudio_stub -lnet_stub -lnetctl_stub -lpthread -lsnes -DEFINES += -DSSNES_CONSOLE -DHAVE_OPENGL -DHAVE_CG -DHAVE_FBO -DHAVE_RSOUND -D__CELLOS_LV2__ -DHAVE_CONFIGFILE=1 -DHAVE_NETPLAY=1 -DHAVE_SOCKET_LEGACY=1 -DPACKAGE_VERSION=\"$(SSNES_VERSION)\" -DHAVE_SCREENSHOTS_BUILTIN=1 -Dmain=ssnes_main -DPC_DEVELOPMENT_IP_ADDRESS=\"$(PC_DEVELOPMENT_IP_ADDRESS)\" -DPC_DEVELOPMENT_UDP_PORT=$(PC_DEVELOPMENT_UDP_PORT) +DEFINES += -DSSNES_CONSOLE -DHAVE_OPENGL -DHAVE_CG -DHAVE_FBO -DHAVE_RSOUND -DHAVE_ZLIB -D__CELLOS_LV2__ -DHAVE_CONFIGFILE=1 -DHAVE_NETPLAY=1 -DHAVE_SOCKET_LEGACY=1 -DPACKAGE_VERSION=\"$(SSNES_VERSION)\" -DHAVE_SCREENSHOTS_BUILTIN=1 -Dmain=ssnes_main -DPC_DEVELOPMENT_IP_ADDRESS=\"$(PC_DEVELOPMENT_IP_ADDRESS)\" -DPC_DEVELOPMENT_UDP_PORT=$(PC_DEVELOPMENT_UDP_PORT) ifeq ($(DEBUG), 1) PPU_OPTIMIZE_LV := -O0 -g diff --git a/console/console_ext.c b/console/console_ext.c index 7732626736..9776b94ae3 100644 --- a/console/console_ext.c +++ b/console/console_ext.c @@ -25,6 +25,12 @@ #include #include +#ifdef HAVE_ZLIB +#include "szlib/zlib.h" + +#define WRITEBUFFERSIZE (512192) +#endif + #ifdef _WIN32 #include "../posix_string.h" #endif @@ -95,3 +101,127 @@ void ssnes_console_set_default_keybind_names_for_emulator (void) strlcpy(ssnes_default_libsnes_keybind_name_lut[SNES_DEVICE_ID_JOYPAD_SELECT], "Mode button", sizeof(ssnes_default_libsnes_keybind_name_lut[SNES_DEVICE_ID_JOYPAD_SELECT])); } } + +#ifdef HAVE_ZLIB +static int ssnes_extract_currentfile_in_zip(unzFile uf) +{ + char filename_inzip[256]; + int err=UNZ_OK; + FILE *fout=NULL; + void* buf; + unsigned int size_buf; + + unz_file_info file_info; + err = unzGetCurrentFileInfo(uf,&file_info,filename_inzip,sizeof(filename_inzip),NULL,0,NULL,0); + + if (err!=UNZ_OK) + { + SSNES_ERR("error %d with zipfile in unzGetCurrentFileInfo\n",err); + return err; + } + + size_buf = WRITEBUFFERSIZE; + buf = (void*)malloc(size_buf); + if (buf==NULL) + { + SSNES_ERR("Error allocating memory\n"); + return UNZ_INTERNALERROR; + } + + char write_filename[1024]; + + /* TODO: currently hardcoded for PS3, fix this */ + snprintf(write_filename, sizeof(write_filename), "/dev_hdd1/%s", filename_inzip); + + err = unzOpenCurrentFile(uf); + if (err!=UNZ_OK) + { + /* failure */ + SSNES_ERR("error %d with zipfile in unzOpenCurrentFile\n",err); + } + else + { + /* success */ + fout=fopen(write_filename,"wb"); + + if (fout==NULL) + { + SSNES_ERR("error opening %s\n",write_filename); + } + } + + if (fout!=NULL) + { + SSNES_LOG(" extracting: %s\n",write_filename); + + do + { + err = unzReadCurrentFile(uf,buf,size_buf); + if (err<0) + { + SSNES_ERR("error %d with zipfile in unzReadCurrentFile\n",err); + break; + } + if (err>0) + if (fwrite(buf,err,1,fout)!=1) + { + SSNES_ERR("error in writing extracted file\n"); + err=UNZ_ERRNO; + break; + } + }while (err>0); + + if (fout) + fclose(fout); + + } + + if (err==UNZ_OK) + { + err = unzCloseCurrentFile (uf); + if (err!=UNZ_OK) + { + SSNES_ERR("error %d with zipfile in unzCloseCurrentFile\n",err); + } + } + else + unzCloseCurrentFile(uf); + + free(buf); + return err; +} + +int ssnes_extract_zipfile(const char * zip_path) +{ + unsigned long i; + unz_global_info gi; + int err; + unzFile uf; + + uf = unzOpen(zip_path); + + err = unzGetGlobalInfo(uf,&gi); + if (err!=UNZ_OK) + { + SSNES_ERR("error %d with zipfile in unzGetGlobalInfo \n",err); + } + + for (i = 0; i < gi.number_entry; i++) + { + if (ssnes_extract_currentfile_in_zip(uf) != UNZ_OK) + break; + + if ((i+1)