*Added Update Button to the Settings which can Update to newer Revs (only seen when in UnlockMode)

**Big Thanks to CorneliousJD for Hosting the DOLs)**

*Reverted ardi's stuff which made codedumps on the Download (sorry ardi commit it again when its fixed)
This commit is contained in:
dimok321 2009-05-28 12:12:52 +00:00
parent 37bfe50fe2
commit f793af2d39
17 changed files with 1664 additions and 1135 deletions

File diff suppressed because one or more lines are too long

View File

@ -26,36 +26,6 @@
#include "main.h" #include "main.h"
#include "cfg.h" #include "cfg.h"
/*! \struct ftgxCharData_
*
* Font face character glyph relevant data structure.
*/
typedef struct ftgxCharData_ {
int16_t renderOffsetX; /**< Texture X axis bearing offset. */
uint16_t glyphAdvanceX; /**< Character glyph X coordinate advance in pixels. */
uint16_t glyphIndex; /**< Charachter glyph index in the font face. */
uint16_t textureWidth; /**< Texture width in pixels/bytes. */
uint16_t textureHeight; /**< Texture glyph height in pixels/bytes. */
int16_t renderOffsetY; /**< Texture Y axis bearing offset. */
int16_t renderOffsetMax; /**< Texture Y axis bearing maximum value. */
int16_t renderOffsetMin; /**< Texture Y axis bearing minimum value. */
uint32_t* glyphDataTexture; /**< Glyph texture bitmap data buffer. */
} ftgxCharData;
/*! \struct ftgxDataOffset_
*
* Offset structure which hold both a maximum and minimum value.
*/
typedef struct ftgxDataOffset_ {
int16_t ascender; /**< Maximum data offset. */
int16_t descender; /**< Minimum data offset. */
int16_t max; /**< Maximum data offset. */
int16_t min; /**< Minimum data offset. */
} ftgxDataOffset;
/** /**
* Default constructor for the FreeTypeGX class. * Default constructor for the FreeTypeGX class.
@ -437,16 +407,16 @@ void FreeTypeGX::loadGlyphData(FT_Bitmap *bmp, ftgxCharData *charData) {
* @param width Current pixel width of the string. * @param width Current pixel width of the string.
* @param format Positional format of the string. * @param format Positional format of the string.
*/ */
int16_t FreeTypeGX::getStyleOffsetWidth(uint16_t width, uint16_t format) { uint16_t FreeTypeGX::getStyleOffsetWidth(uint16_t width, uint16_t format) {
if (format & FTGX_JUSTIFY_LEFT ) { if (format & FTGX_JUSTIFY_LEFT ) {
return 0; return 0;
} }
else if (format & FTGX_JUSTIFY_CENTER ) { else if (format & FTGX_JUSTIFY_CENTER ) {
return -(width >> 1); return width >> 1;
} }
else if (format & FTGX_JUSTIFY_RIGHT ) { else if (format & FTGX_JUSTIFY_RIGHT ) {
return -width; return width;
} }
return 0; return 0;
@ -460,31 +430,15 @@ int16_t FreeTypeGX::getStyleOffsetWidth(uint16_t width, uint16_t format) {
* @param offset Current pixel offset data of the string. * @param offset Current pixel offset data of the string.
* @param format Positional format of the string. * @param format Positional format of the string.
*/ */
int16_t FreeTypeGX::getStyleOffsetHeight(ftgxDataOffset *offset, uint16_t format) uint16_t FreeTypeGX::getStyleOffsetHeight(ftgxDataOffset offset, uint16_t format) {
{ if (format & FTGX_ALIGN_TOP ) {
switch(format & FTGX_ALIGN_MASK) return -offset.max;
{ }
case FTGX_ALIGN_TOP: else if (format & FTGX_ALIGN_MIDDLE ) {
return offset->ascender; return -offset.max;
}
default: else if (format & FTGX_ALIGN_BOTTOM ) {
case FTGX_ALIGN_MIDDLE: return offset.min;
return (offset->ascender + offset->descender + 1) >> 1;
case FTGX_ALIGN_BOTTOM:
return offset->descender;
case FTGX_ALIGN_BASELINE:
return 0;
case FTGX_ALIGN_GLYPH_TOP:
return offset->max;
case FTGX_ALIGN_GLYPH_MIDDLE:
return (offset->max + offset->min + 1) >> 1;
case FTGX_ALIGN_GLYPH_BOTTOM:
return offset->min;
} }
return 0; return 0;
@ -509,13 +463,12 @@ uint16_t FreeTypeGX::drawText(int16_t x, int16_t y, wchar_t *text, GXColor color
uint16_t x_offset = 0, y_offset = 0; uint16_t x_offset = 0, y_offset = 0;
GXTexObj glyphTexture; GXTexObj glyphTexture;
FT_Vector pairDelta; FT_Vector pairDelta;
ftgxDataOffset offset;
if(textStyle & FTGX_JUSTIFY_MASK) { if(textStyle & 0x000F) {
x_offset = this->getStyleOffsetWidth(this->getWidth(text), textStyle); x_offset = this->getStyleOffsetWidth(this->getWidth(text), textStyle);
} }
if(textStyle & FTGX_ALIGN_MASK) { if(textStyle & 0x00F0) {
y_offset = this->getStyleOffsetHeight(this->getOffset(text, &offset), textStyle); y_offset = this->getStyleOffsetHeight(this->getOffset(text), textStyle);
} }
for (uint16_t i = 0; i < strLength; i++) { for (uint16_t i = 0; i < strLength; i++) {
@ -536,15 +489,15 @@ uint16_t FreeTypeGX::drawText(int16_t x, int16_t y, wchar_t *text, GXColor color
} }
GX_InitTexObj(&glyphTexture, glyphData->glyphDataTexture, glyphData->textureWidth, glyphData->textureHeight, this->textureFormat, GX_CLAMP, GX_CLAMP, GX_FALSE); GX_InitTexObj(&glyphTexture, glyphData->glyphDataTexture, glyphData->textureWidth, glyphData->textureHeight, this->textureFormat, GX_CLAMP, GX_CLAMP, GX_FALSE);
this->copyTextureToFramebuffer(&glyphTexture, glyphData->textureWidth, glyphData->textureHeight, x_pos + glyphData->renderOffsetX + x_offset, y - glyphData->renderOffsetY + y_offset, color); this->copyTextureToFramebuffer(&glyphTexture, glyphData->textureWidth, glyphData->textureHeight, x_pos + glyphData->renderOffsetX - x_offset, y - glyphData->renderOffsetY - y_offset, color);
x_pos += glyphData->glyphAdvanceX; x_pos += glyphData->glyphAdvanceX;
printed++; printed++;
} }
} }
if(textStyle & FTGX_STYLE_MASK) { if(textStyle & 0x0F00) {
this->drawTextFeature(x + x_offset, y + y_offset, this->getWidth(text), this->getOffset(text, &offset), textStyle, color); this->drawTextFeature(x - x_offset, y, this->getWidth(text), this->getOffset(text), textStyle, color);
} }
return printed; return printed;
@ -557,22 +510,20 @@ uint16_t FreeTypeGX::drawText(int16_t x, int16_t y, wchar_t const *text, GXColor
return this->drawText(x, y, (wchar_t *)text, color, textStyle); return this->drawText(x, y, (wchar_t *)text, color, textStyle);
} }
void FreeTypeGX::drawTextFeature(int16_t x, int16_t y, uint16_t width, ftgxDataOffset *offsetData, uint16_t format, GXColor color) { void FreeTypeGX::drawTextFeature(int16_t x, int16_t y, uint16_t width, ftgxDataOffset offsetData, uint16_t format, GXColor color) {
uint16_t featureHeight = this->ftPointSize >> 4 > 0 ? this->ftPointSize >> 4 : 1; uint16_t featureHeight = this->ftPointSize >> 4 > 0 ? this->ftPointSize >> 4 : 1;
if (format & FTGX_STYLE_UNDERLINE ) { if (format & FTGX_STYLE_UNDERLINE ) {
switch(format & FTGX_ALIGN_MASK) { switch(format & 0x00F0) {
/*
case FTGX_ALIGN_TOP: case FTGX_ALIGN_TOP:
this->copyFeatureToFramebuffer(width, featureHeight, x, y + offsetData->max + 1, color); this->copyFeatureToFramebuffer(width, featureHeight, x, y + offsetData.max + 1, color);
break; break;
case FTGX_ALIGN_MIDDLE: case FTGX_ALIGN_MIDDLE:
this->copyFeatureToFramebuffer(width, featureHeight, x, y + ((offsetData->max - offsetData->min + 1) >> 1), color); this->copyFeatureToFramebuffer(width, featureHeight, x, y + ((offsetData.max - offsetData.min) >> 1) + 1, color);
break; break;
case FTGX_ALIGN_BOTTOM: case FTGX_ALIGN_BOTTOM:
this->copyFeatureToFramebuffer(width, featureHeight, x, y - offsetData->min, color); this->copyFeatureToFramebuffer(width, featureHeight, x, y - offsetData.min, color);
break; break;
*/
default: default:
this->copyFeatureToFramebuffer(width, featureHeight, x, y + 1, color); this->copyFeatureToFramebuffer(width, featureHeight, x, y + 1, color);
break; break;
@ -580,21 +531,18 @@ void FreeTypeGX::drawTextFeature(int16_t x, int16_t y, uint16_t width, ftgxDataO
} }
if (format & FTGX_STYLE_STRIKE ) { if (format & FTGX_STYLE_STRIKE ) {
switch(format & FTGX_ALIGN_MASK) { switch(format & 0x00F0) {
/*
case FTGX_ALIGN_TOP: case FTGX_ALIGN_TOP:
this->copyFeatureToFramebuffer(width, featureHeight, x, y + ((offsetData->max - offsetData->min + 1) >> 1), color); this->copyFeatureToFramebuffer(width, featureHeight, x, y + ((offsetData.max + offsetData.min) >> 1), color);
break; break;
case FTGX_ALIGN_MIDDLE: case FTGX_ALIGN_MIDDLE:
this->copyFeatureToFramebuffer(width, featureHeight, x, y, color); this->copyFeatureToFramebuffer(width, featureHeight, x, y, color);
break; break;
case FTGX_ALIGN_BOTTOM: case FTGX_ALIGN_BOTTOM:
this->copyFeatureToFramebuffer(width, featureHeight, x, y - ((offsetData->max + offsetData->min) >> 1), color); this->copyFeatureToFramebuffer(width, featureHeight, x, y - ((offsetData.max + offsetData.min) >> 1), color);
break; break;
*/
default: default:
// this->copyFeatureToFramebuffer(width, featureHeight, x, y - ((offsetData->max - offsetData->min) >> 1), color); this->copyFeatureToFramebuffer(width, featureHeight, x, y - ((offsetData.max - offsetData.min) >> 1), color);
this->copyFeatureToFramebuffer(width, featureHeight, x, y - ((offsetData->max) >> 1), color);
break; break;
} }
} }
@ -655,10 +603,9 @@ uint16_t FreeTypeGX::getWidth(wchar_t const *text) {
* @return The height of the text string in pixels. * @return The height of the text string in pixels.
*/ */
uint16_t FreeTypeGX::getHeight(wchar_t *text) { uint16_t FreeTypeGX::getHeight(wchar_t *text) {
ftgxDataOffset offset; ftgxDataOffset offset = this->getOffset(text);
this->getOffset(text, &offset);
return offset.max - offset.min; return offset.max + offset.min;
} }
/** /**
@ -676,12 +623,11 @@ uint16_t FreeTypeGX::getHeight(wchar_t const *text) {
* pixel height below the font origin line and returns the values in an addressible structure. * pixel height below the font origin line and returns the values in an addressible structure.
* *
* @param text NULL terminated string to calculate. * @param text NULL terminated string to calculate.
* @param offset returns the max and min values above and below the font origin line * @return The max and min values above and below the font origin line.
*
*/ */
ftgxDataOffset* FreeTypeGX::getOffset(wchar_t *text, ftgxDataOffset* offset) { ftgxDataOffset FreeTypeGX::getOffset(wchar_t *text) {
uint16_t strLength = wcslen(text); uint16_t strLength = wcslen(text);
int16_t strMax = 0, strMin = 9999; int16_t strMax = 0, strMin = 0;
for (uint16_t i = 0; i < strLength; i++) { for (uint16_t i = 0; i < strLength; i++) {
@ -695,22 +641,19 @@ ftgxDataOffset* FreeTypeGX::getOffset(wchar_t *text, ftgxDataOffset* offset) {
if(glyphData != NULL) { if(glyphData != NULL) {
strMax = glyphData->renderOffsetMax > strMax ? glyphData->renderOffsetMax : strMax; strMax = glyphData->renderOffsetMax > strMax ? glyphData->renderOffsetMax : strMax;
strMin = glyphData->renderOffsetMin < strMin ? glyphData->renderOffsetMin : strMin; strMin = glyphData->renderOffsetMin > strMin ? glyphData->renderOffsetMin : strMin;
} }
} }
offset->ascender = this->ftFace->size->metrics.ascender>>6;
offset->descender = this->ftFace->size->metrics.descender>>6; return (ftgxDataOffset){strMax, strMin};
offset->max = strMax;
offset->min = strMin;
return offset;
} }
/** /**
* *
* \overload * \overload
*/ */
ftgxDataOffset* FreeTypeGX::getOffset(wchar_t const *text, ftgxDataOffset* offset) { ftgxDataOffset FreeTypeGX::getOffset(wchar_t const *text) {
return this->getOffset(text, offset); return this->getOffset(text);
} }
/** /**

View File

@ -20,6 +20,7 @@
* along with FreeTypeGX. If not, see <http://www.gnu.org/licenses/>. * along with FreeTypeGX. If not, see <http://www.gnu.org/licenses/>.
*/ */
/** \mainpage FreeTypeGX /** \mainpage FreeTypeGX
* *
* \section sec_intro Introduction * \section sec_intro Introduction
@ -161,32 +162,47 @@
#include <string.h> #include <string.h>
#include <map> #include <map>
/*! forward deklaration of private structures /*! \struct ftgxCharData_
* *
* Font face character glyph relevant data structure.
*/ */
typedef struct ftgxCharData_ ftgxCharData; typedef struct ftgxCharData_ {
typedef struct ftgxDataOffset_ ftgxDataOffset; int16_t renderOffsetX; /**< Texture X axis bearing offset. */
uint16_t glyphAdvanceX; /**< Character glyph X coordinate advance in pixels. */
uint16_t glyphIndex; /**< Charachter glyph index in the font face. */
uint16_t textureWidth; /**< Texture width in pixels/bytes. */
uint16_t textureHeight; /**< Texture glyph height in pixels/bytes. */
int16_t renderOffsetY; /**< Texture Y axis bearing offset. */
int16_t renderOffsetMax; /**< Texture Y axis bearing maximum value. */
int16_t renderOffsetMin; /**< Texture Y axis bearing minimum value. */
uint32_t* glyphDataTexture; /**< Glyph texture bitmap data buffer. */
} ftgxCharData;
/*! \struct ftgxDataOffset_
*
* Offset structure which hold both a maximum and minimum value.
*/
typedef struct ftgxDataOffset_ {
int16_t max; /**< Maximum data offset. */
int16_t min; /**< Minimum data offset. */
} ftgxDataOffset;
#define _TEXT(t) L ## t /**< Unicode helper macro. */ #define _TEXT(t) L ## t /**< Unicode helper macro. */
#define FTGX_NULL 0x0000 #define FTGX_NULL 0x0000
#define FTGX_JUSTIFY_LEFT 0x0001 #define FTGX_JUSTIFY_LEFT 0x0001
#define FTGX_JUSTIFY_CENTER 0x0002 #define FTGX_JUSTIFY_CENTER 0x0002
#define FTGX_JUSTIFY_RIGHT 0x0003 #define FTGX_JUSTIFY_RIGHT 0x0004
#define FTGX_JUSTIFY_MASK 0x000f
#define FTGX_ALIGN_TOP 0x0010 #define FTGX_ALIGN_TOP 0x0010
#define FTGX_ALIGN_MIDDLE 0x0020 #define FTGX_ALIGN_MIDDLE 0x0020
#define FTGX_ALIGN_BOTTOM 0x0030 #define FTGX_ALIGN_BOTTOM 0x0040
#define FTGX_ALIGN_BASELINE 0x0040
#define FTGX_ALIGN_GLYPH_TOP 0x0050
#define FTGX_ALIGN_GLYPH_MIDDLE 0x0060
#define FTGX_ALIGN_GLYPH_BOTTOM 0x0070
#define FTGX_ALIGN_MASK 0x00f0
#define FTGX_STYLE_UNDERLINE 0x0100 #define FTGX_STYLE_UNDERLINE 0x0100
#define FTGX_STYLE_STRIKE 0x0200 #define FTGX_STYLE_STRIKE 0x0200
#define FTGX_STYLE_MASK 0x0f00
#define FTGX_COMPATIBILITY_DEFAULT_TEVOP_GX_MODULATE 0X0001 #define FTGX_COMPATIBILITY_DEFAULT_TEVOP_GX_MODULATE 0X0001
#define FTGX_COMPATIBILITY_DEFAULT_TEVOP_GX_DECAL 0X0002 #define FTGX_COMPATIBILITY_DEFAULT_TEVOP_GX_DECAL 0X0002
@ -231,8 +247,8 @@ class FreeTypeGX {
static uint16_t adjustTextureWidth(uint16_t textureWidth, uint8_t textureFormat); static uint16_t adjustTextureWidth(uint16_t textureWidth, uint8_t textureFormat);
static uint16_t adjustTextureHeight(uint16_t textureHeight, uint8_t textureFormat); static uint16_t adjustTextureHeight(uint16_t textureHeight, uint8_t textureFormat);
static int16_t getStyleOffsetWidth(uint16_t width, uint16_t format); static uint16_t getStyleOffsetWidth(uint16_t width, uint16_t format);
static int16_t getStyleOffsetHeight(ftgxDataOffset *offset, uint16_t format); static uint16_t getStyleOffsetHeight(ftgxDataOffset offset, uint16_t format);
void unloadFont(); void unloadFont();
ftgxCharData *cacheGlyphData(wchar_t charCode); ftgxCharData *cacheGlyphData(wchar_t charCode);
@ -241,7 +257,7 @@ class FreeTypeGX {
void setDefaultMode(); void setDefaultMode();
void drawTextFeature(int16_t x, int16_t y, uint16_t width, ftgxDataOffset *offsetData, uint16_t format, GXColor color); void drawTextFeature(int16_t x, int16_t y, uint16_t width, ftgxDataOffset offsetData, uint16_t format, GXColor color);
void copyTextureToFramebuffer(GXTexObj *texObj, f32 texWidth, f32 texHeight, int16_t screenX, int16_t screenY, GXColor color); void copyTextureToFramebuffer(GXTexObj *texObj, f32 texWidth, f32 texHeight, int16_t screenX, int16_t screenY, GXColor color);
void copyFeatureToFramebuffer(f32 featureWidth, f32 featureHeight, int16_t screenX, int16_t screenY, GXColor color); void copyFeatureToFramebuffer(f32 featureWidth, f32 featureHeight, int16_t screenX, int16_t screenY, GXColor color);
@ -265,8 +281,8 @@ class FreeTypeGX {
uint16_t getWidth(wchar_t const *text); uint16_t getWidth(wchar_t const *text);
uint16_t getHeight(wchar_t *text); uint16_t getHeight(wchar_t *text);
uint16_t getHeight(wchar_t const *text); uint16_t getHeight(wchar_t const *text);
ftgxDataOffset* getOffset(wchar_t *text, ftgxDataOffset* offset); ftgxDataOffset getOffset(wchar_t *text);
ftgxDataOffset* getOffset(wchar_t const *text, ftgxDataOffset* offset); ftgxDataOffset getOffset(wchar_t const *text);
}; };
#endif /* FREETYPEGX_H_ */ #endif /* FREETYPEGX_H_ */

View File

@ -244,6 +244,7 @@ void CFG_Default(int widescreen) // -1 = non forced Mode
snprintf(CFG.unlockCode, sizeof(CFG.unlockCode), "ab121b"); // default password snprintf(CFG.unlockCode, sizeof(CFG.unlockCode), "ab121b"); // default password
snprintf(CFG.language_path, sizeof(CFG.language_path), "SD:/config/language/"); snprintf(CFG.language_path, sizeof(CFG.language_path), "SD:/config/language/");
snprintf(CFG.oggload_path, sizeof(CFG.oggload_path), "SD:/config/backgroundmusic/"); snprintf(CFG.oggload_path, sizeof(CFG.oggload_path), "SD:/config/backgroundmusic/");
snprintf(CFG.update_path, sizeof(CFG.update_path), "SD:/apps/usbloader_gx/");
sprintf(CFG.ogg_path, "notset"); sprintf(CFG.ogg_path, "notset");
CFG.parentalcontrol = 0; CFG.parentalcontrol = 0;
@ -494,6 +495,10 @@ void cfg_set(char *name, char *val)
strcopy(CFG.language_path, val, sizeof(CFG.language_path)); strcopy(CFG.language_path, val, sizeof(CFG.language_path));
return; return;
} }
if (strcmp(name, "update_path") == 0) {
strcopy(CFG.update_path, val, sizeof(CFG.update_path));
return;
}
if (strcmp(name, "oggload_path") == 0) { if (strcmp(name, "oggload_path") == 0) {
strcopy(CFG.oggload_path, val, sizeof(CFG.oggload_path)); strcopy(CFG.oggload_path, val, sizeof(CFG.oggload_path));
return; return;
@ -1090,6 +1095,7 @@ bool cfg_save_global()// save global settings
fprintf(f, "ogg_path = %s\n ", CFG.ogg_path); fprintf(f, "ogg_path = %s\n ", CFG.ogg_path);
fprintf(f, "wiilight = %d\n ", Settings.wiilight); fprintf(f, "wiilight = %d\n ", Settings.wiilight);
fprintf(f, "gameDisplay = %d\n ", Settings.gameDisplay); fprintf(f, "gameDisplay = %d\n ", Settings.gameDisplay);
fprintf(f, "update_path = %s\n ", CFG.update_path);
fclose(f); fclose(f);
return true; return true;
} }

View File

@ -72,6 +72,7 @@ struct CFG
char language_path[100]; char language_path[100];
char oggload_path[100]; char oggload_path[100];
char ogg_path[150]; char ogg_path[150];
char update_path[150];
short keyset; short keyset;
}; };

View File

@ -51,7 +51,7 @@ return -1;
void SDCard_deInit() void SDCard_deInit()
{ {
//First unmount all the devs... //First unmount all the devs...
fatUnmount("SD"); fatUnmount("SD:/");
//...and then shutdown em! //...and then shutdown em!
__io_wiisd.shutdown(); __io_wiisd.shutdown();
} }

View File

@ -287,4 +287,7 @@ extern const u32 arrangeList_gray_png_size;
extern const u8 arrangeCarosselle_gray_png[]; extern const u8 arrangeCarosselle_gray_png[];
extern const u32 arrangeCarosselle_gray_png_size; extern const u32 arrangeCarosselle_gray_png_size;
extern const u8 updateRev_png[];
extern const u32 updateRev_png_size;
#endif #endif

View File

@ -232,3 +232,14 @@ struct block downloadfile(const char *url)
return file; return file;
} }
s32 GetConnection(char * domain) {
u32 ipaddress = getipbynamecached(domain);
if(ipaddress == 0) {
return -1;
}
s32 connection = server_connect(ipaddress, 80);
return connection;
}

View File

@ -30,6 +30,7 @@ struct block
extern const struct block emptyblock; extern const struct block emptyblock;
struct block downloadfile(const char *url); struct block downloadfile(const char *url);
s32 GetConnection(char * domain);
#ifdef __cplusplus #ifdef __cplusplus
} }

View File

Before

Width:  |  Height:  |  Size: 1.4 KiB

After

Width:  |  Height:  |  Size: 1.4 KiB

View File

@ -74,7 +74,7 @@ snprintf(LANGUAGE.Display, sizeof(LANGUAGE.Display), "Display");
snprintf(LANGUAGE.Doyouwanttoformat, sizeof(LANGUAGE.Doyouwanttoformat), "Do you want to format:"); snprintf(LANGUAGE.Doyouwanttoformat, sizeof(LANGUAGE.Doyouwanttoformat), "Do you want to format:");
snprintf(LANGUAGE.Doyoureallywanttodelete, sizeof(LANGUAGE.Doyoureallywanttodelete), "Do you really want to delete:"); snprintf(LANGUAGE.Doyoureallywanttodelete, sizeof(LANGUAGE.Doyoureallywanttodelete), "Do you really want to delete:");
snprintf(LANGUAGE.Doyouwanttoretryfor30secs, sizeof(LANGUAGE.Doyouwanttoretryfor30secs), "Do you want to retry for 30 secs?"); snprintf(LANGUAGE.Doyouwanttoretryfor30secs, sizeof(LANGUAGE.Doyouwanttoretryfor30secs), "Do you want to retry for 30 secs?");
snprintf(LANGUAGE.Downloadingfile, sizeof(LANGUAGE.Downloadingfile), "Downloading file:"); snprintf(LANGUAGE.Downloadingfile, sizeof(LANGUAGE.Downloadingfile), "Downloading file");
snprintf(LANGUAGE.DownloadBoxartimage, sizeof(LANGUAGE.DownloadBoxartimage), "Download Boxart image?"); snprintf(LANGUAGE.DownloadBoxartimage, sizeof(LANGUAGE.DownloadBoxartimage), "Download Boxart image?");
snprintf(LANGUAGE.Downloadfinished, sizeof(LANGUAGE.Downloadfinished), "Download finished"); snprintf(LANGUAGE.Downloadfinished, sizeof(LANGUAGE.Downloadfinished), "Download finished");
snprintf(LANGUAGE.Defaultgamesettings, sizeof(LANGUAGE.Defaultgamesettings), "Default Gamesettings"); snprintf(LANGUAGE.Defaultgamesettings, sizeof(LANGUAGE.Defaultgamesettings), "Default Gamesettings");
@ -202,6 +202,9 @@ snprintf(LANGUAGE.Timeleft, sizeof(LANGUAGE.Timeleft), "Time left:");
snprintf(LANGUAGE.Unlock, sizeof(LANGUAGE.Unlock), "Unlock"); snprintf(LANGUAGE.Unlock, sizeof(LANGUAGE.Unlock), "Unlock");
snprintf(LANGUAGE.Unicodefix, sizeof(LANGUAGE.Unicodefix), "Unicode Fix"); snprintf(LANGUAGE.Unicodefix, sizeof(LANGUAGE.Unicodefix), "Unicode Fix");
snprintf(LANGUAGE.Uninstall, sizeof(LANGUAGE.Uninstall), "Uninstall"); snprintf(LANGUAGE.Uninstall, sizeof(LANGUAGE.Uninstall), "Uninstall");
snprintf(LANGUAGE.Updatepath, sizeof(LANGUAGE.Updatepath), "Updatepath");
snprintf(LANGUAGE.Updatepathchanged, sizeof(LANGUAGE.Updatepathchanged), "Updatepath changed.");
snprintf(LANGUAGE.Updatefailed, sizeof(LANGUAGE.Updatefailed), "Update failed");
snprintf(LANGUAGE.USBLoaderisprotected, sizeof(LANGUAGE.USBLoaderisprotected), "USB Loader GX is protected"); snprintf(LANGUAGE.USBLoaderisprotected, sizeof(LANGUAGE.USBLoaderisprotected), "USB Loader GX is protected");
snprintf(LANGUAGE.USBDevicenotfound, sizeof(LANGUAGE.USBDevicenotfound), "USB Device not found"); snprintf(LANGUAGE.USBDevicenotfound, sizeof(LANGUAGE.USBDevicenotfound), "USB Device not found");
snprintf(LANGUAGE.VideoMode, sizeof(LANGUAGE.VideoMode), "Video Mode"); snprintf(LANGUAGE.VideoMode, sizeof(LANGUAGE.VideoMode), "Video Mode");
@ -936,6 +939,18 @@ void language_set(char *name, char *val)
strcopy(LANGUAGE.Uninstall, val, sizeof(LANGUAGE.Uninstall)); strcopy(LANGUAGE.Uninstall, val, sizeof(LANGUAGE.Uninstall));
return; return;
} }
if (strcmp(name, "Updatepath") == 0) {
strcopy(LANGUAGE.Updatepath, val, sizeof(LANGUAGE.Updatepath));
return;
}
if (strcmp(name, "Updatepathchanged") == 0) {
strcopy(LANGUAGE.Updatepathchanged, val, sizeof(LANGUAGE.Updatepathchanged));
return;
}
if (strcmp(name, "Updatefailed") == 0) {
strcopy(LANGUAGE.Updatefailed, val, sizeof(LANGUAGE.Updatefailed));
return;
}
if (strcmp(name, "USBLoaderisprotected") == 0) { if (strcmp(name, "USBLoaderisprotected") == 0) {
strcopy(LANGUAGE.USBLoaderisprotected, val, sizeof(LANGUAGE.USBLoaderisprotected)); strcopy(LANGUAGE.USBLoaderisprotected, val, sizeof(LANGUAGE.USBLoaderisprotected));
return; return;

View File

@ -188,6 +188,9 @@ struct LANGUAGE
char Uninstall[50]; char Uninstall[50];
char USBLoaderisprotected[80]; char USBLoaderisprotected[80];
char USBDevicenotfound[80]; char USBDevicenotfound[80];
char Updatepath[50];
char Updatepathchanged[50];
char Updatefailed[40];
char VideoMode[50]; char VideoMode[50];
char VIDTVPatch[50]; char VIDTVPatch[50];
char Volume[50]; char Volume[50];

View File

@ -664,7 +664,7 @@ class GuiText : public GuiElement
//!\param s Font style //!\param s Font style
//!\param h Text alignment (horizontal) //!\param h Text alignment (horizontal)
//!\param v Text alignment (vertical) //!\param v Text alignment (vertical)
static void SetPresets(int sz, GXColor c, int w, int wrap, u16 s, int h, int v); 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);
@ -672,12 +672,14 @@ class GuiText : public GuiElement
//!If the text exceeds this, it is wrapped to the next line //!If the text exceeds this, it is wrapped to the next line
//!\param w Maximum width //!\param w Maximum width
//!\param m WrapMode //!\param m WrapMode
/*
enum { enum {
WRAP, WRAP,
DOTTED, DOTTED,
SCROLL, SCROLL,
MARQUEE MARQUEE
}; };
*/
void SetMaxWidth(int w, short m=GuiText::WRAP); void SetMaxWidth(int w, short m=GuiText::WRAP);
//!Sets the font color //!Sets the font color
//!\param c Font color //!\param c Font color
@ -685,7 +687,7 @@ class GuiText : public GuiElement
//!Sets the FreeTypeGX style attributes //!Sets the FreeTypeGX style attributes
//!\param s Style attributes //!\param s Style attributes
//!\param m Style-Mask attributes //!\param m Style-Mask attributes
void SetStyle(u16 s, u16 m=0xffff); void SetStyle(u16 s/*, u16 m=0xffff*/);
//!Sets the text alignment //!Sets the text alignment
//!\param hor Horizontal alignment (ALIGN_LEFT, ALIGN_RIGHT, ALIGN_CENTRE) //!\param hor Horizontal alignment (ALIGN_LEFT, ALIGN_RIGHT, ALIGN_CENTRE)
//!\param vert Vertical alignment (ALIGN_TOP, ALIGN_BOTTOM, ALIGN_MIDDLE) //!\param vert Vertical alignment (ALIGN_TOP, ALIGN_BOTTOM, ALIGN_MIDDLE)
@ -699,6 +701,12 @@ class GuiText : public GuiElement
void SetWidescreen(bool w); void SetWidescreen(bool w);
//!Constantly called to draw the text //!Constantly called to draw the text
void Draw(); void Draw();
enum {
WRAP,
DOTTED,
SCROLL,
MARQUEE
};
protected: protected:
wchar_t* text; //!< Unicode text value wchar_t* text; //!< Unicode text value
int size; //!< Font size int size; //!< Font size

View File

@ -13,12 +13,12 @@
static int currentSize = 0; static int currentSize = 0;
static int currentWidescreen = 0; static int currentWidescreen = 0;
static int presetSize = 0; static int presetSize = 0;
static GXColor presetColor = (GXColor){255, 255, 255, 255};
static int presetMaxWidth = 0; static int presetMaxWidth = 0;
static int presetWrapMode = 0; static int presetWrapMode = GuiText::WRAP;
static u16 presetStyle = 0;
static int presetAlignmentHor = 0; static int presetAlignmentHor = 0;
static int presetAlignmentVert = 0; static int presetAlignmentVert = 0;
static u16 presetStyle = 0;
static GXColor presetColor = (GXColor){255, 255, 255, 255};
/** /**
* Constructor for the GuiText class. * Constructor for the GuiText class.
@ -35,14 +35,14 @@ GuiText::GuiText(const char * t, int s, GXColor c)
scrollPos1 = 0; scrollPos1 = 0;
scrollPos2 = 0; scrollPos2 = 0;
scrollDelay = 0; scrollDelay = 0;
font = fontSystem; font = NULL;
widescreen = 0; //added widescreen = 0; //added
alignmentHor = ALIGN_CENTRE; alignmentHor = ALIGN_CENTRE;
alignmentVert = ALIGN_MIDDLE; alignmentVert = ALIGN_MIDDLE;
if(t) if(t)
text = FreeTypeGX::charToWideChar((char *)t); text = fontSystem->charToWideChar((char *)t);
} }
/** /**
@ -60,14 +60,14 @@ GuiText::GuiText(const char * t)
scrollPos1 = 0; scrollPos1 = 0;
scrollPos2 = 0; scrollPos2 = 0;
scrollDelay = 0; scrollDelay = 0;
font = fontSystem; font = NULL;
widescreen = 0; //added widescreen = 0; //added
alignmentHor = presetAlignmentHor; alignmentHor = presetAlignmentHor;
alignmentVert = presetAlignmentVert; alignmentVert = presetAlignmentVert;
if(t) if(t)
text = FreeTypeGX::charToWideChar((char *)t); text = fontSystem->charToWideChar((char *)t);
} }
/** /**
@ -90,18 +90,17 @@ void GuiText::SetText(const char * t)
text = NULL; text = NULL;
if(t) if(t)
text = FreeTypeGX::charToWideChar((char *)t); text = fontSystem->charToWideChar((char *)t);
scrollPos2 = 0; scrollPos2 = 0;
scrollDelay = 0; scrollDelay = 0;
} }
void GuiText::SetPresets(int sz, GXColor c, int w, int wrap, u16 s, int h, int v) void GuiText::SetPresets(int sz, GXColor c, int w, u16 s, int h, int v)
{ {
presetSize = sz; presetSize = sz;
presetColor = c; presetColor = c;
presetMaxWidth = w;
presetWrapMode = wrap;
presetStyle = s; presetStyle = s;
presetMaxWidth = w;
presetAlignmentHor = h; presetAlignmentHor = h;
presetAlignmentVert = v; presetAlignmentVert = v;
} }
@ -126,17 +125,16 @@ void GuiText::SetColor(GXColor c)
alpha = c.a; alpha = c.a;
} }
void GuiText::SetStyle(u16 s, u16 m/*=0xffff*/) void GuiText::SetStyle(u16 s)
{ {
LOCK(this); LOCK(this);
style &= ~m; style = s;
style |= s & m;
} }
void GuiText::SetAlignment(int hor, int vert) void GuiText::SetAlignment(int hor, int vert)
{ {
LOCK(this); LOCK(this);
style = FTGX_NULL; style = 0;
switch(hor) switch(hor)
{ {
@ -172,7 +170,7 @@ void GuiText::SetAlignment(int hor, int vert)
void GuiText::SetFont(FreeTypeGX *f) void GuiText::SetFont(FreeTypeGX *f)
{ {
LOCK(this); LOCK(this);
font = f ? f : fontSystem; font = f;
} }
int GuiText::GetTextWidth() int GuiText::GetTextWidth()
@ -182,11 +180,12 @@ int GuiText::GetTextWidth()
if(newSize != currentSize || currentWidescreen != widescreen) if(newSize != currentSize || currentWidescreen != widescreen)
{ {
font->changeSize(newSize, widescreen ? newSize*0.8 : 0); //fontSystem->changeSize(newSize);
(font ? font : fontSystem)->changeSize(newSize, widescreen ? newSize*0.8 : 0);
currentSize = newSize; currentSize = newSize;
currentWidescreen = widescreen; currentWidescreen = widescreen;
} }
return font->getWidth(text); return (font ? font : fontSystem)->getWidth(text);
} }
void GuiText::SetWidescreen(bool w) void GuiText::SetWidescreen(bool w)
@ -213,17 +212,18 @@ void GuiText::Draw()
if(newSize != currentSize || currentWidescreen != widescreen) if(newSize != currentSize || currentWidescreen != widescreen)
{ {
font->changeSize(newSize, widescreen ? newSize*0.8 : 0); //fontSystem->changeSize(newSize);
(font ? font : fontSystem)->changeSize(newSize, widescreen ? newSize*0.8 : 0);
currentSize = newSize; currentSize = newSize;
currentWidescreen = widescreen; currentWidescreen = widescreen;
} }
int voffset = 0; int voffset = 0;
// if(alignmentVert == ALIGN_MIDDLE) if(alignmentVert == ALIGN_MIDDLE)
// voffset = -newSize/2 + 2; voffset = -newSize/2 + 2;
if(maxWidth > 0 && font->getWidth(text) > maxWidth) if(maxWidth > 0 && (font ? font : fontSystem)->getWidth(text) > maxWidth)
{ {
if(wrapMode == GuiText::WRAP) // text wrapping if(wrapMode == GuiText::WRAP) // text wrapping
{ {
@ -246,7 +246,8 @@ void GuiText::Draw()
if(text[ch] == ' ' || ch == strlen-1) if(text[ch] == ' ' || ch == strlen-1)
{ {
if(font->getWidth(tmptext[linenum]) >= maxWidth) if((font ? font : fontSystem)->getWidth(tmptext[linenum]) >= maxWidth)
//if(fontSystem->getWidth(tmptext[linenum]) >= maxWidth)
{ {
if(lastSpace >= 0) if(lastSpace >= 0)
{ {
@ -277,7 +278,7 @@ void GuiText::Draw()
for(i=0; i < linenum; i++) for(i=0; i < linenum; i++)
{ {
font->drawText(this->GetLeft(), this->GetTop()+voffset+i*lineheight, tmptext[i], c, style); (font ? font : fontSystem)->drawText(this->GetLeft(), this->GetTop()+voffset+i*lineheight, tmptext[i], c, style);
delete tmptext[i]; delete tmptext[i];
} }
} }
@ -295,9 +296,9 @@ void GuiText::Draw()
save[i] = text[dotPos+i]; save[i] = text[dotPos+i];
text[dotPos+i] = (i != 3 ? _TEXT('.') : 0); text[dotPos+i] = (i != 3 ? _TEXT('.') : 0);
} }
if((font->getWidth(text)) <= maxWidth) if(((font ? font : fontSystem)->getWidth(text)) <= maxWidth)
{ {
font->drawText(this->GetLeft(), this->GetTop()+voffset, text, c, style); (font ? font : fontSystem)->drawText(this->GetLeft(), this->GetTop()+voffset, text, c, style);
drawed = true; drawed = true;
} }
@ -306,7 +307,7 @@ void GuiText::Draw()
dotPos--; dotPos--;
} }
if(!drawed) if(!drawed)
font->drawText(this->GetLeft(), this->GetTop()+voffset, text, c, style); (font ? font : fontSystem)->drawText(this->GetLeft(), this->GetTop()+voffset, text, c, style);
} }
else if(wrapMode == GuiText::SCROLL) // text scroller else if(wrapMode == GuiText::SCROLL) // text scroller
{ {
@ -315,12 +316,11 @@ void GuiText::Draw()
if(scrollPos2 == 0 || frameCount > scrollDelay+5) if(scrollPos2 == 0 || frameCount > scrollDelay+5)
{ {
scrollPos1 = 0; scrollPos1 = 0;
scrollOffset = 0;
for(scrollPos2 = wcslen(text); scrollPos2 > 1; scrollPos2--) for(scrollPos2 = wcslen(text); scrollPos2 > 1; scrollPos2--)
{ {
save = text[scrollPos2]; // save Pos2 save = text[scrollPos2]; // save Pos2
text[scrollPos2] = 0; text[scrollPos2] = 0;
int textWidth = font->getWidth(text); int textWidth = (font ? font : fontSystem)->getWidth(text);
text[scrollPos2] = save; // restore Pos2 text[scrollPos2] = save; // restore Pos2
if(textWidth <= maxWidth) if(textWidth <= maxWidth)
break; break;
@ -329,22 +329,15 @@ void GuiText::Draw()
} }
else if(scrollPos2 > 0 && frameCount >= scrollDelay) else if(scrollPos2 > 0 && frameCount >= scrollDelay)
{ {
if(--scrollOffset < 0)
{
wchar_t tmp[] = { text[scrollPos1], text[scrollPos1+1], 0 };
scrollOffset += font->getWidth(tmp) - font->getWidth(tmp+1);
scrollPos1++; scrollPos1++;
}
int strlen = wcslen(text); int strlen = wcslen(text);
for(; scrollPos2 < strlen; scrollPos2++) for(; scrollPos2 < strlen; scrollPos2++)
{ {
save = text[scrollPos2+1]; // save Pos2 save = text[scrollPos2+1]; // save Pos2
text[scrollPos2+1] = 0; text[scrollPos2+1] = 0;
int textWidth = font->getWidth(&text[scrollPos1]); int textWidth = (font ? font : fontSystem)->getWidth(&text[scrollPos1]);
text[scrollPos2+1] = save; // restore Pos2 text[scrollPos2+1] = save; // restore Pos2
if(textWidth+scrollOffset > maxWidth) if(textWidth > maxWidth)
break; break;
} }
if(scrollPos2 == strlen) if(scrollPos2 == strlen)
@ -353,28 +346,20 @@ void GuiText::Draw()
scrollDelay = frameCount+25; // when dir-change wait 25 Frames scrollDelay = frameCount+25; // when dir-change wait 25 Frames
} }
else else
scrollDelay = frameCount+1; // wait 1 Frames scrollDelay = frameCount+10; // wait 10 Frames
} }
else if(frameCount >= scrollDelay) else if(frameCount >= scrollDelay)
{ {
scrollPos2 = -scrollPos2; scrollPos2 = -scrollPos2;
scrollOffset++;
wchar_t tmp[] = { text[scrollPos1-1], text[scrollPos1], 0 };
int tmpOffset = font->getWidth(tmp) - font->getWidth(tmp+1);
if(scrollOffset >= tmpOffset)
{
scrollOffset -= tmpOffset;
scrollPos1--; scrollPos1--;
}
for(; scrollPos2 > scrollPos1; scrollPos2--) for(; scrollPos2 > scrollPos1; scrollPos2--)
{ {
save = text[scrollPos2]; // save Pos2 save = text[scrollPos2]; // save Pos2
text[scrollPos2] = 0; text[scrollPos2] = 0;
int textWidth = font->getWidth(&text[scrollPos1]); int textWidth = (font ? font : fontSystem)->getWidth(&text[scrollPos1]);
text[scrollPos2] = save; // restore Pos2 text[scrollPos2] = save; // restore Pos2
if(textWidth+scrollOffset <= maxWidth) if(textWidth <= maxWidth)
break; break;
} }
if(scrollPos1 == 0) if(scrollPos1 == 0)
@ -383,34 +368,19 @@ void GuiText::Draw()
scrollDelay = frameCount+25; // when dir-change wait 25 Frames scrollDelay = frameCount+25; // when dir-change wait 25 Frames
} }
else else
scrollDelay = frameCount+1; // wait 10 Frames scrollDelay = frameCount+10; // wait 10 Frames
scrollPos2 = -scrollPos2; scrollPos2 = -scrollPos2;
} }
uint16_t drawStyle = style;
uint16_t drawX = this->GetLeft() + scrollOffset;
if((drawStyle & FTGX_JUSTIFY_MASK) == FTGX_JUSTIFY_CENTER)
{
drawStyle = (drawStyle & ~FTGX_JUSTIFY_MASK) | FTGX_JUSTIFY_LEFT;
drawX -= maxWidth >> 1;
}
else if((drawStyle & FTGX_JUSTIFY_MASK) == FTGX_JUSTIFY_RIGHT)
{
drawStyle = (drawStyle & ~FTGX_JUSTIFY_MASK) | FTGX_JUSTIFY_LEFT;
drawX -= maxWidth;
}
save = text[abs(scrollPos2)]; // save Pos2 save = text[abs(scrollPos2)]; // save Pos2
text[abs(scrollPos2)] = 0; text[abs(scrollPos2)] = 0;
font->drawText(drawX, this->GetTop()+voffset, &text[scrollPos1], c, drawStyle); (font ? font : fontSystem)->drawText(this->GetLeft(), this->GetTop()+voffset, &text[scrollPos1], c, style);
text[abs(scrollPos2)] = save; // restore Pos2 text[abs(scrollPos2)] = save; // restore Pos2
} }
} }
else else
{ {
font->drawText(this->GetLeft(), this->GetTop()+voffset, text, c, style); (font ? font : fontSystem)->drawText(this->GetLeft(), this->GetTop()+voffset, text, c, style);
} }
this->UpdateEffects(); this->UpdateEffects();
} }

View File

@ -42,6 +42,7 @@
#include "libwiigui/gui_diskcover.h" #include "libwiigui/gui_diskcover.h"
#include "mp3s.h" #include "mp3s.h"
#include "fatmounter.h" #include "fatmounter.h"
#include "updater.h"
#define MAX_CHARACTERS 38 #define MAX_CHARACTERS 38
extern FreeTypeGX *fontClock; //CLOCK extern FreeTypeGX *fontClock; //CLOCK
@ -228,7 +229,7 @@ static void WindowCredits(void * ptr)
txt[i] = new GuiText(LANGUAGE.OfficialSite, 20, (GXColor){255, 255, 255, 255}); txt[i] = new GuiText(LANGUAGE.OfficialSite, 20, (GXColor){255, 255, 255, 255});
txt[i]->SetAlignment(ALIGN_CENTRE, ALIGN_TOP); txt[i]->SetPosition(-180,y); i++; y+=28; txt[i]->SetAlignment(ALIGN_CENTRE, ALIGN_TOP); txt[i]->SetPosition(-180,y); i++; y+=28;
GuiText::SetPresets(22, (GXColor){255, 255, 255, 255}, 0, GuiText::WRAP, txt[i]->SetPresets(22, (GXColor){255, 255, 255, 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("Coding:"); txt[i] = new GuiText("Coding:");
@ -2173,9 +2174,9 @@ ProgressDownloadWindow(int choice2)
if ((Settings.wsprompt == yes) && (CFG.widescreen)){/////////////adjust for widescreen if ((Settings.wsprompt == yes) && (CFG.widescreen)){/////////////adjust for widescreen
progressbarImg.SetPosition(80,40); progressbarImg.SetPosition(80,40);
progressbarImg.SetTile(80*i/cntMissFiles); progressbarImg.SetTile(80*i/cntMissFiles);
} else {
progressbarImg.SetTile(100*i/cntMissFiles);
} }
else{
progressbarImg.SetTile(100*i/cntMissFiles);}
sprintf(msg, "%i %s", cntMissFiles - i, LANGUAGE.filesleft); sprintf(msg, "%i %s", cntMissFiles - i, LANGUAGE.filesleft);
msgTxt.SetText(msg); msgTxt.SetText(msg);
@ -2268,6 +2269,315 @@ ProgressDownloadWindow(int choice2)
} }
} }
/****************************************************************************
* ProgressWindow
*
* Opens a window, which displays progress to the user. Can either display a
* progress bar showing % completion, or a throbber that only shows that an
* action is in progress.
***************************************************************************/
int
ProgressUpdateWindow()
{
int ret = 0, failed = 0;
const unsigned int blocksize = 1024;
char hostip[16];
char * IP = NULL;
u8 blockbuffer[blocksize] ATTRIBUTE_ALIGN(32);
GuiWindow promptWindow(472,320);
promptWindow.SetAlignment(ALIGN_CENTRE, ALIGN_MIDDLE);
promptWindow.SetPosition(0, -10);
GuiSound btnSoundOver(button_over_pcm, button_over_pcm_size, SOUND_PCM, vol);
GuiSound btnClick(button_click2_pcm, button_click2_pcm_size, SOUND_PCM, vol);
char imgPath[100];
snprintf(imgPath, sizeof(imgPath), "%sbutton_dialogue_box.png", CFG.theme_path);
GuiImageData btnOutline(imgPath, button_dialogue_box_png);
snprintf(imgPath, sizeof(imgPath), "%sdialogue_box.png", CFG.theme_path);
GuiImageData dialogBox(imgPath, dialogue_box_png);
GuiTrigger trigA;
trigA.SetSimpleTrigger(-1, WPAD_BUTTON_A | WPAD_CLASSIC_BUTTON_A, PAD_BUTTON_A);
GuiImage dialogBoxImg(&dialogBox);
if (Settings.wsprompt == yes){
dialogBoxImg.SetWidescreen(CFG.widescreen);}
snprintf(imgPath, sizeof(imgPath), "%sprogressbar_outline.png", CFG.theme_path);
GuiImageData progressbarOutline(imgPath, progressbar_outline_png);
GuiImage progressbarOutlineImg(&progressbarOutline);
if (Settings.wsprompt == yes){
progressbarOutlineImg.SetWidescreen(CFG.widescreen);}
progressbarOutlineImg.SetAlignment(ALIGN_LEFT, ALIGN_MIDDLE);
progressbarOutlineImg.SetPosition(25, 7);
snprintf(imgPath, sizeof(imgPath), "%sprogressbar_empty.png", CFG.theme_path);
GuiImageData progressbarEmpty(imgPath, progressbar_empty_png);
GuiImage progressbarEmptyImg(&progressbarEmpty);
progressbarEmptyImg.SetAlignment(ALIGN_LEFT, ALIGN_MIDDLE);
progressbarEmptyImg.SetPosition(25, 7);
progressbarEmptyImg.SetTile(100);
snprintf(imgPath, sizeof(imgPath), "%sprogressbar.png", CFG.theme_path);
GuiImageData progressbar(imgPath, progressbar_png);
progressbarImg.SetAlignment(ALIGN_LEFT, ALIGN_MIDDLE);
progressbarImg.SetPosition(25, 7);
char title[50];
sprintf(title, "%s", "Checking for Updates");
GuiText titleTxt(title, 26, (GXColor){THEME.prompttxt_r, THEME.prompttxt_g, THEME.prompttxt_b, 255}); //{0, 0, 0, 255});
titleTxt.SetAlignment(ALIGN_CENTRE, ALIGN_TOP);
titleTxt.SetPosition(0,50);
char msg[50];
sprintf(msg, "%s", LANGUAGE.InitializingNetwork);
GuiText msgTxt(msg, 26, (GXColor){THEME.prompttxt_r, THEME.prompttxt_g, THEME.prompttxt_b, 255}); //{0, 0, 0, 255});
msgTxt.SetAlignment(ALIGN_CENTRE, ALIGN_TOP);
msgTxt.SetPosition(0,140);
char msg2[50] = " ";
GuiText msg2Txt(msg2, 26, (GXColor){THEME.prompttxt_r, THEME.prompttxt_g, THEME.prompttxt_b, 255}); //{0, 0, 0, 255});
msg2Txt.SetAlignment(ALIGN_CENTRE, ALIGN_MIDDLE);
msg2Txt.SetPosition(0, 50);
prTxt.SetAlignment(ALIGN_CENTRE, ALIGN_MIDDLE);
prTxt.SetPosition(0, 7);
GuiText btn1Txt(LANGUAGE.Cancel, 22, (GXColor){THEME.prompttxt_r, THEME.prompttxt_g, THEME.prompttxt_b, 255}); //{0, 0, 0, 255});
GuiImage btn1Img(&btnOutline);
if (Settings.wsprompt == yes){
btn1Txt.SetWidescreen(CFG.widescreen);
btn1Img.SetWidescreen(CFG.widescreen);}
GuiButton btn1(btnOutline.GetWidth(), btnOutline.GetHeight());
btn1.SetAlignment(ALIGN_CENTRE, ALIGN_BOTTOM);
btn1.SetPosition(0, -40);
btn1.SetLabel(&btn1Txt);
btn1.SetImage(&btn1Img);
btn1.SetSoundOver(&btnSoundOver);
btn1.SetSoundClick(&btnClick);
btn1.SetTrigger(&trigA);
btn1.SetState(STATE_SELECTED);
btn1.SetEffectGrow();
if ((Settings.wsprompt == yes) && (CFG.widescreen)){/////////////adjust for widescreen
progressbarOutlineImg.SetAlignment(ALIGN_CENTRE, ALIGN_MIDDLE);
progressbarOutlineImg.SetPosition(0, 7);
progressbarEmptyImg.SetPosition(80,7);
progressbarEmptyImg.SetTile(78);
progressbarImg.SetPosition(80, 7);
}
promptWindow.Append(&dialogBoxImg);
promptWindow.Append(&titleTxt);
promptWindow.Append(&msgTxt);
promptWindow.Append(&msg2Txt);
promptWindow.Append(&btn1);
promptWindow.SetEffect(EFFECT_SLIDE_TOP | EFFECT_SLIDE_IN, 50);
HaltGui();
mainWindow->SetState(STATE_DISABLED);
mainWindow->Append(&promptWindow);
mainWindow->ChangeFocus(&promptWindow);
ResumeGui();
struct stat st;
if(stat(CFG.update_path, &st) != 0) {
char dir[100];
snprintf(dir,strlen(CFG.update_path),"%s",CFG.update_path);
if (mkdir(dir, 0777) == -1) {
if(subfoldercheck(dir) != 1) {
WindowPrompt(LANGUAGE.Error,LANGUAGE.Cantcreatedirectory,LANGUAGE.ok,0,0,0);
ret = -1;
failed = -1;
}
}
}
char dolpath[150];
char dolpathsuccess[150];
snprintf(dolpath, sizeof(dolpath), "%sbootnew.dol", CFG.update_path);
snprintf(dolpathsuccess, sizeof(dolpathsuccess), "%sboot.dol", CFG.update_path);
while (!IP && !(ret < 0)) {
VIDEO_WaitVSync();
ret = Net_Init(hostip);
if (ret > 0) {
IP = hostip;
msgTxt.SetText(IP);
}
if (ret <= 0) {
msgTxt.SetText(LANGUAGE.Couldnotinitializenetwork);
}
if(btn1.GetState() == STATE_CLICKED) {
IP = 0;
ret = -1;
failed = -1;
btn1.ResetState();
break;
}
}
if(IP && ret >= 0) {
networkisinitialized = 1;
int revnumber = 0;
int currentrev = atoi(SVN_REV);
SDCard_deInit();
struct block file = downloadfile("http://www.techjawa.com/usbloadergx/rev.txt");
FILE *pfile;
SDCard_Init();
if(file.data != NULL)
{
char revtxt[10];
pfile = fopen("SD:/rev.txt", "w");
fwrite(file.data,1,file.size,pfile);
fclose(pfile);
//has to be repeated or it isnt working (first file download bug)
pfile = fopen("SD:/rev.txt", "w");
fwrite(file.data,1,file.size,pfile);
fclose(pfile);
//"w+" doesnt work, needs to be reopened as "r"
pfile = fopen("SD:/rev.txt", "r");
int c = 0, i = 0;
while(c != EOF || i < 10) {
c = fgetc(pfile);
if (c != EOF) {
revtxt[i] = c;
} else {
revtxt[i] = 0x00;
break;
}
i++;
}
fclose(pfile);
revnumber = atoi(revtxt);
remove("SD:/rev.txt");
free(file.data);
}
if(revnumber > currentrev) {
sprintf(msg, "Rev%i available.", revnumber);
int choice = WindowPrompt(msg, "Do you want to update?", LANGUAGE.Yes, LANGUAGE.No, 0, 0);
if(choice == 1) {
sprintf(title, "%s", "Updating USB Loader GX");
titleTxt.SetText(title);
msgTxt.SetPosition(0,100);
promptWindow.Append(&progressbarEmptyImg);
promptWindow.Append(&progressbarImg);
promptWindow.Append(&progressbarOutlineImg);
promptWindow.Append(&prTxt);
sprintf(msg, "Updating to Rev%i", revnumber);
msgTxt.SetText(msg);
int filesize = downloadrev("http://www.techjawa.com/usbloadergx/boot.dol");
if(filesize > 0) {
pfile = fopen(dolpath, "wb");
for (int i = 0; i < filesize; i += blocksize) {
sprintf(prozent, "%i%%", 100*i/filesize);
prTxt.SetText(prozent);
if ((Settings.wsprompt == yes) && (CFG.widescreen)){/////////////adjust for widescreen
progressbarImg.SetTile(80*i/filesize);
} else {
progressbarImg.SetTile(100*i/filesize);
}
sprintf(msg2, "%iKB/%iKB", i/1024, filesize/1024);
msg2Txt.SetText(msg2);
if(btn1.GetState() == STATE_CLICKED) {
fclose(pfile);
remove(dolpath);
failed = -1;
btn1.ResetState();
break;
}
u32 blksize;
blksize = (u32)(filesize - i);
if (blksize > blocksize)
blksize = blocksize;
ret = network_read(blockbuffer, blksize);
if ((u32)ret != blksize) {
failed = -1;
ret = -1;
fclose(pfile);
remove(dolpath);
break;
}
fwrite(blockbuffer,1,blksize, pfile);
}
fclose(pfile);
if(!failed) {
//remove old
if(checkfile(dolpathsuccess)){
remove(dolpathsuccess);
}
//rename new to old
rename(dolpath, dolpathsuccess);
//get the icon.png and the meta.xml
char xmliconpath[150];
file = downloadfile("http://www.techjawa.com/usbloadergx/meta.file");
if(file.data != NULL){
sprintf(xmliconpath, "%smeta.xml", CFG.update_path);
pfile = fopen(xmliconpath, "wb");
fwrite(file.data,1,file.size,pfile);
fclose(pfile);
free(file.data);
}
file = downloadfile("http://www.techjawa.com/usbloadergx/icon.png");
if(file.data != NULL){
sprintf(xmliconpath, "%sicon.png", CFG.update_path);
pfile = fopen(xmliconpath, "wb");
fwrite(file.data,1,file.size,pfile);
fclose(pfile);
free(file.data);
}
}
} else {
failed = -1;
}
} else {
ret = -1;
}
} else {
WindowPrompt("No new updates", 0, "OK", 0, 0, 0);
ret = -1;
}
}
CloseConnection();
if(!failed && ret >= 0) {
WindowPrompt("Successfully updated ", "Restarting the Loader", "OK", 0, 0, 0);
if (*((u32*) 0x80001800)) exit(0);
SYS_ResetSystem(SYS_RETURNTOMENU, 0, 0);
}
promptWindow.SetEffect(EFFECT_SLIDE_TOP | EFFECT_SLIDE_OUT, 50);
while(promptWindow.GetEffect() > 0) usleep(50);
HaltGui();
mainWindow->Remove(&promptWindow);
mainWindow->SetState(STATE_DEFAULT);
ResumeGui();
if(failed != 0)
return failed;
return 1;
}
/**************************************************************************** /****************************************************************************
* UpdateGUI * UpdateGUI
@ -4140,7 +4450,6 @@ static int MenuSettings()
char imgPath[100]; char imgPath[100];
snprintf(imgPath, sizeof(imgPath), "%sbutton_dialogue_box.png", CFG.theme_path); snprintf(imgPath, sizeof(imgPath), "%sbutton_dialogue_box.png", CFG.theme_path);
GuiImageData btnOutline(imgPath, button_dialogue_box_png); GuiImageData btnOutline(imgPath, button_dialogue_box_png);
snprintf(imgPath, sizeof(imgPath), "%ssettings_background.png", CFG.theme_path); snprintf(imgPath, sizeof(imgPath), "%ssettings_background.png", CFG.theme_path);
@ -4151,6 +4460,8 @@ static int MenuSettings()
GuiImageData tab2(imgPath, tab_bg2_png); GuiImageData tab2(imgPath, tab_bg2_png);
snprintf(imgPath, sizeof(imgPath), "%stab_bg3.png", CFG.theme_path); snprintf(imgPath, sizeof(imgPath), "%stab_bg3.png", CFG.theme_path);
GuiImageData tab3(imgPath, tab_bg3_png); GuiImageData tab3(imgPath, tab_bg3_png);
snprintf(imgPath, sizeof(imgPath), "%supdateRev.png", CFG.theme_path);
GuiImageData updateRevImgData(imgPath, updateRev_png);
GuiTrigger trigA; GuiTrigger trigA;
trigA.SetSimpleTrigger(-1, WPAD_BUTTON_A | WPAD_CLASSIC_BUTTON_A, PAD_BUTTON_A); trigA.SetSimpleTrigger(-1, WPAD_BUTTON_A | WPAD_CLASSIC_BUTTON_A, PAD_BUTTON_A);
@ -4249,6 +4560,19 @@ static int MenuSettings()
lockBtn.SetTrigger(&trigA); lockBtn.SetTrigger(&trigA);
lockBtn.SetEffectGrow(); lockBtn.SetEffectGrow();
GuiImage updateBtnImg(&updateRevImgData);
updateBtnImg.SetWidescreen(CFG.widescreen);
GuiButton updateBtn(updateBtnImg.GetWidth(), updateBtnImg.GetHeight());
updateBtn.SetAlignment(ALIGN_CENTRE, ALIGN_TOP);
updateBtn.SetPosition(70, 400);
updateBtn.SetImage(&updateBtnImg);
updateBtn.SetSoundOver(&btnSoundOver);
updateBtn.SetSoundClick(&btnClick);
updateBtn.SetTrigger(&trigA);
updateBtn.SetVisible(false);
updateBtn.SetClickable(false);
updateBtn.SetEffectGrow();
GuiImageData logo(credits_button_png); GuiImageData logo(credits_button_png);
GuiImage logoImg(&logo); GuiImage logoImg(&logo);
GuiImageData logoOver(credits_button_over_png); GuiImageData logoOver(credits_button_over_png);
@ -4295,6 +4619,7 @@ static int MenuSettings()
w.Append(&titleTxt); w.Append(&titleTxt);
w.Append(&backBtn); w.Append(&backBtn);
w.Append(&lockBtn); w.Append(&lockBtn);
w.Append(&updateBtn);
w.Append(btnLogo); w.Append(btnLogo);
w.Append(&homo); w.Append(&homo);
//set triggers for tabs //set triggers for tabs
@ -4372,7 +4697,7 @@ static int MenuSettings()
sprintf(options2.name[3], "%s",LANGUAGE.Unicodefix); sprintf(options2.name[3], "%s",LANGUAGE.Unicodefix);
sprintf(options2.name[4], "%s",LANGUAGE.Backgroundmusic); sprintf(options2.name[4], "%s",LANGUAGE.Backgroundmusic);
sprintf(options2.name[5], "%s",LANGUAGE.Wiilight); sprintf(options2.name[5], "%s",LANGUAGE.Wiilight);
sprintf(options2.name[6], " "); sprintf(options2.name[6], "%s",LANGUAGE.Updatepath);
sprintf(options2.name[7], "%s",LANGUAGE.MP3Menu); sprintf(options2.name[7], "%s",LANGUAGE.MP3Menu);
sprintf(options2.name[8], "%s",LANGUAGE.Defaultsettings); sprintf(options2.name[8], "%s",LANGUAGE.Defaultsettings);
@ -4572,6 +4897,7 @@ static int MenuSettings()
mainWindow->Remove(&page3Btn); mainWindow->Remove(&page3Btn);
w.Remove(&backBtn); w.Remove(&backBtn);
w.Remove(&lockBtn); w.Remove(&lockBtn);
w.Remove(&updateBtn);
char entered[20] = ""; char entered[20] = "";
strncpy(entered, Settings.unlockCode, sizeof(entered)); strncpy(entered, Settings.unlockCode, sizeof(entered));
int result = OnScreenKeyboard(entered, 20,0); int result = OnScreenKeyboard(entered, 20,0);
@ -4582,6 +4908,7 @@ static int MenuSettings()
mainWindow->Append(&page3Btn); mainWindow->Append(&page3Btn);
w.Append(&backBtn); w.Append(&backBtn);
w.Append(&lockBtn); w.Append(&lockBtn);
w.Append(&updateBtn);
if ( result == 1 ) if ( result == 1 )
{ {
strncpy(Settings.unlockCode, entered, sizeof(Settings.unlockCode)); strncpy(Settings.unlockCode, entered, sizeof(Settings.unlockCode));
@ -4620,6 +4947,7 @@ static int MenuSettings()
mainWindow->Remove(&page3Btn); mainWindow->Remove(&page3Btn);
w.Remove(&backBtn); w.Remove(&backBtn);
w.Remove(&lockBtn); w.Remove(&lockBtn);
w.Remove(&updateBtn);
char entered[43] = ""; char entered[43] = "";
strncpy(entered, CFG.covers_path, sizeof(entered)); strncpy(entered, CFG.covers_path, sizeof(entered));
int result = OnScreenKeyboard(entered,43,4); int result = OnScreenKeyboard(entered,43,4);
@ -4630,6 +4958,7 @@ static int MenuSettings()
mainWindow->Append(&page3Btn); mainWindow->Append(&page3Btn);
w.Append(&backBtn); w.Append(&backBtn);
w.Append(&lockBtn); w.Append(&lockBtn);
w.Append(&updateBtn);
if ( result == 1 ) if ( result == 1 )
{ {
int len = (strlen(entered)-1); int len = (strlen(entered)-1);
@ -4657,6 +4986,7 @@ static int MenuSettings()
mainWindow->Remove(&page3Btn); mainWindow->Remove(&page3Btn);
w.Remove(&backBtn); w.Remove(&backBtn);
w.Remove(&lockBtn); w.Remove(&lockBtn);
w.Remove(&updateBtn);
char entered[43] = ""; char entered[43] = "";
strncpy(entered, CFG.disc_path, sizeof(entered)); strncpy(entered, CFG.disc_path, sizeof(entered));
int result = OnScreenKeyboard(entered, 43,4); int result = OnScreenKeyboard(entered, 43,4);
@ -4667,6 +4997,7 @@ static int MenuSettings()
mainWindow->Append(&page3Btn); mainWindow->Append(&page3Btn);
w.Append(&backBtn); w.Append(&backBtn);
w.Append(&lockBtn); w.Append(&lockBtn);
w.Append(&updateBtn);
if ( result == 1 ) if ( result == 1 )
{ {
int len = (strlen(entered)-1); int len = (strlen(entered)-1);
@ -4694,6 +5025,7 @@ static int MenuSettings()
mainWindow->Remove(&page3Btn); mainWindow->Remove(&page3Btn);
w.Remove(&backBtn); w.Remove(&backBtn);
w.Remove(&lockBtn); w.Remove(&lockBtn);
w.Remove(&updateBtn);
char entered[43] = ""; char entered[43] = "";
strncpy(entered, CFG.theme_path, sizeof(entered)); strncpy(entered, CFG.theme_path, sizeof(entered));
int result = OnScreenKeyboard(entered, 43,4); int result = OnScreenKeyboard(entered, 43,4);
@ -4704,6 +5036,7 @@ static int MenuSettings()
mainWindow->Append(&page3Btn); mainWindow->Append(&page3Btn);
w.Append(&backBtn); w.Append(&backBtn);
w.Append(&lockBtn); w.Append(&lockBtn);
w.Append(&updateBtn);
if ( result == 1 ) if ( result == 1 )
{ {
int len = (strlen(entered)-1); int len = (strlen(entered)-1);
@ -4745,6 +5078,7 @@ static int MenuSettings()
w.Append(&titleTxt); w.Append(&titleTxt);
w.Append(&backBtn); w.Append(&backBtn);
w.Append(&lockBtn); w.Append(&lockBtn);
w.Append(&updateBtn);
w.Append(btnLogo); w.Append(btnLogo);
mainWindow->Append(&optionBrowser2); mainWindow->Append(&optionBrowser2);
@ -4754,6 +5088,7 @@ static int MenuSettings()
mainWindow->Append(&page3Btn); mainWindow->Append(&page3Btn);
w.Append(&backBtn); w.Append(&backBtn);
w.Append(&lockBtn); w.Append(&lockBtn);
w.Append(&updateBtn);
} }
} }
else else
@ -4818,7 +5153,15 @@ static int MenuSettings()
else if (Settings.wiilight == 1) sprintf (options2.value[5],"%s",LANGUAGE.ON); else if (Settings.wiilight == 1) sprintf (options2.value[5],"%s",LANGUAGE.ON);
else if (Settings.wiilight == 2) sprintf (options2.value[5],"%s",LANGUAGE.OnlyInstall); else if (Settings.wiilight == 2) sprintf (options2.value[5],"%s",LANGUAGE.OnlyInstall);
sprintf(options2.value[6], " "); if (strlen(CFG.update_path) < (9 + 3)) {
sprintf(cfgtext, "%s", CFG.update_path);
} else {
strncpy(cfgtext, CFG.update_path, 9);
cfgtext[9] = '\0';
strncat(cfgtext, "...", 3);
}
sprintf(options2.value[6], "%s", cfgtext);
sprintf(options2.value[7], "not working!"); sprintf(options2.value[7], "not working!");
sprintf(options2.value[8], " "); sprintf(options2.value[8], " ");
@ -4836,6 +5179,7 @@ static int MenuSettings()
mainWindow->Remove(&page3Btn); mainWindow->Remove(&page3Btn);
w.Remove(&backBtn); w.Remove(&backBtn);
w.Remove(&lockBtn); w.Remove(&lockBtn);
w.Remove(&updateBtn);
char entered[43] = ""; char entered[43] = "";
strncpy(entered, CFG.titlestxt_path, sizeof(entered)); strncpy(entered, CFG.titlestxt_path, sizeof(entered));
int result = OnScreenKeyboard(entered,43,4); int result = OnScreenKeyboard(entered,43,4);
@ -4846,6 +5190,7 @@ static int MenuSettings()
mainWindow->Append(&page3Btn); mainWindow->Append(&page3Btn);
w.Append(&backBtn); w.Append(&backBtn);
w.Append(&lockBtn); w.Append(&lockBtn);
w.Append(&updateBtn);
if ( result == 1 ) if ( result == 1 )
{ {
int len = (strlen(entered)-1); int len = (strlen(entered)-1);
@ -4876,6 +5221,7 @@ static int MenuSettings()
mainWindow->Remove(&page3Btn); mainWindow->Remove(&page3Btn);
w.Remove(&backBtn); w.Remove(&backBtn);
w.Remove(&lockBtn); w.Remove(&lockBtn);
w.Remove(&updateBtn);
char entered[40] = ""; char entered[40] = "";
strncpy(entered, CFG.language_path, sizeof(entered)); strncpy(entered, CFG.language_path, sizeof(entered));
int result = OnScreenKeyboard(entered, 40,0); int result = OnScreenKeyboard(entered, 40,0);
@ -4886,6 +5232,7 @@ static int MenuSettings()
mainWindow->Append(&page3Btn); mainWindow->Append(&page3Btn);
w.Append(&backBtn); w.Append(&backBtn);
w.Append(&lockBtn); w.Append(&lockBtn);
w.Append(&updateBtn);
if ( result == 1 ) if ( result == 1 )
{ strncpy(CFG.language_path, entered, sizeof(CFG.language_path)); { strncpy(CFG.language_path, entered, sizeof(CFG.language_path));
if(isSdInserted()) { if(isSdInserted()) {
@ -4932,6 +5279,40 @@ static int MenuSettings()
WindowPrompt(LANGUAGE.NoSDcardinserted, LANGUAGE.InsertaSDCardtousethatoption, LANGUAGE.ok, 0,0,0); WindowPrompt(LANGUAGE.NoSDcardinserted, LANGUAGE.InsertaSDCardtousethatoption, LANGUAGE.ok, 0,0,0);
} }
break; break;
case 6:
if ( CFG.godmode == 1)
{
mainWindow->Remove(&optionBrowser2);
mainWindow->Remove(&page1Btn);
mainWindow->Remove(&page2Btn);
mainWindow->Remove(&tabBtn);
mainWindow->Remove(&page3Btn);
w.Remove(&backBtn);
w.Remove(&lockBtn);
w.Remove(&updateBtn);
char entered[43] = "";
strncpy(entered, CFG.update_path, sizeof(entered));
int result = OnScreenKeyboard(entered,43,4);
mainWindow->Append(&optionBrowser2);
mainWindow->Append(&page1Btn);
mainWindow->Append(&page2Btn);
mainWindow->Append(&tabBtn);
mainWindow->Append(&page3Btn);
w.Append(&backBtn);
w.Append(&lockBtn);
w.Append(&updateBtn);
if ( result == 1 )
{
int len = (strlen(entered)-1);
if(entered[len] !='/')
strncat (entered, "/", 1);
strncpy(CFG.update_path, entered, sizeof(CFG.update_path));
WindowPrompt(LANGUAGE.Updatepathchanged,0,LANGUAGE.ok,0,0,0);
}
} else {
WindowPrompt(0,LANGUAGE.Consoleshouldbeunlockedtomodifyit,LANGUAGE.ok,0,0,0);
}
break;
case 8: case 8:
int choice = WindowPrompt(LANGUAGE.Areyousure, 0, LANGUAGE.Yes, LANGUAGE.Cancel, 0, 0); int choice = WindowPrompt(LANGUAGE.Areyousure, 0, LANGUAGE.Yes, LANGUAGE.Cancel, 0, 0);
if(choice == 1) { if(choice == 1) {
@ -4992,6 +5373,34 @@ static int MenuSettings()
break; break;
} }
if(updateBtn.GetState() == STATE_CLICKED) {
if(isSdInserted() && CFG.godmode) {
mainWindow->Remove(&optionBrowser2);
mainWindow->Remove(&page1Btn);
mainWindow->Remove(&page2Btn);
mainWindow->Remove(&tabBtn);
mainWindow->Remove(&page3Btn);
w.Remove(&backBtn);
w.Remove(&lockBtn);
w.Remove(&updateBtn);
int ret = ProgressUpdateWindow();
if(ret < 0) {
WindowPrompt(LANGUAGE.Updatefailed,0,LANGUAGE.ok,0,0,0);
}
mainWindow->Append(&optionBrowser2);
mainWindow->Append(&page1Btn);
mainWindow->Append(&page2Btn);
mainWindow->Append(&tabBtn);
mainWindow->Append(&page3Btn);
w.Append(&backBtn);
w.Append(&lockBtn);
w.Append(&updateBtn);
} else {
WindowPrompt(LANGUAGE.NoSDcardinserted, LANGUAGE.InsertaSDCardtousethatoption, LANGUAGE.ok, 0,0,0);
}
updateBtn.ResetState();
}
if(lockBtn.GetState() == STATE_CLICKED) if(lockBtn.GetState() == STATE_CLICKED)
{ {
if (!strcmp("", Settings.unlockCode)) if (!strcmp("", Settings.unlockCode))
@ -5008,6 +5417,7 @@ static int MenuSettings()
mainWindow->Remove(&page3Btn); mainWindow->Remove(&page3Btn);
w.Remove(&backBtn); w.Remove(&backBtn);
w.Remove(&lockBtn); w.Remove(&lockBtn);
w.Remove(&updateBtn);
char entered[20] = ""; char entered[20] = "";
int result = OnScreenKeyboard(entered, 20,0); int result = OnScreenKeyboard(entered, 20,0);
mainWindow->Append(&optionBrowser2); mainWindow->Append(&optionBrowser2);
@ -5017,6 +5427,7 @@ static int MenuSettings()
mainWindow->Append(&page3Btn); mainWindow->Append(&page3Btn);
w.Append(&backBtn); w.Append(&backBtn);
w.Append(&lockBtn); w.Append(&lockBtn);
w.Append(&updateBtn);
mainWindow->Append(&tabBtn); mainWindow->Append(&tabBtn);
if ( result == 1 ) { if ( result == 1 ) {
if (!strcmp(entered, Settings.unlockCode)) //if password correct if (!strcmp(entered, Settings.unlockCode)) //if password correct
@ -5087,6 +5498,13 @@ static int MenuSettings()
homo.ResetState(); homo.ResetState();
} }
} }
if(CFG.godmode) {
updateBtn.SetVisible(true);
updateBtn.SetClickable(true);
} else {
updateBtn.SetVisible(false);
updateBtn.SetClickable(false);
}
if(settingsbackgroundbtn.GetState() == STATE_CLICKED) if(settingsbackgroundbtn.GetState() == STATE_CLICKED)
{ {
optionBrowser2.SetFocus(1); optionBrowser2.SetFocus(1);

116
source/updater.c Normal file
View File

@ -0,0 +1,116 @@
#include <stdio.h>
#include <string.h>
#include <ogcsys.h>
#include <network.h>
#include "http.h"
static s32 connection;
s32 network_request(const char * request)
{
char buf[1024];
char *ptr = NULL;
u32 cnt, size;
s32 ret;
/* Send request */
ret = net_send(connection, request, strlen(request), 0);
if (ret < 0)
return ret;
/* Clear buffer */
memset(buf, 0, sizeof(buf));
/* Read HTTP header */
for (cnt = 0; !strstr(buf, "\r\n\r\n"); cnt++)
if (net_recv(connection, buf + cnt, 1, 0) <= 0)
return -1;
/* HTTP request OK? */
if (!strstr(buf, "HTTP/1.1 200 OK"))
return -1;
/* Retrieve content size */
ptr = strstr(buf, "Content-Length:");
if (!ptr)
return -1;
sscanf(ptr, "Content-Length: %u", &size);
return size;
}
s32 network_read(void *buf, u32 len)
{
s32 read = 0, ret;
/* Data to be read */
while (read < len) {
/* Read network data */
ret = net_read(connection, buf + read, len - read);
if (ret < 0)
return ret;
/* Read finished */
if (!ret)
break;
/* Increment read variable */
read += ret;
}
return read;
}
s32 downloadrev(const char * url) {
//Check if the url starts with "http://", if not it is not considered a valid url
if(strncmp(url, "http://", strlen("http://")) != 0)
{
//printf("URL '%s' doesn't start with 'http://'\n", url);
return -1;
}
//Locate the path part of the url by searching for '/' past "http://"
char *path = strchr(url + strlen("http://"), '/');
//At the very least the url has to end with '/', ending with just a domain is invalid
if(path == NULL)
{
//printf("URL '%s' has no PATH part\n", url);
return -1;
}
//Extract the domain part out of the url
int domainlength = path - url - strlen("http://");
if(domainlength == 0)
{
//printf("No domain part in URL '%s'\n", url);
return -1;
}
char domain[domainlength + 1];
strncpy(domain, url + strlen("http://"), domainlength);
domain[domainlength] = '\0';
connection = GetConnection(domain);
if(connection < 0) {
return -1;
}
//Form a nice request header to send to the webserver
char* headerformat = "GET %s HTTP/1.1\r\nHost: %s\r\nConnection: close\r\n\r\n";;
char header[strlen(headerformat) + strlen(domain) + strlen(path)];
sprintf(header, headerformat, path, domain);
s32 filesize = network_request(header);
return filesize;
}
void CloseConnection() {
net_close(connection);
}

18
source/updater.h Normal file
View File

@ -0,0 +1,18 @@
#ifndef _UPDATER_H_
#define _UPDATER_H_
#ifdef __cplusplus
extern "C"
{
#endif
s32 network_request(const char * request);
s32 network_read(void *buf, u32 len);
s32 downloadrev(const char * url);
void CloseConnection();
#ifdef __cplusplus
}
#endif
#endif