mirror of
https://github.com/dborth/vbagx.git
synced 2024-11-21 18:19:16 +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
e588477fce
commit
e52829994b
4
Makefile
4
Makefile
@ -1,8 +1,8 @@
|
|||||||
.PHONY = all wii gc wii-clean gc-clean wii-run gc-run
|
.PHONY = all wii gc wii-clean gc-clean wii-run gc-run
|
||||||
|
|
||||||
all: wii
|
all: wii gc
|
||||||
|
|
||||||
clean: wii-clean
|
clean: wii-clean gc-clean
|
||||||
|
|
||||||
run: wii-run
|
run: wii-run
|
||||||
|
|
||||||
|
@ -35,8 +35,11 @@ CFLAGS = -g -O3 -Wall $(MACHDEP) $(INCLUDE) \
|
|||||||
-DSDL -DNO_PNG -DHAVE_ZUTIL_H \
|
-DSDL -DNO_PNG -DHAVE_ZUTIL_H \
|
||||||
-D_SZ_ONE_DIRECTORY -D_LZMA_IN_CB -D_LZMA_OUT_READ \
|
-D_SZ_ONE_DIRECTORY -D_LZMA_IN_CB -D_LZMA_OUT_READ \
|
||||||
-fomit-frame-pointer \
|
-fomit-frame-pointer \
|
||||||
-Wno-unused-parameter -Wno-strict-aliasing -Wno-parentheses
|
-Wno-unused-parameter -Wno-strict-aliasing -Wno-parentheses -Wno-format -Wno-stringop-truncation \
|
||||||
CXXFLAGS = $(CFLAGS)
|
-Wno-maybe-uninitialized -Wno-unused-but-set-variable -Wno-stringop-overflow -Wno-narrowing \
|
||||||
|
-Wno-misleading-indentation -Wno-unused-function -Wno-sign-compare -Wno-unused-variable \
|
||||||
|
-Wno-memset-elt-size -Wno-attributes -Wno-tautological-compare
|
||||||
|
CXXFLAGS = $(CFLAGS) -Wno-reorder
|
||||||
LDFLAGS = -g $(MACHDEP) -Wl,-Map,$(notdir $@).map
|
LDFLAGS = -g $(MACHDEP) -Wl,-Map,$(notdir $@).map
|
||||||
|
|
||||||
#---------------------------------------------------------------------------------
|
#---------------------------------------------------------------------------------
|
||||||
|
15
Makefile.wii
15
Makefile.wii
@ -19,7 +19,7 @@ TARGET := vbagx_wii
|
|||||||
TARGETDIR := executables
|
TARGETDIR := executables
|
||||||
BUILD := build_wii
|
BUILD := build_wii
|
||||||
SOURCES := source source/images source/sounds source/fonts source/lang \
|
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/vba source/vba/apu source/vba/common \
|
source/vba source/vba/apu source/vba/common \
|
||||||
source/vba/gb source/vba/gba source/goomba source/goomba/minilzo-2.06
|
source/vba/gb source/vba/gba source/goomba source/goomba/minilzo-2.06
|
||||||
INCLUDES := source source/vba
|
INCLUDES := source source/vba
|
||||||
@ -28,21 +28,24 @@ INCLUDES := source source/vba
|
|||||||
# options for code generation
|
# options for code generation
|
||||||
#---------------------------------------------------------------------------------
|
#---------------------------------------------------------------------------------
|
||||||
|
|
||||||
CFLAGS = -g -O3 -Wall $(MACHDEP) $(INCLUDE) -DNO_SOUND \
|
CFLAGS = -g -O3 -Wall $(MACHDEP) $(INCLUDE) \
|
||||||
-DWORDS_BIGENDIAN -DNO_LINK -DNO_FEX \
|
-DWORDS_BIGENDIAN -DNO_LINK -DNO_FEX \
|
||||||
-DTILED_RENDERING \
|
-DTILED_RENDERING \
|
||||||
-DC_CORE -D__ppc__ -D__POWERPC__ -DFINAL_VERSION \
|
-DC_CORE -D__ppc__ -D__POWERPC__ -DFINAL_VERSION \
|
||||||
-DSDL -DNO_PNG -DHAVE_ZUTIL_H \
|
-DSDL -DNO_PNG -DHAVE_ZUTIL_H \
|
||||||
-D_SZ_ONE_DIRECTORY -D_LZMA_IN_CB -D_LZMA_OUT_READ \
|
-D_SZ_ONE_DIRECTORY -D_LZMA_IN_CB -D_LZMA_OUT_READ \
|
||||||
-fomit-frame-pointer \
|
-fomit-frame-pointer \
|
||||||
-Wno-unused-parameter -Wno-strict-aliasing -Wno-parentheses
|
-Wno-unused-parameter -Wno-strict-aliasing -Wno-parentheses -Wno-format -Wno-stringop-truncation \
|
||||||
CXXFLAGS = $(CFLAGS)
|
-Wno-maybe-uninitialized -Wno-unused-but-set-variable -Wno-stringop-overflow -Wno-narrowing \
|
||||||
LDFLAGS = -g $(MACHDEP) -Wl,-Map,$(notdir $@).map,-wrap,wiiuse_register
|
-Wno-misleading-indentation -Wno-unused-function -Wno-sign-compare -Wno-unused-variable \
|
||||||
|
-Wno-memset-elt-size -Wno-attributes -Wno-tautological-compare
|
||||||
|
CXXFLAGS = $(CFLAGS) -Wno-reorder
|
||||||
|
LDFLAGS = -g $(MACHDEP) -Wl,-Map,$(notdir $@).map
|
||||||
|
|
||||||
#---------------------------------------------------------------------------------
|
#---------------------------------------------------------------------------------
|
||||||
# any extra libraries we wish to link with
|
# any extra libraries we wish to link with
|
||||||
#---------------------------------------------------------------------------------
|
#---------------------------------------------------------------------------------
|
||||||
LIBS := -ldi -liso9660 -lpng -lmxml -lfat -lwiiuse -lwupc -lz -lbte -lasnd -logc \
|
LIBS := -ldi -liso9660 -lpng -lmxml -lfat -lwiiuse -lz -lbte -lasnd -logc \
|
||||||
-lvorbisidec -lfreetype -ltinysmb
|
-lvorbisidec -lfreetype -ltinysmb
|
||||||
|
|
||||||
#---------------------------------------------------------------------------------
|
#---------------------------------------------------------------------------------
|
||||||
|
@ -123,16 +123,6 @@ typedef struct _paddata {
|
|||||||
u8 triggerR;
|
u8 triggerR;
|
||||||
} PADData;
|
} 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_TOP 1
|
||||||
#define EFFECT_SLIDE_BOTTOM 2
|
#define EFFECT_SLIDE_BOTTOM 2
|
||||||
#define EFFECT_SLIDE_RIGHT 4
|
#define EFFECT_SLIDE_RIGHT 4
|
||||||
@ -236,7 +226,6 @@ class GuiTrigger
|
|||||||
|
|
||||||
WPADData wpaddata; //!< Wii controller trigger data
|
WPADData wpaddata; //!< Wii controller trigger data
|
||||||
PADData pad; //!< GameCube controller trigger data
|
PADData pad; //!< GameCube controller trigger data
|
||||||
WUPCFullData wupcdata; //!< WiiU Pro controller trigger data
|
|
||||||
WPADData * wpad; //!< Wii controller trigger
|
WPADData * wpad; //!< Wii controller trigger
|
||||||
s32 chan; //!< Trigger controller channel (0-3, -1 for all)
|
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)
|
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 s Font size
|
||||||
//!\param h Text alignment (horizontal)
|
//!\param h Text alignment (horizontal)
|
||||||
//!\param v Text alignment (vertical)
|
//!\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
|
//!Sets the font size
|
||||||
//!\param s Font size
|
//!\param s Font size
|
||||||
void SetFontSize(int s);
|
void SetFontSize(int s);
|
||||||
|
@ -254,7 +254,7 @@ void GuiButton::Update(GuiTrigger * t)
|
|||||||
// button triggers
|
// button triggers
|
||||||
if(this->IsClickable())
|
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++)
|
for(int i=0; i<3; i++)
|
||||||
{
|
{
|
||||||
if(trigger[i] && (trigger[i]->chan == -1 || trigger[i]->chan == t->chan))
|
if(trigger[i] && (trigger[i]->chan == -1 || trigger[i]->chan == t->chan))
|
||||||
@ -267,16 +267,12 @@ void GuiButton::Update(GuiTrigger * t)
|
|||||||
cc_btns = t->wpad->btns_d >> 16;
|
cc_btns = t->wpad->btns_d >> 16;
|
||||||
cc_btns_trig = trigger[i]->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(
|
if(
|
||||||
(t->wpad->btns_d > 0 &&
|
(t->wpad->btns_d > 0 &&
|
||||||
(wm_btns == wm_btns_trig ||
|
(wm_btns == wm_btns_trig ||
|
||||||
(cc_btns == cc_btns_trig && t->wpad->exp.type == EXP_CLASSIC))) ||
|
(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) ||
|
(t->pad.btns_d == trigger[i]->pad.btns_d && t->pad.btns_d > 0))
|
||||||
(wupc_btns == wupc_btns_trig && wupc_btns_trig > 0))
|
|
||||||
{
|
{
|
||||||
if(t->chan == stateChan || stateChan == -1)
|
if(t->chan == stateChan || stateChan == -1)
|
||||||
{
|
{
|
||||||
@ -308,7 +304,7 @@ void GuiButton::Update(GuiTrigger * t)
|
|||||||
if(this->IsHoldable())
|
if(this->IsHoldable())
|
||||||
{
|
{
|
||||||
bool held = false;
|
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++)
|
for(int i=0; i<3; i++)
|
||||||
{
|
{
|
||||||
@ -324,17 +320,11 @@ void GuiButton::Update(GuiTrigger * t)
|
|||||||
cc_btns_h = t->wpad->btns_h >> 16;
|
cc_btns_h = t->wpad->btns_h >> 16;
|
||||||
cc_btns_trig = trigger[i]->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(
|
if(
|
||||||
(t->wpad->btns_d > 0 &&
|
(t->wpad->btns_d > 0 &&
|
||||||
(wm_btns == wm_btns_trig ||
|
(wm_btns == wm_btns_trig ||
|
||||||
(cc_btns == cc_btns_trig && t->wpad->exp.type == EXP_CLASSIC))) ||
|
(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) ||
|
(t->pad.btns_d == trigger[i]->pad.btns_h && t->pad.btns_d > 0))
|
||||||
(wupc_btns == wupc_btns_trig && wupc_btns > 0))
|
|
||||||
{
|
{
|
||||||
if(trigger[i]->type == TRIGGER_HELD && state == STATE_SELECTED &&
|
if(trigger[i]->type == TRIGGER_HELD && state == STATE_SELECTED &&
|
||||||
(t->chan == stateChan || stateChan == -1))
|
(t->chan == stateChan || stateChan == -1))
|
||||||
@ -345,8 +335,8 @@ void GuiButton::Update(GuiTrigger * t)
|
|||||||
(t->wpad->btns_h > 0 &&
|
(t->wpad->btns_h > 0 &&
|
||||||
(wm_btns_h == wm_btns_trig ||
|
(wm_btns_h == wm_btns_trig ||
|
||||||
(cc_btns_h == cc_btns_trig && t->wpad->exp.type == EXP_CLASSIC))) ||
|
(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) ||
|
(t->pad.btns_h == trigger[i]->pad.btns_h && t->pad.btns_h > 0))
|
||||||
(wupc_btns_h == wupc_btns_trig && wupc_btns_h > 0))
|
|
||||||
{
|
{
|
||||||
if(trigger[i]->type == TRIGGER_HELD)
|
if(trigger[i]->type == TRIGGER_HELD)
|
||||||
held = true;
|
held = true;
|
||||||
|
@ -22,7 +22,6 @@ static u32 delay[4];
|
|||||||
GuiTrigger::GuiTrigger()
|
GuiTrigger::GuiTrigger()
|
||||||
{
|
{
|
||||||
chan = -1;
|
chan = -1;
|
||||||
memset(&wupcdata, 0, sizeof(WUPCFullData));
|
|
||||||
memset(&wpaddata, 0, sizeof(WPADData));
|
memset(&wpaddata, 0, sizeof(WPADData));
|
||||||
memset(&pad, 0, sizeof(PADData));
|
memset(&pad, 0, sizeof(PADData));
|
||||||
wpad = &wpaddata;
|
wpad = &wpaddata;
|
||||||
@ -44,7 +43,6 @@ void GuiTrigger::SetSimpleTrigger(s32 ch, u32 wiibtns, u16 gcbtns)
|
|||||||
{
|
{
|
||||||
type = TRIGGER_SIMPLE;
|
type = TRIGGER_SIMPLE;
|
||||||
chan = ch;
|
chan = ch;
|
||||||
wupcdata.btns_d = wiibtns;
|
|
||||||
wpaddata.btns_d = wiibtns;
|
wpaddata.btns_d = wiibtns;
|
||||||
pad.btns_d = gcbtns;
|
pad.btns_d = gcbtns;
|
||||||
}
|
}
|
||||||
@ -58,7 +56,6 @@ void GuiTrigger::SetHeldTrigger(s32 ch, u32 wiibtns, u16 gcbtns)
|
|||||||
{
|
{
|
||||||
type = TRIGGER_HELD;
|
type = TRIGGER_HELD;
|
||||||
chan = ch;
|
chan = ch;
|
||||||
wupcdata.btns_h = wiibtns;
|
|
||||||
wpaddata.btns_h = wiibtns;
|
wpaddata.btns_h = wiibtns;
|
||||||
pad.btns_h = gcbtns;
|
pad.btns_h = gcbtns;
|
||||||
}
|
}
|
||||||
@ -71,7 +68,6 @@ void GuiTrigger::SetButtonOnlyTrigger(s32 ch, u32 wiibtns, u16 gcbtns)
|
|||||||
{
|
{
|
||||||
type = TRIGGER_BUTTON_ONLY;
|
type = TRIGGER_BUTTON_ONLY;
|
||||||
chan = ch;
|
chan = ch;
|
||||||
wupcdata.btns_d = wiibtns;
|
|
||||||
wpaddata.btns_d = wiibtns;
|
wpaddata.btns_d = wiibtns;
|
||||||
pad.btns_d = gcbtns;
|
pad.btns_d = gcbtns;
|
||||||
}
|
}
|
||||||
@ -85,7 +81,6 @@ void GuiTrigger::SetButtonOnlyInFocusTrigger(s32 ch, u32 wiibtns, u16 gcbtns)
|
|||||||
{
|
{
|
||||||
type = TRIGGER_BUTTON_ONLY_IN_FOCUS;
|
type = TRIGGER_BUTTON_ONLY_IN_FOCUS;
|
||||||
chan = ch;
|
chan = ch;
|
||||||
wupcdata.btns_d = wiibtns;
|
|
||||||
wpaddata.btns_d = wiibtns;
|
wpaddata.btns_d = wiibtns;
|
||||||
pad.btns_d = gcbtns;
|
pad.btns_d = gcbtns;
|
||||||
}
|
}
|
||||||
@ -163,15 +158,12 @@ bool GuiTrigger::Left()
|
|||||||
u32 wiibtn = GCSettings.WiimoteOrientation ? WPAD_BUTTON_UP : WPAD_BUTTON_LEFT;
|
u32 wiibtn = GCSettings.WiimoteOrientation ? WPAD_BUTTON_UP : WPAD_BUTTON_LEFT;
|
||||||
|
|
||||||
if((wpad->btns_d | wpad->btns_h) & (wiibtn | WPAD_CLASSIC_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.btns_d | pad.btns_h) & PAD_BUTTON_LEFT
|
||||||
|| pad.stickX < -PADCAL
|
|| pad.stickX < -PADCAL
|
||||||
|| WPAD_StickX(0) < -PADCAL
|
|| WPAD_StickX(0) < -PADCAL)
|
||||||
|| wupcdata.stickX < -WUPCCAL)
|
|
||||||
{
|
{
|
||||||
if((wpad->btns_d & (wiibtn | WPAD_CLASSIC_BUTTON_LEFT))
|
if(wpad->btns_d & (wiibtn | WPAD_CLASSIC_BUTTON_LEFT)
|
||||||
|| (wupcdata.btns_d & (wiibtn | WPAD_CLASSIC_BUTTON_LEFT))
|
|| pad.btns_d & PAD_BUTTON_LEFT)
|
||||||
|| pad.btns_d & PAD_BUTTON_LEFT)
|
|
||||||
{
|
{
|
||||||
prev[chan] = gettime();
|
prev[chan] = gettime();
|
||||||
delay[chan] = SCROLL_DELAY_INITIAL; // reset scroll delay
|
delay[chan] = SCROLL_DELAY_INITIAL; // reset scroll delay
|
||||||
@ -199,14 +191,11 @@ bool GuiTrigger::Right()
|
|||||||
u32 wiibtn = GCSettings.WiimoteOrientation ? WPAD_BUTTON_DOWN : WPAD_BUTTON_RIGHT;
|
u32 wiibtn = GCSettings.WiimoteOrientation ? WPAD_BUTTON_DOWN : WPAD_BUTTON_RIGHT;
|
||||||
|
|
||||||
if((wpad->btns_d | wpad->btns_h) & (wiibtn | WPAD_CLASSIC_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.btns_d | pad.btns_h) & PAD_BUTTON_RIGHT
|
||||||
|| pad.stickX > PADCAL
|
|| pad.stickX > PADCAL
|
||||||
|| WPAD_StickX(0) > PADCAL
|
|| WPAD_StickX(0) > PADCAL)
|
||||||
|| wupcdata.stickX > WUPCCAL)
|
|
||||||
{
|
{
|
||||||
if((wpad->btns_d & (wiibtn | WPAD_CLASSIC_BUTTON_RIGHT))
|
if(wpad->btns_d & (wiibtn | WPAD_CLASSIC_BUTTON_RIGHT)
|
||||||
|| (wupcdata.btns_d & (wiibtn | WPAD_CLASSIC_BUTTON_RIGHT))
|
|
||||||
|| pad.btns_d & PAD_BUTTON_RIGHT)
|
|| pad.btns_d & PAD_BUTTON_RIGHT)
|
||||||
{
|
{
|
||||||
prev[chan] = gettime();
|
prev[chan] = gettime();
|
||||||
@ -234,15 +223,12 @@ bool GuiTrigger::Up()
|
|||||||
{
|
{
|
||||||
u32 wiibtn = GCSettings.WiimoteOrientation ? WPAD_BUTTON_RIGHT : WPAD_BUTTON_UP;
|
u32 wiibtn = GCSettings.WiimoteOrientation ? WPAD_BUTTON_RIGHT : WPAD_BUTTON_UP;
|
||||||
|
|
||||||
if(((wpad->btns_d | wpad->btns_h) & (wiibtn | WPAD_CLASSIC_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))
|
|
||||||
|| (pad.btns_d | pad.btns_h) & PAD_BUTTON_UP
|
|| (pad.btns_d | pad.btns_h) & PAD_BUTTON_UP
|
||||||
|| pad.stickY > PADCAL
|
|| pad.stickY > PADCAL
|
||||||
|| WPAD_StickY(0) > PADCAL
|
|| WPAD_StickY(0) > PADCAL)
|
||||||
|| wupcdata.stickY > WUPCCAL)
|
|
||||||
{
|
{
|
||||||
if((wpad->btns_d & (wiibtn | WPAD_CLASSIC_BUTTON_UP))
|
if(wpad->btns_d & (wiibtn | WPAD_CLASSIC_BUTTON_UP)
|
||||||
|| (wupcdata.btns_d & (wiibtn | WPAD_CLASSIC_BUTTON_UP))
|
|
||||||
|| pad.btns_d & PAD_BUTTON_UP)
|
|| pad.btns_d & PAD_BUTTON_UP)
|
||||||
{
|
{
|
||||||
prev[chan] = gettime();
|
prev[chan] = gettime();
|
||||||
@ -270,15 +256,12 @@ bool GuiTrigger::Down()
|
|||||||
{
|
{
|
||||||
u32 wiibtn = GCSettings.WiimoteOrientation ? WPAD_BUTTON_LEFT : WPAD_BUTTON_DOWN;
|
u32 wiibtn = GCSettings.WiimoteOrientation ? WPAD_BUTTON_LEFT : WPAD_BUTTON_DOWN;
|
||||||
|
|
||||||
if(((wpad->btns_d | wpad->btns_h) & (wiibtn | WPAD_CLASSIC_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))
|
|
||||||
|| (pad.btns_d | pad.btns_h) & PAD_BUTTON_DOWN
|
|| (pad.btns_d | pad.btns_h) & PAD_BUTTON_DOWN
|
||||||
|| pad.stickY < -PADCAL
|
|| pad.stickY < -PADCAL
|
||||||
|| WPAD_StickY(0) < -PADCAL
|
|| WPAD_StickY(0) < -PADCAL)
|
||||||
|| wupcdata.stickY < -WUPCCAL)
|
|
||||||
{
|
{
|
||||||
if((wpad->btns_d & (wiibtn | WPAD_CLASSIC_BUTTON_DOWN))
|
if(wpad->btns_d & (wiibtn | WPAD_CLASSIC_BUTTON_DOWN)
|
||||||
|| wupcdata.btns_d & (wiibtn | WPAD_CLASSIC_BUTTON_DOWN)
|
|
||||||
|| pad.btns_d & PAD_BUTTON_DOWN)
|
|| pad.btns_d & PAD_BUTTON_DOWN)
|
||||||
{
|
{
|
||||||
prev[chan] = gettime();
|
prev[chan] = gettime();
|
||||||
|
@ -229,7 +229,7 @@ void GuiWindow::ToggleFocus(GuiTrigger * t)
|
|||||||
}
|
}
|
||||||
// change focus
|
// change focus
|
||||||
else if((t->wpad->btns_d & (WPAD_BUTTON_1 | WPAD_BUTTON_B | WPAD_CLASSIC_BUTTON_B))
|
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)
|
for (i = found; i < elemSize; ++i)
|
||||||
{
|
{
|
||||||
|
Binary file not shown.
Before Width: | Height: | Size: 10 KiB |
@ -16,7 +16,6 @@
|
|||||||
#include <ogcsys.h>
|
#include <ogcsys.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <wiiuse/wpad.h>
|
#include <wiiuse/wpad.h>
|
||||||
#include <wupc/wupc.h>
|
|
||||||
#include <ogc/lwp_watchdog.h>
|
#include <ogc/lwp_watchdog.h>
|
||||||
|
|
||||||
#include "vbagx.h"
|
#include "vbagx.h"
|
||||||
@ -139,7 +138,6 @@ void
|
|||||||
UpdatePads()
|
UpdatePads()
|
||||||
{
|
{
|
||||||
#ifdef HW_RVL
|
#ifdef HW_RVL
|
||||||
WUPC_UpdateButtonStats();
|
|
||||||
WPAD_ScanPads();
|
WPAD_ScanPads();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -156,15 +154,6 @@ UpdatePads()
|
|||||||
userInput[i].pad.substickY = PAD_SubStickY(i);
|
userInput[i].pad.substickY = PAD_SubStickY(i);
|
||||||
userInput[i].pad.triggerL = PAD_TriggerL(i);
|
userInput[i].pad.triggerL = PAD_TriggerL(i);
|
||||||
userInput[i].pad.triggerR = PAD_TriggerR(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
|
|
||||||
--i;
|
--i;
|
||||||
} while(i >= 0);
|
} while(i >= 0);
|
||||||
}
|
}
|
||||||
@ -322,9 +311,6 @@ u32 StandardMovement(unsigned short chan)
|
|||||||
#ifdef HW_RVL
|
#ifdef HW_RVL
|
||||||
s8 wm_ax = userInput[0].WPAD_StickX(0);
|
s8 wm_ax = userInput[0].WPAD_StickX(0);
|
||||||
s8 wm_ay = userInput[0].WPAD_StickY(0);
|
s8 wm_ay = userInput[0].WPAD_StickY(0);
|
||||||
|
|
||||||
s16 wupc_ax = userInput[chan].wupcdata.stickX;
|
|
||||||
s16 wupc_ay = userInput[chan].wupcdata.stickY;
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/***
|
/***
|
||||||
@ -361,19 +347,6 @@ u32 StandardMovement(unsigned short chan)
|
|||||||
else if(sin(angle) < -THRES)
|
else if(sin(angle) < -THRES)
|
||||||
J |= VBA_DOWN;
|
J |= VBA_DOWN;
|
||||||
}
|
}
|
||||||
/* WiiU Pro Controller */
|
|
||||||
if (wupc_ax * wupc_ax + wupc_ay * wupc_ay > WUPCCAL * WUPCCAL)
|
|
||||||
{
|
|
||||||
angle = atan2(wupc_ay, wupc_ax);
|
|
||||||
if(cos(angle) > THRES)
|
|
||||||
J |= VBA_RIGHT;
|
|
||||||
else if(cos(angle) < -THRES)
|
|
||||||
J |= VBA_LEFT;
|
|
||||||
if(sin(angle) > THRES)
|
|
||||||
J |= VBA_UP;
|
|
||||||
else if(sin(angle) < -THRES)
|
|
||||||
J |= VBA_DOWN;
|
|
||||||
}
|
|
||||||
#endif
|
#endif
|
||||||
return J;
|
return J;
|
||||||
}
|
}
|
||||||
@ -406,16 +379,6 @@ u32 StandardDPad(unsigned short pad)
|
|||||||
if (wp & WPAD_CLASSIC_BUTTON_RIGHT)
|
if (wp & WPAD_CLASSIC_BUTTON_RIGHT)
|
||||||
J |= VBA_RIGHT;
|
J |= VBA_RIGHT;
|
||||||
}
|
}
|
||||||
/* WiiU Pro Controller */
|
|
||||||
u32 wupcp = userInput[pad].wupcdata.btns_h;
|
|
||||||
if (wupcp & WPAD_CLASSIC_BUTTON_UP)
|
|
||||||
J |= VBA_UP;
|
|
||||||
if (wupcp & WPAD_CLASSIC_BUTTON_DOWN)
|
|
||||||
J |= VBA_DOWN;
|
|
||||||
if (wupcp & WPAD_CLASSIC_BUTTON_LEFT)
|
|
||||||
J |= VBA_LEFT;
|
|
||||||
if (wupcp & WPAD_CLASSIC_BUTTON_RIGHT)
|
|
||||||
J |= VBA_RIGHT;
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -474,8 +437,7 @@ u32 StandardClassic(unsigned short pad)
|
|||||||
{
|
{
|
||||||
u32 J = 0;
|
u32 J = 0;
|
||||||
#ifdef HW_RVL
|
#ifdef HW_RVL
|
||||||
u32 wp = userInput[pad].wpad->btns_h
|
u32 wp = userInput[pad].wpad->btns_h;
|
||||||
| userInput[pad].wupcdata.btns_h; /* just add pro controller */
|
|
||||||
|
|
||||||
if (wp & WPAD_CLASSIC_BUTTON_RIGHT)
|
if (wp & WPAD_CLASSIC_BUTTON_RIGHT)
|
||||||
J |= VBA_RIGHT;
|
J |= VBA_RIGHT;
|
||||||
@ -574,14 +536,6 @@ u32 DecodeClassic(unsigned short pad)
|
|||||||
#ifdef HW_RVL
|
#ifdef HW_RVL
|
||||||
WPADData * wp = WPAD_Data(pad);
|
WPADData * wp = WPAD_Data(pad);
|
||||||
u32 wpad_btns_h = wp->btns_h;
|
u32 wpad_btns_h = wp->btns_h;
|
||||||
|
|
||||||
/* WiiU Pro Controller */
|
|
||||||
u32 wupc_btns_h = userInput[pad].wupcdata.btns_h;
|
|
||||||
for (u32 i = 0; i < MAXJP; ++i)
|
|
||||||
{
|
|
||||||
if(wupc_btns_h & btnmap[CTRLR_CLASSIC][i])
|
|
||||||
J |= vbapadmap[i];
|
|
||||||
}
|
|
||||||
|
|
||||||
if(wp->exp.type == WPAD_EXP_CLASSIC){
|
if(wp->exp.type == WPAD_EXP_CLASSIC){
|
||||||
for (u32 i = 0; i < MAXJP; ++i){
|
for (u32 i = 0; i < MAXJP; ++i){
|
||||||
@ -867,7 +821,7 @@ static u32 DecodeJoy(unsigned short pad)
|
|||||||
u32 J = StandardMovement(pad);
|
u32 J = StandardMovement(pad);
|
||||||
|
|
||||||
// Turbo feature
|
// Turbo feature
|
||||||
if(userInput[0].pad.substickX > 70 || userInput[0].WPAD_Stick(1,0) > 70 || userInput[0].wupcdata.substickX > 560)
|
if(userInput[0].pad.substickX > 70 || userInput[0].WPAD_Stick(1,0) > 70)
|
||||||
J |= VBA_SPEED;
|
J |= VBA_SPEED;
|
||||||
|
|
||||||
// Report pressed buttons (gamepads)
|
// Report pressed buttons (gamepads)
|
||||||
@ -923,36 +877,24 @@ static u32 DecodeJoy(unsigned short pad)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef HW_RVL
|
|
||||||
/* WiiU Pro Controller */
|
|
||||||
u32 wupc_btns_h = userInput[pad].wupcdata.btns_h;
|
|
||||||
for (u32 i =0; i < MAXJP; ++i)
|
|
||||||
{
|
|
||||||
if(wupc_btns_h & btnmap[CTRLR_CLASSIC][i])
|
|
||||||
J |= vbapadmap[i];
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
return J;
|
return J;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool MenuRequested()
|
bool MenuRequested()
|
||||||
{
|
{
|
||||||
for(int i=0; i<4; i++)
|
for(int i=0; i<4; i++) {
|
||||||
{
|
|
||||||
if (
|
if (
|
||||||
(userInput[i].pad.substickX < -70)
|
(userInput[i].pad.substickX < -70)
|
||||||
#ifdef HW_RVL
|
#ifdef HW_RVL
|
||||||
|| (userInput[i].wpad->btns_h & WPAD_BUTTON_HOME) ||
|
|| (userInput[i].wpad->btns_h & WPAD_BUTTON_HOME) ||
|
||||||
(userInput[i].wpad->btns_h & WPAD_CLASSIC_BUTTON_HOME) ||
|
(userInput[i].wpad->btns_h & WPAD_CLASSIC_BUTTON_HOME)
|
||||||
(userInput[i].wupcdata.btns_h & WPAD_CLASSIC_BUTTON_HOME)
|
|
||||||
#endif
|
#endif
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
return false;
|
}
|
||||||
}
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
u32 GetJoy(int pad)
|
u32 GetJoy(int pad)
|
||||||
|
@ -16,7 +16,6 @@
|
|||||||
|
|
||||||
#define PI 3.14159265f
|
#define PI 3.14159265f
|
||||||
#define PADCAL 50
|
#define PADCAL 50
|
||||||
#define WUPCCAL 400
|
|
||||||
#define MAXJP 10 // # of mappable controller buttons
|
#define MAXJP 10 // # of mappable controller buttons
|
||||||
|
|
||||||
#define VBA_BUTTON_A 1
|
#define VBA_BUTTON_A 1
|
||||||
|
@ -874,7 +874,7 @@ u32 UniversalGravitationInput(unsigned short pad) {
|
|||||||
J |= VBA_DOWN;
|
J |= VBA_DOWN;
|
||||||
if (wp->btns_h & WPAD_CLASSIC_BUTTON_FULL_R)
|
if (wp->btns_h & WPAD_CLASSIC_BUTTON_FULL_R)
|
||||||
J |= VBA_UP;
|
J |= VBA_UP;
|
||||||
if (WPAD_CLASSIC_BUTTON_ZR)
|
if (wp->btns_h & WPAD_CLASSIC_BUTTON_ZR)
|
||||||
J |= VBA_SPEED;
|
J |= VBA_SPEED;
|
||||||
} else {
|
} else {
|
||||||
J |= StandardSideways(pad);
|
J |= StandardSideways(pad);
|
||||||
|
111
source/menu.cpp
111
source/menu.cpp
@ -18,7 +18,6 @@
|
|||||||
#ifdef HW_RVL
|
#ifdef HW_RVL
|
||||||
#include <di/di.h>
|
#include <di/di.h>
|
||||||
#include <wiiuse/wpad.h>
|
#include <wiiuse/wpad.h>
|
||||||
#include <wupc/wupc.h>
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "vbagx.h"
|
#include "vbagx.h"
|
||||||
@ -69,7 +68,6 @@ static GuiText * settingText = NULL;
|
|||||||
static GuiText * settingText2 = NULL;
|
static GuiText * settingText2 = NULL;
|
||||||
static int lastMenu = MENU_NONE;
|
static int lastMenu = MENU_NONE;
|
||||||
static int mapMenuCtrl = 0;
|
static int mapMenuCtrl = 0;
|
||||||
static int wiiuproCtrl = 0;
|
|
||||||
|
|
||||||
static lwp_t guithread = LWP_THREAD_NULL;
|
static lwp_t guithread = LWP_THREAD_NULL;
|
||||||
static lwp_t progressthread = LWP_THREAD_NULL;
|
static lwp_t progressthread = LWP_THREAD_NULL;
|
||||||
@ -252,27 +250,6 @@ WindowPrompt(const char *title, const char *msg, const char *btn1Label, const ch
|
|||||||
return WindowPrompt(title, msg, btn1Label, btn2Label, false);
|
return WindowPrompt(title, msg, btn1Label, btn2Label, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
#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
|
* UpdateGUI
|
||||||
*
|
*
|
||||||
@ -313,15 +290,6 @@ UpdateGUI (void *arg)
|
|||||||
mainWindow->Update(&userInput[1]);
|
mainWindow->Update(&userInput[1]);
|
||||||
mainWindow->Update(&userInput[0]);
|
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)
|
if(ExitRequested || ShutdownRequested)
|
||||||
{
|
{
|
||||||
for(i = 0; i <= 255; i += 15)
|
for(i = 0; i <= 255; i += 15)
|
||||||
@ -776,8 +744,7 @@ static void WindowCredits(void * ptr)
|
|||||||
txt[i] = new GuiText("Official Site: https://github.com/dborth/vbagx", 20, (GXColor){0, 0, 0, 255});
|
txt[i] = new GuiText("Official Site: https://github.com/dborth/vbagx", 20, (GXColor){0, 0, 0, 255});
|
||||||
txt[i]->SetAlignment(ALIGN_CENTRE, ALIGN_TOP); txt[i]->SetPosition(0,y); i++; y+=32;
|
txt[i]->SetAlignment(ALIGN_CENTRE, ALIGN_TOP); txt[i]->SetPosition(0,y); i++; y+=32;
|
||||||
|
|
||||||
txt[i]->SetPresets(20, (GXColor){0, 0, 0, 255}, 0,
|
GuiText::SetPresets(20, (GXColor){0, 0, 0, 255}, 0, FTGX_JUSTIFY_LEFT | FTGX_ALIGN_TOP, ALIGN_LEFT, ALIGN_TOP);
|
||||||
FTGX_JUSTIFY_LEFT | FTGX_ALIGN_TOP, ALIGN_LEFT, ALIGN_TOP);
|
|
||||||
|
|
||||||
txt[i] = new GuiText("Main developer");
|
txt[i] = new GuiText("Main developer");
|
||||||
txt[i]->SetPosition(40,y); i++;
|
txt[i]->SetPosition(40,y); i++;
|
||||||
@ -822,8 +789,7 @@ static void WindowCredits(void * ptr)
|
|||||||
txt[i] = new GuiText("Armin Tamzarian");
|
txt[i] = new GuiText("Armin Tamzarian");
|
||||||
txt[i]->SetPosition(250,y); i++; y+=32;
|
txt[i]->SetPosition(250,y); i++; y+=32;
|
||||||
|
|
||||||
txt[i]->SetPresets(18, (GXColor){0, 0, 0, 255}, 0,
|
GuiText::SetPresets(18, (GXColor){0, 0, 0, 255}, 0, FTGX_JUSTIFY_CENTER | FTGX_ALIGN_TOP, ALIGN_CENTRE, ALIGN_TOP);
|
||||||
FTGX_JUSTIFY_CENTER | FTGX_ALIGN_TOP, ALIGN_CENTRE, ALIGN_TOP);
|
|
||||||
|
|
||||||
txt[i] = new GuiText("This software is open source and may be copied,");
|
txt[i] = new GuiText("This software is open source and may be copied,");
|
||||||
txt[i]->SetPosition(0,y); i++; y+=20;
|
txt[i]->SetPosition(0,y); i++; y+=20;
|
||||||
@ -869,10 +835,10 @@ static void WindowCredits(void * ptr)
|
|||||||
|
|
||||||
Menu_Render();
|
Menu_Render();
|
||||||
|
|
||||||
if((userInput[0].wpad->btns_d || userInput[0].pad.btns_d || userInput[0].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[1].wupcdata.btns_d) ||
|
(userInput[1].wpad->btns_d || userInput[1].pad.btns_d) ||
|
||||||
(userInput[2].wpad->btns_d || userInput[2].pad.btns_d || userInput[2].wupcdata.btns_d) ||
|
(userInput[2].wpad->btns_d || userInput[2].pad.btns_d) ||
|
||||||
(userInput[3].wpad->btns_d || userInput[3].pad.btns_d || userInput[3].wupcdata.btns_d))
|
(userInput[3].wpad->btns_d || userInput[3].pad.btns_d))
|
||||||
{
|
{
|
||||||
exit = true;
|
exit = true;
|
||||||
}
|
}
|
||||||
@ -882,7 +848,6 @@ static void WindowCredits(void * ptr)
|
|||||||
// clear buttons pressed
|
// clear buttons pressed
|
||||||
for(i=0; i < 4; i++)
|
for(i=0; i < 4; i++)
|
||||||
{
|
{
|
||||||
userInput[i].wupcdata.btns_d = 0;
|
|
||||||
userInput[i].wpad->btns_d = 0;
|
userInput[i].wpad->btns_d = 0;
|
||||||
userInput[i].pad.btns_d = 0;
|
userInput[i].pad.btns_d = 0;
|
||||||
}
|
}
|
||||||
@ -1426,17 +1391,8 @@ static int MenuGame()
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
struct WUPCData *data = WUPC_Data(i);
|
newStatus = false;
|
||||||
if(data != NULL)
|
newLevel = 0;
|
||||||
{
|
|
||||||
newStatus = true;
|
|
||||||
newLevel = data->battery;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
newStatus = false;
|
|
||||||
newLevel = 0;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if(status[i] != newStatus || level[i] != newLevel)
|
if(status[i] != newStatus || level[i] != newLevel)
|
||||||
@ -2126,7 +2082,6 @@ static int MenuSettingsMappings()
|
|||||||
GuiImageData iconClassic(icon_settings_classic_png);
|
GuiImageData iconClassic(icon_settings_classic_png);
|
||||||
GuiImageData iconGamecube(icon_settings_gamecube_png);
|
GuiImageData iconGamecube(icon_settings_gamecube_png);
|
||||||
GuiImageData iconNunchuk(icon_settings_nunchuk_png);
|
GuiImageData iconNunchuk(icon_settings_nunchuk_png);
|
||||||
GuiImageData iconWiiupro(icon_settings_wiiupro_png);
|
|
||||||
|
|
||||||
GuiText gamecubeBtnTxt("GameCube Controller", 22, (GXColor){0, 0, 0, 255});
|
GuiText gamecubeBtnTxt("GameCube Controller", 22, (GXColor){0, 0, 0, 255});
|
||||||
gamecubeBtnTxt.SetWrap(true, btnLargeOutline.GetWidth()-30);
|
gamecubeBtnTxt.SetWrap(true, btnLargeOutline.GetWidth()-30);
|
||||||
@ -2181,24 +2136,6 @@ static int MenuSettingsMappings()
|
|||||||
classicBtn.SetTrigger(trig2);
|
classicBtn.SetTrigger(trig2);
|
||||||
classicBtn.SetEffectGrow();
|
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 nunchukBtnTxt1("Wiimote", 22, (GXColor){0, 0, 0, 255});
|
||||||
GuiText nunchukBtnTxt2("&", 18, (GXColor){0, 0, 0, 255});
|
GuiText nunchukBtnTxt2("&", 18, (GXColor){0, 0, 0, 255});
|
||||||
GuiText nunchukBtnTxt3("Nunchuk", 22, (GXColor){0, 0, 0, 255});
|
GuiText nunchukBtnTxt3("Nunchuk", 22, (GXColor){0, 0, 0, 255});
|
||||||
@ -2246,7 +2183,6 @@ static int MenuSettingsMappings()
|
|||||||
w.Append(&wiimoteBtn);
|
w.Append(&wiimoteBtn);
|
||||||
w.Append(&nunchukBtn);
|
w.Append(&nunchukBtn);
|
||||||
w.Append(&classicBtn);
|
w.Append(&classicBtn);
|
||||||
w.Append(&wiiuproBtn);
|
|
||||||
#endif
|
#endif
|
||||||
w.Append(&backBtn);
|
w.Append(&backBtn);
|
||||||
|
|
||||||
@ -2270,13 +2206,6 @@ static int MenuSettingsMappings()
|
|||||||
}
|
}
|
||||||
else if(classicBtn.GetState() == STATE_CLICKED)
|
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;
|
menu = MENU_GAMESETTINGS_MAPPINGS_MAP;
|
||||||
mapMenuCtrl = CTRLR_CLASSIC;
|
mapMenuCtrl = CTRLR_CLASSIC;
|
||||||
}
|
}
|
||||||
@ -2331,14 +2260,7 @@ ButtonMappingWindow()
|
|||||||
sprintf(msg, "Press any button on the Wiimote now. Press Home to clear the existing mapping.");
|
sprintf(msg, "Press any button on the Wiimote now. Press Home to clear the existing mapping.");
|
||||||
break;
|
break;
|
||||||
case CTRLR_CLASSIC:
|
case CTRLR_CLASSIC:
|
||||||
if(wiiuproCtrl == 1)
|
sprintf(msg, "Press any button on the Classic Controller now. Press Home to clear the existing mapping.");
|
||||||
{
|
|
||||||
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.");
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
case CTRLR_NUNCHUK:
|
case CTRLR_NUNCHUK:
|
||||||
sprintf(msg, "Press any button on the Wiimote or Nunchuk now. Press Home to clear the existing mapping.");
|
sprintf(msg, "Press any button on the Wiimote or Nunchuk now. Press Home to clear the existing mapping.");
|
||||||
@ -2407,8 +2329,6 @@ ButtonMappingWindow()
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(pressed == 0)
|
|
||||||
pressed = userInput[0].wupcdata.btns_d;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2438,14 +2358,7 @@ static int MenuSettingsMappingsMap()
|
|||||||
titleTxt.SetAlignment(ALIGN_LEFT, ALIGN_TOP);
|
titleTxt.SetAlignment(ALIGN_LEFT, ALIGN_TOP);
|
||||||
titleTxt.SetPosition(50,30);
|
titleTxt.SetPosition(50,30);
|
||||||
|
|
||||||
if(wiiuproCtrl == 1)
|
sprintf(menuSubtitle, "%s", ctrlrName[mapMenuCtrl]);
|
||||||
{
|
|
||||||
sprintf(menuSubtitle, "%s", "Wii U Pro Controller");
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
sprintf(menuSubtitle, "%s", ctrlrName[mapMenuCtrl]);
|
|
||||||
}
|
|
||||||
GuiText subtitleTxt(menuSubtitle, 20, (GXColor){255, 255, 255, 255});
|
GuiText subtitleTxt(menuSubtitle, 20, (GXColor){255, 255, 255, 255});
|
||||||
subtitleTxt.SetAlignment(ALIGN_LEFT, ALIGN_TOP);
|
subtitleTxt.SetAlignment(ALIGN_LEFT, ALIGN_TOP);
|
||||||
subtitleTxt.SetPosition(50,60);
|
subtitleTxt.SetPosition(50,60);
|
||||||
@ -2575,7 +2488,7 @@ static int MenuSettingsMappingsMap()
|
|||||||
optionBrowser.TriggerUpdate();
|
optionBrowser.TriggerUpdate();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
wiiuproCtrl = 0;
|
|
||||||
HaltGui();
|
HaltGui();
|
||||||
mainWindow->Remove(&optionBrowser);
|
mainWindow->Remove(&optionBrowser);
|
||||||
mainWindow->Remove(&w);
|
mainWindow->Remove(&w);
|
||||||
@ -4721,6 +4634,8 @@ MainMenu (int menu)
|
|||||||
mainWindow->Append(bgBottomImg);
|
mainWindow->Append(bgBottomImg);
|
||||||
mainWindow->Append(btnLogo);
|
mainWindow->Append(btnLogo);
|
||||||
|
|
||||||
|
printf("in main menu()\n");
|
||||||
|
|
||||||
if(currentMenu == MENU_GAMESELECTION)
|
if(currentMenu == MENU_GAMESELECTION)
|
||||||
ResumeGui();
|
ResumeGui();
|
||||||
|
|
||||||
|
@ -8,19 +8,16 @@
|
|||||||
* Network and SMB support routines
|
* Network and SMB support routines
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
|
#include <errno.h>
|
||||||
#include <network.h>
|
#include <network.h>
|
||||||
#include <malloc.h>
|
#include <malloc.h>
|
||||||
#include <ogc/lwp_watchdog.h>
|
#include <ogc/lwp_watchdog.h>
|
||||||
#include <smb.h>
|
#include <smb.h>
|
||||||
#include <mxml.h>
|
|
||||||
|
|
||||||
#include "vbagx.h"
|
#include "vbagx.h"
|
||||||
#include "menu.h"
|
#include "menu.h"
|
||||||
#include "fileop.h"
|
#include "fileop.h"
|
||||||
#include "filebrowser.h"
|
#include "filebrowser.h"
|
||||||
#include "utils/http.h"
|
|
||||||
#include "utils/unzip/unzip.h"
|
|
||||||
#include "utils/unzip/miniunz.h"
|
|
||||||
|
|
||||||
static bool networkInit = false;
|
static bool networkInit = false;
|
||||||
static bool networkShareInit = false;
|
static bool networkShareInit = false;
|
||||||
@ -28,144 +25,6 @@ char wiiIP[16] = { 0 };
|
|||||||
|
|
||||||
#ifdef HW_RVL
|
#ifdef HW_RVL
|
||||||
static int netHalt = 0;
|
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/vbagx-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
|
* InitializeNetwork
|
||||||
@ -313,7 +172,7 @@ bool InitializeNetwork(bool silent)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
networkInit = !(if_config(wiiIP, NULL, NULL, true, 10) < 0);
|
networkInit = !(if_config(wiiIP, NULL, NULL, true) < 0);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
CancelAction();
|
CancelAction();
|
||||||
|
@ -11,13 +11,7 @@
|
|||||||
#ifndef _NETWORKOP_H_
|
#ifndef _NETWORKOP_H_
|
||||||
#define _NETWORKOP_H_
|
#define _NETWORKOP_H_
|
||||||
|
|
||||||
void UpdateCheck();
|
|
||||||
bool DownloadUpdate();
|
|
||||||
void StartNetworkThread();
|
|
||||||
bool InitializeNetwork(bool silent);
|
|
||||||
bool ConnectShare (bool silent);
|
bool ConnectShare (bool silent);
|
||||||
void CloseShare();
|
void CloseShare();
|
||||||
|
|
||||||
extern bool updateFound;
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -12,6 +12,7 @@
|
|||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <dirent.h>
|
#include <dirent.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
#include <ogcsys.h>
|
#include <ogcsys.h>
|
||||||
#include <mxml.h>
|
#include <mxml.h>
|
||||||
|
|
||||||
@ -169,7 +170,6 @@ preparePrefsData ()
|
|||||||
createXMLSetting("LastFileLoaded", "Last File Loaded", GCSettings.LastFileLoaded);
|
createXMLSetting("LastFileLoaded", "Last File Loaded", GCSettings.LastFileLoaded);
|
||||||
createXMLSetting("SaveFolder", "Save Folder", GCSettings.SaveFolder);
|
createXMLSetting("SaveFolder", "Save Folder", GCSettings.SaveFolder);
|
||||||
createXMLSetting("AppendAuto", "Append Auto to .SAV Files", toStr(GCSettings.AppendAuto));
|
createXMLSetting("AppendAuto", "Append Auto to .SAV Files", toStr(GCSettings.AppendAuto));
|
||||||
//createXMLSetting("CheatFolder", "Cheats Folder", GCSettings.CheatFolder);
|
|
||||||
createXMLSetting("ScreenshotsFolder", "Screenshots Folder", GCSettings.ScreenshotsFolder);
|
createXMLSetting("ScreenshotsFolder", "Screenshots Folder", GCSettings.ScreenshotsFolder);
|
||||||
createXMLSetting("BorderFolder", "SGB Borders Folder", GCSettings.BorderFolder);
|
createXMLSetting("BorderFolder", "SGB Borders Folder", GCSettings.BorderFolder);
|
||||||
createXMLSetting("CoverFolder", "Covers Folder", GCSettings.CoverFolder);
|
createXMLSetting("CoverFolder", "Covers Folder", GCSettings.CoverFolder);
|
||||||
@ -460,17 +460,12 @@ decodePrefsData ()
|
|||||||
int verMajor = version[0] - '0';
|
int verMajor = version[0] - '0';
|
||||||
int verMinor = version[2] - '0';
|
int verMinor = version[2] - '0';
|
||||||
int verPoint = version[4] - '0';
|
int verPoint = version[4] - '0';
|
||||||
int curMajor = APPVERSION[0] - '0';
|
|
||||||
int curMinor = APPVERSION[2] - '0';
|
|
||||||
int curPoint = APPVERSION[4] - '0';
|
|
||||||
|
|
||||||
// first we'll check that the versioning is valid
|
// check that the versioning is valid
|
||||||
if(!(verMajor >= 0 && verMajor <= 9 &&
|
if(!(verMajor >= 2 && verMajor <= 9 &&
|
||||||
verMinor >= 0 && verMinor <= 9 &&
|
verMinor >= 0 && verMinor <= 9 &&
|
||||||
verPoint >= 0 && verPoint <= 9))
|
verPoint >= 0 && verPoint <= 9))
|
||||||
result = false;
|
result = false;
|
||||||
else if(verMajor < 2) // less than version 2.0.0
|
|
||||||
result = false; // reset settings (sorry, should update settings instead)
|
|
||||||
else
|
else
|
||||||
result = true;
|
result = true;
|
||||||
}
|
}
|
||||||
|
@ -1,411 +0,0 @@
|
|||||||
/****************************************************************************
|
|
||||||
* Visual Boy Advance GX
|
|
||||||
*
|
|
||||||
* 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 @@
|
|||||||
/****************************************************************************
|
|
||||||
* Visual Boy Advance GX
|
|
||||||
*
|
|
||||||
* Tantric December 2008
|
|
||||||
*
|
|
||||||
* 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 <stdio.h>
|
||||||
#include <malloc.h>
|
#include <malloc.h>
|
||||||
|
#include <string.h>
|
||||||
#include "pngu.h"
|
#include "pngu.h"
|
||||||
#include <png.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 */
|
|
@ -15,7 +15,6 @@
|
|||||||
#include <ogcsys.h>
|
#include <ogcsys.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <wiiuse/wpad.h>
|
#include <wiiuse/wpad.h>
|
||||||
#include <wupc/wupc.h>
|
|
||||||
#include <sys/iosupport.h>
|
#include <sys/iosupport.h>
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
@ -163,7 +162,7 @@ void ShutdownCB()
|
|||||||
{
|
{
|
||||||
ShutdownRequested = 1;
|
ShutdownRequested = 1;
|
||||||
}
|
}
|
||||||
void ResetCB()
|
void ResetCB(u32 irq, void *ctx)
|
||||||
{
|
{
|
||||||
ResetRequested = 1;
|
ResetRequested = 1;
|
||||||
}
|
}
|
||||||
@ -273,7 +272,7 @@ bool SaneIOS(u32 ios)
|
|||||||
static bool gecko = false;
|
static bool gecko = false;
|
||||||
static mutex_t gecko_mutex = 0;
|
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)
|
if (!gecko || len == 0)
|
||||||
return len;
|
return len;
|
||||||
@ -365,12 +364,10 @@ int main(int argc, char *argv[])
|
|||||||
SYS_SetPowerCallback(ShutdownCB);
|
SYS_SetPowerCallback(ShutdownCB);
|
||||||
SYS_SetResetCallback(ResetCB);
|
SYS_SetResetCallback(ResetCB);
|
||||||
|
|
||||||
WUPC_Init();
|
|
||||||
WPAD_Init();
|
WPAD_Init();
|
||||||
WPAD_SetPowerButtonCallback((WPADShutdownCallback)ShutdownCB);
|
WPAD_SetPowerButtonCallback((WPADShutdownCallback)ShutdownCB);
|
||||||
DI_Init();
|
DI_Init();
|
||||||
USBStorage_Initialize();
|
USBStorage_Initialize();
|
||||||
StartNetworkThread();
|
|
||||||
#else
|
#else
|
||||||
DVD_Init (); // Initialize DVD subsystem (GameCube only)
|
DVD_Init (); // Initialize DVD subsystem (GameCube only)
|
||||||
#endif
|
#endif
|
||||||
|
@ -33,7 +33,6 @@
|
|||||||
#include "preferences.h"
|
#include "preferences.h"
|
||||||
#include "fastmath.h"
|
#include "fastmath.h"
|
||||||
#include "utils/pngu.h"
|
#include "utils/pngu.h"
|
||||||
#include "utils/unzip/unzip.h"
|
|
||||||
|
|
||||||
#include "vba/Util.h"
|
#include "vba/Util.h"
|
||||||
#include "vba/common/Port.h"
|
#include "vba/common/Port.h"
|
||||||
|
Loading…
Reference in New Issue
Block a user