/**************************************************************************** * HomebrewBrowse * USB Loader GX 2009 * * Homebrew launcher for USB Loader GX * * homebrewbrowse.cpp ***************************************************************************/ #include #include #include "language/gettext.h" #include "libwiigui/gui.h" #include "prompts/TitleBrowser.h" #include "prompts/PromptWindows.h" #include "prompts/ProgressWindow.h" #include "homebrewboot/HomebrewFiles.h" #include "homebrewboot/HomebrewXML.h" #include "homebrewboot/BootHomebrew.h" #include "network/networkops.h" #include "menu.h" #include "menu/menus.h" #include "filelist.h" #include "sys.h" #include "network/http.h" #include #include "settings/cfg.h" #include "unzip/unzip.h" #include "unzip/miniunz.h" #include "usbloader/utils.h" /*** Extern functions ***/ extern void ResumeGui(); extern void HaltGui(); /*** Extern variables ***/ extern GuiImage * bgImg; extern u32 infilesize; extern u32 uncfilesize; extern char wiiloadVersion[2]; extern u8 shutdown; extern u8 reset; extern struct SSettings Settings; /*** Variables used elsewhere ***/ u8 boothomebrew = 0; /**************************************************************************** * roundup Function ***************************************************************************/ int roundup( float number ) { if ( number == ( int ) number ) return ( int ) number; else return ( int ) ( number + 1 ); } /**************************************************************************** * MenuHomebrewBrowse ***************************************************************************/ int MenuHomebrewBrowse() { int menu = MENU_NONE; int choice = 0; HomebrewFiles HomebrewFiles( Settings.homebrewapps_path ); u32 filecount = HomebrewFiles.GetFilecount(); if ( !filecount ) { WindowPrompt( tr( "No .dol or .elf files found." ), 0, tr( "OK" ) ); return MENU_DISCLIST; } enum { FADE, LEFT, RIGHT }; if ( IsNetworkInit() ) ResumeNetworkWait(); int slidedirection = FADE; /*** Sound Variables ***/ GuiSound btnSoundOver( button_over_pcm, button_over_pcm_size, Settings.sfxvolume ); // because destroy GuiSound must wait while sound playing is finished, we use a global sound if ( !btnClick2 ) btnClick2 = new GuiSound( button_click2_pcm, button_click2_pcm_size, Settings.sfxvolume ); // GuiSound btnClick(button_click2_pcm, button_click2_pcm_size, Settings.sfxvolume); GuiSound btnClick1( button_click_pcm, button_click_pcm_size, 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 ), "%ssettings_background.png", CFG.theme_path ); GuiImageData bgData( imgPath, settings_background_png ); snprintf( imgPath, sizeof( imgPath ), "%ssettings_title.png", CFG.theme_path ); GuiImageData MainButtonImgData( imgPath, settings_title_png ); snprintf( imgPath, sizeof( imgPath ), "%ssettings_title_over.png", CFG.theme_path ); GuiImageData MainButtonImgOverData( imgPath, settings_title_over_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 ), "%sChannel_btn.png", CFG.theme_path ); GuiImageData channelImgData( imgPath, Channel_btn_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( "Homebrew Launcher" ), 28, ( GXColor ) {0, 0, 0, 255} ); titleTxt.SetAlignment( ALIGN_CENTRE, ALIGN_TOP ); titleTxt.SetPosition( 0, 40 ); GuiImageData *IconData[4]; GuiImage *IconImg[4]; for ( int i = 0; i < 4; i++ ) { IconData[i] = NULL; IconImg[i] = NULL; } /*** Buttons ***/ 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, btnClick2, 1 ); backBtn.SetLabel( &backBtnTxt ); backBtn.SetTrigger( &trigB ); GuiButton homo( 1, 1 ); homo.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( btnClick2 ); 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( btnClick2 ); GoRightBtn.SetEffectGrow(); GoRightBtn.SetTrigger( &trigA ); GoRightBtn.SetTrigger( &trigR ); GoRightBtn.SetTrigger( &trigPlus ); char MainButtonText[50]; snprintf( MainButtonText, sizeof( MainButtonText ), "%s", " " ); GuiImage MainButton1Img( &MainButtonImgData ); GuiImage MainButton1ImgOver( &MainButtonImgOverData ); GuiText MainButton1Txt( MainButtonText, 18, ( GXColor ) {0, 0, 0, 255} ); MainButton1Txt.SetMaxWidth( MainButton1Img.GetWidth() - 150, DOTTED ); MainButton1Txt.SetAlignment( ALIGN_LEFT, ALIGN_MIDDLE ); MainButton1Txt.SetPosition( 148, -12 ); GuiText MainButton1DescTxt( MainButtonText, 18, ( GXColor ) {0, 0, 0, 255} ); MainButton1DescTxt.SetMaxWidth( MainButton1Img.GetWidth() - 150, DOTTED ); MainButton1DescTxt.SetAlignment( ALIGN_LEFT, ALIGN_MIDDLE ); MainButton1DescTxt.SetPosition( 148, 15 ); GuiText MainButton1DescOverTxt( MainButtonText, 18, ( GXColor ) { 0, 0, 0, 255} ); MainButton1DescOverTxt.SetMaxWidth( MainButton1Img.GetWidth() - 150, SCROLL_HORIZONTAL ); MainButton1DescOverTxt.SetAlignment( ALIGN_LEFT, ALIGN_MIDDLE ); MainButton1DescOverTxt.SetPosition( 148, 15 ); GuiButton MainButton1( MainButton1Img.GetWidth(), MainButton1Img.GetHeight() ); MainButton1.SetAlignment( ALIGN_CENTRE, ALIGN_TOP ); MainButton1.SetPosition( 0, 90 ); MainButton1.SetImage( &MainButton1Img ); MainButton1.SetImageOver( &MainButton1ImgOver ); MainButton1.SetLabel( &MainButton1Txt ); MainButton1.SetLabel( &MainButton1DescTxt, 1 ); MainButton1.SetLabelOver( &MainButton1DescOverTxt, 1 ); MainButton1.SetSoundOver( &btnSoundOver ); MainButton1.SetSoundClick( &btnClick1 ); MainButton1.SetEffectGrow(); MainButton1.SetTrigger( &trigA ); GuiImage MainButton2Img( &MainButtonImgData ); GuiImage MainButton2ImgOver( &MainButtonImgOverData ); GuiText MainButton2Txt( MainButtonText, 18, ( GXColor ) {0, 0, 0, 255 } ); MainButton2Txt.SetAlignment( ALIGN_LEFT, ALIGN_MIDDLE ); MainButton2Txt.SetPosition( 148, -12 ); MainButton2Txt.SetMaxWidth( MainButton2Img.GetWidth() - 150, DOTTED ); GuiText MainButton2DescTxt( MainButtonText, 18, ( GXColor ) { 0, 0, 0, 255} ); MainButton2DescTxt.SetAlignment( ALIGN_LEFT, ALIGN_MIDDLE ); MainButton2DescTxt.SetPosition( 148, 15 ); MainButton2DescTxt.SetMaxWidth( MainButton2Img.GetWidth() - 150, DOTTED ); GuiText MainButton2DescOverTxt( MainButtonText, 18, ( GXColor ) {0, 0, 0, 255} ); MainButton2DescOverTxt.SetAlignment( ALIGN_LEFT, ALIGN_MIDDLE ); MainButton2DescOverTxt.SetPosition( 148, 15 ); MainButton2DescOverTxt.SetMaxWidth( MainButton2Img.GetWidth() - 150, SCROLL_HORIZONTAL ); GuiButton MainButton2( MainButton2Img.GetWidth(), MainButton2Img.GetHeight() ); MainButton2.SetAlignment( ALIGN_CENTRE, ALIGN_TOP ); MainButton2.SetPosition( 0, 160 ); MainButton2.SetImage( &MainButton2Img ); MainButton2.SetImageOver( &MainButton2ImgOver ); MainButton2.SetLabel( &MainButton2Txt ); MainButton2.SetLabel( &MainButton2DescTxt, 1 ); MainButton2.SetLabelOver( &MainButton2DescOverTxt, 1 ); MainButton2.SetSoundOver( &btnSoundOver ); MainButton2.SetSoundClick( &btnClick1 ); MainButton2.SetEffectGrow(); MainButton2.SetTrigger( &trigA ); GuiImage MainButton3Img( &MainButtonImgData ); GuiImage MainButton3ImgOver( &MainButtonImgOverData ); GuiText MainButton3Txt( MainButtonText, 18, ( GXColor ) {0, 0, 0, 255} ); MainButton3Txt.SetAlignment( ALIGN_LEFT, ALIGN_MIDDLE ); MainButton3Txt.SetPosition( 148, -12 ); MainButton3Txt.SetMaxWidth( MainButton3Img.GetWidth() - 150, DOTTED ); GuiText MainButton3DescTxt( MainButtonText, 18, ( GXColor ) { 0, 0, 0, 255} ); MainButton3DescTxt.SetAlignment( ALIGN_LEFT, ALIGN_MIDDLE ); MainButton3DescTxt.SetPosition( 148, 15 ); MainButton3DescTxt.SetMaxWidth( MainButton3Img.GetWidth() - 150, DOTTED ); GuiText MainButton3DescOverTxt( MainButtonText, 18, ( GXColor ) {0, 0, 0, 255 } ); MainButton3DescOverTxt.SetAlignment( ALIGN_LEFT, ALIGN_MIDDLE ); MainButton3DescOverTxt.SetPosition( 148, 15 ); MainButton3DescOverTxt.SetMaxWidth( MainButton3Img.GetWidth() - 150, SCROLL_HORIZONTAL ); GuiButton MainButton3( MainButton3Img.GetWidth(), MainButton3Img.GetHeight() ); MainButton3.SetAlignment( ALIGN_CENTRE, ALIGN_TOP ); MainButton3.SetPosition( 0, 230 ); MainButton3.SetImage( &MainButton3Img ); MainButton3.SetImageOver( &MainButton3ImgOver ); MainButton3.SetLabel( &MainButton3Txt ); MainButton3.SetLabel( &MainButton3DescTxt, 1 ); MainButton3.SetLabelOver( &MainButton3DescOverTxt, 1 ); MainButton3.SetSoundOver( &btnSoundOver ); MainButton3.SetSoundClick( &btnClick1 ); MainButton3.SetEffectGrow(); MainButton3.SetTrigger( &trigA ); GuiImage MainButton4Img( &MainButtonImgData ); GuiImage MainButton4ImgOver( &MainButtonImgOverData ); GuiText MainButton4Txt( MainButtonText, 18, ( GXColor ) {0, 0, 0, 255} ); MainButton4Txt.SetAlignment( ALIGN_LEFT, ALIGN_MIDDLE ); MainButton4Txt.SetPosition( 148, -12 ); MainButton4Txt.SetMaxWidth( MainButton4Img.GetWidth() - 150, DOTTED ); GuiText MainButton4DescTxt( MainButtonText, 18, ( GXColor ) {0, 0, 0, 255} ); MainButton4DescTxt.SetAlignment( ALIGN_LEFT, ALIGN_MIDDLE ); MainButton4DescTxt.SetPosition( 148, 15 ); MainButton4DescTxt.SetMaxWidth( MainButton4Img.GetWidth() - 150, DOTTED ); GuiText MainButton4DescOverTxt( MainButtonText, 18, ( GXColor ) { 0, 0, 0, 255} ); MainButton4DescOverTxt.SetAlignment( ALIGN_LEFT, ALIGN_MIDDLE ); MainButton4DescOverTxt.SetPosition( 148, 15 ); MainButton4DescOverTxt.SetMaxWidth( MainButton4Img.GetWidth() - 150, SCROLL_HORIZONTAL ); GuiButton MainButton4( MainButton4Img.GetWidth(), MainButton4Img.GetHeight() ); MainButton4.SetAlignment( ALIGN_CENTRE, ALIGN_TOP ); MainButton4.SetPosition( 0, 300 ); MainButton4.SetImage( &MainButton4Img ); MainButton4.SetImageOver( &MainButton4ImgOver ); MainButton4.SetLabel( &MainButton4Txt ); MainButton4.SetLabel( &MainButton4DescTxt, 1 ); MainButton4.SetLabelOver( &MainButton4DescOverTxt, 1 ); MainButton4.SetSoundOver( &btnSoundOver ); MainButton4.SetSoundClick( &btnClick1 ); MainButton4.SetEffectGrow(); MainButton4.SetTrigger( &trigA ); 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.SetAlpha( 80 ); wifiBtn.SetTrigger( &trigA ); GuiImage channelBtnImg( &channelImgData ); channelBtnImg.SetWidescreen( CFG.widescreen ); GuiButton channelBtn( channelBtnImg.GetWidth(), channelBtnImg.GetHeight() ); channelBtn.SetAlignment( ALIGN_LEFT, ALIGN_TOP ); channelBtn.SetPosition( 440, 400 ); channelBtn.SetImage( &channelBtnImg ); channelBtn.SetSoundOver( &btnSoundOver ); channelBtn.SetSoundClick( btnClick2 ); channelBtn.SetEffectGrow(); channelBtn.SetTrigger( &trigA ); GuiTooltip * titleTT = NULL; GuiWindow w( screenwidth, screenheight ); /*** XML Variables ***/ HomebrewXML XMLInfo[4]; int pageToDisplay = 1; const int pages = roundup( filecount / 4.0f ); bool wifi_btn_loaded = false; while ( menu == MENU_NONE ) //set pageToDisplay to 0 to quit { VIDEO_WaitVSync (); menu = MENU_NONE; bool changed = false; int fileoffset = pageToDisplay * 4 - 4; /** Standard procedure made in all pages **/ MainButton1.StopEffect(); MainButton2.StopEffect(); MainButton3.StopEffect(); MainButton4.StopEffect(); if ( slidedirection == RIGHT ) { MainButton1.SetEffect( EFFECT_SLIDE_LEFT | EFFECT_SLIDE_OUT, 60 ); MainButton2.SetEffect( EFFECT_SLIDE_LEFT | EFFECT_SLIDE_OUT, 60 ); MainButton3.SetEffect( EFFECT_SLIDE_LEFT | EFFECT_SLIDE_OUT, 60 ); MainButton4.SetEffect( EFFECT_SLIDE_LEFT | EFFECT_SLIDE_OUT, 60 ); while ( MainButton1.GetEffect() > 0 ) usleep( 50 ); } else if ( slidedirection == LEFT ) { MainButton1.SetEffect( EFFECT_SLIDE_RIGHT | EFFECT_SLIDE_OUT, 60 ); MainButton2.SetEffect( EFFECT_SLIDE_RIGHT | EFFECT_SLIDE_OUT, 60 ); MainButton3.SetEffect( EFFECT_SLIDE_RIGHT | EFFECT_SLIDE_OUT, 60 ); MainButton4.SetEffect( EFFECT_SLIDE_RIGHT | EFFECT_SLIDE_OUT, 60 ); while ( MainButton1.GetEffect() > 0 ) usleep( 50 ); } HaltGui(); mainWindow->RemoveAll(); /** Set new icons **/ for ( int i = 0; i < 4; i++ ) { if ( IconData[i] != NULL ) { delete IconData[i]; IconData[i] = NULL; } if ( IconImg[i] != NULL ) { delete IconImg[i]; IconImg[i] = NULL; } if ( fileoffset + i < ( int ) filecount ) { char iconpath[200]; snprintf( iconpath, sizeof( iconpath ), "%sicon.png", HomebrewFiles.GetFilepath( fileoffset + i ) ); IconData[i] = new GuiImageData( iconpath, 0 ); if ( IconData[i]->GetImage() ) { IconImg[i] = new GuiImage( IconData[i] ); IconImg[i]->SetAlignment( ALIGN_LEFT, ALIGN_MIDDLE ); IconImg[i]->SetPosition( 12, 0 ); IconImg[i]->SetScale( 0.95 ); } } } if ( IconImg[0] != 0 ) MainButton1.SetIcon( IconImg[0] ); else MainButton1.SetIcon( NULL ); if ( IconImg[1] != 0 ) MainButton2.SetIcon( IconImg[1] ); else MainButton2.SetIcon( NULL ); if ( IconImg[2] != 0 ) MainButton3.SetIcon( IconImg[2] ); else MainButton3.SetIcon( NULL ); if ( IconImg[3] != 0 ) MainButton4.SetIcon( IconImg[3] ); else MainButton4.SetIcon( NULL ); mainWindow->Append( &w ); w.RemoveAll(); w.Append( &background ); w.Append( &titleTxt ); w.Append( &backBtn ); w.Append( &homo ); w.Append( &wifiBtn ); w.Append( &channelBtn ); w.Append( &GoRightBtn ); w.Append( &GoLeftBtn ); if ( pageToDisplay == pages ) { int buttonsleft = filecount - ( pages - 1 ) * 4; char * shortpath = NULL; char temp[200]; if ( buttonsleft > 0 ) { snprintf( temp, sizeof( temp ), "%smeta.xml", HomebrewFiles.GetFilepath( fileoffset ) ); if ( XMLInfo[0].LoadHomebrewXMLData( temp ) > 0 ) { snprintf( MainButtonText, sizeof( MainButtonText ), "%s", XMLInfo[0].GetName() ); MainButton1Txt.SetText( MainButtonText ); snprintf( MainButtonText, sizeof( MainButtonText ), "%s", XMLInfo[0].GetShortDescription() ); MainButton1DescTxt.SetText( MainButtonText ); MainButton1DescOverTxt.SetText( MainButtonText ); } else { snprintf( temp, strlen( HomebrewFiles.GetFilepath( fileoffset ) ), "%s", HomebrewFiles.GetFilepath( fileoffset ) ); shortpath = strrchr( temp, '/' ); snprintf( MainButtonText, sizeof( MainButtonText ), "%s/%s", shortpath, HomebrewFiles.GetFilename( fileoffset ) ); XMLInfo[0].SetName( MainButtonText ); MainButton1Txt.SetText( MainButtonText ); snprintf( MainButtonText, sizeof( MainButtonText ), " " ); MainButton1DescTxt.SetText( MainButtonText ); MainButton1DescOverTxt.SetText( MainButtonText ); } w.Append( &MainButton1 ); } if ( buttonsleft > 1 ) { snprintf( temp, sizeof( temp ), "%smeta.xml", HomebrewFiles.GetFilepath( fileoffset + 1 ) ); if ( XMLInfo[1].LoadHomebrewXMLData( temp ) > 0 ) { snprintf( MainButtonText, sizeof( MainButtonText ), "%s", XMLInfo[1].GetName() ); MainButton2Txt.SetText( MainButtonText ); snprintf( MainButtonText, sizeof( MainButtonText ), "%s", XMLInfo[1].GetShortDescription() ); MainButton2DescTxt.SetText( MainButtonText ); MainButton2DescOverTxt.SetText( MainButtonText ); } else { snprintf( temp, strlen( HomebrewFiles.GetFilepath( fileoffset + 1 ) ), "%s", HomebrewFiles.GetFilepath( fileoffset + 1 ) ); shortpath = strrchr( temp, '/' ); snprintf( MainButtonText, sizeof( MainButtonText ), "%s/%s", shortpath, HomebrewFiles.GetFilename( fileoffset + 1 ) ); XMLInfo[1].SetName( MainButtonText ); MainButton2Txt.SetText( MainButtonText ); snprintf( MainButtonText, sizeof( MainButtonText ), " " ); MainButton2DescTxt.SetText( MainButtonText ); MainButton2DescOverTxt.SetText( MainButtonText ); } w.Append( &MainButton2 ); } if ( buttonsleft > 2 ) { snprintf( temp, sizeof( temp ), "%smeta.xml", HomebrewFiles.GetFilepath( fileoffset + 2 ) ); if ( XMLInfo[3].LoadHomebrewXMLData( temp ) > 0 ) { snprintf( MainButtonText, sizeof( MainButtonText ), "%s", XMLInfo[3].GetName() ); MainButton3Txt.SetText( MainButtonText ); snprintf( MainButtonText, sizeof( MainButtonText ), "%s", XMLInfo[3].GetShortDescription() ); MainButton3DescTxt.SetText( MainButtonText ); MainButton3DescOverTxt.SetText( MainButtonText ); } else { snprintf( temp, strlen( HomebrewFiles.GetFilepath( fileoffset + 2 ) ), "%s", HomebrewFiles.GetFilepath( fileoffset + 2 ) ); shortpath = strrchr( temp, '/' ); snprintf( MainButtonText, sizeof( MainButtonText ), "%s/%s", shortpath, HomebrewFiles.GetFilename( fileoffset + 2 ) ); XMLInfo[2].SetName( MainButtonText ); MainButton3Txt.SetText( MainButtonText ); snprintf( MainButtonText, sizeof( MainButtonText ), " " ); MainButton3DescTxt.SetText( MainButtonText ); MainButton3DescOverTxt.SetText( MainButtonText ); } w.Append( &MainButton3 ); } if ( buttonsleft > 3 ) { snprintf( temp, sizeof( temp ), "%smeta.xml", HomebrewFiles.GetFilepath( fileoffset + 3 ) ); if ( XMLInfo[3].LoadHomebrewXMLData( temp ) > 0 ) { snprintf( MainButtonText, sizeof( MainButtonText ), "%s", XMLInfo[3].GetName() ); MainButton4Txt.SetText( MainButtonText ); snprintf( MainButtonText, sizeof( MainButtonText ), "%s", XMLInfo[3].GetShortDescription() ); MainButton4DescTxt.SetText( MainButtonText ); MainButton4DescOverTxt.SetText( MainButtonText ); } else { snprintf( temp, strlen( HomebrewFiles.GetFilepath( fileoffset + 3 ) ), "%s", HomebrewFiles.GetFilepath( fileoffset + 3 ) ); shortpath = strrchr( temp, '/' ); snprintf( MainButtonText, sizeof( MainButtonText ), "%s/%s", shortpath, HomebrewFiles.GetFilename( fileoffset + 3 ) ); XMLInfo[3].SetName( MainButtonText ); MainButton4Txt.SetText( MainButtonText ); snprintf( MainButtonText, sizeof( MainButtonText ), " " ); MainButton4DescTxt.SetText( MainButtonText ); MainButton4DescOverTxt.SetText( MainButtonText ); } w.Append( &MainButton4 ); } } else { char temp[200]; char *shortpath = NULL; snprintf( temp, sizeof( temp ), "%smeta.xml", HomebrewFiles.GetFilepath( fileoffset ) ); if ( XMLInfo[0].LoadHomebrewXMLData( temp ) > 0 ) { snprintf( MainButtonText, sizeof( MainButtonText ), "%s", XMLInfo[0].GetName() ); MainButton1Txt.SetText( MainButtonText ); snprintf( MainButtonText, sizeof( MainButtonText ), "%s", XMLInfo[0].GetShortDescription() ); MainButton1DescTxt.SetText( MainButtonText ); MainButton1DescOverTxt.SetText( MainButtonText ); } else { snprintf( temp, strlen( HomebrewFiles.GetFilepath( fileoffset ) ), "%s", HomebrewFiles.GetFilepath( fileoffset ) ); shortpath = strrchr( temp, '/' ); snprintf( MainButtonText, sizeof( MainButtonText ), "%s/%s", shortpath, HomebrewFiles.GetFilename( fileoffset ) ); XMLInfo[0].SetName( MainButtonText ); MainButton1Txt.SetText( MainButtonText ); snprintf( MainButtonText, sizeof( MainButtonText ), " " ); MainButton1DescTxt.SetText( MainButtonText ); MainButton1DescOverTxt.SetText( MainButtonText ); } w.Append( &MainButton1 ); snprintf( temp, sizeof( temp ), "%smeta.xml", HomebrewFiles.GetFilepath( fileoffset + 1 ) ); if ( XMLInfo[1].LoadHomebrewXMLData( temp ) > 0 ) { snprintf( MainButtonText, sizeof( MainButtonText ), "%s", XMLInfo[1].GetName() ); MainButton2Txt.SetText( MainButtonText ); snprintf( MainButtonText, sizeof( MainButtonText ), "%s", XMLInfo[1].GetShortDescription() ); MainButton2DescTxt.SetText( MainButtonText ); MainButton2DescOverTxt.SetText( MainButtonText ); } else { snprintf( temp, strlen( HomebrewFiles.GetFilepath( fileoffset + 1 ) ), "%s", HomebrewFiles.GetFilepath( fileoffset + 1 ) ); shortpath = strrchr( temp, '/' ); snprintf( MainButtonText, sizeof( MainButtonText ), "%s/%s", shortpath, HomebrewFiles.GetFilename( fileoffset + 1 ) ); XMLInfo[1].SetName( MainButtonText ); MainButton2Txt.SetText( MainButtonText ); snprintf( MainButtonText, sizeof( MainButtonText ), " " ); MainButton2DescTxt.SetText( MainButtonText ); MainButton2DescOverTxt.SetText( MainButtonText ); } w.Append( &MainButton2 ); snprintf( temp, sizeof( temp ), "%smeta.xml", HomebrewFiles.GetFilepath( fileoffset + 2 ) ); if ( XMLInfo[3].LoadHomebrewXMLData( temp ) > 0 ) { snprintf( MainButtonText, sizeof( MainButtonText ), "%s", XMLInfo[3].GetName() ); MainButton3Txt.SetText( MainButtonText ); snprintf( MainButtonText, sizeof( MainButtonText ), "%s", XMLInfo[3].GetShortDescription() ); MainButton3DescTxt.SetText( MainButtonText ); MainButton3DescOverTxt.SetText( MainButtonText ); } else { snprintf( temp, strlen( HomebrewFiles.GetFilepath( fileoffset + 2 ) ), "%s", HomebrewFiles.GetFilepath( fileoffset + 2 ) ); shortpath = strrchr( temp, '/' ); snprintf( MainButtonText, sizeof( MainButtonText ), "%s/%s", shortpath, HomebrewFiles.GetFilename( fileoffset + 2 ) ); XMLInfo[2].SetName( MainButtonText ); MainButton3Txt.SetText( MainButtonText ); snprintf( MainButtonText, sizeof( MainButtonText ), " " ); MainButton3DescTxt.SetText( MainButtonText ); MainButton3DescOverTxt.SetText( MainButtonText ); } w.Append( &MainButton3 ); snprintf( temp, sizeof( temp ), "%smeta.xml", HomebrewFiles.GetFilepath( fileoffset + 3 ) ); if ( XMLInfo[3].LoadHomebrewXMLData( temp ) > 0 ) { snprintf( MainButtonText, sizeof( MainButtonText ), "%s", XMLInfo[3].GetName() ); MainButton4Txt.SetText( MainButtonText ); snprintf( MainButtonText, sizeof( MainButtonText ), "%s", XMLInfo[3].GetShortDescription() ); MainButton4DescTxt.SetText( MainButtonText ); MainButton4DescOverTxt.SetText( MainButtonText ); } else { snprintf( temp, strlen( HomebrewFiles.GetFilepath( fileoffset + 3 ) ), "%s", HomebrewFiles.GetFilepath( fileoffset + 3 ) ); shortpath = strrchr( temp, '/' ); snprintf( MainButtonText, sizeof( MainButtonText ), "%s/%s", shortpath, HomebrewFiles.GetFilename( fileoffset + 3 ) ); XMLInfo[3].SetName( MainButtonText ); MainButton4Txt.SetText( MainButtonText ); snprintf( MainButtonText, sizeof( MainButtonText ), " " ); MainButton4DescTxt.SetText( MainButtonText ); MainButton4DescOverTxt.SetText( MainButtonText ); } w.Append( &MainButton4 ); } MainButton1.StopEffect(); MainButton2.StopEffect(); MainButton3.StopEffect(); MainButton4.StopEffect(); MainButton1.SetEffectGrow(); MainButton2.SetEffectGrow(); MainButton3.SetEffectGrow(); MainButton4.SetEffectGrow(); if ( slidedirection == FADE ) { MainButton1.SetEffect( EFFECT_FADE, 20 ); MainButton2.SetEffect( EFFECT_FADE, 20 ); MainButton3.SetEffect( EFFECT_FADE, 20 ); MainButton4.SetEffect( EFFECT_FADE, 20 ); } else if ( slidedirection == LEFT ) { MainButton1.SetEffect( EFFECT_SLIDE_LEFT | EFFECT_SLIDE_IN, 60 ); MainButton2.SetEffect( EFFECT_SLIDE_LEFT | EFFECT_SLIDE_IN, 60 ); MainButton3.SetEffect( EFFECT_SLIDE_LEFT | EFFECT_SLIDE_IN, 60 ); MainButton4.SetEffect( EFFECT_SLIDE_LEFT | EFFECT_SLIDE_IN, 60 ); } else if ( slidedirection == RIGHT ) { MainButton1.SetEffect( EFFECT_SLIDE_RIGHT | EFFECT_SLIDE_IN, 60 ); MainButton2.SetEffect( EFFECT_SLIDE_RIGHT | EFFECT_SLIDE_IN, 60 ); MainButton3.SetEffect( EFFECT_SLIDE_RIGHT | EFFECT_SLIDE_IN, 60 ); MainButton4.SetEffect( EFFECT_SLIDE_RIGHT | EFFECT_SLIDE_IN, 60 ); } mainWindow->Append( &w ); ResumeGui(); while ( MainButton1.GetEffect() > 0 ) usleep( 50 ); while ( !changed ) { VIDEO_WaitVSync (); if ( MainButton1.GetState() == STATE_CLICKED ) { char temp[200]; char iconpath[200]; char metapath[200]; char * shortpath = NULL; //write iconpath snprintf( metapath, sizeof( metapath ), "%smeta.xml", HomebrewFiles.GetFilepath( fileoffset ) ); //write iconpath snprintf( iconpath, sizeof( iconpath ), "%sicon.png", HomebrewFiles.GetFilepath( fileoffset ) ); //get filesize u64 filesize = HomebrewFiles.GetFilesize( fileoffset ); //write short filename snprintf( temp, strlen( HomebrewFiles.GetFilepath( fileoffset ) ), "%s", HomebrewFiles.GetFilepath( fileoffset ) ); shortpath = strrchr( temp, '/' ); snprintf( temp, sizeof( temp ), "%s/%s", shortpath, HomebrewFiles.GetFilename( fileoffset ) ); int choice = HBCWindowPrompt( XMLInfo[0].GetName(), XMLInfo[0].GetCoder(), XMLInfo[0].GetVersion(), XMLInfo[0].GetReleasedate(), XMLInfo[0].GetLongDescription(), iconpath, filesize ); if ( choice == 1 ) { boothomebrew = 1; menu = MENU_EXIT; snprintf( Settings.selected_homebrew, sizeof( Settings.selected_homebrew ), "%s%s", HomebrewFiles.GetFilepath( fileoffset ), HomebrewFiles.GetFilename( fileoffset ) ); break; } MainButton1.ResetState(); } else if ( MainButton2.GetState() == STATE_CLICKED ) { char temp[200]; char iconpath[200]; char metapath[200]; char * shortpath = NULL; //write iconpath snprintf( metapath, sizeof( metapath ), "%smeta.xml", HomebrewFiles.GetFilepath( fileoffset + 1 ) ); //write iconpath snprintf( iconpath, sizeof( iconpath ), "%sicon.png", HomebrewFiles.GetFilepath( fileoffset + 1 ) ); //get filesize u64 filesize = HomebrewFiles.GetFilesize( fileoffset + 1 ); //write short filename snprintf( temp, strlen( HomebrewFiles.GetFilepath( fileoffset + 1 ) ), "%s", HomebrewFiles.GetFilepath( fileoffset + 1 ) ); shortpath = strrchr( temp, '/' ); snprintf( temp, sizeof( temp ), "%s/%s", shortpath, HomebrewFiles.GetFilename( fileoffset + 1 ) ); int choice = HBCWindowPrompt( XMLInfo[1].GetName(), XMLInfo[1].GetCoder(), XMLInfo[1].GetVersion(), XMLInfo[1].GetReleasedate(), XMLInfo[1].GetLongDescription(), iconpath, filesize ); if ( choice == 1 ) { boothomebrew = 1; menu = MENU_EXIT; snprintf( Settings.selected_homebrew, sizeof( Settings.selected_homebrew ), "%s%s", HomebrewFiles.GetFilepath( fileoffset + 1 ), HomebrewFiles.GetFilename( fileoffset + 1 ) ); break; } MainButton2.ResetState(); } else if ( MainButton3.GetState() == STATE_CLICKED ) { char temp[200]; char iconpath[200]; char metapath[200]; char * shortpath = NULL; //write iconpath snprintf( metapath, sizeof( metapath ), "%smeta.xml", HomebrewFiles.GetFilepath( fileoffset + 2 ) ); //write iconpath snprintf( iconpath, sizeof( iconpath ), "%sicon.png", HomebrewFiles.GetFilepath( fileoffset + 2 ) ); //get filesize u64 filesize = HomebrewFiles.GetFilesize( fileoffset + 2 ); //write short filename snprintf( temp, strlen( HomebrewFiles.GetFilepath( fileoffset + 2 ) ), "%s", HomebrewFiles.GetFilepath( fileoffset + 2 ) ); shortpath = strrchr( temp, '/' ); snprintf( temp, sizeof( temp ), "%s/%s", shortpath, HomebrewFiles.GetFilename( fileoffset + 2 ) ); int choice = HBCWindowPrompt( XMLInfo[2].GetName(), XMLInfo[2].GetCoder(), XMLInfo[2].GetVersion(), XMLInfo[2].GetReleasedate(), XMLInfo[2].GetLongDescription(), iconpath, filesize ); if ( choice == 1 ) { boothomebrew = 1; menu = MENU_EXIT; snprintf( Settings.selected_homebrew, sizeof( Settings.selected_homebrew ), "%s%s", HomebrewFiles.GetFilepath( fileoffset + 2 ), HomebrewFiles.GetFilename( fileoffset + 2 ) ); break; } MainButton3.ResetState(); } else if ( MainButton4.GetState() == STATE_CLICKED ) { char temp[200]; char iconpath[200]; char metapath[200]; char * shortpath = NULL; //write iconpath snprintf( metapath, sizeof( metapath ), "%smeta.xml", HomebrewFiles.GetFilepath( fileoffset + 3 ) ); //write iconpath snprintf( iconpath, sizeof( iconpath ), "%sicon.png", HomebrewFiles.GetFilepath( fileoffset + 3 ) ); //get filesize u64 filesize = HomebrewFiles.GetFilesize( fileoffset + 3 ); //write short filename snprintf( temp, strlen( HomebrewFiles.GetFilepath( fileoffset + 3 ) ), "%s", HomebrewFiles.GetFilepath( fileoffset + 3 ) ); shortpath = strrchr( temp, '/' ); snprintf( temp, sizeof( temp ), "%s/%s", shortpath, HomebrewFiles.GetFilename( fileoffset + 3 ) ); int choice = HBCWindowPrompt( XMLInfo[3].GetName(), XMLInfo[3].GetCoder(), XMLInfo[3].GetVersion(), XMLInfo[3].GetReleasedate(), XMLInfo[3].GetLongDescription(), iconpath, filesize ); if ( choice == 1 ) { boothomebrew = 1; menu = MENU_EXIT; snprintf( Settings.selected_homebrew, sizeof( Settings.selected_homebrew ), "%s%s", HomebrewFiles.GetFilepath( fileoffset + 3 ), HomebrewFiles.GetFilename( fileoffset + 3 ) ); break; } MainButton4.ResetState(); } else if ( shutdown == 1 ) Sys_Shutdown(); else if ( reset == 1 ) Sys_Reboot(); else if ( backBtn.GetState() == STATE_CLICKED ) { menu = MENU_DISCLIST; changed = true; } else if ( GoLeftBtn.GetState() == STATE_CLICKED ) { pageToDisplay--; /** Change direction of the flying buttons **/ if ( pageToDisplay < 1 ) pageToDisplay = pages; slidedirection = LEFT; changed = true; GoLeftBtn.ResetState(); } else if ( GoRightBtn.GetState() == STATE_CLICKED ) { pageToDisplay++; /** Change direction of the flying buttons **/ if ( pageToDisplay > pages ) pageToDisplay = 1; slidedirection = RIGHT; changed = true; GoRightBtn.ResetState(); } else if ( wifiBtn.GetState() == STATE_CLICKED ) { ResumeNetworkWait(); wifiBtn.ResetState(); } else if ( homo.GetState() == STATE_CLICKED ) { cfg_save_global(); bgMusic->Pause(); choice = WindowExitPrompt(); bgMusic->Resume(); if ( choice == 3 ) { Sys_LoadMenu(); // Back to System Menu } else if ( choice == 2 ) { Sys_BackToLoader(); } else { homo.ResetState(); } } else if ( infilesize > 0 ) { char filesizetxt[50]; char temp[50]; if ( infilesize < MB_SIZE ) snprintf( filesizetxt, sizeof( filesizetxt ), tr( "Incoming file %0.2fKB" ), infilesize / KB_SIZE ); else snprintf( filesizetxt, sizeof( filesizetxt ), tr( "Incoming file %0.2fMB" ), infilesize / MB_SIZE ); snprintf( temp, sizeof( temp ), tr( "Load file from: %s ?" ), GetIncommingIP() ); int choice = WindowPrompt( filesizetxt, temp, tr( "OK" ), tr( "Cancel" ) ); if ( choice == 1 ) { int res = AllocHomebrewMemory( infilesize ); if ( res < 0 ) { CloseConnection(); WindowPrompt( tr( "Not enough free memory." ), 0, tr( "OK" ) ); } else { u32 read = 0; u8 *temp = NULL; int len = NETWORKBLOCKSIZE; temp = ( u8 * ) malloc( infilesize ); bool error = false; u8 *ptr = temp; while ( read < infilesize ) { ShowProgress( tr( "Receiving file from:" ), GetIncommingIP(), NULL, read, infilesize, true ); if ( infilesize - read < ( u32 ) len ) len = infilesize - read; else len = NETWORKBLOCKSIZE; int result = network_read( ptr, len ); if ( result < 0 ) { WindowPrompt( tr( "Error while transfering data." ), 0, tr( "OK" ) ); error = true; break; } if ( !result ) { break; } ptr += result; read += result; } char filename[101]; if ( !error ) { network_read( ( u8* ) &filename, 100 ); // Do we need to unzip this thing? if ( wiiloadVersion[0] > 0 || wiiloadVersion[1] > 4 ) { // We need to unzip... if ( temp[0] == 'P' && temp[1] == 'K' && temp[2] == 0x03 && temp[3] == 0x04 ) { // It's a zip file, unzip to the apps directory // Zip archive, ask for permission to install the zip char zippath[255]; sprintf( ( char * ) &zippath, "%s%s", Settings.homebrewapps_path, filename ); FILE *fp = fopen( zippath, "wb" ); if ( fp != NULL ) { fwrite( temp, 1, infilesize, fp ); fclose( fp ); // Now unzip the zip file... unzFile uf = unzOpen( zippath ); if ( uf == NULL ) { error = true; } else { extractZip( uf, 0, 1, 0, Settings.homebrewapps_path ); unzCloseCurrentFile( uf ); remove( zippath ); // Reload this menu here... menu = MENU_HOMEBREWBROWSE; break; } } else { error = true; } } else if ( uncfilesize != 0 ) // if uncfilesize == 0, it's not compressed { // It's compressed, uncompress u8 *unc = ( u8 * ) malloc( uncfilesize ); uLongf f = uncfilesize; error = uncompress( unc, &f, temp, infilesize ) != Z_OK; uncfilesize = f; homebrewsize = uncfilesize; free( temp ); temp = unc; } } if ( !error && strstr( filename, ".zip" ) == NULL ) { innetbuffer = temp; } } ProgressStop(); if ( error || read != infilesize ) { WindowPrompt( tr( "Error:" ), tr( "No data could be read." ), tr( "OK" ) ); FreeHomebrewBuffer(); } else { if ( strstr( filename, ".dol" ) || strstr( filename, ".DOL" ) || strstr( filename, ".elf" ) || strstr( filename, ".ELF" ) ) { boothomebrew = 2; AddBootArgument( filename ); menu = MENU_EXIT; CloseConnection(); break; } else if ( strstr( filename, ".zip" ) ) { WindowPrompt( tr( "Success:" ), tr( "Uploaded ZIP file installed to homebrew directory." ), tr( "OK" ) ); CloseConnection(); } else { FreeHomebrewBuffer(); WindowPrompt( tr( "ERROR:" ), tr( "Not a DOL/ELF file." ), tr( "OK" ) ); } } } } CloseConnection(); ResumeNetworkWait(); } else if ( channelBtn.GetState() == STATE_CLICKED ) { w.SetState( STATE_DISABLED ); //10001 are the channels that are installed as channels, not including shop channel/mii channel etc TitleBrowser(); //if they didn't boot a channel reset this window w.SetState( STATE_DEFAULT ); channelBtn.ResetState(); } if ( IsNetworkInit() ) { if ( !wifi_btn_loaded ) { wifiBtn.SetAlpha( 255 ); titleTT = new GuiTooltip( GetNetworkIP() ); titleTT->SetAlpha( THEME.tooltipAlpha ); wifiBtn.SetToolTip( titleTT, 0, -50, 0, 5 ); wifi_btn_loaded = true; } } } } w.SetEffect( EFFECT_FADE, -20 ); while ( w.GetEffect() > 0 ) usleep( 50 ); HaltGui(); for ( int i = 0; i < 4; i++ ) { if ( IconData[i] != NULL ) { delete IconData[i]; IconData[i] = NULL; } if ( IconImg[i] != NULL ) { delete IconImg[i]; IconImg[i] = NULL; } } delete titleTT; titleTT = NULL; if ( IsNetworkInit() ) HaltNetworkThread(); mainWindow->RemoveAll(); mainWindow->Append( bgImg ); ResumeGui(); return menu; }