mirror of
https://github.com/dborth/snes9xgx.git
synced 2024-11-27 13:04:21 +01:00
remove wiiupc since libogc wiiuse now supports WiiU Pro controller.
remove update check completely. compatibility fixes for newer devkitppc.
This commit is contained in:
parent
0baaf38e35
commit
9703bef743
13
Makefile.gc
13
Makefile.gc
@ -26,16 +26,17 @@ INCLUDES := source source/snes9x
|
||||
#---------------------------------------------------------------------------------
|
||||
# options for code generation
|
||||
#---------------------------------------------------------------------------------
|
||||
LTO = -flto
|
||||
CFLAGS = -g -O3 $(LTO) -Wall $(MACHDEP) $(INCLUDE) -DNO_SOUND \
|
||||
|
||||
CFLAGS = -g -O3 -Wall $(MACHDEP) $(INCLUDE) \
|
||||
-DHAVE_STDINT_H -DBLARGG_NONPORTABLE -DBLARGG_BIG_ENDIAN -DBLARGG_CPU_POWERPC \
|
||||
-DZLIB -DRIGHTSHIFT_IS_SAR -DCPU_SHUTDOWN -DCORRECT_VRAM_READS \
|
||||
-D_SZ_ONE_DIRECTORY -D_LZMA_IN_CB -D_LZMA_OUT_READ -DUSE_VM \
|
||||
-D_SZ_ONE_DIRECTORY -D_LZMA_IN_CB -D_LZMA_OUT_READ -DNO_SOUND -DUSE_VM \
|
||||
-fomit-frame-pointer \
|
||||
-Wno-unused-parameter -Wno-strict-aliasing \
|
||||
-Wno-write-strings -Wno-parentheses
|
||||
-Wno-unused-parameter -Wno-unused-variable -Wno-unused-but-set-variable -Wno-strict-aliasing \
|
||||
-Wno-format -Wno-format-overflow -Wno-stringop-truncation -Wno-stringop-overflow -Wno-format-truncation -Wno-narrowing -Wno-sign-compare \
|
||||
-Wno-unused-function -Wno-write-strings -Wno-parentheses
|
||||
CXXFLAGS = $(CFLAGS)
|
||||
LDFLAGS = -g $(MACHDEP) $(LTO) -Wl,-Map,$(notdir $@).map
|
||||
LDFLAGS = -g $(MACHDEP) -Wl,-Map,$(notdir $@).map
|
||||
|
||||
#---------------------------------------------------------------------------------
|
||||
# any extra libraries we wish to link with the project
|
||||
|
15
Makefile.wii
15
Makefile.wii
@ -19,7 +19,7 @@ TARGET := snes9xgx-wii
|
||||
TARGETDIR := executables
|
||||
BUILD := build_wii
|
||||
SOURCES := source source/images source/sounds source/fonts source/lang \
|
||||
source/gui source/utils source/utils/sz source/utils/unzip \
|
||||
source/gui source/utils source/utils/sz \
|
||||
source/snes9x source/snes9x/apu
|
||||
INCLUDES := source source/snes9x
|
||||
|
||||
@ -27,20 +27,23 @@ INCLUDES := source source/snes9x
|
||||
# options for code generation
|
||||
#---------------------------------------------------------------------------------
|
||||
|
||||
CFLAGS = -g -O3 -Wall $(MACHDEP) $(INCLUDE) -DNO_SOUND \
|
||||
CFLAGS = -g -O3 -Wall $(MACHDEP) $(INCLUDE) \
|
||||
-DHAVE_STDINT_H -DBLARGG_NONPORTABLE -DBLARGG_BIG_ENDIAN -DBLARGG_CPU_POWERPC \
|
||||
-DZLIB -DRIGHTSHIFT_IS_SAR -DCPU_SHUTDOWN -DCORRECT_VRAM_READS \
|
||||
-D_SZ_ONE_DIRECTORY -D_LZMA_IN_CB -D_LZMA_OUT_READ \
|
||||
-fomit-frame-pointer \
|
||||
-Wno-unused-parameter -Wno-strict-aliasing \
|
||||
-Wno-write-strings -Wno-parentheses
|
||||
-Wno-unused-parameter -Wno-unused-variable -Wno-unused-but-set-variable -Wno-strict-aliasing \
|
||||
-Wno-format -Wno-format-overflow -Wno-stringop-truncation -Wno-stringop-overflow -Wno-format-truncation -Wno-narrowing -Wno-sign-compare \
|
||||
-Wno-unused-function -Wno-write-strings -Wno-parentheses
|
||||
|
||||
CXXFLAGS = $(CFLAGS)
|
||||
LDFLAGS = -g $(MACHDEP) -Wl,-Map,$(notdir $@).map,-wrap,wiiuse_register
|
||||
LDFLAGS = -g $(MACHDEP) -Wl,-Map,$(notdir $@).map
|
||||
|
||||
#---------------------------------------------------------------------------------
|
||||
# any extra libraries we wish to link with the project
|
||||
#---------------------------------------------------------------------------------
|
||||
LIBS := -ldi -liso9660 -lpng -lmxml \
|
||||
-lfat -lwiiuse -lwupc -lz -lbte -lasnd -logc -lvorbisidec -lfreetype -ltinysmb
|
||||
-lfat -lwiiuse -lz -lbte -lasnd -logc -lvorbisidec -lfreetype -ltinysmb
|
||||
#---------------------------------------------------------------------------------
|
||||
# list of directories containing libraries, this must be the top level containing
|
||||
# include and lib
|
||||
|
@ -24,6 +24,7 @@
|
||||
#include <di/di.h>
|
||||
#endif
|
||||
|
||||
#include "snes9x/port.h"
|
||||
#include "snes9xgx.h"
|
||||
#include "filebrowser.h"
|
||||
#include "menu.h"
|
||||
@ -454,7 +455,7 @@ int BrowserLoadSz()
|
||||
|
||||
int WiiFileLoader()
|
||||
{
|
||||
u32 size;
|
||||
size_t size;
|
||||
char filepath[1024];
|
||||
|
||||
memset(Memory.NSRTHeader, 0, sizeof(Memory.NSRTHeader));
|
||||
|
@ -106,8 +106,6 @@ extern const u8 icon_settings_gamecube_png[];
|
||||
extern const u32 icon_settings_gamecube_png_size;
|
||||
extern const u8 icon_settings_nunchuk_png[];
|
||||
extern const u32 icon_settings_nunchuk_png_size;
|
||||
extern const u8 icon_settings_wiiupro_png[];
|
||||
extern const u32 icon_settings_wiiupro_png_size;
|
||||
|
||||
extern const u8 icon_settings_snescontroller_png[];
|
||||
extern const u32 icon_settings_snescontroller_png_size;
|
||||
|
@ -158,7 +158,6 @@ devicecallback (void *arg)
|
||||
usleep(THREAD_SLEEP);
|
||||
devsleep -= THREAD_SLEEP;
|
||||
}
|
||||
UpdateCheck();
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
@ -123,16 +123,6 @@ typedef struct _paddata {
|
||||
u8 triggerR;
|
||||
} PADData;
|
||||
|
||||
typedef struct _wupcfulldata {
|
||||
u32 btns_d;
|
||||
u32 btns_u;
|
||||
u32 btns_h;
|
||||
s16 stickX;
|
||||
s16 stickY;
|
||||
s16 substickX;
|
||||
s16 substickY;
|
||||
} WUPCFullData;
|
||||
|
||||
#define EFFECT_SLIDE_TOP 1
|
||||
#define EFFECT_SLIDE_BOTTOM 2
|
||||
#define EFFECT_SLIDE_RIGHT 4
|
||||
@ -236,7 +226,6 @@ class GuiTrigger
|
||||
|
||||
WPADData wpaddata; //!< Wii controller trigger data
|
||||
PADData pad; //!< GameCube controller trigger data
|
||||
WUPCFullData wupcdata; //!< WiiU Pro controller trigger data
|
||||
WPADData * wpad; //!< Wii controller trigger
|
||||
s32 chan; //!< Trigger controller channel (0-3, -1 for all)
|
||||
u8 type; //!< trigger type (TRIGGER_SIMPLE, TRIGGER_HELD, TRIGGER_BUTTON_ONLY, TRIGGER_BUTTON_ONLY_IN_FOCUS)
|
||||
@ -671,7 +660,7 @@ class GuiText : public GuiElement
|
||||
//!\param s Font size
|
||||
//!\param h Text alignment (horizontal)
|
||||
//!\param v Text alignment (vertical)
|
||||
void SetPresets(int sz, GXColor c, int w, u16 s, int h, int v);
|
||||
static void SetPresets(int sz, GXColor c, int w, u16 s, int h, int v);
|
||||
//!Sets the font size
|
||||
//!\param s Font size
|
||||
void SetFontSize(int s);
|
||||
|
@ -255,7 +255,7 @@ void GuiButton::Update(GuiTrigger * t)
|
||||
// button triggers
|
||||
if(this->IsClickable())
|
||||
{
|
||||
s32 wm_btns, wm_btns_trig, cc_btns, cc_btns_trig, wupc_btns, wupc_btns_trig;
|
||||
s32 wm_btns, wm_btns_trig, cc_btns, cc_btns_trig;
|
||||
for(int i=0; i<3; i++)
|
||||
{
|
||||
if(trigger[i] && (trigger[i]->chan == -1 || trigger[i]->chan == t->chan))
|
||||
@ -268,16 +268,11 @@ void GuiButton::Update(GuiTrigger * t)
|
||||
cc_btns = t->wpad->btns_d >> 16;
|
||||
cc_btns_trig = trigger[i]->wpad->btns_d >> 16;
|
||||
|
||||
// lower 16 bits only (WiiU Pro controller)
|
||||
wupc_btns = t->wupcdata.btns_d >> 16;
|
||||
wupc_btns_trig = trigger[i]->wupcdata.btns_d >> 16;
|
||||
|
||||
if(
|
||||
(t->wpad->btns_d > 0 &&
|
||||
(wm_btns == wm_btns_trig ||
|
||||
(cc_btns == cc_btns_trig && t->wpad->exp.type == EXP_CLASSIC))) ||
|
||||
(t->pad.btns_d == trigger[i]->pad.btns_d && t->pad.btns_d > 0) ||
|
||||
(wupc_btns == wupc_btns_trig && wupc_btns_trig > 0))
|
||||
(t->pad.btns_d == trigger[i]->pad.btns_d && t->pad.btns_d > 0))
|
||||
|
||||
{
|
||||
if(t->chan == stateChan || stateChan == -1)
|
||||
@ -310,7 +305,7 @@ void GuiButton::Update(GuiTrigger * t)
|
||||
if(this->IsHoldable())
|
||||
{
|
||||
bool held = false;
|
||||
s32 wm_btns, wm_btns_h, wm_btns_trig, cc_btns, cc_btns_h, cc_btns_trig, wupc_btns, wupc_btns_h, wupc_btns_trig;
|
||||
s32 wm_btns, wm_btns_h, wm_btns_trig, cc_btns, cc_btns_h, cc_btns_trig;
|
||||
|
||||
for(int i=0; i<3; i++)
|
||||
{
|
||||
@ -325,18 +320,12 @@ void GuiButton::Update(GuiTrigger * t)
|
||||
cc_btns = t->wpad->btns_d >> 16;
|
||||
cc_btns_h = t->wpad->btns_h >> 16;
|
||||
cc_btns_trig = trigger[i]->wpad->btns_h >> 16;
|
||||
|
||||
// lower 16 bits only (WiiU Pro controller)
|
||||
wupc_btns = t->wpad->btns_d >> 16;
|
||||
wupc_btns_h = t->wpad->btns_h >> 16;
|
||||
wupc_btns_trig = trigger[i]->wpad->btns_h >> 16;
|
||||
|
||||
if(
|
||||
(t->wpad->btns_d > 0 &&
|
||||
(wm_btns == wm_btns_trig ||
|
||||
(cc_btns == cc_btns_trig && t->wpad->exp.type == EXP_CLASSIC))) ||
|
||||
(t->pad.btns_d == trigger[i]->pad.btns_h && t->pad.btns_d > 0) ||
|
||||
(wupc_btns == wupc_btns_trig && wupc_btns > 0))
|
||||
(t->pad.btns_d == trigger[i]->pad.btns_h && t->pad.btns_d > 0))
|
||||
{
|
||||
if(trigger[i]->type == TRIGGER_HELD && state == STATE_SELECTED &&
|
||||
(t->chan == stateChan || stateChan == -1))
|
||||
@ -347,8 +336,7 @@ void GuiButton::Update(GuiTrigger * t)
|
||||
(t->wpad->btns_h > 0 &&
|
||||
(wm_btns_h == wm_btns_trig ||
|
||||
(cc_btns_h == cc_btns_trig && t->wpad->exp.type == EXP_CLASSIC))) ||
|
||||
(t->pad.btns_h == trigger[i]->pad.btns_h && t->pad.btns_h > 0) ||
|
||||
(wupc_btns_h == wupc_btns_trig && wupc_btns_h > 0))
|
||||
(t->pad.btns_h == trigger[i]->pad.btns_h && t->pad.btns_h > 0))
|
||||
|
||||
{
|
||||
if(trigger[i]->type == TRIGGER_HELD)
|
||||
|
@ -22,7 +22,6 @@ static u32 delay[4];
|
||||
GuiTrigger::GuiTrigger()
|
||||
{
|
||||
chan = -1;
|
||||
memset(&wupcdata, 0, sizeof(WUPCFullData));
|
||||
memset(&wpaddata, 0, sizeof(WPADData));
|
||||
memset(&pad, 0, sizeof(PADData));
|
||||
wpad = &wpaddata;
|
||||
@ -44,7 +43,6 @@ void GuiTrigger::SetSimpleTrigger(s32 ch, u32 wiibtns, u16 gcbtns)
|
||||
{
|
||||
type = TRIGGER_SIMPLE;
|
||||
chan = ch;
|
||||
wupcdata.btns_d = wiibtns;
|
||||
wpaddata.btns_d = wiibtns;
|
||||
pad.btns_d = gcbtns;
|
||||
}
|
||||
@ -58,7 +56,6 @@ void GuiTrigger::SetHeldTrigger(s32 ch, u32 wiibtns, u16 gcbtns)
|
||||
{
|
||||
type = TRIGGER_HELD;
|
||||
chan = ch;
|
||||
wupcdata.btns_h = wiibtns;
|
||||
wpaddata.btns_h = wiibtns;
|
||||
pad.btns_h = gcbtns;
|
||||
}
|
||||
@ -71,7 +68,6 @@ void GuiTrigger::SetButtonOnlyTrigger(s32 ch, u32 wiibtns, u16 gcbtns)
|
||||
{
|
||||
type = TRIGGER_BUTTON_ONLY;
|
||||
chan = ch;
|
||||
wupcdata.btns_d = wiibtns;
|
||||
wpaddata.btns_d = wiibtns;
|
||||
pad.btns_d = gcbtns;
|
||||
}
|
||||
@ -85,7 +81,6 @@ void GuiTrigger::SetButtonOnlyInFocusTrigger(s32 ch, u32 wiibtns, u16 gcbtns)
|
||||
{
|
||||
type = TRIGGER_BUTTON_ONLY_IN_FOCUS;
|
||||
chan = ch;
|
||||
wupcdata.btns_d = wiibtns;
|
||||
wpaddata.btns_d = wiibtns;
|
||||
pad.btns_d = gcbtns;
|
||||
}
|
||||
@ -163,14 +158,11 @@ bool GuiTrigger::Left()
|
||||
u32 wiibtn = GCSettings.WiimoteOrientation ? WPAD_BUTTON_UP : WPAD_BUTTON_LEFT;
|
||||
|
||||
if((wpad->btns_d | wpad->btns_h) & (wiibtn | WPAD_CLASSIC_BUTTON_LEFT)
|
||||
|| (wupcdata.btns_d | wupcdata.btns_h) & (wiibtn | WPAD_CLASSIC_BUTTON_LEFT)
|
||||
|| (pad.btns_d | pad.btns_h) & PAD_BUTTON_LEFT
|
||||
|| pad.stickX < -PADCAL
|
||||
|| WPAD_StickX(0) < -PADCAL
|
||||
|| wupcdata.stickX < -WUPCCAL)
|
||||
|| WPAD_StickX(0) < -PADCAL)
|
||||
{
|
||||
if((wpad->btns_d & (wiibtn | WPAD_CLASSIC_BUTTON_LEFT))
|
||||
|| (wupcdata.btns_d & (wiibtn | WPAD_CLASSIC_BUTTON_LEFT))
|
||||
if(wpad->btns_d & (wiibtn | WPAD_CLASSIC_BUTTON_LEFT)
|
||||
|| pad.btns_d & PAD_BUTTON_LEFT)
|
||||
{
|
||||
prev[chan] = gettime();
|
||||
@ -199,14 +191,11 @@ bool GuiTrigger::Right()
|
||||
u32 wiibtn = GCSettings.WiimoteOrientation ? WPAD_BUTTON_DOWN : WPAD_BUTTON_RIGHT;
|
||||
|
||||
if((wpad->btns_d | wpad->btns_h) & (wiibtn | WPAD_CLASSIC_BUTTON_RIGHT)
|
||||
|| ((wupcdata.btns_d | wupcdata.btns_h) & (wiibtn | WPAD_CLASSIC_BUTTON_RIGHT))
|
||||
|| (pad.btns_d | pad.btns_h) & PAD_BUTTON_RIGHT
|
||||
|| pad.stickX > PADCAL
|
||||
|| WPAD_StickX(0) > PADCAL
|
||||
|| wupcdata.stickX > WUPCCAL)
|
||||
|| WPAD_StickX(0) > PADCAL)
|
||||
{
|
||||
if((wpad->btns_d & (wiibtn | WPAD_CLASSIC_BUTTON_RIGHT))
|
||||
|| (wupcdata.btns_d & (wiibtn | WPAD_CLASSIC_BUTTON_RIGHT))
|
||||
if(wpad->btns_d & (wiibtn | WPAD_CLASSIC_BUTTON_RIGHT)
|
||||
|| pad.btns_d & PAD_BUTTON_RIGHT)
|
||||
{
|
||||
prev[chan] = gettime();
|
||||
@ -234,15 +223,12 @@ bool GuiTrigger::Up()
|
||||
{
|
||||
u32 wiibtn = GCSettings.WiimoteOrientation ? WPAD_BUTTON_RIGHT : WPAD_BUTTON_UP;
|
||||
|
||||
if(((wpad->btns_d | wpad->btns_h) & (wiibtn | WPAD_CLASSIC_BUTTON_UP))
|
||||
|| ((wupcdata.btns_d | wupcdata.btns_h) & (wiibtn | WPAD_CLASSIC_BUTTON_UP))
|
||||
if((wpad->btns_d | wpad->btns_h) & (wiibtn | WPAD_CLASSIC_BUTTON_UP)
|
||||
|| (pad.btns_d | pad.btns_h) & PAD_BUTTON_UP
|
||||
|| pad.stickY > PADCAL
|
||||
|| WPAD_StickY(0) > PADCAL
|
||||
|| wupcdata.stickY > WUPCCAL)
|
||||
|| WPAD_StickY(0) > PADCAL)
|
||||
{
|
||||
if((wpad->btns_d & (wiibtn | WPAD_CLASSIC_BUTTON_UP))
|
||||
|| (wupcdata.btns_d & (wiibtn | WPAD_CLASSIC_BUTTON_UP))
|
||||
if(wpad->btns_d & (wiibtn | WPAD_CLASSIC_BUTTON_UP)
|
||||
|| pad.btns_d & PAD_BUTTON_UP)
|
||||
{
|
||||
prev[chan] = gettime();
|
||||
@ -270,15 +256,12 @@ bool GuiTrigger::Down()
|
||||
{
|
||||
u32 wiibtn = GCSettings.WiimoteOrientation ? WPAD_BUTTON_LEFT : WPAD_BUTTON_DOWN;
|
||||
|
||||
if(((wpad->btns_d | wpad->btns_h) & (wiibtn | WPAD_CLASSIC_BUTTON_DOWN))
|
||||
|| ((wupcdata.btns_d | wupcdata.btns_h) & (wiibtn | WPAD_CLASSIC_BUTTON_DOWN))
|
||||
if((wpad->btns_d | wpad->btns_h) & (wiibtn | WPAD_CLASSIC_BUTTON_DOWN)
|
||||
|| (pad.btns_d | pad.btns_h) & PAD_BUTTON_DOWN
|
||||
|| pad.stickY < -PADCAL
|
||||
|| WPAD_StickY(0) < -PADCAL
|
||||
|| wupcdata.stickY < -WUPCCAL)
|
||||
|| WPAD_StickY(0) < -PADCAL)
|
||||
{
|
||||
if((wpad->btns_d & (wiibtn | WPAD_CLASSIC_BUTTON_DOWN))
|
||||
|| wupcdata.btns_d & (wiibtn | WPAD_CLASSIC_BUTTON_DOWN)
|
||||
if(wpad->btns_d & (wiibtn | WPAD_CLASSIC_BUTTON_DOWN)
|
||||
|| pad.btns_d & PAD_BUTTON_DOWN)
|
||||
{
|
||||
prev[chan] = gettime();
|
||||
@ -288,7 +271,7 @@ bool GuiTrigger::Down()
|
||||
|
||||
now[chan] = gettime();
|
||||
|
||||
if(diff_usec(prev[chan], now[chan]) > delay[chan])
|
||||
if(diff_usec(prev[chan], now[chan]) > delay[chan])
|
||||
{
|
||||
prev[chan] = now[chan];
|
||||
|
||||
|
@ -229,7 +229,7 @@ void GuiWindow::ToggleFocus(GuiTrigger * t)
|
||||
}
|
||||
// change focus
|
||||
else if((t->wpad->btns_d & (WPAD_BUTTON_1 | WPAD_BUTTON_B | WPAD_CLASSIC_BUTTON_B))
|
||||
|| (t->pad.btns_d & PAD_BUTTON_B) || (t->wupcdata.btns_d & WPAD_CLASSIC_BUTTON_B))
|
||||
|| (t->pad.btns_d & PAD_BUTTON_B))
|
||||
{
|
||||
for (i = found; i < elemSize; ++i)
|
||||
{
|
||||
|
Binary file not shown.
Before Width: | Height: | Size: 10 KiB |
@ -21,10 +21,10 @@
|
||||
#include <unistd.h>
|
||||
#ifdef HW_RVL
|
||||
#include <wiiuse/wpad.h>
|
||||
#include <wupc/wupc.h>
|
||||
#endif
|
||||
#include <ogc/lwp_watchdog.h>
|
||||
|
||||
#include "snes9x/port.h"
|
||||
#include "snes9xgx.h"
|
||||
#include "button_mapping.h"
|
||||
#include "menu.h"
|
||||
@ -205,7 +205,6 @@ void
|
||||
UpdatePads()
|
||||
{
|
||||
#ifdef HW_RVL
|
||||
WUPC_UpdateButtonStats();
|
||||
WPAD_ScanPads();
|
||||
#endif
|
||||
|
||||
@ -222,15 +221,6 @@ UpdatePads()
|
||||
userInput[i].pad.substickY = PAD_SubStickY(i);
|
||||
userInput[i].pad.triggerL = PAD_TriggerL(i);
|
||||
userInput[i].pad.triggerR = PAD_TriggerR(i);
|
||||
#ifdef HW_RVL
|
||||
userInput[i].wupcdata.btns_d = WUPC_ButtonsDown(i);
|
||||
userInput[i].wupcdata.btns_u = WUPC_ButtonsUp(i);
|
||||
userInput[i].wupcdata.btns_h = WUPC_ButtonsHeld(i);
|
||||
userInput[i].wupcdata.stickX = WUPC_lStickX(i);
|
||||
userInput[i].wupcdata.stickY = WUPC_lStickY(i);
|
||||
userInput[i].wupcdata.substickX = WUPC_rStickX(i);
|
||||
userInput[i].wupcdata.substickY = WUPC_rStickY(i);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
@ -311,7 +301,6 @@ static void UpdateCursorPosition (int chan, int &pos_x, int &pos_y)
|
||||
{
|
||||
#define SCOPEPADCAL 20
|
||||
|
||||
#define WUPCSCOPEPADCAL 160
|
||||
// gc left joystick
|
||||
|
||||
if (userInput[chan].pad.stickX > SCOPEPADCAL)
|
||||
@ -368,32 +357,6 @@ static void UpdateCursorPosition (int chan, int &pos_x, int &pos_y)
|
||||
pos_y -= (wm_ay*1.0)/SCOPEPADCAL;
|
||||
if (pos_y < 0) pos_y = 0;
|
||||
}
|
||||
|
||||
/* WiiU Pro Controller */
|
||||
s8 wupc_ax = userInput[chan].wupcdata.stickX;
|
||||
s8 wupc_ay = userInput[chan].wupcdata.stickX;
|
||||
|
||||
if (wupc_ax > WUPCSCOPEPADCAL)
|
||||
{
|
||||
pos_x += (wupc_ax*1.0)/WUPCSCOPEPADCAL;
|
||||
if (pos_x > 256) pos_x = 256;
|
||||
}
|
||||
if (wupc_ax < -WUPCSCOPEPADCAL)
|
||||
{
|
||||
pos_x -= (wupc_ax*-1.0)/WUPCSCOPEPADCAL;
|
||||
if (pos_x < 0) pos_x = 0;
|
||||
}
|
||||
|
||||
if (wupc_ay < -WUPCSCOPEPADCAL)
|
||||
{
|
||||
pos_y += (wupc_ay*-1.0)/WUPCSCOPEPADCAL;
|
||||
if (pos_y > 224) pos_y = 224;
|
||||
}
|
||||
if (wupc_ay > WUPCSCOPEPADCAL)
|
||||
{
|
||||
pos_y -= (wupc_ay*1.0)/WUPCSCOPEPADCAL;
|
||||
if (pos_y < 0) pos_y = 0;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
@ -423,10 +386,6 @@ static void decodepad (int chan)
|
||||
u32 exp_type;
|
||||
if ( WPAD_Probe(chan, &exp_type) != 0 )
|
||||
exp_type = WPAD_EXP_NONE;
|
||||
|
||||
s16 wupc_ax = userInput[chan].wupcdata.stickX;
|
||||
s16 wupc_ay = userInput[chan].wupcdata.stickY;
|
||||
u32 wupcp = userInput[chan].wupcdata.btns_h;
|
||||
#endif
|
||||
|
||||
/***
|
||||
@ -471,20 +430,6 @@ static void decodepad (int chan)
|
||||
else if(sin(angle) < -THRES)
|
||||
wp |= (exp_type == WPAD_EXP_CLASSIC) ? WPAD_CLASSIC_BUTTON_DOWN : WPAD_BUTTON_DOWN;
|
||||
}
|
||||
|
||||
/* Pro Controller */
|
||||
if (wupc_ax * wupc_ax + wupc_ay * wupc_ay > WUPCCAL * WUPCCAL)
|
||||
{
|
||||
angle = atan2(wupc_ay, wupc_ax);
|
||||
if(cos(angle) > THRES)
|
||||
wupcp |= WPAD_CLASSIC_BUTTON_RIGHT;
|
||||
else if(cos(angle) < -THRES)
|
||||
wupcp |= WPAD_CLASSIC_BUTTON_LEFT;
|
||||
if(sin(angle) > THRES)
|
||||
wupcp |= WPAD_CLASSIC_BUTTON_UP;
|
||||
else if(sin(angle) < -THRES)
|
||||
wupcp |= WPAD_CLASSIC_BUTTON_DOWN;
|
||||
}
|
||||
#endif
|
||||
|
||||
/*** Fix offset to pad ***/
|
||||
@ -498,7 +443,6 @@ static void decodepad (int chan)
|
||||
|| ( (exp_type == WPAD_EXP_NONE) && (wp & btnmap[CTRL_PAD][CTRLR_WIIMOTE][i]) ) // wiimote
|
||||
|| ( (exp_type == WPAD_EXP_CLASSIC) && (wp & btnmap[CTRL_PAD][CTRLR_CLASSIC][i]) ) // classic controller
|
||||
|| ( (exp_type == WPAD_EXP_NUNCHUK) && (wp & btnmap[CTRL_PAD][CTRLR_NUNCHUK][i]) ) // nunchuk + wiimote
|
||||
|| ( (wupcp & btnmap[CTRL_PAD][CTRLR_CLASSIC][i]) ) // WiiU Pro Controller
|
||||
#endif
|
||||
)
|
||||
S9xReportButton (offset + i, true);
|
||||
@ -516,7 +460,6 @@ static void decodepad (int chan)
|
||||
if (jp & btnmap[CTRL_SCOPE][CTRLR_GCPAD][i]
|
||||
#ifdef HW_RVL
|
||||
|| wp & btnmap[CTRL_SCOPE][CTRLR_WIIMOTE][i]
|
||||
|| wupcp & btnmap[CTRL_SCOPE][CTRLR_WIIMOTE][i]
|
||||
#endif
|
||||
)
|
||||
{
|
||||
@ -554,7 +497,6 @@ static void decodepad (int chan)
|
||||
if (jp & btnmap[CTRL_MOUSE][CTRLR_GCPAD][i]
|
||||
#ifdef HW_RVL
|
||||
|| wp & btnmap[CTRL_MOUSE][CTRLR_WIIMOTE][i]
|
||||
|| wupcp & btnmap[CTRL_MOUSE][CTRLR_WIIMOTE][i]
|
||||
#endif
|
||||
)
|
||||
S9xReportButton(offset + i, true);
|
||||
@ -577,7 +519,6 @@ static void decodepad (int chan)
|
||||
if (jp & btnmap[CTRL_JUST][CTRLR_GCPAD][i]
|
||||
#ifdef HW_RVL
|
||||
|| wp & btnmap[CTRL_JUST][CTRLR_WIIMOTE][i]
|
||||
|| wupcp & btnmap[CTRL_JUST][CTRLR_WIIMOTE][i]
|
||||
#endif
|
||||
)
|
||||
S9xReportButton(offset + i, true);
|
||||
@ -613,8 +554,7 @@ bool MenuRequested()
|
||||
)
|
||||
#ifdef HW_RVL
|
||||
|| (userInput[i].wpad->btns_h & WPAD_BUTTON_HOME) ||
|
||||
(userInput[i].wpad->btns_h & WPAD_CLASSIC_BUTTON_HOME) ||
|
||||
(userInput[i].wupcdata.btns_h & WPAD_CLASSIC_BUTTON_HOME)
|
||||
(userInput[i].wpad->btns_h & WPAD_CLASSIC_BUTTON_HOME)
|
||||
#endif
|
||||
)
|
||||
{
|
||||
@ -638,8 +578,7 @@ void ReportButtons ()
|
||||
|
||||
Settings.TurboMode = (
|
||||
userInput[0].pad.substickX > 70 ||
|
||||
userInput[0].WPAD_StickX(1) > 70 ||
|
||||
userInput[0].wupcdata.substickX > 560
|
||||
userInput[0].WPAD_StickX(1) > 70
|
||||
); // RIGHT on c-stick and on classic controller right joystick
|
||||
|
||||
/* Check for menu:
|
||||
|
@ -19,7 +19,6 @@
|
||||
|
||||
#define PI 3.14159265f
|
||||
#define PADCAL 50
|
||||
#define WUPCCAL 400
|
||||
#define MAXJP 12 // # of mappable controller buttons
|
||||
|
||||
extern u32 btnmap[4][4][12];
|
||||
|
130
source/menu.cpp
130
source/menu.cpp
@ -18,9 +18,9 @@
|
||||
#ifdef HW_RVL
|
||||
#include <di/di.h>
|
||||
#include <wiiuse/wpad.h>
|
||||
#include <wupc/wupc.h>
|
||||
#endif
|
||||
|
||||
#include "snes9x/port.h"
|
||||
#include "snes9xgx.h"
|
||||
#include "video.h"
|
||||
#include "filebrowser.h"
|
||||
@ -82,7 +82,6 @@ static GuiWindow * mainWindow = NULL;
|
||||
static GuiText * settingText = NULL;
|
||||
static GuiText * settingText2 = NULL;
|
||||
static int lastMenu = MENU_NONE;
|
||||
static int wiiuproCtrl = 0;
|
||||
static int mapMenuCtrl = 0;
|
||||
static int mapMenuCtrlSNES = 0;
|
||||
|
||||
@ -253,27 +252,6 @@ WindowPrompt(const char *title, const char *msg, const char *btn1Label, const ch
|
||||
return choice;
|
||||
}
|
||||
|
||||
#ifdef HW_RVL
|
||||
/****************************************************************************
|
||||
* EmulatorUpdate
|
||||
*
|
||||
* Prompts for confirmation, and downloads/installs updates
|
||||
***************************************************************************/
|
||||
static void *
|
||||
EmulatorUpdate (void *arg)
|
||||
{
|
||||
bool installUpdate = WindowPrompt(
|
||||
"Update Available",
|
||||
"An update is available!",
|
||||
"Update now",
|
||||
"Update later");
|
||||
if(installUpdate)
|
||||
if(DownloadUpdate())
|
||||
ExitRequested = 1;
|
||||
return NULL;
|
||||
}
|
||||
#endif
|
||||
|
||||
/****************************************************************************
|
||||
* UpdateGUI
|
||||
*
|
||||
@ -300,9 +278,9 @@ UpdateGUI (void *arg)
|
||||
i = 3;
|
||||
do
|
||||
{
|
||||
if(userInput[i].wpad->ir.valid)
|
||||
Menu_DrawImg(userInput[i].wpad->ir.x-48, userInput[i].wpad->ir.y-48,
|
||||
96, 96, pointer[i]->GetImage(), userInput[i].wpad->ir.angle, 1, 1, 255);
|
||||
if(userInput[i].wpad->ir.valid) {
|
||||
Menu_DrawImg(userInput[i].wpad->ir.x-48, userInput[i].wpad->ir.y-48, 96, 96, pointer[i]->GetImage(), userInput[i].wpad->ir.angle, 1, 1, 255);
|
||||
}
|
||||
DoRumble(i);
|
||||
--i;
|
||||
} while(i>=0);
|
||||
@ -315,16 +293,6 @@ UpdateGUI (void *arg)
|
||||
mainWindow->Update(&userInput[1]);
|
||||
mainWindow->Update(&userInput[0]);
|
||||
|
||||
#ifdef HW_RVL
|
||||
if(updateFound)
|
||||
{
|
||||
updateFound = false;
|
||||
|
||||
if(!loadingFile)
|
||||
LWP_CreateThread (&updatethread, EmulatorUpdate, NULL, NULL, 0, 70);
|
||||
}
|
||||
#endif
|
||||
|
||||
if(ExitRequested || ShutdownRequested)
|
||||
{
|
||||
for(i = 0; i <= 255; i += 15)
|
||||
@ -802,9 +770,7 @@ static void WindowCredits(void * ptr)
|
||||
txt[i] = new GuiText("Official Site: https://github.com/dborth/snes9xgx", 20, (GXColor){0, 0, 0, 255});
|
||||
txt[i]->SetAlignment(ALIGN_CENTRE, ALIGN_TOP); txt[i]->SetPosition(0,y); i++; y+=40;
|
||||
|
||||
txt[i]->SetPresets(20, (GXColor){0, 0, 0, 255}, 0,
|
||||
FTGX_JUSTIFY_LEFT | FTGX_ALIGN_TOP, ALIGN_LEFT, ALIGN_TOP);
|
||||
|
||||
GuiText::SetPresets(20, (GXColor){0, 0, 0, 255}, 0, FTGX_JUSTIFY_LEFT | FTGX_ALIGN_TOP, ALIGN_LEFT, ALIGN_TOP);
|
||||
txt[i] = new GuiText("Coding & menu design");
|
||||
txt[i]->SetPosition(60,y); i++;
|
||||
txt[i] = new GuiText("Tantric");
|
||||
@ -842,8 +808,7 @@ static void WindowCredits(void * ptr)
|
||||
txt[i] = new GuiText("Armin Tamzarian");
|
||||
txt[i]->SetPosition(350,y); i++; y+=48;
|
||||
|
||||
txt[i]->SetPresets(18, (GXColor){0, 0, 0, 255}, 0,
|
||||
FTGX_JUSTIFY_CENTER | FTGX_ALIGN_TOP, ALIGN_CENTRE, ALIGN_TOP);
|
||||
GuiText::SetPresets(18, (GXColor){0, 0, 0, 255}, 0, FTGX_JUSTIFY_CENTER | FTGX_ALIGN_TOP, ALIGN_CENTRE, ALIGN_TOP);
|
||||
|
||||
txt[i] = new GuiText("Snes9x - Copyright (c) Snes9x Team 1996 - 2006");
|
||||
txt[i]->SetPosition(0,y); i++; y+=20;
|
||||
@ -855,7 +820,7 @@ static void WindowCredits(void * ptr)
|
||||
char iosVersion[20];
|
||||
|
||||
#ifdef HW_RVL
|
||||
sprintf(iosVersion, "IOS: %d", IOS_GetVersion());
|
||||
sprintf(iosVersion, "IOS: %ld", IOS_GetVersion());
|
||||
#endif
|
||||
|
||||
txt[i] = new GuiText(iosVersion, 18, (GXColor){0, 0, 0, 255});
|
||||
@ -879,9 +844,9 @@ static void WindowCredits(void * ptr)
|
||||
#ifdef HW_RVL
|
||||
i = 3;
|
||||
do {
|
||||
if(userInput[i].wpad->ir.valid)
|
||||
Menu_DrawImg(userInput[i].wpad->ir.x-48, userInput[i].wpad->ir.y-48,
|
||||
96, 96, pointer[i]->GetImage(), userInput[i].wpad->ir.angle, 1, 1, 255);
|
||||
if(userInput[i].wpad->ir.valid) {
|
||||
Menu_DrawImg(userInput[i].wpad->ir.x-48, userInput[i].wpad->ir.y-48, 96, 96, pointer[i]->GetImage(), userInput[i].wpad->ir.angle, 1, 1, 255);
|
||||
}
|
||||
DoRumble(i);
|
||||
--i;
|
||||
} while(i >= 0);
|
||||
@ -889,10 +854,10 @@ static void WindowCredits(void * ptr)
|
||||
|
||||
Menu_Render();
|
||||
|
||||
if((userInput[0].wpad->btns_d || userInput[0].pad.btns_d || userInput[0].wupcdata.btns_d) ||
|
||||
(userInput[1].wpad->btns_d || userInput[1].pad.btns_d || userInput[1].wupcdata.btns_d) ||
|
||||
(userInput[2].wpad->btns_d || userInput[2].pad.btns_d || userInput[2].wupcdata.btns_d) ||
|
||||
(userInput[3].wpad->btns_d || userInput[3].pad.btns_d || userInput[3].wupcdata.btns_d))
|
||||
if((userInput[0].wpad->btns_d || userInput[0].pad.btns_d) ||
|
||||
(userInput[1].wpad->btns_d || userInput[1].pad.btns_d) ||
|
||||
(userInput[2].wpad->btns_d || userInput[2].pad.btns_d) ||
|
||||
(userInput[3].wpad->btns_d || userInput[3].pad.btns_d))
|
||||
{
|
||||
exit = true;
|
||||
}
|
||||
@ -902,7 +867,6 @@ static void WindowCredits(void * ptr)
|
||||
// clear buttons pressed
|
||||
for(i=0; i < 4; i++)
|
||||
{
|
||||
userInput[i].wupcdata.btns_d = 0;
|
||||
userInput[i].wpad->btns_d = 0;
|
||||
userInput[i].pad.btns_d = 0;
|
||||
}
|
||||
@ -1485,17 +1449,8 @@ static int MenuGame()
|
||||
}
|
||||
else
|
||||
{
|
||||
struct WUPCData *data = WUPC_Data(i);
|
||||
if(data != NULL)
|
||||
{
|
||||
newStatus = true;
|
||||
newLevel = data->battery;
|
||||
}
|
||||
else
|
||||
{
|
||||
newStatus = false;
|
||||
newLevel = 0;
|
||||
}
|
||||
newStatus = false;
|
||||
newLevel = 0;
|
||||
}
|
||||
|
||||
if(status[i] != newStatus || level[i] != newLevel)
|
||||
@ -2415,7 +2370,6 @@ static int MenuSettingsMappingsController()
|
||||
GuiImageData iconClassic(icon_settings_classic_png);
|
||||
GuiImageData iconGamecube(icon_settings_gamecube_png);
|
||||
GuiImageData iconNunchuk(icon_settings_nunchuk_png);
|
||||
GuiImageData iconWiiupro(icon_settings_wiiupro_png);
|
||||
|
||||
GuiText gamecubeBtnTxt("GameCube Controller", 22, (GXColor){0, 0, 0, 255});
|
||||
gamecubeBtnTxt.SetWrap(true, btnLargeOutline.GetWidth()-20);
|
||||
@ -2469,24 +2423,6 @@ static int MenuSettingsMappingsController()
|
||||
classicBtn.SetTrigger(trigA);
|
||||
classicBtn.SetTrigger(trig2);
|
||||
classicBtn.SetEffectGrow();
|
||||
|
||||
GuiText wiiuproBtnTxt("Wii U Pro Controller", 22, (GXColor){0, 0, 0, 255});
|
||||
wiiuproBtnTxt.SetWrap(true, btnLargeOutline.GetWidth()-20);
|
||||
GuiImage wiiuproBtnImg(&btnLargeOutline);
|
||||
GuiImage wiiuproBtnImgOver(&btnLargeOutlineOver);
|
||||
GuiImage wiiuproBtnIcon(&iconWiiupro);
|
||||
GuiButton wiiuproBtn(btnLargeOutline.GetWidth(), btnLargeOutline.GetHeight());
|
||||
wiiuproBtn.SetAlignment(ALIGN_CENTRE, ALIGN_TOP);
|
||||
wiiuproBtn.SetPosition(0, 250);
|
||||
wiiuproBtn.SetLabel(&wiiuproBtnTxt);
|
||||
wiiuproBtn.SetImage(&wiiuproBtnImg);
|
||||
wiiuproBtn.SetImageOver(&wiiuproBtnImgOver);
|
||||
wiiuproBtn.SetIcon(&wiiuproBtnIcon);
|
||||
wiiuproBtn.SetSoundOver(&btnSoundOver);
|
||||
wiiuproBtn.SetSoundClick(&btnSoundClick);
|
||||
wiiuproBtn.SetTrigger(trigA);
|
||||
wiiuproBtn.SetTrigger(trig2);
|
||||
wiiuproBtn.SetEffectGrow();
|
||||
|
||||
GuiText nunchukBtnTxt1("Wiimote", 22, (GXColor){0, 0, 0, 255});
|
||||
GuiText nunchukBtnTxt2("&", 18, (GXColor){0, 0, 0, 255});
|
||||
@ -2539,7 +2475,6 @@ static int MenuSettingsMappingsController()
|
||||
{
|
||||
w.Append(&nunchukBtn);
|
||||
w.Append(&classicBtn);
|
||||
w.Append(&wiiuproBtn);
|
||||
}
|
||||
#endif
|
||||
w.Append(&backBtn);
|
||||
@ -2564,13 +2499,6 @@ static int MenuSettingsMappingsController()
|
||||
}
|
||||
else if(classicBtn.GetState() == STATE_CLICKED)
|
||||
{
|
||||
wiiuproCtrl = 0;
|
||||
menu = MENU_GAMESETTINGS_MAPPINGS_MAP;
|
||||
mapMenuCtrl = CTRLR_CLASSIC;
|
||||
}
|
||||
else if(wiiuproBtn.GetState() == STATE_CLICKED)
|
||||
{
|
||||
wiiuproCtrl = 1;
|
||||
menu = MENU_GAMESETTINGS_MAPPINGS_MAP;
|
||||
mapMenuCtrl = CTRLR_CLASSIC;
|
||||
}
|
||||
@ -2626,14 +2554,7 @@ ButtonMappingWindow()
|
||||
sprintf(msg, "Press any button on the Wiimote now. Press Home to clear the existing mapping.");
|
||||
break;
|
||||
case CTRLR_CLASSIC:
|
||||
if(wiiuproCtrl == 1)
|
||||
{
|
||||
sprintf(msg, "Press any button on the Wii U Pro Controller now. Press Home to clear the existing mapping.");
|
||||
}
|
||||
else
|
||||
{
|
||||
sprintf(msg, "Press any button on the Classic Controller now. Press Home to clear the existing mapping.");
|
||||
}
|
||||
sprintf(msg, "Press any button on the Classic Controller now. Press Home to clear the existing mapping.");
|
||||
break;
|
||||
case CTRLR_NUNCHUK:
|
||||
sprintf(msg, "Press any button on the Wiimote or Nunchuk now. Press Home to clear the existing mapping.");
|
||||
@ -2701,13 +2622,10 @@ ButtonMappingWindow()
|
||||
break;
|
||||
}
|
||||
}
|
||||
if(pressed == 0)
|
||||
pressed = userInput[0].wupcdata.btns_d;
|
||||
}
|
||||
}
|
||||
|
||||
if(pressed == WPAD_BUTTON_HOME
|
||||
|| pressed == WPAD_CLASSIC_BUTTON_HOME)
|
||||
if(pressed == WPAD_BUTTON_HOME || pressed == WPAD_CLASSIC_BUTTON_HOME)
|
||||
pressed = 0;
|
||||
|
||||
HaltGui();
|
||||
@ -2733,15 +2651,7 @@ static int MenuSettingsMappingsMap()
|
||||
titleTxt.SetAlignment(ALIGN_LEFT, ALIGN_TOP);
|
||||
titleTxt.SetPosition(50,30);
|
||||
|
||||
if(wiiuproCtrl == 1)
|
||||
{
|
||||
sprintf(menuSubtitle, "%s - %s", gettext(ctrlName[mapMenuCtrlSNES]),"Wii U Pro Controller");
|
||||
}
|
||||
else
|
||||
{
|
||||
sprintf(menuSubtitle, "%s - %s", gettext(ctrlName[mapMenuCtrlSNES]), gettext(ctrlrName[mapMenuCtrl]));
|
||||
}
|
||||
|
||||
sprintf(menuSubtitle, "%s - %s", gettext(ctrlName[mapMenuCtrlSNES]), gettext(ctrlrName[mapMenuCtrl]));
|
||||
GuiText subtitleTxt(menuSubtitle, 20, (GXColor){255, 255, 255, 255});
|
||||
subtitleTxt.SetAlignment(ALIGN_LEFT, ALIGN_TOP);
|
||||
subtitleTxt.SetPosition(50,60);
|
||||
@ -2899,7 +2809,7 @@ static int MenuSettingsMappingsMap()
|
||||
optionBrowser.TriggerUpdate();
|
||||
}
|
||||
}
|
||||
wiiuproCtrl = 0;
|
||||
|
||||
HaltGui();
|
||||
mainWindow->Remove(&optionBrowser);
|
||||
mainWindow->Remove(&w);
|
||||
|
@ -8,19 +8,16 @@
|
||||
* Network and SMB support routines
|
||||
****************************************************************************/
|
||||
|
||||
#include <errno.h>
|
||||
#include <network.h>
|
||||
#include <malloc.h>
|
||||
#include <ogc/lwp_watchdog.h>
|
||||
#include <smb.h>
|
||||
#include <mxml.h>
|
||||
|
||||
#include "snes9xgx.h"
|
||||
#include "menu.h"
|
||||
#include "fileop.h"
|
||||
#include "filebrowser.h"
|
||||
#include "utils/http.h"
|
||||
#include "utils/unzip/unzip.h"
|
||||
#include "utils/unzip/miniunz.h"
|
||||
|
||||
static bool networkInit = false;
|
||||
static bool networkShareInit = false;
|
||||
@ -28,144 +25,6 @@ char wiiIP[16] = { 0 };
|
||||
|
||||
#ifdef HW_RVL
|
||||
static int netHalt = 0;
|
||||
static bool updateChecked = false; // true if checked for app update
|
||||
static char updateURL[128]; // URL of app update
|
||||
bool updateFound = false; // true if an app update was found
|
||||
|
||||
/****************************************************************************
|
||||
* UpdateCheck
|
||||
* Checks for an update for the application
|
||||
***************************************************************************/
|
||||
|
||||
void UpdateCheck()
|
||||
{
|
||||
// we only check for an update if we have internet + SD/USB
|
||||
if(updateChecked || !networkInit)
|
||||
return;
|
||||
|
||||
if(!isMounted[DEVICE_SD] && !isMounted[DEVICE_USB])
|
||||
return;
|
||||
|
||||
updateChecked = true;
|
||||
u8 tmpbuffer[256];
|
||||
|
||||
if (http_request("http://www.wiimc.org/files/snes9xgx-update.xml", NULL, tmpbuffer, 256, SILENT) <= 0)
|
||||
return;
|
||||
|
||||
mxml_node_t *xml;
|
||||
mxml_node_t *item;
|
||||
|
||||
xml = mxmlLoadString(NULL, (char *)tmpbuffer, MXML_TEXT_CALLBACK);
|
||||
|
||||
if(!xml)
|
||||
return;
|
||||
|
||||
// check settings version
|
||||
item = mxmlFindElement(xml, xml, "app", "version", NULL, MXML_DESCEND);
|
||||
if(item) // a version entry exists
|
||||
{
|
||||
const char * version = mxmlElementGetAttr(item, "version");
|
||||
|
||||
if(version && strlen(version) == 5)
|
||||
{
|
||||
int verMajor = version[0] - '0';
|
||||
int verMinor = version[2] - '0';
|
||||
int verPoint = version[4] - '0';
|
||||
int curMajor = APPVERSION[0] - '0';
|
||||
int curMinor = APPVERSION[2] - '0';
|
||||
int curPoint = APPVERSION[4] - '0';
|
||||
|
||||
// check that the versioning is valid and is a newer version
|
||||
if((verMajor >= 0 && verMajor <= 9 &&
|
||||
verMinor >= 0 && verMinor <= 9 &&
|
||||
verPoint >= 0 && verPoint <= 9) &&
|
||||
(verMajor > curMajor ||
|
||||
(verMajor == curMajor && verMinor > curMinor) ||
|
||||
(verMajor == curMajor && verMinor == curMinor && verPoint > curPoint)))
|
||||
{
|
||||
item = mxmlFindElement(xml, xml, "file", NULL, NULL, MXML_DESCEND);
|
||||
if(item)
|
||||
{
|
||||
const char * tmp = mxmlElementGetAttr(item, "url");
|
||||
if(tmp)
|
||||
{
|
||||
snprintf(updateURL, 128, "%s", tmp);
|
||||
updateFound = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
mxmlDelete(xml);
|
||||
}
|
||||
|
||||
static bool unzipArchive(char * zipfilepath, char * unzipfolderpath)
|
||||
{
|
||||
unzFile uf = unzOpen(zipfilepath);
|
||||
if (uf==NULL)
|
||||
return false;
|
||||
|
||||
if(chdir(unzipfolderpath)) // can't access dir
|
||||
{
|
||||
makedir(unzipfolderpath); // attempt to make dir
|
||||
if(chdir(unzipfolderpath)) // still can't access dir
|
||||
return false;
|
||||
}
|
||||
|
||||
extractZip(uf,0,1,0);
|
||||
|
||||
unzCloseCurrentFile(uf);
|
||||
return true;
|
||||
}
|
||||
|
||||
bool DownloadUpdate()
|
||||
{
|
||||
bool result = false;
|
||||
|
||||
if(updateURL[0] == 0 || appPath[0] == 0 || !ChangeInterface(appPath, NOTSILENT))
|
||||
{
|
||||
ErrorPrompt("Update failed!");
|
||||
updateFound = false; // updating is finished (successful or not!)
|
||||
return false;
|
||||
}
|
||||
|
||||
// stop checking if devices were removed/inserted
|
||||
// since we're saving a file
|
||||
HaltDeviceThread();
|
||||
|
||||
int device;
|
||||
FindDevice(appPath, &device);
|
||||
|
||||
char updateFile[50];
|
||||
sprintf(updateFile, "%s%s Update.zip", pathPrefix[device], APPNAME);
|
||||
|
||||
FILE * hfile = fopen (updateFile, "wb");
|
||||
|
||||
if (hfile)
|
||||
{
|
||||
if(http_request(updateURL, hfile, NULL, (1024*1024*10), NOTSILENT) > 0)
|
||||
{
|
||||
fclose (hfile);
|
||||
result = unzipArchive(updateFile, (char *)pathPrefix[device]);
|
||||
}
|
||||
else
|
||||
{
|
||||
fclose (hfile);
|
||||
}
|
||||
remove(updateFile); // delete update file
|
||||
}
|
||||
|
||||
// go back to checking if devices were inserted/removed
|
||||
ResumeDeviceThread();
|
||||
|
||||
if(result)
|
||||
InfoPrompt("Update successful!");
|
||||
else
|
||||
ErrorPrompt("Update failed!");
|
||||
|
||||
updateFound = false; // updating is finished (successful or not!)
|
||||
return result;
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* InitializeNetwork
|
||||
@ -313,7 +172,7 @@ bool InitializeNetwork(bool silent)
|
||||
break;
|
||||
}
|
||||
#else
|
||||
networkInit = !(if_config(wiiIP, NULL, NULL, true, 10) < 0);
|
||||
networkInit = !(if_config(wiiIP, NULL, NULL, true) < 0);
|
||||
#endif
|
||||
|
||||
CancelAction();
|
||||
|
@ -11,13 +11,7 @@
|
||||
#ifndef _NETWORKOP_H_
|
||||
#define _NETWORKOP_H_
|
||||
|
||||
void UpdateCheck();
|
||||
bool DownloadUpdate();
|
||||
void StartNetworkThread();
|
||||
bool InitializeNetwork(bool silent);
|
||||
bool ConnectShare (bool silent);
|
||||
void CloseShare();
|
||||
|
||||
extern bool updateFound;
|
||||
|
||||
#endif
|
||||
|
@ -12,6 +12,7 @@
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <dirent.h>
|
||||
#include <sys/stat.h>
|
||||
#include <ogcsys.h>
|
||||
#include <mxml.h>
|
||||
|
||||
|
@ -19,6 +19,7 @@
|
||||
#include <unistd.h>
|
||||
#include <ogc/lwp_watchdog.h>
|
||||
|
||||
#include "snes9x/port.h"
|
||||
#include "snes9xgx.h"
|
||||
#include "video.h"
|
||||
#include "audio.h"
|
||||
|
@ -177,6 +177,32 @@
|
||||
// Input recording/playback code
|
||||
// (c) Copyright 2004 blip
|
||||
|
||||
#ifdef GEKKO
|
||||
#include "snes9x.h"
|
||||
int S9xMovieOpen (const char *filename, bool8 read_only) { return 1; }
|
||||
int S9xMovieCreate (const char *filename, uint8 controllers_mask, uint8 opts, const wchar_t *metadata, int metadata_length) { return 1; }
|
||||
int S9xMovieGetInfo (const char *filename, struct MovieInfo *info) { return 1; }
|
||||
void S9xMovieStop (bool8 suppress_message) { }
|
||||
void S9xMovieToggleRecState (void) { }
|
||||
void S9xMovieToggleFrameDisplay (void) { }
|
||||
void S9xMovieInit (void) { }
|
||||
void S9xMovieShutdown (void) { }
|
||||
void S9xMovieUpdate (bool a) { }
|
||||
void S9xMovieUpdateOnReset (void) { }
|
||||
void S9xUpdateFrameCounter (int o) { }
|
||||
void S9xMovieFreeze (uint8 **buf, uint32 *size) { }
|
||||
int S9xMovieUnfreeze (uint8 *buf, uint32 size) { return 1; }
|
||||
bool8 S9xMovieActive (void) { return FALSE; }
|
||||
bool8 S9xMoviePlaying (void) { return FALSE; }
|
||||
bool8 S9xMovieRecording (void) { return FALSE; }
|
||||
bool8 S9xMovieReadOnly (void) { return FALSE; }
|
||||
uint8 S9xMovieControllers (void) { return 0; }
|
||||
uint32 S9xMovieGetId (void) { return 0; }
|
||||
uint32 S9xMovieGetLength (void) { return 0; }
|
||||
uint32 S9xMovieGetFrameCounter (void) { return 0; }
|
||||
|
||||
#else
|
||||
|
||||
#ifndef __WIN32__
|
||||
#include <unistd.h>
|
||||
#endif
|
||||
@ -1199,3 +1225,5 @@ void S9xUpdateFrameCounter (int offset)
|
||||
max(0, (int) (NetPlay.FrameCount + offset)));
|
||||
#endif
|
||||
}
|
||||
|
||||
#endif
|
||||
|
@ -25,7 +25,6 @@
|
||||
#ifdef HW_RVL
|
||||
#include <di/di.h>
|
||||
#include <wiiuse/wpad.h>
|
||||
#include <wupc/wupc.h>
|
||||
#endif
|
||||
#ifdef USE_VM
|
||||
#include "vmalloc.h"
|
||||
@ -313,7 +312,7 @@ bool SaneIOS(u32 ios)
|
||||
static bool gecko = false;
|
||||
static mutex_t gecko_mutex = 0;
|
||||
|
||||
static ssize_t __out_write(struct _reent *r, void* fd, const char *ptr, size_t len)
|
||||
static ssize_t __out_write(struct _reent *r, int fd, const char *ptr, size_t len)
|
||||
{
|
||||
if (!gecko || len == 0)
|
||||
return len;
|
||||
@ -404,12 +403,10 @@ int main(int argc, char *argv[])
|
||||
SYS_SetPowerCallback(ShutdownCB);
|
||||
SYS_SetResetCallback(ResetCB);
|
||||
|
||||
WUPC_Init();
|
||||
WPAD_Init();
|
||||
WPAD_SetPowerButtonCallback((WPADShutdownCallback)ShutdownCB);
|
||||
DI_Init();
|
||||
USBStorage_Initialize();
|
||||
StartNetworkThread();
|
||||
#else
|
||||
DVD_Init (); // Initialize DVD subsystem (GameCube only)
|
||||
#endif
|
||||
|
@ -14,7 +14,6 @@
|
||||
#ifndef _SNES9XGX_H_
|
||||
#define _SNES9XGX_H_
|
||||
|
||||
#define MAXPATHLEN 1024
|
||||
#include "utils/FreeTypeGX.h"
|
||||
#include "snes9x.h"
|
||||
#include "filter.h"
|
||||
@ -25,6 +24,7 @@
|
||||
#define APPFOLDER "snes9xgx"
|
||||
#define PREF_FILE_NAME "settings.xml"
|
||||
|
||||
#define MAXPATHLEN 1024
|
||||
#define NOTSILENT 0
|
||||
#define SILENT 1
|
||||
|
||||
|
@ -1,411 +0,0 @@
|
||||
/****************************************************************************
|
||||
* Snes9x Nintendo Wii/Gamecube Port
|
||||
*
|
||||
* Tantric December 2008
|
||||
*
|
||||
* http.cpp
|
||||
*
|
||||
* HTTP operations
|
||||
* Written by dhewg/bushing, modified by Tantric
|
||||
***************************************************************************/
|
||||
|
||||
#ifdef HW_RVL
|
||||
|
||||
#include <malloc.h>
|
||||
#include <string.h>
|
||||
#include <stdio.h>
|
||||
#include <unistd.h>
|
||||
#include <ogcsys.h>
|
||||
#include <network.h>
|
||||
#include <ogc/lwp_watchdog.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/errno.h>
|
||||
#include <fcntl.h>
|
||||
|
||||
#include "menu.h"
|
||||
#include "http.h"
|
||||
|
||||
#define TCP_CONNECT_TIMEOUT 4000 // 4 secs to make a connection
|
||||
#define TCP_SEND_SIZE (32 * 1024)
|
||||
#define TCP_RECV_SIZE (32 * 1024)
|
||||
#define TCP_BLOCK_RECV_TIMEOUT 4000 // 4 secs to receive
|
||||
#define TCP_BLOCK_SEND_TIMEOUT 4000 // 4 secs to send
|
||||
#define TCP_BLOCK_SIZE 1024
|
||||
#define HTTP_TIMEOUT 10000 // 10 secs to get an http response
|
||||
#define IOS_O_NONBLOCK 0x04
|
||||
|
||||
static s32 tcp_socket(void)
|
||||
{
|
||||
s32 s, res;
|
||||
|
||||
s = net_socket(PF_INET, SOCK_STREAM, IPPROTO_IP);
|
||||
if (s < 0)
|
||||
return s;
|
||||
|
||||
// Switch off Nagle with TCP_NODELAY
|
||||
u32 nodelay = 1;
|
||||
net_setsockopt(s,IPPROTO_TCP,TCP_NODELAY,&nodelay,sizeof(nodelay));
|
||||
|
||||
res = net_fcntl(s, F_GETFL, 0);
|
||||
if (res < 0)
|
||||
{
|
||||
net_close(s);
|
||||
return res;
|
||||
}
|
||||
|
||||
res = net_fcntl(s, F_SETFL, res | IOS_O_NONBLOCK);
|
||||
if (res < 0)
|
||||
{
|
||||
net_close(s);
|
||||
return res;
|
||||
}
|
||||
|
||||
return s;
|
||||
}
|
||||
|
||||
static s32 tcp_connect(char *host, const u16 port)
|
||||
{
|
||||
struct hostent *hp;
|
||||
struct sockaddr_in sa;
|
||||
struct in_addr val;
|
||||
s32 s, res;
|
||||
u64 t1;
|
||||
|
||||
s = tcp_socket();
|
||||
if (s < 0)
|
||||
return s;
|
||||
|
||||
memset(&sa, 0, sizeof(struct sockaddr_in));
|
||||
sa.sin_family= PF_INET;
|
||||
sa.sin_len = sizeof(struct sockaddr_in);
|
||||
sa.sin_port= htons(port);
|
||||
|
||||
if(strlen(host) < 16 && inet_aton(host, &val))
|
||||
{
|
||||
sa.sin_addr.s_addr = val.s_addr;
|
||||
}
|
||||
else
|
||||
{
|
||||
hp = net_gethostbyname (host);
|
||||
if (!hp || !(hp->h_addrtype == PF_INET))
|
||||
return errno;
|
||||
|
||||
memcpy((char *) &sa.sin_addr, hp->h_addr_list[0], hp->h_length);
|
||||
}
|
||||
|
||||
t1=ticks_to_secs(gettime());
|
||||
do
|
||||
{
|
||||
res = net_connect(s,(struct sockaddr*) &sa, sizeof (sa));
|
||||
if(ticks_to_secs(gettime())-t1 > TCP_CONNECT_TIMEOUT*1000) break;
|
||||
usleep(500);
|
||||
}while(res != -EISCONN);
|
||||
if(res != -EISCONN)
|
||||
{
|
||||
net_close(s);
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
return s;
|
||||
}
|
||||
|
||||
static int tcp_readln(const s32 s, char *buf, const u16 max_length)
|
||||
{
|
||||
s32 res = -1;
|
||||
s32 ret;
|
||||
u64 start_time = gettime();
|
||||
u16 c = 0;
|
||||
|
||||
while (c < max_length)
|
||||
{
|
||||
if (ticks_to_millisecs(diff_ticks(start_time, gettime())) > HTTP_TIMEOUT)
|
||||
break;
|
||||
|
||||
ret = net_read(s, &buf[c], 1);
|
||||
|
||||
if (ret == -EAGAIN)
|
||||
{
|
||||
usleep(20 * 1000);
|
||||
continue;
|
||||
}
|
||||
|
||||
if (ret <= 0)
|
||||
break;
|
||||
|
||||
if (c > 0 && buf[c - 1] == '\r' && buf[c] == '\n')
|
||||
{
|
||||
res = 0;
|
||||
buf[c-1] = 0;
|
||||
break;
|
||||
}
|
||||
c++;
|
||||
start_time = gettime();
|
||||
usleep(100);
|
||||
}
|
||||
return res;
|
||||
}
|
||||
|
||||
static u32 tcp_read(const s32 s, u8 *buffer, const u32 length)
|
||||
{
|
||||
char *p;
|
||||
u32 left, block, received, step=0;
|
||||
u64 t;
|
||||
s32 res;
|
||||
|
||||
p = (char *)buffer;
|
||||
left = length;
|
||||
received = 0;
|
||||
|
||||
t = gettime();
|
||||
while (left)
|
||||
{
|
||||
if (ticks_to_millisecs(diff_ticks(t, gettime()))
|
||||
> TCP_BLOCK_RECV_TIMEOUT)
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
block = left;
|
||||
if (block > TCP_RECV_SIZE)
|
||||
block = TCP_RECV_SIZE;
|
||||
|
||||
res = net_read(s, p, block);
|
||||
|
||||
if (res == -EAGAIN)
|
||||
{
|
||||
usleep(20 * 1000);
|
||||
continue;
|
||||
}
|
||||
|
||||
if(res<=0) break;
|
||||
|
||||
received += res;
|
||||
left -= res;
|
||||
p += res;
|
||||
usleep(1000);
|
||||
|
||||
if ((received / TCP_BLOCK_SIZE) > step)
|
||||
{
|
||||
t = gettime ();
|
||||
step++;
|
||||
}
|
||||
}
|
||||
return received;
|
||||
}
|
||||
|
||||
static u32 tcp_write(const s32 s, const u8 *buffer, const u32 length)
|
||||
{
|
||||
const u8 *p;
|
||||
u32 left, block, sent, step=0;
|
||||
s64 t;
|
||||
s32 res;
|
||||
|
||||
p = buffer;
|
||||
left = length;
|
||||
sent = 0;
|
||||
|
||||
t = gettime();
|
||||
while (left)
|
||||
{
|
||||
if (ticks_to_millisecs(diff_ticks(t, gettime()))
|
||||
> TCP_BLOCK_SEND_TIMEOUT)
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
block = left;
|
||||
if (block > TCP_SEND_SIZE)
|
||||
block = TCP_SEND_SIZE;
|
||||
|
||||
res = net_write(s, p, block);
|
||||
|
||||
if ((res == 0) || (res == -56))
|
||||
{
|
||||
usleep(20 * 1000);
|
||||
continue;
|
||||
}
|
||||
|
||||
if (res < 0)
|
||||
break;
|
||||
|
||||
sent += res;
|
||||
left -= res;
|
||||
p += res;
|
||||
usleep(100);
|
||||
|
||||
if ((sent / TCP_BLOCK_SIZE) > step)
|
||||
{
|
||||
t = gettime ();
|
||||
step++;
|
||||
}
|
||||
}
|
||||
|
||||
return left == 0;
|
||||
}
|
||||
|
||||
static bool http_split_url(char *host, char *path, const char *url)
|
||||
{
|
||||
const char *p;
|
||||
char *c;
|
||||
|
||||
if (strncasecmp(url, "http://", 7))
|
||||
return false;
|
||||
|
||||
p = url + 7;
|
||||
c = strchr(p, '/');
|
||||
|
||||
if (c == NULL || c[0] == 0)
|
||||
return false;
|
||||
|
||||
snprintf(host, c-p+1, "%s", p);
|
||||
strcpy(path, c);
|
||||
return true;
|
||||
}
|
||||
|
||||
#define MAX_SIZE (1024*1024*15)
|
||||
|
||||
/****************************************************************************
|
||||
* http_request
|
||||
* Retrieves the specified URL, and stores it in the specified file or buffer
|
||||
***************************************************************************/
|
||||
int http_request(const char *url, FILE *hfile, u8 *buffer, u32 maxsize, bool silent)
|
||||
{
|
||||
int res = 0;
|
||||
char http_host[1024];
|
||||
char http_path[1024];
|
||||
u16 http_port;
|
||||
|
||||
http_res result;
|
||||
u32 http_status;
|
||||
u32 sizeread = 0, content_length = 0;
|
||||
|
||||
int linecount;
|
||||
|
||||
if(maxsize > MAX_SIZE)
|
||||
return 0;
|
||||
|
||||
if (url == NULL || (hfile == NULL && buffer == NULL))
|
||||
return 0;
|
||||
|
||||
if (!http_split_url(http_host, http_path, url))
|
||||
return 0;
|
||||
|
||||
http_port = 80;
|
||||
http_status = 404;
|
||||
|
||||
int s = tcp_connect(http_host, http_port);
|
||||
|
||||
if (s < 0)
|
||||
{
|
||||
result = HTTPR_ERR_CONNECT;
|
||||
return 0;
|
||||
}
|
||||
|
||||
char request[1024];
|
||||
char *r = request;
|
||||
|
||||
r += sprintf(r, "GET %s HTTP/1.1\r\n", http_path);
|
||||
r += sprintf(r, "Host: %s\r\n", http_host);
|
||||
r += sprintf(r, "Cache-Control: no-cache\r\n\r\n");
|
||||
|
||||
res = tcp_write(s, (u8 *) request, strlen(request));
|
||||
|
||||
char line[256];
|
||||
|
||||
for (linecount = 0; linecount < 32; linecount++)
|
||||
{
|
||||
if (tcp_readln(s, line, 255) != 0)
|
||||
{
|
||||
http_status = 404;
|
||||
result = HTTPR_ERR_REQUEST;
|
||||
break;
|
||||
}
|
||||
|
||||
if (strlen(line) < 1)
|
||||
break;
|
||||
|
||||
sscanf(line, "HTTP/1.%*u %u", &http_status);
|
||||
sscanf(line, "Content-Length: %u", &content_length);
|
||||
}
|
||||
|
||||
if (http_status != 200)
|
||||
{
|
||||
result = HTTPR_ERR_STATUS;
|
||||
net_close(s);
|
||||
return 0;
|
||||
}
|
||||
|
||||
// length unknown - just read as much as we can
|
||||
if(content_length == 0)
|
||||
{
|
||||
content_length = maxsize;
|
||||
}
|
||||
else if (content_length > maxsize)
|
||||
{
|
||||
result = HTTPR_ERR_TOOBIG;
|
||||
net_close(s);
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (buffer != NULL)
|
||||
{
|
||||
if(!silent)
|
||||
ShowAction("Downloading...");
|
||||
|
||||
sizeread = tcp_read(s, buffer, content_length);
|
||||
|
||||
if(!silent)
|
||||
CancelAction();
|
||||
}
|
||||
else
|
||||
{
|
||||
// read into file
|
||||
u32 bufSize = (1024 * 32);
|
||||
u32 bytesLeft = content_length;
|
||||
u32 readSize;
|
||||
|
||||
if(!silent)
|
||||
ShowProgress("Downloading...", 0, content_length);
|
||||
u8 * fbuffer = (u8 *) malloc(bufSize);
|
||||
if(fbuffer)
|
||||
{
|
||||
while (bytesLeft > 0)
|
||||
{
|
||||
if (bytesLeft < bufSize)
|
||||
readSize = bytesLeft;
|
||||
else
|
||||
readSize = bufSize;
|
||||
|
||||
res = tcp_read(s, fbuffer, readSize);
|
||||
if (!res)
|
||||
break;
|
||||
|
||||
sizeread += res;
|
||||
bytesLeft -= res;
|
||||
|
||||
res = fwrite(fbuffer, 1, res, hfile);
|
||||
if (!res)
|
||||
break;
|
||||
|
||||
if(!silent)
|
||||
ShowProgress("Downloading...", (content_length - bytesLeft), content_length);
|
||||
}
|
||||
free(fbuffer);
|
||||
}
|
||||
if(!silent)
|
||||
CancelAction();
|
||||
}
|
||||
|
||||
net_close(s);
|
||||
|
||||
if (content_length < maxsize && sizeread != content_length)
|
||||
{
|
||||
result = HTTPR_ERR_RECEIVE;
|
||||
return 0;
|
||||
}
|
||||
|
||||
result = HTTPR_OK;
|
||||
return sizeread;
|
||||
}
|
||||
#endif
|
@ -1,25 +0,0 @@
|
||||
/****************************************************************************
|
||||
* Snes9x Nintendo Wii/Gamecube Port
|
||||
*
|
||||
* Tantric 2008-2010
|
||||
*
|
||||
* http.h
|
||||
*
|
||||
* HTTP operations
|
||||
***************************************************************************/
|
||||
|
||||
#ifndef _HTTP_H_
|
||||
#define _HTTP_H_
|
||||
|
||||
typedef enum {
|
||||
HTTPR_OK,
|
||||
HTTPR_ERR_CONNECT,
|
||||
HTTPR_ERR_REQUEST,
|
||||
HTTPR_ERR_STATUS,
|
||||
HTTPR_ERR_TOOBIG,
|
||||
HTTPR_ERR_RECEIVE
|
||||
} http_res;
|
||||
|
||||
int http_request (const char *url, FILE * hfile, u8 * buffer, const u32 max_size, bool silent);
|
||||
|
||||
#endif
|
@ -9,6 +9,7 @@
|
||||
|
||||
#include <stdio.h>
|
||||
#include <malloc.h>
|
||||
#include <string.h>
|
||||
#include "pngu.h"
|
||||
#include <png.h>
|
||||
|
||||
|
@ -1,132 +0,0 @@
|
||||
/* crypt.h -- base code for crypt/uncrypt ZIPfile
|
||||
|
||||
|
||||
Version 1.01e, February 12th, 2005
|
||||
|
||||
Copyright (C) 1998-2005 Gilles Vollant
|
||||
|
||||
This code is a modified version of crypting code in Infozip distribution
|
||||
|
||||
The encryption/decryption parts of this source code (as opposed to the
|
||||
non-echoing password parts) were originally written in Europe. The
|
||||
whole source package can be freely distributed, including from the USA.
|
||||
(Prior to January 2000, re-export from the US was a violation of US law.)
|
||||
|
||||
This encryption code is a direct transcription of the algorithm from
|
||||
Roger Schlafly, described by Phil Katz in the file appnote.txt. This
|
||||
file (appnote.txt) is distributed with the PKZIP program (even in the
|
||||
version without encryption capabilities).
|
||||
|
||||
If you don't need crypting in your application, just define symbols
|
||||
NOCRYPT and NOUNCRYPT.
|
||||
|
||||
This code support the "Traditional PKWARE Encryption".
|
||||
|
||||
The new AES encryption added on Zip format by Winzip (see the page
|
||||
http://www.winzip.com/aes_info.htm ) and PKWare PKZip 5.x Strong
|
||||
Encryption is not supported.
|
||||
*/
|
||||
|
||||
#define CRC32(c, b) ((*(pcrc_32_tab+(((int)(c) ^ (b)) & 0xff))) ^ ((c) >> 8))
|
||||
|
||||
/***********************************************************************
|
||||
* Return the next byte in the pseudo-random sequence
|
||||
*/
|
||||
static int decrypt_byte(unsigned long* pkeys, const unsigned long* pcrc_32_tab)
|
||||
{
|
||||
unsigned temp; /* POTENTIAL BUG: temp*(temp^1) may overflow in an
|
||||
* unpredictable manner on 16-bit systems; not a problem
|
||||
* with any known compiler so far, though */
|
||||
|
||||
temp = ((unsigned)(*(pkeys+2)) & 0xffff) | 2;
|
||||
return (int)(((temp * (temp ^ 1)) >> 8) & 0xff);
|
||||
}
|
||||
|
||||
/***********************************************************************
|
||||
* Update the encryption keys with the next byte of plain text
|
||||
*/
|
||||
static int update_keys(unsigned long* pkeys,const unsigned long* pcrc_32_tab,int c)
|
||||
{
|
||||
(*(pkeys+0)) = CRC32((*(pkeys+0)), c);
|
||||
(*(pkeys+1)) += (*(pkeys+0)) & 0xff;
|
||||
(*(pkeys+1)) = (*(pkeys+1)) * 134775813L + 1;
|
||||
{
|
||||
register int keyshift = (int)((*(pkeys+1)) >> 24);
|
||||
(*(pkeys+2)) = CRC32((*(pkeys+2)), keyshift);
|
||||
}
|
||||
return c;
|
||||
}
|
||||
|
||||
|
||||
/***********************************************************************
|
||||
* Initialize the encryption keys and the random header according to
|
||||
* the given password.
|
||||
*/
|
||||
static void init_keys(const char* passwd,unsigned long* pkeys,const unsigned long* pcrc_32_tab)
|
||||
{
|
||||
*(pkeys+0) = 305419896L;
|
||||
*(pkeys+1) = 591751049L;
|
||||
*(pkeys+2) = 878082192L;
|
||||
while (*passwd != '\0') {
|
||||
update_keys(pkeys,pcrc_32_tab,(int)*passwd);
|
||||
passwd++;
|
||||
}
|
||||
}
|
||||
|
||||
#define zdecode(pkeys,pcrc_32_tab,c) \
|
||||
(update_keys(pkeys,pcrc_32_tab,c ^= decrypt_byte(pkeys,pcrc_32_tab)))
|
||||
|
||||
#define zencode(pkeys,pcrc_32_tab,c,t) \
|
||||
(t=decrypt_byte(pkeys,pcrc_32_tab), update_keys(pkeys,pcrc_32_tab,c), t^(c))
|
||||
|
||||
#ifdef INCLUDECRYPTINGCODE_IFCRYPTALLOWED
|
||||
|
||||
#define RAND_HEAD_LEN 12
|
||||
/* "last resort" source for second part of crypt seed pattern */
|
||||
# ifndef ZCR_SEED2
|
||||
# define ZCR_SEED2 3141592654UL /* use PI as default pattern */
|
||||
# endif
|
||||
|
||||
static int crypthead(passwd, buf, bufSize, pkeys, pcrc_32_tab, crcForCrypting)
|
||||
const char *passwd; /* password string */
|
||||
unsigned char *buf; /* where to write header */
|
||||
int bufSize;
|
||||
unsigned long* pkeys;
|
||||
const unsigned long* pcrc_32_tab;
|
||||
unsigned long crcForCrypting;
|
||||
{
|
||||
int n; /* index in random header */
|
||||
int t; /* temporary */
|
||||
int c; /* random byte */
|
||||
unsigned char header[RAND_HEAD_LEN-2]; /* random header */
|
||||
static unsigned calls = 0; /* ensure different random header each time */
|
||||
|
||||
if (bufSize<RAND_HEAD_LEN)
|
||||
return 0;
|
||||
|
||||
/* First generate RAND_HEAD_LEN-2 random bytes. We encrypt the
|
||||
* output of rand() to get less predictability, since rand() is
|
||||
* often poorly implemented.
|
||||
*/
|
||||
if (++calls == 1)
|
||||
{
|
||||
srand((unsigned)(time(NULL) ^ ZCR_SEED2));
|
||||
}
|
||||
init_keys(passwd, pkeys, pcrc_32_tab);
|
||||
for (n = 0; n < RAND_HEAD_LEN-2; n++)
|
||||
{
|
||||
c = (rand() >> 7) & 0xff;
|
||||
header[n] = (unsigned char)zencode(pkeys, pcrc_32_tab, c, t);
|
||||
}
|
||||
/* Encrypt random header (last two bytes is high word of crc) */
|
||||
init_keys(passwd, pkeys, pcrc_32_tab);
|
||||
for (n = 0; n < RAND_HEAD_LEN-2; n++)
|
||||
{
|
||||
buf[n] = (unsigned char)zencode(pkeys, pcrc_32_tab, header[n], t);
|
||||
}
|
||||
buf[n++] = zencode(pkeys, pcrc_32_tab, (int)(crcForCrypting >> 16) & 0xff, t);
|
||||
buf[n++] = zencode(pkeys, pcrc_32_tab, (int)(crcForCrypting >> 24) & 0xff, t);
|
||||
return n;
|
||||
}
|
||||
|
||||
#endif
|
@ -1,177 +0,0 @@
|
||||
/* ioapi.c -- IO base function header for compress/uncompress .zip
|
||||
files using zlib + zip or unzip API
|
||||
|
||||
Version 1.01e, February 12th, 2005
|
||||
|
||||
Copyright (C) 1998-2005 Gilles Vollant
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "zlib.h"
|
||||
#include "ioapi.h"
|
||||
|
||||
|
||||
|
||||
/* I've found an old Unix (a SunOS 4.1.3_U1) without all SEEK_* defined.... */
|
||||
|
||||
#ifndef SEEK_CUR
|
||||
#define SEEK_CUR 1
|
||||
#endif
|
||||
|
||||
#ifndef SEEK_END
|
||||
#define SEEK_END 2
|
||||
#endif
|
||||
|
||||
#ifndef SEEK_SET
|
||||
#define SEEK_SET 0
|
||||
#endif
|
||||
|
||||
voidpf ZCALLBACK fopen_file_func OF((
|
||||
voidpf opaque,
|
||||
const char* filename,
|
||||
int mode));
|
||||
|
||||
uLong ZCALLBACK fread_file_func OF((
|
||||
voidpf opaque,
|
||||
voidpf stream,
|
||||
void* buf,
|
||||
uLong size));
|
||||
|
||||
uLong ZCALLBACK fwrite_file_func OF((
|
||||
voidpf opaque,
|
||||
voidpf stream,
|
||||
const void* buf,
|
||||
uLong size));
|
||||
|
||||
long ZCALLBACK ftell_file_func OF((
|
||||
voidpf opaque,
|
||||
voidpf stream));
|
||||
|
||||
long ZCALLBACK fseek_file_func OF((
|
||||
voidpf opaque,
|
||||
voidpf stream,
|
||||
uLong offset,
|
||||
int origin));
|
||||
|
||||
int ZCALLBACK fclose_file_func OF((
|
||||
voidpf opaque,
|
||||
voidpf stream));
|
||||
|
||||
int ZCALLBACK ferror_file_func OF((
|
||||
voidpf opaque,
|
||||
voidpf stream));
|
||||
|
||||
|
||||
voidpf ZCALLBACK fopen_file_func (opaque, filename, mode)
|
||||
voidpf opaque;
|
||||
const char* filename;
|
||||
int mode;
|
||||
{
|
||||
FILE* file = NULL;
|
||||
const char* mode_fopen = NULL;
|
||||
if ((mode & ZLIB_FILEFUNC_MODE_READWRITEFILTER)==ZLIB_FILEFUNC_MODE_READ)
|
||||
mode_fopen = "rb";
|
||||
else
|
||||
if (mode & ZLIB_FILEFUNC_MODE_EXISTING)
|
||||
mode_fopen = "r+b";
|
||||
else
|
||||
if (mode & ZLIB_FILEFUNC_MODE_CREATE)
|
||||
mode_fopen = "wb";
|
||||
|
||||
if ((filename!=NULL) && (mode_fopen != NULL))
|
||||
file = fopen(filename, mode_fopen);
|
||||
return file;
|
||||
}
|
||||
|
||||
|
||||
uLong ZCALLBACK fread_file_func (opaque, stream, buf, size)
|
||||
voidpf opaque;
|
||||
voidpf stream;
|
||||
void* buf;
|
||||
uLong size;
|
||||
{
|
||||
uLong ret;
|
||||
ret = (uLong)fread(buf, 1, (size_t)size, (FILE *)stream);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
uLong ZCALLBACK fwrite_file_func (opaque, stream, buf, size)
|
||||
voidpf opaque;
|
||||
voidpf stream;
|
||||
const void* buf;
|
||||
uLong size;
|
||||
{
|
||||
uLong ret;
|
||||
ret = (uLong)fwrite(buf, 1, (size_t)size, (FILE *)stream);
|
||||
return ret;
|
||||
}
|
||||
|
||||
long ZCALLBACK ftell_file_func (opaque, stream)
|
||||
voidpf opaque;
|
||||
voidpf stream;
|
||||
{
|
||||
long ret;
|
||||
ret = ftell((FILE *)stream);
|
||||
return ret;
|
||||
}
|
||||
|
||||
long ZCALLBACK fseek_file_func (opaque, stream, offset, origin)
|
||||
voidpf opaque;
|
||||
voidpf stream;
|
||||
uLong offset;
|
||||
int origin;
|
||||
{
|
||||
int fseek_origin=0;
|
||||
long ret;
|
||||
switch (origin)
|
||||
{
|
||||
case ZLIB_FILEFUNC_SEEK_CUR :
|
||||
fseek_origin = SEEK_CUR;
|
||||
break;
|
||||
case ZLIB_FILEFUNC_SEEK_END :
|
||||
fseek_origin = SEEK_END;
|
||||
break;
|
||||
case ZLIB_FILEFUNC_SEEK_SET :
|
||||
fseek_origin = SEEK_SET;
|
||||
break;
|
||||
default: return -1;
|
||||
}
|
||||
ret = 0;
|
||||
fseek((FILE *)stream, offset, fseek_origin);
|
||||
return ret;
|
||||
}
|
||||
|
||||
int ZCALLBACK fclose_file_func (opaque, stream)
|
||||
voidpf opaque;
|
||||
voidpf stream;
|
||||
{
|
||||
int ret;
|
||||
ret = fclose((FILE *)stream);
|
||||
return ret;
|
||||
}
|
||||
|
||||
int ZCALLBACK ferror_file_func (opaque, stream)
|
||||
voidpf opaque;
|
||||
voidpf stream;
|
||||
{
|
||||
int ret;
|
||||
ret = ferror((FILE *)stream);
|
||||
return ret;
|
||||
}
|
||||
|
||||
void fill_fopen_filefunc (pzlib_filefunc_def)
|
||||
zlib_filefunc_def* pzlib_filefunc_def;
|
||||
{
|
||||
pzlib_filefunc_def->zopen_file = fopen_file_func;
|
||||
pzlib_filefunc_def->zread_file = fread_file_func;
|
||||
pzlib_filefunc_def->zwrite_file = fwrite_file_func;
|
||||
pzlib_filefunc_def->ztell_file = ftell_file_func;
|
||||
pzlib_filefunc_def->zseek_file = fseek_file_func;
|
||||
pzlib_filefunc_def->zclose_file = fclose_file_func;
|
||||
pzlib_filefunc_def->zerror_file = ferror_file_func;
|
||||
pzlib_filefunc_def->opaque = NULL;
|
||||
}
|
@ -1,75 +0,0 @@
|
||||
/* ioapi.h -- IO base function header for compress/uncompress .zip
|
||||
files using zlib + zip or unzip API
|
||||
|
||||
Version 1.01e, February 12th, 2005
|
||||
|
||||
Copyright (C) 1998-2005 Gilles Vollant
|
||||
*/
|
||||
|
||||
#ifndef _ZLIBIOAPI_H
|
||||
#define _ZLIBIOAPI_H
|
||||
|
||||
|
||||
#define ZLIB_FILEFUNC_SEEK_CUR (1)
|
||||
#define ZLIB_FILEFUNC_SEEK_END (2)
|
||||
#define ZLIB_FILEFUNC_SEEK_SET (0)
|
||||
|
||||
#define ZLIB_FILEFUNC_MODE_READ (1)
|
||||
#define ZLIB_FILEFUNC_MODE_WRITE (2)
|
||||
#define ZLIB_FILEFUNC_MODE_READWRITEFILTER (3)
|
||||
|
||||
#define ZLIB_FILEFUNC_MODE_EXISTING (4)
|
||||
#define ZLIB_FILEFUNC_MODE_CREATE (8)
|
||||
|
||||
|
||||
#ifndef ZCALLBACK
|
||||
|
||||
#if (defined(WIN32) || defined (WINDOWS) || defined (_WINDOWS)) && defined(CALLBACK) && defined (USEWINDOWS_CALLBACK)
|
||||
#define ZCALLBACK CALLBACK
|
||||
#else
|
||||
#define ZCALLBACK
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
typedef voidpf (ZCALLBACK *open_file_func) OF((voidpf opaque, const char* filename, int mode));
|
||||
typedef uLong (ZCALLBACK *read_file_func) OF((voidpf opaque, voidpf stream, void* buf, uLong size));
|
||||
typedef uLong (ZCALLBACK *write_file_func) OF((voidpf opaque, voidpf stream, const void* buf, uLong size));
|
||||
typedef long (ZCALLBACK *tell_file_func) OF((voidpf opaque, voidpf stream));
|
||||
typedef long (ZCALLBACK *seek_file_func) OF((voidpf opaque, voidpf stream, uLong offset, int origin));
|
||||
typedef int (ZCALLBACK *close_file_func) OF((voidpf opaque, voidpf stream));
|
||||
typedef int (ZCALLBACK *testerror_file_func) OF((voidpf opaque, voidpf stream));
|
||||
|
||||
typedef struct zlib_filefunc_def_s
|
||||
{
|
||||
open_file_func zopen_file;
|
||||
read_file_func zread_file;
|
||||
write_file_func zwrite_file;
|
||||
tell_file_func ztell_file;
|
||||
seek_file_func zseek_file;
|
||||
close_file_func zclose_file;
|
||||
testerror_file_func zerror_file;
|
||||
voidpf opaque;
|
||||
} zlib_filefunc_def;
|
||||
|
||||
|
||||
|
||||
void fill_fopen_filefunc OF((zlib_filefunc_def* pzlib_filefunc_def));
|
||||
|
||||
#define ZREAD(filefunc,filestream,buf,size) ((*((filefunc).zread_file))((filefunc).opaque,filestream,buf,size))
|
||||
#define ZWRITE(filefunc,filestream,buf,size) ((*((filefunc).zwrite_file))((filefunc).opaque,filestream,buf,size))
|
||||
#define ZTELL(filefunc,filestream) ((*((filefunc).ztell_file))((filefunc).opaque,filestream))
|
||||
#define ZSEEK(filefunc,filestream,pos,mode) ((*((filefunc).zseek_file))((filefunc).opaque,filestream,pos,mode))
|
||||
#define ZCLOSE(filefunc,filestream) ((*((filefunc).zclose_file))((filefunc).opaque,filestream))
|
||||
#define ZERROR(filefunc,filestream) ((*((filefunc).zerror_file))((filefunc).opaque,filestream))
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
@ -1,324 +0,0 @@
|
||||
/*
|
||||
miniunz.c
|
||||
Version 1.01e, February 12th, 2005
|
||||
|
||||
Copyright (C) 1998-2005 Gilles Vollant
|
||||
*/
|
||||
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <time.h>
|
||||
#include <errno.h>
|
||||
#include <fcntl.h>
|
||||
#include <unistd.h>
|
||||
#include <utime.h>
|
||||
|
||||
#include "unzip.h"
|
||||
#include "menu.h"
|
||||
|
||||
#define CASESENSITIVITY (0)
|
||||
#define WRITEBUFFERSIZE (1024*256)
|
||||
#define MAXFILENAME (256)
|
||||
|
||||
// used to display unzip progress
|
||||
static uLong total_size;
|
||||
static uLong total_unzipped;
|
||||
|
||||
static int mymkdir(const char* dirname)
|
||||
{
|
||||
int ret=0;
|
||||
ret = mkdir (dirname,0775);
|
||||
return ret;
|
||||
}
|
||||
|
||||
int makedir (char *newdir)
|
||||
{
|
||||
char *buffer ;
|
||||
char *p;
|
||||
int len = (int)strlen(newdir);
|
||||
|
||||
if (len <= 0)
|
||||
return 0;
|
||||
|
||||
buffer = (char*)malloc(len+1);
|
||||
strcpy(buffer,newdir);
|
||||
|
||||
if (buffer[len-1] == '/') {
|
||||
buffer[len-1] = '\0';
|
||||
}
|
||||
if (mymkdir(buffer) == 0)
|
||||
{
|
||||
free(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))
|
||||
{
|
||||
//printf("couldn't create directory %s\n",buffer);
|
||||
free(buffer);
|
||||
return 0;
|
||||
}
|
||||
if (hold == 0)
|
||||
break;
|
||||
*p++ = hold;
|
||||
}
|
||||
free(buffer);
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int do_extract_currentfile(unzFile uf,const int* popt_extract_without_path,int* popt_overwrite,const char* password)
|
||||
{
|
||||
char filename_inzip[256];
|
||||
char* filename_withoutpath;
|
||||
char* p;
|
||||
int err=UNZ_OK;
|
||||
FILE *fout=NULL;
|
||||
void* buf;
|
||||
uInt 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)
|
||||
{
|
||||
//printf("error %d with zipfile in unzGetCurrentFileInfo\n",err);
|
||||
return err;
|
||||
}
|
||||
|
||||
size_buf = WRITEBUFFERSIZE;
|
||||
buf = (void*)malloc(size_buf);
|
||||
if (buf==NULL)
|
||||
{
|
||||
//printf("Error allocating memory\n");
|
||||
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)
|
||||
{
|
||||
//printf("creating directory: %s\n",filename_inzip);
|
||||
mymkdir(filename_inzip);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
char* 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 (err!=UNZ_OK)
|
||||
{
|
||||
//printf("error %d with zipfile in unzOpenCurrentFilePassword\n",err);
|
||||
}
|
||||
|
||||
if (((*popt_overwrite)==0) && (err==UNZ_OK))
|
||||
{
|
||||
char rep=0;
|
||||
FILE* ftestexist;
|
||||
ftestexist = fopen(write_filename,"rb");
|
||||
if (ftestexist!=NULL)
|
||||
{
|
||||
fclose(ftestexist);
|
||||
do
|
||||
{
|
||||
char answer[128];
|
||||
int ret;
|
||||
|
||||
printf("The file %s exists. Overwrite ? [y]es, [n]o, [A]ll: ",write_filename);
|
||||
ret = scanf("%1s",answer);
|
||||
if (ret != 1)
|
||||
{
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
rep = answer[0] ;
|
||||
if ((rep>='a') && (rep<='z'))
|
||||
rep -= 0x20;
|
||||
}
|
||||
while ((rep!='Y') && (rep!='N') && (rep!='A'));
|
||||
}
|
||||
|
||||
if (rep == 'N')
|
||||
skip = 1;
|
||||
|
||||
if (rep == 'A')
|
||||
*popt_overwrite=1;
|
||||
}
|
||||
|
||||
if ((skip==0) && (err==UNZ_OK))
|
||||
{
|
||||
fout=fopen(write_filename,"wb");
|
||||
|
||||
/* some zipfile don't contain directory alone before file */
|
||||
if ((fout==NULL) && ((*popt_extract_without_path)==0) &&
|
||||
(filename_withoutpath!=(char*)filename_inzip))
|
||||
{
|
||||
char c=*(filename_withoutpath-1);
|
||||
*(filename_withoutpath-1)='\0';
|
||||
makedir(write_filename);
|
||||
*(filename_withoutpath-1)=c;
|
||||
fout=fopen(write_filename,"wb");
|
||||
}
|
||||
|
||||
if (fout==NULL)
|
||||
{
|
||||
//printf("error opening %s\n",write_filename);
|
||||
}
|
||||
}
|
||||
|
||||
if (fout!=NULL)
|
||||
{
|
||||
//printf(" extracting: %s\n",write_filename);
|
||||
|
||||
do
|
||||
{
|
||||
err = unzReadCurrentFile(uf,buf,size_buf);
|
||||
if (err<0)
|
||||
{
|
||||
//printf("error %d with zipfile in unzReadCurrentFile\n",err);
|
||||
break;
|
||||
}
|
||||
if (err>0)
|
||||
if (fwrite(buf,err,1,fout)!=1)
|
||||
{
|
||||
//printf("error in writing extracted file\n");
|
||||
err=UNZ_ERRNO;
|
||||
break;
|
||||
}
|
||||
total_unzipped += size_buf;
|
||||
// show progress
|
||||
ShowProgress("Unzipping...", total_unzipped, total_size);
|
||||
}
|
||||
while (err>0);
|
||||
if (fout)
|
||||
fclose(fout);
|
||||
|
||||
}
|
||||
|
||||
if (err==UNZ_OK)
|
||||
{
|
||||
err = unzCloseCurrentFile (uf);
|
||||
if (err!=UNZ_OK)
|
||||
{
|
||||
//printf("error %d with zipfile in unzCloseCurrentFile\n",err);
|
||||
}
|
||||
}
|
||||
else
|
||||
unzCloseCurrentFile(uf); /* don't lose the error */
|
||||
}
|
||||
|
||||
free(buf);
|
||||
return err;
|
||||
}
|
||||
|
||||
static uLong zipSize(unzFile uf)
|
||||
{
|
||||
uLong i;
|
||||
unz_global_info gi;
|
||||
int err;
|
||||
|
||||
uLong total = 0;
|
||||
|
||||
unz_file_info file_info;
|
||||
char filename_inzip[256];
|
||||
|
||||
err = unzGetGlobalInfo (uf,&gi);
|
||||
|
||||
for (i=0;i<gi.number_entry;i++)
|
||||
{
|
||||
err = unzGetCurrentFileInfo(uf,&file_info,filename_inzip,sizeof(filename_inzip),NULL,0,NULL,0);
|
||||
|
||||
if (err!=UNZ_OK)
|
||||
return err;
|
||||
|
||||
total += file_info.uncompressed_size;
|
||||
|
||||
if ((i+1)<gi.number_entry)
|
||||
{
|
||||
err = unzGoToNextFile(uf);
|
||||
if (err!=UNZ_OK)
|
||||
return err;
|
||||
}
|
||||
}
|
||||
|
||||
err = unzGoToFirstFile(uf);
|
||||
if (err!=UNZ_OK)
|
||||
return err;
|
||||
|
||||
return total;
|
||||
}
|
||||
|
||||
int extractZip(unzFile uf,int opt_extract_without_path,int opt_overwrite,const char* password)
|
||||
{
|
||||
uLong i;
|
||||
unz_global_info gi;
|
||||
int err;
|
||||
|
||||
total_size = zipSize(uf);
|
||||
total_unzipped = 0;
|
||||
ShowProgress("Unzipping...", total_unzipped, total_size);
|
||||
|
||||
err = unzGetGlobalInfo (uf,&gi);
|
||||
//if (err!=UNZ_OK)
|
||||
// printf("error %d with zipfile in unzGetGlobalInfo \n",err);
|
||||
|
||||
for (i=0;i<gi.number_entry;i++)
|
||||
{
|
||||
if (do_extract_currentfile(uf,&opt_extract_without_path,
|
||||
&opt_overwrite,
|
||||
password) != UNZ_OK)
|
||||
break;
|
||||
|
||||
if ((i+1)<gi.number_entry)
|
||||
{
|
||||
err = unzGoToNextFile(uf);
|
||||
if (err!=UNZ_OK)
|
||||
{
|
||||
//printf("error %d with zipfile in unzGoToNextFile\n",err);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
CancelAction();
|
||||
return 0;
|
||||
}
|
||||
|
||||
int extractZipOnefile(unzFile uf,const char* filename,int opt_extract_without_path,int opt_overwrite,const char* password)
|
||||
{
|
||||
if (unzLocateFile(uf,filename,CASESENSITIVITY)!=UNZ_OK)
|
||||
{
|
||||
//printf("file %s not found in the zipfile\n",filename);
|
||||
return 2;
|
||||
}
|
||||
|
||||
if (do_extract_currentfile(uf,&opt_extract_without_path,
|
||||
&opt_overwrite,
|
||||
password) == UNZ_OK)
|
||||
return 0;
|
||||
else
|
||||
return 1;
|
||||
}
|
@ -1,9 +0,0 @@
|
||||
|
||||
#ifndef _miniunz_H
|
||||
#define _miniunz_H
|
||||
|
||||
int extractZip(unzFile uf,int opt_extract_without_path,int opt_overwrite,const char* password);
|
||||
int extractZipOnefile(unzFile uf,const char* filename,int opt_extract_without_path,int opt_overwrite,const char* password);
|
||||
int makedir(char *newdir);
|
||||
|
||||
#endif
|
File diff suppressed because it is too large
Load Diff
@ -1,354 +0,0 @@
|
||||
/* unzip.h -- IO for uncompress .zip files using zlib
|
||||
Version 1.01e, February 12th, 2005
|
||||
|
||||
Copyright (C) 1998-2005 Gilles Vollant
|
||||
|
||||
This unzip package allow extract file from .ZIP file, compatible with PKZip 2.04g
|
||||
WinZip, InfoZip tools and compatible.
|
||||
|
||||
Multi volume ZipFile (span) are not supported.
|
||||
Encryption compatible with pkzip 2.04g only supported
|
||||
Old compressions used by old PKZip 1.x are not supported
|
||||
|
||||
|
||||
I WAIT FEEDBACK at mail info@winimage.com
|
||||
Visit also http://www.winimage.com/zLibDll/unzip.htm for evolution
|
||||
|
||||
Condition of use and distribution are the same than zlib :
|
||||
|
||||
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.
|
||||
|
||||
|
||||
*/
|
||||
|
||||
/* for more info about .ZIP format, see
|
||||
http://www.info-zip.org/pub/infozip/doc/appnote-981119-iz.zip
|
||||
http://www.info-zip.org/pub/infozip/doc/
|
||||
PkWare has also a specification at :
|
||||
ftp://ftp.pkware.com/probdesc.zip
|
||||
*/
|
||||
|
||||
#ifndef _unz_H
|
||||
#define _unz_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#ifndef _ZLIB_H
|
||||
#include "zlib.h"
|
||||
#endif
|
||||
|
||||
#ifndef _ZLIBIOAPI_H
|
||||
#include "ioapi.h"
|
||||
#endif
|
||||
|
||||
#if defined(STRICTUNZIP) || defined(STRICTZIPUNZIP)
|
||||
/* like the STRICT of WIN32, we define a pointer that cannot be converted
|
||||
from (void*) without cast */
|
||||
typedef struct TagunzFile__ { int unused; } unzFile__;
|
||||
typedef unzFile__ *unzFile;
|
||||
#else
|
||||
typedef voidp unzFile;
|
||||
#endif
|
||||
|
||||
|
||||
#define UNZ_OK (0)
|
||||
#define UNZ_END_OF_LIST_OF_FILE (-100)
|
||||
#define UNZ_ERRNO (Z_ERRNO)
|
||||
#define UNZ_EOF (0)
|
||||
#define UNZ_PARAMERROR (-102)
|
||||
#define UNZ_BADZIPFILE (-103)
|
||||
#define UNZ_INTERNALERROR (-104)
|
||||
#define UNZ_CRCERROR (-105)
|
||||
|
||||
/* tm_unz contain date/time info */
|
||||
typedef struct tm_unz_s
|
||||
{
|
||||
uInt tm_sec; /* seconds after the minute - [0,59] */
|
||||
uInt tm_min; /* minutes after the hour - [0,59] */
|
||||
uInt tm_hour; /* hours since midnight - [0,23] */
|
||||
uInt tm_mday; /* day of the month - [1,31] */
|
||||
uInt tm_mon; /* months since January - [0,11] */
|
||||
uInt tm_year; /* years - [1980..2044] */
|
||||
} tm_unz;
|
||||
|
||||
/* unz_global_info structure contain global data about the ZIPfile
|
||||
These data comes from the end of central dir */
|
||||
typedef struct unz_global_info_s
|
||||
{
|
||||
uLong number_entry; /* total number of entries in
|
||||
the central dir on this disk */
|
||||
uLong size_comment; /* size of the global comment of the zipfile */
|
||||
} unz_global_info;
|
||||
|
||||
|
||||
/* unz_file_info contain information about a file in the zipfile */
|
||||
typedef struct unz_file_info_s
|
||||
{
|
||||
uLong version; /* version made by 2 bytes */
|
||||
uLong version_needed; /* version needed to extract 2 bytes */
|
||||
uLong flag; /* general purpose bit flag 2 bytes */
|
||||
uLong compression_method; /* compression method 2 bytes */
|
||||
uLong dosDate; /* last mod file date in Dos fmt 4 bytes */
|
||||
uLong crc; /* crc-32 4 bytes */
|
||||
uLong compressed_size; /* compressed size 4 bytes */
|
||||
uLong uncompressed_size; /* uncompressed size 4 bytes */
|
||||
uLong size_filename; /* filename length 2 bytes */
|
||||
uLong size_file_extra; /* extra field length 2 bytes */
|
||||
uLong size_file_comment; /* file comment length 2 bytes */
|
||||
|
||||
uLong disk_num_start; /* disk number start 2 bytes */
|
||||
uLong internal_fa; /* internal file attributes 2 bytes */
|
||||
uLong external_fa; /* external file attributes 4 bytes */
|
||||
|
||||
tm_unz tmu_date;
|
||||
} unz_file_info;
|
||||
|
||||
extern int ZEXPORT unzStringFileNameCompare OF ((const char* fileName1,
|
||||
const char* fileName2,
|
||||
int iCaseSensitivity));
|
||||
/*
|
||||
Compare two filename (fileName1,fileName2).
|
||||
If iCaseSenisivity = 1, comparision is case sensitivity (like strcmp)
|
||||
If iCaseSenisivity = 2, comparision is not case sensitivity (like strcmpi
|
||||
or strcasecmp)
|
||||
If iCaseSenisivity = 0, case sensitivity is defaut of your operating system
|
||||
(like 1 on Unix, 2 on Windows)
|
||||
*/
|
||||
|
||||
|
||||
extern unzFile ZEXPORT unzOpen OF((const char *path));
|
||||
/*
|
||||
Open a Zip file. path contain the full pathname (by example,
|
||||
on a Windows XP computer "c:\\zlib\\zlib113.zip" or on an Unix computer
|
||||
"zlib/zlib113.zip".
|
||||
If the zipfile cannot be opened (file don't exist or in not valid), the
|
||||
return value is NULL.
|
||||
Else, the return value is a unzFile Handle, usable with other function
|
||||
of this unzip package.
|
||||
*/
|
||||
|
||||
extern unzFile ZEXPORT unzOpen2 OF((const char *path,
|
||||
zlib_filefunc_def* pzlib_filefunc_def));
|
||||
/*
|
||||
Open a Zip file, like unzOpen, but provide a set of file low level API
|
||||
for read/write the zip file (see ioapi.h)
|
||||
*/
|
||||
|
||||
extern int ZEXPORT unzClose OF((unzFile file));
|
||||
/*
|
||||
Close a ZipFile opened with unzipOpen.
|
||||
If there is files inside the .Zip opened with unzOpenCurrentFile (see later),
|
||||
these files MUST be closed with unzipCloseCurrentFile before call unzipClose.
|
||||
return UNZ_OK if there is no problem. */
|
||||
|
||||
extern int ZEXPORT unzGetGlobalInfo OF((unzFile file,
|
||||
unz_global_info *pglobal_info));
|
||||
/*
|
||||
Write info about the ZipFile in the *pglobal_info structure.
|
||||
No preparation of the structure is needed
|
||||
return UNZ_OK if there is no problem. */
|
||||
|
||||
|
||||
extern int ZEXPORT unzGetGlobalComment OF((unzFile file,
|
||||
char *szComment,
|
||||
uLong uSizeBuf));
|
||||
/*
|
||||
Get the global comment string of the ZipFile, in the szComment buffer.
|
||||
uSizeBuf is the size of the szComment buffer.
|
||||
return the number of byte copied or an error code <0
|
||||
*/
|
||||
|
||||
|
||||
/***************************************************************************/
|
||||
/* Unzip package allow you browse the directory of the zipfile */
|
||||
|
||||
extern int ZEXPORT unzGoToFirstFile OF((unzFile file));
|
||||
/*
|
||||
Set the current file of the zipfile to the first file.
|
||||
return UNZ_OK if there is no problem
|
||||
*/
|
||||
|
||||
extern int ZEXPORT unzGoToNextFile OF((unzFile file));
|
||||
/*
|
||||
Set the current file of the zipfile to the next file.
|
||||
return UNZ_OK if there is no problem
|
||||
return UNZ_END_OF_LIST_OF_FILE if the actual file was the latest.
|
||||
*/
|
||||
|
||||
extern int ZEXPORT unzLocateFile OF((unzFile file,
|
||||
const char *szFileName,
|
||||
int iCaseSensitivity));
|
||||
/*
|
||||
Try locate the file szFileName in the zipfile.
|
||||
For the iCaseSensitivity signification, see unzStringFileNameCompare
|
||||
|
||||
return value :
|
||||
UNZ_OK if the file is found. It becomes the current file.
|
||||
UNZ_END_OF_LIST_OF_FILE if the file is not found
|
||||
*/
|
||||
|
||||
|
||||
/* ****************************************** */
|
||||
/* Ryan supplied functions */
|
||||
/* unz_file_info contain information about a file in the zipfile */
|
||||
typedef struct unz_file_pos_s
|
||||
{
|
||||
uLong pos_in_zip_directory; /* offset in zip file directory */
|
||||
uLong num_of_file; /* # of file */
|
||||
} unz_file_pos;
|
||||
|
||||
extern int ZEXPORT unzGetFilePos(
|
||||
unzFile file,
|
||||
unz_file_pos* file_pos);
|
||||
|
||||
extern int ZEXPORT unzGoToFilePos(
|
||||
unzFile file,
|
||||
unz_file_pos* file_pos);
|
||||
|
||||
/* ****************************************** */
|
||||
|
||||
extern int ZEXPORT unzGetCurrentFileInfo OF((unzFile file,
|
||||
unz_file_info *pfile_info,
|
||||
char *szFileName,
|
||||
uLong fileNameBufferSize,
|
||||
void *extraField,
|
||||
uLong extraFieldBufferSize,
|
||||
char *szComment,
|
||||
uLong commentBufferSize));
|
||||
/*
|
||||
Get Info about the current file
|
||||
if pfile_info!=NULL, the *pfile_info structure will contain somes info about
|
||||
the current file
|
||||
if szFileName!=NULL, the filemane string will be copied in szFileName
|
||||
(fileNameBufferSize is the size of the buffer)
|
||||
if extraField!=NULL, the extra field information will be copied in extraField
|
||||
(extraFieldBufferSize is the size of the buffer).
|
||||
This is the Central-header version of the extra field
|
||||
if szComment!=NULL, the comment string of the file will be copied in szComment
|
||||
(commentBufferSize is the size of the buffer)
|
||||
*/
|
||||
|
||||
/***************************************************************************/
|
||||
/* for reading the content of the current zipfile, you can open it, read data
|
||||
from it, and close it (you can close it before reading all the file)
|
||||
*/
|
||||
|
||||
extern int ZEXPORT unzOpenCurrentFile OF((unzFile file));
|
||||
/*
|
||||
Open for reading data the current file in the zipfile.
|
||||
If there is no error, the return value is UNZ_OK.
|
||||
*/
|
||||
|
||||
extern int ZEXPORT unzOpenCurrentFilePassword OF((unzFile file,
|
||||
const char* password));
|
||||
/*
|
||||
Open for reading data the current file in the zipfile.
|
||||
password is a crypting password
|
||||
If there is no error, the return value is UNZ_OK.
|
||||
*/
|
||||
|
||||
extern int ZEXPORT unzOpenCurrentFile2 OF((unzFile file,
|
||||
int* method,
|
||||
int* level,
|
||||
int raw));
|
||||
/*
|
||||
Same than unzOpenCurrentFile, but open for read raw the file (not uncompress)
|
||||
if raw==1
|
||||
*method will receive method of compression, *level will receive level of
|
||||
compression
|
||||
note : you can set level parameter as NULL (if you did not want known level,
|
||||
but you CANNOT set method parameter as NULL
|
||||
*/
|
||||
|
||||
extern int ZEXPORT unzOpenCurrentFile3 OF((unzFile file,
|
||||
int* method,
|
||||
int* level,
|
||||
int raw,
|
||||
const char* password));
|
||||
/*
|
||||
Same than unzOpenCurrentFile, but open for read raw the file (not uncompress)
|
||||
if raw==1
|
||||
*method will receive method of compression, *level will receive level of
|
||||
compression
|
||||
note : you can set level parameter as NULL (if you did not want known level,
|
||||
but you CANNOT set method parameter as NULL
|
||||
*/
|
||||
|
||||
|
||||
extern int ZEXPORT unzCloseCurrentFile OF((unzFile file));
|
||||
/*
|
||||
Close the file in zip opened with unzOpenCurrentFile
|
||||
Return UNZ_CRCERROR if all the file was read but the CRC is not good
|
||||
*/
|
||||
|
||||
extern int ZEXPORT unzReadCurrentFile OF((unzFile file,
|
||||
voidp buf,
|
||||
unsigned len));
|
||||
/*
|
||||
Read bytes from the current file (opened by unzOpenCurrentFile)
|
||||
buf contain buffer where data must be copied
|
||||
len the size of buf.
|
||||
|
||||
return the number of byte copied if somes bytes are copied
|
||||
return 0 if the end of file was reached
|
||||
return <0 with error code if there is an error
|
||||
(UNZ_ERRNO for IO error, or zLib error for uncompress error)
|
||||
*/
|
||||
|
||||
extern z_off_t ZEXPORT unztell OF((unzFile file));
|
||||
/*
|
||||
Give the current position in uncompressed data
|
||||
*/
|
||||
|
||||
extern int ZEXPORT unzeof OF((unzFile file));
|
||||
/*
|
||||
return 1 if the end of file was reached, 0 elsewhere
|
||||
*/
|
||||
|
||||
extern int ZEXPORT unzGetLocalExtrafield OF((unzFile file,
|
||||
voidp buf,
|
||||
unsigned len));
|
||||
/*
|
||||
Read extra field from the current file (opened by unzOpenCurrentFile)
|
||||
This is the local-header version of the extra field (sometimes, there is
|
||||
more info in the local-header version than in the central-header)
|
||||
|
||||
if buf==NULL, it return the size of the local extra field
|
||||
|
||||
if buf!=NULL, len is the size of the buffer, the extra header is copied in
|
||||
buf.
|
||||
the return value is the number of bytes copied in buf, or (if <0)
|
||||
the error code
|
||||
*/
|
||||
|
||||
/***************************************************************************/
|
||||
|
||||
/* Get the current file offset */
|
||||
extern uLong ZEXPORT unzGetOffset (unzFile file);
|
||||
|
||||
/* Set the current file offset */
|
||||
extern int ZEXPORT unzSetOffset (unzFile file, uLong pos);
|
||||
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* _unz_H */
|
Loading…
Reference in New Issue
Block a user