From d3d20555832166d209eb9170b372b8a842c07624 Mon Sep 17 00:00:00 2001 From: dimok321 <15055714+dimok789@users.noreply.github.com> Date: Mon, 2 Nov 2009 22:15:28 +0000 Subject: [PATCH] *Changed to download files under their real filename *Small change to the download request function, added filename reading --- gui.pnproj | 2 +- gui.pnps | 2 +- source/network/networkops.cpp | 24 +- source/network/networkops.h | 56 +- source/themes/Theme_Downloader.cpp | 1329 ++++++++++++++-------------- 5 files changed, 717 insertions(+), 696 deletions(-) diff --git a/gui.pnproj b/gui.pnproj index d231f893..286fb2e6 100644 --- a/gui.pnproj +++ b/gui.pnproj @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/gui.pnps b/gui.pnps index 52f4eb57..720a05a3 100644 --- a/gui.pnps +++ b/gui.pnps @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/source/network/networkops.cpp b/source/network/networkops.cpp index 86c86cd1..18ebcbaf 100644 --- a/source/network/networkops.cpp +++ b/source/network/networkops.cpp @@ -99,7 +99,7 @@ bool ShutdownWC24() { return onlinefix; } -s32 network_request(const char * request) { +s32 network_request(const char * request, char * filename) { char buf[1024]; char *ptr = NULL; @@ -122,6 +122,24 @@ s32 network_request(const char * request) { /* HTTP request OK? */ if (!strstr(buf, "HTTP/1.1 200 OK")) return -1; + + if(filename) + { + /* Get filename */ + ptr = strstr(buf, "filename=\""); + + if(ptr) + { + ptr += sizeof("filename=\"")-1; + + for(cnt = 0; ptr[cnt] != '\r' && ptr[cnt] != '\n' && ptr[cnt] != '"'; cnt++) + { + filename[cnt] = ptr[cnt]; + filename[cnt+1] = '\0'; + } + } + } + /* Retrieve content size */ ptr = strstr(buf, "Content-Length:"); if (!ptr) @@ -156,7 +174,7 @@ s32 network_read(u8 *buf, u32 len) { /**************************************************************************** * Download request ***************************************************************************/ -s32 download_request(const char * url) { +s32 download_request(const char * url, char * filename) { //Check if the url starts with "http://", if not it is not considered a valid url if (strncmp(url, "http://", strlen("http://")) != 0) { @@ -190,7 +208,7 @@ s32 download_request(const char * url) { char header[strlen(path)+strlen(domain)+strlen(url)+100]; sprintf(header, "GET %s HTTP/1.1\r\nHost: %s\r\nReferer: %s\r\nConnection: close\r\n\r\n", path, domain, url); - s32 filesize = network_request(header); + s32 filesize = network_request(header, filename); return filesize; } diff --git a/source/network/networkops.h b/source/network/networkops.h index e9717a86..0d7538dc 100644 --- a/source/network/networkops.h +++ b/source/network/networkops.h @@ -1,30 +1,30 @@ -/**************************************************************************** - * Network Operations - * for USB Loader GX - * - * HTTP operations - * Written by dhewg/bushing modified by dimok - ****************************************************************************/ +/**************************************************************************** + * Network Operations + * for USB Loader GX + * + * HTTP operations + * Written by dhewg/bushing modified by dimok + ****************************************************************************/ #ifndef _NETWORKOPS_H_ -#define _NETWORKOPS_H_ - -#define NETWORKBLOCKSIZE 5*1024 //5KB - -void Initialize_Network(void); -bool IsNetworkInit(void); -char * GetNetworkIP(void); -char * GetIncommingIP(void); -bool ShutdownWC24(); -s32 network_request(const char * request); -s32 network_read(u8 *buf, u32 len); -s32 download_request(const char * url); -void CloseConnection(); -int CheckUpdate(); - -void HaltNetworkThread(); -void ResumeNetworkWait(); -void ResumeNetworkThread(); -void InitNetworkThread(); -void ShutdownNetworkThread(); - +#define _NETWORKOPS_H_ + +#define NETWORKBLOCKSIZE 5*1024 //5KB + +void Initialize_Network(void); +bool IsNetworkInit(void); +char * GetNetworkIP(void); +char * GetIncommingIP(void); +bool ShutdownWC24(); +s32 network_request(const char * request, char * filename); +s32 network_read(u8 *buf, u32 len); +s32 download_request(const char * url, char * filename = NULL); +void CloseConnection(); +int CheckUpdate(); + +void HaltNetworkThread(); +void ResumeNetworkWait(); +void ResumeNetworkThread(); +void InitNetworkThread(); +void ShutdownNetworkThread(); + #endif diff --git a/source/themes/Theme_Downloader.cpp b/source/themes/Theme_Downloader.cpp index f121dc44..0d5106aa 100644 --- a/source/themes/Theme_Downloader.cpp +++ b/source/themes/Theme_Downloader.cpp @@ -1,663 +1,666 @@ -/**************************************************************************** - * Theme_Downloader - * USB Loader GX 2009 - * - * Theme downloader for USB Loader GX - * - * Theme_Downloader.cpp - ***************************************************************************/ -#include -#include - -#include "language/gettext.h" -#include "libwiigui/gui.h" -#include "prompts/PromptWindows.h" -#include "prompts/ProgressWindow.h" -#include "network/networkops.h" -#include "themes/Theme_List.h" -#include "menu.h" -#include "filelist.h" -#include "listfiles.h" -#include "sys.h" -#include "network/http.h" -#include "ZipFile.h" - -/*** Extern functions ***/ -extern void ResumeGui(); -extern void HaltGui(); - -/*** Extern variables ***/ -extern GuiWindow * mainWindow; -extern GuiSound * bgMusic; -extern GuiImage * bgImg; -extern u8 shutdown; -extern u8 reset; - - -bool DownloadTheme(const char *url, const char *title) -{ - if(!url) - return false; - - int filesize = download_request(url); - - if(filesize <= 0) - { - WindowPrompt(tr("Download request failed."), 0, tr("OK")); - return false; - } - - char path[300]; - char filepath[300]; - - snprintf(path, sizeof(path), "%s%s", Settings.theme_downloadpath, title); - - subfoldercreate(path); - - snprintf(filepath, sizeof(filepath), "%s/%s.zip", path, title); - - FILE *file = fopen(filepath, "wb"); - if(!file) - { - WindowPrompt(tr("Download failed."), tr("Can't create file"), tr("OK")); - return false; - } - - u32 done = 0; - - int blocksize = 1024; - - u8 *buffer = (u8*) malloc(blocksize); - - while(done < (u32) filesize) - { - if((u32) blocksize > filesize-done) - blocksize = filesize-done; - - ShowProgress(tr("Downloading file"), 0, (char*) title, done, filesize, true); - - int ret = network_read(buffer, blocksize); - if(ret < 0) - { - free(buffer); - fclose(file); - remove(path); - ProgressStop(); - WindowPrompt(tr("Download failed."), tr("Transfer failed."), tr("OK")); - return false; - } - - fwrite(buffer, 1, blocksize, file); - - done += ret; - } - - free(buffer); - fclose(file); - - ProgressStop(); - - ZipFile zipfile(filepath); - - bool result = zipfile.ExtractAll(path); - if(result) - { - remove(filepath); - WindowPrompt(tr("Successfully extracted theme"), title, tr("OK")); - } - else - WindowPrompt(tr("Failed to extract."), tr("Unsupported format, try to extract manually."), tr("OK")); - - return result; -} - - -static void Theme_Prompt(const char *title, const char *author, GuiImageData *thumbimageData, const char *downloadlink) -{ - bool leave = false; - - GuiSound btnSoundOver(button_over_pcm, button_over_pcm_size, SOUND_PCM, Settings.sfxvolume); - GuiSound btnClick(button_click2_pcm, button_click2_pcm_size, SOUND_PCM, Settings.sfxvolume); - - 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), "%stheme_dialogue_box.png", CFG.theme_path); - GuiImageData dialogBox(imgPath, theme_dialogue_box_png); - - GuiImage dialogBoxImg(&dialogBox); - - GuiWindow promptWindow(dialogBox.GetWidth(),dialogBox.GetHeight()); - promptWindow.SetAlignment(ALIGN_CENTRE, ALIGN_MIDDLE); - promptWindow.SetPosition(0, -10); - - GuiTrigger trigA; - trigA.SetSimpleTrigger(-1, WPAD_BUTTON_A | WPAD_CLASSIC_BUTTON_A, PAD_BUTTON_A); - GuiTrigger trigB; - trigB.SetButtonOnlyTrigger(-1, WPAD_BUTTON_B | WPAD_CLASSIC_BUTTON_B, PAD_BUTTON_B); - - GuiText titleTxt(tr("Theme Title:"), 18, THEME.prompttext); - titleTxt.SetAlignment(ALIGN_LEFT, ALIGN_TOP); - titleTxt.SetPosition(230, 30); - - GuiText titleTxt2(title, 18, THEME.prompttext); - titleTxt2.SetAlignment(ALIGN_LEFT, ALIGN_TOP); - titleTxt2.SetPosition(230, 50); - titleTxt2.SetMaxWidth(dialogBox.GetWidth()-220, GuiText::WRAP); - - GuiText authorTxt(tr("Author:"), 18, THEME.prompttext); - authorTxt.SetAlignment(ALIGN_LEFT, ALIGN_TOP); - authorTxt.SetPosition(230, 100); - - GuiText authorTxt2(author, 18, THEME.prompttext); - authorTxt2.SetAlignment(ALIGN_LEFT, ALIGN_TOP); - authorTxt2.SetPosition(230, 120); - authorTxt2.SetMaxWidth(dialogBox.GetWidth()-220, GuiText::DOTTED); - - GuiText downloadBtnTxt(tr("Download") , 22, THEME.prompttext); - downloadBtnTxt.SetMaxWidth(btnOutline.GetWidth()-30); - GuiImage downloadBtnImg(&btnOutline); - if (Settings.wsprompt == yes) - { - downloadBtnTxt.SetWidescreen(CFG.widescreen); - downloadBtnImg.SetWidescreen(CFG.widescreen); - } - GuiButton downloadBtn(&downloadBtnImg,&downloadBtnImg, ALIGN_RIGHT, ALIGN_TOP, -5, 170, &trigA, &btnSoundOver, &btnClick,1); - downloadBtn.SetLabel(&downloadBtnTxt); - downloadBtn.SetScale(0.9); - - GuiText backBtnTxt(tr("Back") , 22, THEME.prompttext); - backBtnTxt.SetMaxWidth(btnOutline.GetWidth()-30); - GuiImage backBtnImg(&btnOutline); - if (Settings.wsprompt == yes) - { - backBtnTxt.SetWidescreen(CFG.widescreen); - backBtnImg.SetWidescreen(CFG.widescreen); - } - GuiButton backBtn(&backBtnImg,&backBtnImg, ALIGN_RIGHT, ALIGN_TOP, -5, 220, &trigA, &btnSoundOver, &btnClick,1); - backBtn.SetLabel(&backBtnTxt); - backBtn.SetTrigger(&trigB); - backBtn.SetScale(0.9); - - GuiImage ThemeImage(thumbimageData); - ThemeImage.SetAlignment(ALIGN_LEFT, ALIGN_TOP); - ThemeImage.SetPosition(20, 10); - ThemeImage.SetScale(0.8); - - ThemeImage.SetScale(0.8); - - promptWindow.Append(&dialogBoxImg); - promptWindow.Append(&ThemeImage); - promptWindow.Append(&titleTxt); - promptWindow.Append(&titleTxt2); - promptWindow.Append(&authorTxt); - promptWindow.Append(&authorTxt2); - promptWindow.Append(&downloadBtn); - promptWindow.Append(&backBtn); - - HaltGui(); - promptWindow.SetEffect(EFFECT_SLIDE_TOP | EFFECT_SLIDE_IN, 50); - mainWindow->SetState(STATE_DISABLED); - mainWindow->Append(&promptWindow); - mainWindow->ChangeFocus(&promptWindow); - ResumeGui(); - - while (!leave) - { - VIDEO_WaitVSync(); - - if (shutdown == 1) - Sys_Shutdown(); - else if (reset == 1) - Sys_Reboot(); - - if (downloadBtn.GetState() == STATE_CLICKED) - { - int choice = WindowPrompt(tr("Do you want to download this theme?"), title, tr("Yes"), tr("Cancel")); - if(choice) - { - DownloadTheme(downloadlink, title); - } - mainWindow->SetState(STATE_DISABLED); - promptWindow.SetState(STATE_DEFAULT); - mainWindow->ChangeFocus(&promptWindow); - downloadBtn.ResetState(); - } - - else if (backBtn.GetState() == STATE_CLICKED) - { - leave = true; - backBtn.ResetState(); - } - } - - promptWindow.SetEffect(EFFECT_SLIDE_TOP | EFFECT_SLIDE_OUT, 50); - while (promptWindow.GetEffect() > 0) usleep(50); - HaltGui(); - mainWindow->Remove(&promptWindow); - mainWindow->SetState(STATE_DEFAULT); - ResumeGui(); -} - - -int Theme_Downloader() -{ - int pagesize = 4; - int menu = MENU_NONE; - bool pagechanged = false; - bool listchanged = false; - - char THEME_LINK[30] = "http://wii.spiffy360.com/"; - - /*** Sound Variables ***/ - GuiSound btnSoundOver(button_over_pcm, button_over_pcm_size, SOUND_PCM, Settings.sfxvolume); - GuiSound btnClick(button_click2_pcm, button_click2_pcm_size, SOUND_PCM, Settings.sfxvolume); - GuiSound btnClick1(button_click_pcm, button_click_pcm_size, SOUND_PCM, Settings.sfxvolume); - - /*** Image Variables ***/ - char imgPath[150]; - snprintf(imgPath, sizeof(imgPath), "%sbutton_dialogue_box.png", CFG.theme_path); - GuiImageData btnOutline(imgPath, button_dialogue_box_png); - - snprintf(imgPath, sizeof(imgPath), "%stheme_box.png", CFG.theme_path); - GuiImageData theme_box_Data(imgPath, theme_box_png); - - snprintf(imgPath, sizeof(imgPath), "%ssettings_background.png", CFG.theme_path); - GuiImageData bgData(imgPath, settings_background_png); - - snprintf(imgPath, sizeof(imgPath), "%sstartgame_arrow_left.png", CFG.theme_path); - GuiImageData arrow_left(imgPath, startgame_arrow_left_png); - - snprintf(imgPath, sizeof(imgPath), "%sstartgame_arrow_right.png", CFG.theme_path); - GuiImageData arrow_right(imgPath, startgame_arrow_right_png); - - snprintf(imgPath, sizeof(imgPath), "%sWifi_btn.png", CFG.theme_path); - GuiImageData wifiImgData(imgPath, Wifi_btn_png); - - snprintf(imgPath, sizeof(imgPath), "%spageindicator.png", CFG.theme_path); - GuiImageData PageindicatorImgData(imgPath, pageindicator_png); - - GuiImage background(&bgData); - - /*** Trigger Variables ***/ - GuiTrigger trigA; - trigA.SetSimpleTrigger(-1, WPAD_BUTTON_A | WPAD_CLASSIC_BUTTON_A, PAD_BUTTON_A); - GuiTrigger trigHome; - trigHome.SetButtonOnlyTrigger(-1, WPAD_BUTTON_HOME | WPAD_CLASSIC_BUTTON_HOME, 0); - GuiTrigger trigB; - trigB.SetButtonOnlyTrigger(-1, WPAD_BUTTON_B | WPAD_CLASSIC_BUTTON_B, PAD_BUTTON_B); - GuiTrigger trigL; - trigL.SetButtonOnlyTrigger(-1, WPAD_BUTTON_LEFT | WPAD_CLASSIC_BUTTON_LEFT, PAD_BUTTON_LEFT); - GuiTrigger trigR; - trigR.SetButtonOnlyTrigger(-1, WPAD_BUTTON_RIGHT | WPAD_CLASSIC_BUTTON_RIGHT, PAD_BUTTON_RIGHT); - GuiTrigger trigMinus; - trigMinus.SetButtonOnlyTrigger(-1, WPAD_BUTTON_MINUS | WPAD_CLASSIC_BUTTON_MINUS, 0); - GuiTrigger trigPlus; - trigPlus.SetButtonOnlyTrigger(-1, WPAD_BUTTON_PLUS | WPAD_CLASSIC_BUTTON_PLUS, 0); - - GuiText titleTxt(tr("Theme Downloader"), 28, (GXColor) {0, 0, 0, 255}); - titleTxt.SetAlignment(ALIGN_CENTRE, ALIGN_TOP); - titleTxt.SetPosition(0,40); - - GuiImageData *ImageData[pagesize]; - GuiImage *Image[pagesize]; - GuiImage *theme_box_img[pagesize]; - GuiButton *MainButton[pagesize]; - GuiText *MainButtonTxt[pagesize]; - Theme_List *Theme = NULL; - - /*** Buttons ***/ - - for (int i = 0; i < pagesize; i++) - { - ImageData[i] = NULL; - Image[i] = NULL; - MainButtonTxt[i] = NULL; - theme_box_img[i] = new GuiImage(&theme_box_Data); - - MainButton[i] = new GuiButton(theme_box_Data.GetWidth(), theme_box_Data.GetHeight()); - MainButton[i]->SetAlignment(ALIGN_LEFT, ALIGN_TOP); - MainButton[i]->SetSoundOver(&btnSoundOver); - MainButton[i]->SetSoundClick(&btnClick1); - MainButton[i]->SetImage(theme_box_img[i]); - MainButton[i]->SetEffectGrow(); - MainButton[i]->SetTrigger(&trigA); - } - - /*** Positions ***/ - MainButton[0]->SetPosition(90, 75); - MainButton[1]->SetPosition(340, 75); - MainButton[2]->SetPosition(90, 230); - MainButton[3]->SetPosition(340, 230); - - GuiText backBtnTxt(tr("Back") , 22, THEME.prompttext); - backBtnTxt.SetMaxWidth(btnOutline.GetWidth()-30); - GuiImage backBtnImg(&btnOutline); - if (Settings.wsprompt == yes) - { - backBtnTxt.SetWidescreen(CFG.widescreen); - backBtnImg.SetWidescreen(CFG.widescreen); - } - GuiButton backBtn(&backBtnImg,&backBtnImg, 2, 3, -180, 400, &trigA, &btnSoundOver, &btnClick,1); - backBtn.SetLabel(&backBtnTxt); - backBtn.SetTrigger(&trigB); - - GuiButton HomeBtn(1,1); - HomeBtn.SetTrigger(&trigHome); - - GuiImage GoLeftImg(&arrow_left); - GuiButton GoLeftBtn(GoLeftImg.GetWidth(), GoLeftImg.GetHeight()); - GoLeftBtn.SetAlignment(ALIGN_LEFT, ALIGN_MIDDLE); - GoLeftBtn.SetPosition(25, -25); - GoLeftBtn.SetImage(&GoLeftImg); - GoLeftBtn.SetSoundOver(&btnSoundOver); - GoLeftBtn.SetSoundClick(&btnClick); - GoLeftBtn.SetEffectGrow(); - GoLeftBtn.SetTrigger(&trigA); - GoLeftBtn.SetTrigger(&trigL); - GoLeftBtn.SetTrigger(&trigMinus); - - GuiImage GoRightImg(&arrow_right); - GuiButton GoRightBtn(GoRightImg.GetWidth(), GoRightImg.GetHeight()); - GoRightBtn.SetAlignment(ALIGN_RIGHT, ALIGN_MIDDLE); - GoRightBtn.SetPosition(-25, -25); - GoRightBtn.SetImage(&GoRightImg); - GoRightBtn.SetSoundOver(&btnSoundOver); - GoRightBtn.SetSoundClick(&btnClick); - GoRightBtn.SetEffectGrow(); - GoRightBtn.SetTrigger(&trigA); - GoRightBtn.SetTrigger(&trigR); - GoRightBtn.SetTrigger(&trigPlus); - - GuiImage PageindicatorImg(&PageindicatorImgData); - GuiText PageindicatorTxt(NULL, 22, (GXColor) { 0, 0, 0, 255}); - GuiButton PageIndicatorBtn(PageindicatorImg.GetWidth(), PageindicatorImg.GetHeight()); - PageIndicatorBtn.SetAlignment(ALIGN_CENTRE, ALIGN_TOP); - PageIndicatorBtn.SetPosition(110, 400); - PageIndicatorBtn.SetImage(&PageindicatorImg); - PageIndicatorBtn.SetLabel(&PageindicatorTxt); - PageIndicatorBtn.SetSoundOver(&btnSoundOver); - PageIndicatorBtn.SetSoundClick(&btnClick1); - PageIndicatorBtn.SetTrigger(&trigA); - PageIndicatorBtn.SetEffectGrow(); - - GuiImage Pageindicator2Img(&PageindicatorImgData); - GuiText Pageindicator2Txt(NULL, 22, (GXColor) { 0, 0, 0, 255}); - GuiButton PageIndicator2Btn(Pageindicator2Img.GetWidth(), Pageindicator2Img.GetHeight()); - PageIndicator2Btn.SetAlignment(ALIGN_CENTRE, ALIGN_TOP); - PageIndicator2Btn.SetPosition(150, 400); - PageIndicator2Btn.SetImage(&Pageindicator2Img); - PageIndicator2Btn.SetLabel(&Pageindicator2Txt); - PageIndicator2Btn.SetSoundOver(&btnSoundOver); - PageIndicator2Btn.SetSoundClick(&btnClick1); - PageIndicator2Btn.SetTrigger(&trigA); - PageIndicator2Btn.SetEffectGrow(); - - GuiImage wifiImg(&wifiImgData); - if (Settings.wsprompt == yes) - { - wifiImg.SetWidescreen(CFG.widescreen); - } - GuiButton wifiBtn(wifiImg.GetWidth(), wifiImg.GetHeight()); - wifiBtn.SetImage(&wifiImg); - wifiBtn.SetPosition(500, 400); - wifiBtn.SetSoundOver(&btnSoundOver); - wifiBtn.SetSoundClick(&btnClick1); - wifiBtn.SetEffectGrow(); - wifiBtn.SetTrigger(&trigA); - - GuiWindow w(screenwidth, screenheight); - - HaltGui(); - w.Append(&background); - mainWindow->Append(&w); - ResumeGui(); - - if(!IsNetworkInit()) - NetworkInitPrompt(); - - char url[300]; - int currentpage = 1; - int currenttheme = 0; - int currentloaderpage = 1; - - while(menu == MENU_NONE) - { - HaltGui(); - w.RemoveAll(); - w.Append(&background); - w.Append(&titleTxt); - w.Append(&backBtn); - w.Append(&GoLeftBtn); - w.Append(&GoRightBtn); - w.Append(&PageIndicatorBtn); - w.Append(&PageIndicator2Btn); - w.Append(&wifiBtn); - w.Append(&HomeBtn); - ResumeGui(); - - ShowProgress(tr("Downloading Page List:"), 0, (char *) tr("Please wait..."), 0, pagesize); - - snprintf(url, sizeof(url), "%sthemes.php?creator=&sort=1&page=%i", THEME_LINK, currentpage); - - if(Theme) - { - delete Theme; - Theme = NULL; - } - Theme = new Theme_List(url); - - sprintf(url, "%i", currentpage); - PageindicatorTxt.SetText(url); - - int SitePageCount = Theme->GetSitepageCount(); - int ThemesOnPage = Theme->GetThemeCount(); - - pagechanged = false; - - if(!ThemesOnPage) - { - WindowPrompt(tr("No themes found on the site."), 0, "OK"); - pagechanged = true; - menu = MENU_SETTINGS; - } - - while(!pagechanged) - { - HaltGui(); - w.RemoveAll(); - w.Append(&background); - w.Append(&titleTxt); - w.Append(&backBtn); - w.Append(&GoLeftBtn); - w.Append(&GoRightBtn); - w.Append(&PageIndicatorBtn); - w.Append(&PageIndicator2Btn); - w.Append(&wifiBtn); - w.Append(&HomeBtn); - ResumeGui(); - - sprintf(url, "%i", currentloaderpage); - Pageindicator2Txt.SetText(url); - - int n = 0; - - for(int i = currenttheme; (i < (currenttheme+pagesize)); i++) - { - ShowProgress(tr("Downloading image:"), 0, (char *) Theme->GetThemeTitle(i), n, pagesize); - - if(MainButtonTxt[n]) - delete MainButtonTxt[n]; - if(ImageData[n]) - delete ImageData[n]; - if(Image[n]) - delete Image[n]; - - MainButtonTxt[n] = NULL; - ImageData[n] = NULL; - Image[n] = NULL; - - if(i < ThemesOnPage) - { - MainButtonTxt[n] = new GuiText(Theme->GetThemeTitle(i), 18, (GXColor) { 0, 0, 0, 255}); - MainButtonTxt[n]->SetAlignment(ALIGN_CENTER, ALIGN_TOP); - MainButtonTxt[n]->SetPosition(0, 10); - MainButtonTxt[n]->SetMaxWidth(theme_box_Data.GetWidth()-10, GuiText::DOTTED); - - if(!Theme->IsDirectImageLink(i)) - sprintf(url, "%s%s", THEME_LINK, Theme->GetImageLink(i)); - else - sprintf(url, "%s", Theme->GetImageLink(i)); - - char filepath[300]; - snprintf(filepath, sizeof(filepath), "%s/tmp/%s.jpg", Settings.theme_downloadpath, Theme->GetThemeTitle(i)); - - FILE * storefile = fopen(filepath, "rb"); - - if(!storefile) - { - struct block file = downloadfile(url); - char storepath[300]; - snprintf(storepath, sizeof(storepath), "%s/tmp/", Settings.theme_downloadpath); - subfoldercreate(storepath); - if(file.data) - { - storefile = fopen(filepath, "wb"); - fwrite(file.data, 1, file.size, storefile); - fclose(storefile); - } - ImageData[n] = new GuiImageData(file.data, file.size); - free(file.data); - } - else - { - fseek(storefile, 0, SEEK_END); - u32 filesize = ftell(storefile); - u8 *buffer = (u8*) malloc(filesize); - rewind(storefile); - fread(buffer, 1, filesize, storefile); - fclose(storefile); - ImageData[n] = new GuiImageData(buffer, filesize); - free(buffer); - buffer = NULL; - } - Image[n] = new GuiImage(ImageData[n]); - Image[n]->SetScale(0.4); - Image[n]->SetPosition(50, -45); - MainButton[n]->SetIcon(Image[n]); - MainButton[n]->SetLabel(MainButtonTxt[n]); - } - n++; - } - - ProgressStop(); - - HaltGui(); - for(int i = 0; i < pagesize; i++) - { - if(MainButtonTxt[i]) - w.Append(MainButton[i]); - } - ResumeGui(); - - listchanged = false; - - while(!listchanged) - { - VIDEO_WaitVSync (); - - if (shutdown == 1) - Sys_Shutdown(); - else if (reset == 1) - Sys_Reboot(); - - else if (wifiBtn.GetState() == STATE_CLICKED) - { - Initialize_Network(); - wifiBtn.ResetState(); - } - else if (backBtn.GetState() == STATE_CLICKED) - { - listchanged = true; - pagechanged = true; - menu = MENU_SETTINGS; - backBtn.ResetState(); - break; - } - else if (GoRightBtn.GetState() == STATE_CLICKED) - { - listchanged = true; - currenttheme += pagesize; - currentloaderpage++; - if(currenttheme >= ThemesOnPage) - { - pagechanged = true; - currentpage++; - if(currentpage > SitePageCount) - currentpage = 1; - - currenttheme = 0; - currentloaderpage = 1; - } - GoRightBtn.ResetState(); - } - else if (GoLeftBtn.GetState() == STATE_CLICKED) - { - listchanged = true; - currenttheme -= pagesize; - currentloaderpage--; - if(currenttheme < 0) - { - pagechanged = true; - currentpage--; - if(currentpage < 1) - currentpage = SitePageCount; - - currenttheme = 0; - currentloaderpage = 1; - } - GoLeftBtn.ResetState(); - } - - for(int i = 0; i < pagesize; i++) - { - if(MainButton[i]->GetState() == STATE_CLICKED) - { - snprintf(url, sizeof(url), "%s%s", THEME_LINK, Theme->GetDownloadLink(currenttheme+i)); - Theme_Prompt(Theme->GetThemeTitle(currenttheme+i), Theme->GetThemeAuthor(currenttheme+i), ImageData[i], url); - MainButton[i]->ResetState(); - } - } - } - } - } - - w.SetEffect(EFFECT_FADE, -20); - - while(w.GetEffect() > 0) usleep(100); - - HaltGui(); - mainWindow->Remove(&w); - - for (int i = 0; i < pagesize; i++) - { - if(MainButton[i]) - delete MainButton[i]; - if(theme_box_img[i]) - delete theme_box_img[i]; - if(ImageData[i]) - delete ImageData[i]; - if(Image[i]) - delete Image[i]; - if(MainButtonTxt[i]) - delete MainButtonTxt[i]; - } - - if(Theme) - delete Theme; - Theme = NULL; - - ResumeGui(); - - return menu; -} +/**************************************************************************** + * Theme_Downloader + * USB Loader GX 2009 + * + * Theme downloader for USB Loader GX + * + * Theme_Downloader.cpp + ***************************************************************************/ +#include +#include + +#include "language/gettext.h" +#include "libwiigui/gui.h" +#include "prompts/PromptWindows.h" +#include "prompts/ProgressWindow.h" +#include "network/networkops.h" +#include "themes/Theme_List.h" +#include "menu.h" +#include "filelist.h" +#include "listfiles.h" +#include "sys.h" +#include "network/http.h" +#include "ZipFile.h" + +/*** Extern functions ***/ +extern void ResumeGui(); +extern void HaltGui(); + +/*** Extern variables ***/ +extern GuiWindow * mainWindow; +extern GuiSound * bgMusic; +extern GuiImage * bgImg; +extern u8 shutdown; +extern u8 reset; + + +bool DownloadTheme(const char *url, const char *title) +{ + if(!url) + return false; + + char filename[255]; + memset(filename, 0, sizeof(filename)); + + int filesize = download_request(url, (char *) &filename); + + if(filesize <= 0) + { + WindowPrompt(tr("Download request failed."), 0, tr("OK")); + return false; + } + + char path[300]; + char filepath[300]; + + snprintf(path, sizeof(path), "%s%s", Settings.theme_downloadpath, title); + + subfoldercreate(path); + + snprintf(filepath, sizeof(filepath), "%s/%s", path, filename); + + FILE *file = fopen(filepath, "wb"); + if(!file) + { + WindowPrompt(tr("Download failed."), tr("Can't create file"), tr("OK")); + return false; + } + + u32 done = 0; + + int blocksize = 1024; + + u8 *buffer = (u8*) malloc(blocksize); + + while(done < (u32) filesize) + { + if((u32) blocksize > filesize-done) + blocksize = filesize-done; + + ShowProgress(tr("Downloading file"), 0, (char*) filename, done, filesize, true); + + int ret = network_read(buffer, blocksize); + if(ret < 0) + { + free(buffer); + fclose(file); + remove(path); + ProgressStop(); + WindowPrompt(tr("Download failed."), tr("Transfer failed."), tr("OK")); + return false; + } + + fwrite(buffer, 1, blocksize, file); + + done += ret; + } + + free(buffer); + fclose(file); + + ProgressStop(); + + ZipFile zipfile(filepath); + + bool result = zipfile.ExtractAll(path); + if(result) + { + remove(filepath); + WindowPrompt(tr("Successfully extracted theme"), title, tr("OK")); + } + else + WindowPrompt(tr("Failed to extract."), tr("Unsupported format, try to extract manually."), tr("OK")); + + return result; +} + + +static void Theme_Prompt(const char *title, const char *author, GuiImageData *thumbimageData, const char *downloadlink) +{ + bool leave = false; + + GuiSound btnSoundOver(button_over_pcm, button_over_pcm_size, SOUND_PCM, Settings.sfxvolume); + GuiSound btnClick(button_click2_pcm, button_click2_pcm_size, SOUND_PCM, Settings.sfxvolume); + + 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), "%stheme_dialogue_box.png", CFG.theme_path); + GuiImageData dialogBox(imgPath, theme_dialogue_box_png); + + GuiImage dialogBoxImg(&dialogBox); + + GuiWindow promptWindow(dialogBox.GetWidth(),dialogBox.GetHeight()); + promptWindow.SetAlignment(ALIGN_CENTRE, ALIGN_MIDDLE); + promptWindow.SetPosition(0, -10); + + GuiTrigger trigA; + trigA.SetSimpleTrigger(-1, WPAD_BUTTON_A | WPAD_CLASSIC_BUTTON_A, PAD_BUTTON_A); + GuiTrigger trigB; + trigB.SetButtonOnlyTrigger(-1, WPAD_BUTTON_B | WPAD_CLASSIC_BUTTON_B, PAD_BUTTON_B); + + GuiText titleTxt(tr("Theme Title:"), 18, THEME.prompttext); + titleTxt.SetAlignment(ALIGN_LEFT, ALIGN_TOP); + titleTxt.SetPosition(230, 30); + + GuiText titleTxt2(title, 18, THEME.prompttext); + titleTxt2.SetAlignment(ALIGN_LEFT, ALIGN_TOP); + titleTxt2.SetPosition(230, 50); + titleTxt2.SetMaxWidth(dialogBox.GetWidth()-220, GuiText::WRAP); + + GuiText authorTxt(tr("Author:"), 18, THEME.prompttext); + authorTxt.SetAlignment(ALIGN_LEFT, ALIGN_TOP); + authorTxt.SetPosition(230, 100); + + GuiText authorTxt2(author, 18, THEME.prompttext); + authorTxt2.SetAlignment(ALIGN_LEFT, ALIGN_TOP); + authorTxt2.SetPosition(230, 120); + authorTxt2.SetMaxWidth(dialogBox.GetWidth()-220, GuiText::DOTTED); + + GuiText downloadBtnTxt(tr("Download") , 22, THEME.prompttext); + downloadBtnTxt.SetMaxWidth(btnOutline.GetWidth()-30); + GuiImage downloadBtnImg(&btnOutline); + if (Settings.wsprompt == yes) + { + downloadBtnTxt.SetWidescreen(CFG.widescreen); + downloadBtnImg.SetWidescreen(CFG.widescreen); + } + GuiButton downloadBtn(&downloadBtnImg,&downloadBtnImg, ALIGN_RIGHT, ALIGN_TOP, -5, 170, &trigA, &btnSoundOver, &btnClick,1); + downloadBtn.SetLabel(&downloadBtnTxt); + downloadBtn.SetScale(0.9); + + GuiText backBtnTxt(tr("Back") , 22, THEME.prompttext); + backBtnTxt.SetMaxWidth(btnOutline.GetWidth()-30); + GuiImage backBtnImg(&btnOutline); + if (Settings.wsprompt == yes) + { + backBtnTxt.SetWidescreen(CFG.widescreen); + backBtnImg.SetWidescreen(CFG.widescreen); + } + GuiButton backBtn(&backBtnImg,&backBtnImg, ALIGN_RIGHT, ALIGN_TOP, -5, 220, &trigA, &btnSoundOver, &btnClick,1); + backBtn.SetLabel(&backBtnTxt); + backBtn.SetTrigger(&trigB); + backBtn.SetScale(0.9); + + GuiImage ThemeImage(thumbimageData); + ThemeImage.SetAlignment(ALIGN_LEFT, ALIGN_TOP); + ThemeImage.SetPosition(20, 10); + ThemeImage.SetScale(0.8); + + ThemeImage.SetScale(0.8); + + promptWindow.Append(&dialogBoxImg); + promptWindow.Append(&ThemeImage); + promptWindow.Append(&titleTxt); + promptWindow.Append(&titleTxt2); + promptWindow.Append(&authorTxt); + promptWindow.Append(&authorTxt2); + promptWindow.Append(&downloadBtn); + promptWindow.Append(&backBtn); + + HaltGui(); + promptWindow.SetEffect(EFFECT_SLIDE_TOP | EFFECT_SLIDE_IN, 50); + mainWindow->SetState(STATE_DISABLED); + mainWindow->Append(&promptWindow); + mainWindow->ChangeFocus(&promptWindow); + ResumeGui(); + + while (!leave) + { + VIDEO_WaitVSync(); + + if (shutdown == 1) + Sys_Shutdown(); + else if (reset == 1) + Sys_Reboot(); + + if (downloadBtn.GetState() == STATE_CLICKED) + { + int choice = WindowPrompt(tr("Do you want to download this theme?"), title, tr("Yes"), tr("Cancel")); + if(choice) + { + DownloadTheme(downloadlink, title); + } + mainWindow->SetState(STATE_DISABLED); + promptWindow.SetState(STATE_DEFAULT); + mainWindow->ChangeFocus(&promptWindow); + downloadBtn.ResetState(); + } + + else if (backBtn.GetState() == STATE_CLICKED) + { + leave = true; + backBtn.ResetState(); + } + } + + promptWindow.SetEffect(EFFECT_SLIDE_TOP | EFFECT_SLIDE_OUT, 50); + while (promptWindow.GetEffect() > 0) usleep(50); + HaltGui(); + mainWindow->Remove(&promptWindow); + mainWindow->SetState(STATE_DEFAULT); + ResumeGui(); +} + + +int Theme_Downloader() +{ + int pagesize = 4; + int menu = MENU_NONE; + bool pagechanged = false; + bool listchanged = false; + + char THEME_LINK[30] = "http://wii.spiffy360.com/"; + + /*** Sound Variables ***/ + GuiSound btnSoundOver(button_over_pcm, button_over_pcm_size, SOUND_PCM, Settings.sfxvolume); + GuiSound btnClick(button_click2_pcm, button_click2_pcm_size, SOUND_PCM, Settings.sfxvolume); + GuiSound btnClick1(button_click_pcm, button_click_pcm_size, SOUND_PCM, Settings.sfxvolume); + + /*** Image Variables ***/ + char imgPath[150]; + snprintf(imgPath, sizeof(imgPath), "%sbutton_dialogue_box.png", CFG.theme_path); + GuiImageData btnOutline(imgPath, button_dialogue_box_png); + + snprintf(imgPath, sizeof(imgPath), "%stheme_box.png", CFG.theme_path); + GuiImageData theme_box_Data(imgPath, theme_box_png); + + snprintf(imgPath, sizeof(imgPath), "%ssettings_background.png", CFG.theme_path); + GuiImageData bgData(imgPath, settings_background_png); + + snprintf(imgPath, sizeof(imgPath), "%sstartgame_arrow_left.png", CFG.theme_path); + GuiImageData arrow_left(imgPath, startgame_arrow_left_png); + + snprintf(imgPath, sizeof(imgPath), "%sstartgame_arrow_right.png", CFG.theme_path); + GuiImageData arrow_right(imgPath, startgame_arrow_right_png); + + snprintf(imgPath, sizeof(imgPath), "%sWifi_btn.png", CFG.theme_path); + GuiImageData wifiImgData(imgPath, Wifi_btn_png); + + snprintf(imgPath, sizeof(imgPath), "%spageindicator.png", CFG.theme_path); + GuiImageData PageindicatorImgData(imgPath, pageindicator_png); + + GuiImage background(&bgData); + + /*** Trigger Variables ***/ + GuiTrigger trigA; + trigA.SetSimpleTrigger(-1, WPAD_BUTTON_A | WPAD_CLASSIC_BUTTON_A, PAD_BUTTON_A); + GuiTrigger trigHome; + trigHome.SetButtonOnlyTrigger(-1, WPAD_BUTTON_HOME | WPAD_CLASSIC_BUTTON_HOME, 0); + GuiTrigger trigB; + trigB.SetButtonOnlyTrigger(-1, WPAD_BUTTON_B | WPAD_CLASSIC_BUTTON_B, PAD_BUTTON_B); + GuiTrigger trigL; + trigL.SetButtonOnlyTrigger(-1, WPAD_BUTTON_LEFT | WPAD_CLASSIC_BUTTON_LEFT, PAD_BUTTON_LEFT); + GuiTrigger trigR; + trigR.SetButtonOnlyTrigger(-1, WPAD_BUTTON_RIGHT | WPAD_CLASSIC_BUTTON_RIGHT, PAD_BUTTON_RIGHT); + GuiTrigger trigMinus; + trigMinus.SetButtonOnlyTrigger(-1, WPAD_BUTTON_MINUS | WPAD_CLASSIC_BUTTON_MINUS, 0); + GuiTrigger trigPlus; + trigPlus.SetButtonOnlyTrigger(-1, WPAD_BUTTON_PLUS | WPAD_CLASSIC_BUTTON_PLUS, 0); + + GuiText titleTxt(tr("Theme Downloader"), 28, (GXColor) {0, 0, 0, 255}); + titleTxt.SetAlignment(ALIGN_CENTRE, ALIGN_TOP); + titleTxt.SetPosition(0,40); + + GuiImageData *ImageData[pagesize]; + GuiImage *Image[pagesize]; + GuiImage *theme_box_img[pagesize]; + GuiButton *MainButton[pagesize]; + GuiText *MainButtonTxt[pagesize]; + Theme_List *Theme = NULL; + + /*** Buttons ***/ + + for (int i = 0; i < pagesize; i++) + { + ImageData[i] = NULL; + Image[i] = NULL; + MainButtonTxt[i] = NULL; + theme_box_img[i] = new GuiImage(&theme_box_Data); + + MainButton[i] = new GuiButton(theme_box_Data.GetWidth(), theme_box_Data.GetHeight()); + MainButton[i]->SetAlignment(ALIGN_LEFT, ALIGN_TOP); + MainButton[i]->SetSoundOver(&btnSoundOver); + MainButton[i]->SetSoundClick(&btnClick1); + MainButton[i]->SetImage(theme_box_img[i]); + MainButton[i]->SetEffectGrow(); + MainButton[i]->SetTrigger(&trigA); + } + + /*** Positions ***/ + MainButton[0]->SetPosition(90, 75); + MainButton[1]->SetPosition(340, 75); + MainButton[2]->SetPosition(90, 230); + MainButton[3]->SetPosition(340, 230); + + GuiText backBtnTxt(tr("Back") , 22, THEME.prompttext); + backBtnTxt.SetMaxWidth(btnOutline.GetWidth()-30); + GuiImage backBtnImg(&btnOutline); + if (Settings.wsprompt == yes) + { + backBtnTxt.SetWidescreen(CFG.widescreen); + backBtnImg.SetWidescreen(CFG.widescreen); + } + GuiButton backBtn(&backBtnImg,&backBtnImg, 2, 3, -180, 400, &trigA, &btnSoundOver, &btnClick,1); + backBtn.SetLabel(&backBtnTxt); + backBtn.SetTrigger(&trigB); + + GuiButton HomeBtn(1,1); + HomeBtn.SetTrigger(&trigHome); + + GuiImage GoLeftImg(&arrow_left); + GuiButton GoLeftBtn(GoLeftImg.GetWidth(), GoLeftImg.GetHeight()); + GoLeftBtn.SetAlignment(ALIGN_LEFT, ALIGN_MIDDLE); + GoLeftBtn.SetPosition(25, -25); + GoLeftBtn.SetImage(&GoLeftImg); + GoLeftBtn.SetSoundOver(&btnSoundOver); + GoLeftBtn.SetSoundClick(&btnClick); + GoLeftBtn.SetEffectGrow(); + GoLeftBtn.SetTrigger(&trigA); + GoLeftBtn.SetTrigger(&trigL); + GoLeftBtn.SetTrigger(&trigMinus); + + GuiImage GoRightImg(&arrow_right); + GuiButton GoRightBtn(GoRightImg.GetWidth(), GoRightImg.GetHeight()); + GoRightBtn.SetAlignment(ALIGN_RIGHT, ALIGN_MIDDLE); + GoRightBtn.SetPosition(-25, -25); + GoRightBtn.SetImage(&GoRightImg); + GoRightBtn.SetSoundOver(&btnSoundOver); + GoRightBtn.SetSoundClick(&btnClick); + GoRightBtn.SetEffectGrow(); + GoRightBtn.SetTrigger(&trigA); + GoRightBtn.SetTrigger(&trigR); + GoRightBtn.SetTrigger(&trigPlus); + + GuiImage PageindicatorImg(&PageindicatorImgData); + GuiText PageindicatorTxt(NULL, 22, (GXColor) { 0, 0, 0, 255}); + GuiButton PageIndicatorBtn(PageindicatorImg.GetWidth(), PageindicatorImg.GetHeight()); + PageIndicatorBtn.SetAlignment(ALIGN_CENTRE, ALIGN_TOP); + PageIndicatorBtn.SetPosition(110, 400); + PageIndicatorBtn.SetImage(&PageindicatorImg); + PageIndicatorBtn.SetLabel(&PageindicatorTxt); + PageIndicatorBtn.SetSoundOver(&btnSoundOver); + PageIndicatorBtn.SetSoundClick(&btnClick1); + PageIndicatorBtn.SetTrigger(&trigA); + PageIndicatorBtn.SetEffectGrow(); + + GuiImage Pageindicator2Img(&PageindicatorImgData); + GuiText Pageindicator2Txt(NULL, 22, (GXColor) { 0, 0, 0, 255}); + GuiButton PageIndicator2Btn(Pageindicator2Img.GetWidth(), Pageindicator2Img.GetHeight()); + PageIndicator2Btn.SetAlignment(ALIGN_CENTRE, ALIGN_TOP); + PageIndicator2Btn.SetPosition(150, 400); + PageIndicator2Btn.SetImage(&Pageindicator2Img); + PageIndicator2Btn.SetLabel(&Pageindicator2Txt); + PageIndicator2Btn.SetSoundOver(&btnSoundOver); + PageIndicator2Btn.SetSoundClick(&btnClick1); + PageIndicator2Btn.SetTrigger(&trigA); + PageIndicator2Btn.SetEffectGrow(); + + GuiImage wifiImg(&wifiImgData); + if (Settings.wsprompt == yes) + { + wifiImg.SetWidescreen(CFG.widescreen); + } + GuiButton wifiBtn(wifiImg.GetWidth(), wifiImg.GetHeight()); + wifiBtn.SetImage(&wifiImg); + wifiBtn.SetPosition(500, 400); + wifiBtn.SetSoundOver(&btnSoundOver); + wifiBtn.SetSoundClick(&btnClick1); + wifiBtn.SetEffectGrow(); + wifiBtn.SetTrigger(&trigA); + + GuiWindow w(screenwidth, screenheight); + + HaltGui(); + w.Append(&background); + mainWindow->Append(&w); + ResumeGui(); + + if(!IsNetworkInit()) + NetworkInitPrompt(); + + char url[300]; + int currentpage = 1; + int currenttheme = 0; + int currentloaderpage = 1; + + while(menu == MENU_NONE) + { + HaltGui(); + w.RemoveAll(); + w.Append(&background); + w.Append(&titleTxt); + w.Append(&backBtn); + w.Append(&GoLeftBtn); + w.Append(&GoRightBtn); + w.Append(&PageIndicatorBtn); + w.Append(&PageIndicator2Btn); + w.Append(&wifiBtn); + w.Append(&HomeBtn); + ResumeGui(); + + ShowProgress(tr("Downloading Page List:"), "", (char *) tr("Please wait..."), 0, pagesize); + + snprintf(url, sizeof(url), "%sthemes.php?creator=&sort=1&page=%i", THEME_LINK, currentpage); + + if(Theme) + { + delete Theme; + Theme = NULL; + } + Theme = new Theme_List(url); + + sprintf(url, "%i", currentpage); + PageindicatorTxt.SetText(url); + + int SitePageCount = Theme->GetSitepageCount(); + int ThemesOnPage = Theme->GetThemeCount(); + + pagechanged = false; + + if(!ThemesOnPage) + { + WindowPrompt(tr("No themes found on the site."), 0, "OK"); + pagechanged = true; + menu = MENU_SETTINGS; + } + + while(!pagechanged) + { + HaltGui(); + w.RemoveAll(); + w.Append(&background); + w.Append(&titleTxt); + w.Append(&backBtn); + w.Append(&GoLeftBtn); + w.Append(&GoRightBtn); + w.Append(&PageIndicatorBtn); + w.Append(&PageIndicator2Btn); + w.Append(&wifiBtn); + w.Append(&HomeBtn); + ResumeGui(); + + sprintf(url, "%i", currentloaderpage); + Pageindicator2Txt.SetText(url); + + int n = 0; + + for(int i = currenttheme; (i < (currenttheme+pagesize)); i++) + { + ShowProgress(tr("Downloading image:"), 0, (char *) Theme->GetThemeTitle(i), n, pagesize); + + if(MainButtonTxt[n]) + delete MainButtonTxt[n]; + if(ImageData[n]) + delete ImageData[n]; + if(Image[n]) + delete Image[n]; + + MainButtonTxt[n] = NULL; + ImageData[n] = NULL; + Image[n] = NULL; + + if(i < ThemesOnPage) + { + MainButtonTxt[n] = new GuiText(Theme->GetThemeTitle(i), 18, (GXColor) { 0, 0, 0, 255}); + MainButtonTxt[n]->SetAlignment(ALIGN_CENTER, ALIGN_TOP); + MainButtonTxt[n]->SetPosition(0, 10); + MainButtonTxt[n]->SetMaxWidth(theme_box_Data.GetWidth()-10, GuiText::DOTTED); + + if(!Theme->IsDirectImageLink(i)) + sprintf(url, "%s%s", THEME_LINK, Theme->GetImageLink(i)); + else + sprintf(url, "%s", Theme->GetImageLink(i)); + + char filepath[300]; + snprintf(filepath, sizeof(filepath), "%s/tmp/%s.jpg", Settings.theme_downloadpath, Theme->GetThemeTitle(i)); + + FILE * storefile = fopen(filepath, "rb"); + + if(!storefile) + { + struct block file = downloadfile(url); + char storepath[300]; + snprintf(storepath, sizeof(storepath), "%s/tmp/", Settings.theme_downloadpath); + subfoldercreate(storepath); + if(file.data) + { + storefile = fopen(filepath, "wb"); + fwrite(file.data, 1, file.size, storefile); + fclose(storefile); + } + ImageData[n] = new GuiImageData(file.data, file.size); + free(file.data); + } + else + { + fseek(storefile, 0, SEEK_END); + u32 filesize = ftell(storefile); + u8 *buffer = (u8*) malloc(filesize); + rewind(storefile); + fread(buffer, 1, filesize, storefile); + fclose(storefile); + ImageData[n] = new GuiImageData(buffer, filesize); + free(buffer); + buffer = NULL; + } + Image[n] = new GuiImage(ImageData[n]); + Image[n]->SetScale(0.4); + Image[n]->SetPosition(50, -45); + MainButton[n]->SetIcon(Image[n]); + MainButton[n]->SetLabel(MainButtonTxt[n]); + } + n++; + } + + ProgressStop(); + + HaltGui(); + for(int i = 0; i < pagesize; i++) + { + if(MainButtonTxt[i]) + w.Append(MainButton[i]); + } + ResumeGui(); + + listchanged = false; + + while(!listchanged) + { + VIDEO_WaitVSync (); + + if (shutdown == 1) + Sys_Shutdown(); + else if (reset == 1) + Sys_Reboot(); + + else if (wifiBtn.GetState() == STATE_CLICKED) + { + Initialize_Network(); + wifiBtn.ResetState(); + } + else if (backBtn.GetState() == STATE_CLICKED) + { + listchanged = true; + pagechanged = true; + menu = MENU_SETTINGS; + backBtn.ResetState(); + break; + } + else if (GoRightBtn.GetState() == STATE_CLICKED) + { + listchanged = true; + currenttheme += pagesize; + currentloaderpage++; + if(currenttheme >= ThemesOnPage) + { + pagechanged = true; + currentpage++; + if(currentpage > SitePageCount) + currentpage = 1; + + currenttheme = 0; + currentloaderpage = 1; + } + GoRightBtn.ResetState(); + } + else if (GoLeftBtn.GetState() == STATE_CLICKED) + { + listchanged = true; + currenttheme -= pagesize; + currentloaderpage--; + if(currenttheme < 0) + { + pagechanged = true; + currentpage--; + if(currentpage < 1) + currentpage = SitePageCount; + + currenttheme = 0; + currentloaderpage = 1; + } + GoLeftBtn.ResetState(); + } + + for(int i = 0; i < pagesize; i++) + { + if(MainButton[i]->GetState() == STATE_CLICKED) + { + snprintf(url, sizeof(url), "%s%s", THEME_LINK, Theme->GetDownloadLink(currenttheme+i)); + Theme_Prompt(Theme->GetThemeTitle(currenttheme+i), Theme->GetThemeAuthor(currenttheme+i), ImageData[i], url); + MainButton[i]->ResetState(); + } + } + } + } + } + + w.SetEffect(EFFECT_FADE, -20); + + while(w.GetEffect() > 0) usleep(100); + + HaltGui(); + mainWindow->Remove(&w); + + for (int i = 0; i < pagesize; i++) + { + if(MainButton[i]) + delete MainButton[i]; + if(theme_box_img[i]) + delete theme_box_img[i]; + if(ImageData[i]) + delete ImageData[i]; + if(Image[i]) + delete Image[i]; + if(MainButtonTxt[i]) + delete MainButtonTxt[i]; + } + + if(Theme) + delete Theme; + Theme = NULL; + + ResumeGui(); + + return menu; +}