/*************************************************************************** * __________ __ ___. * Open \______ \ ____ ____ | | _\_ |__ _______ ___ * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ * \/ \/ \/ \/ \/ * Module: rbutil * File: rbutilFrm.cpp * * Copyright (C) 2005 Christi Alice Scarborough * * All files in this archive are subject to the GNU General Public License. * See the file COPYING in the source tree root for full license agreement. * * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY * KIND, either express or implied. * ****************************************************************************/ #include "rbutilFrm.h" #include "credits.h" #include "rbutilFrm_XPM.xpm" #include "install_3d.xpm" #include "uninstall_3d.xpm" #include "fonts_3d.xpm" #include "tools2_3d.xpm" #include "rblogo.xpm" #include "wizard.xpm" //---------------------------------------------------------------------------- // rbutilFrm //---------------------------------------------------------------------------- BEGIN_EVENT_TABLE(rbutilFrm,wxFrame) EVT_BUTTON (ID_INSTALL_BTN, rbutilFrm::OnInstallBtn) EVT_BUTTON (ID_REMOVE_BTN, rbutilFrm::OnRemoveBtn) EVT_BUTTON (ID_FONT_BTN, rbutilFrm::OnFontBtn) EVT_BUTTON (ID_BOOTLOADER_BTN, rbutilFrm::OnBootloaderBtn) EVT_CLOSE(rbutilFrm::rbutilFrmClose) EVT_MENU(ID_FILE_EXIT, rbutilFrm::OnFileExit) EVT_MENU(ID_FILE_ABOUT, rbutilFrm::OnFileAbout) EVT_MENU(ID_FILE_WIPECACHE, rbutilFrm::OnFileWipeCache) EVT_MENU(ID_PORTABLE_INSTALL, rbutilFrm::OnPortableInstall) END_EVENT_TABLE() rbutilFrm::rbutilFrm( wxWindow *parent, wxWindowID id, const wxString &title, const wxPoint &position, const wxSize& size, long style ) : wxFrame( parent, id, title, position, size, style) { wxLogVerbose(wxT("=== begin rbutilFrm::rbutilFrm(...)")); CreateGUIControls(); wxLogVerbose(wxT("=== end rbutilFrm::rbutilFrm")); } rbutilFrm::~rbutilFrm() {} void rbutilFrm::CreateGUIControls(void) { wxLogVerbose(wxT("=== begin rbutilFrm::CreateGUIControls()")); wxBoxSizer* WxBoxSizer1 = new wxBoxSizer(wxHORIZONTAL); this->SetSizer(WxBoxSizer1); this->SetAutoLayout(TRUE); WxPanel1 = new wxPanel(this, ID_WXPANEL1, wxPoint(0,0), wxSize(400,600)); WxBoxSizer1->Add(WxPanel1,1,wxGROW | wxALL,0); wxBoxSizer* WxBoxSizer2 = new wxBoxSizer(wxVERTICAL); WxPanel1->SetSizer(WxBoxSizer2); WxPanel1->SetAutoLayout(TRUE); wxBitmap WxStaticBitmap1_BITMAP(rblogo_xpm); WxStaticBitmap1 = new wxStaticBitmap(WxPanel1, ID_WXSTATICBITMAP1, WxStaticBitmap1_BITMAP, wxPoint(0,0), wxSize(400,123)); WxStaticBitmap1->Enable(false); WxBoxSizer2->Add(WxStaticBitmap1,0,wxALIGN_CENTER_HORIZONTAL | wxALL,5); wxStaticBox* WxStaticBoxSizer3_StaticBoxObj = new wxStaticBox(WxPanel1, wxID_ANY, _("Please choose an option")); wxStaticBoxSizer* WxStaticBoxSizer3 = new wxStaticBoxSizer(WxStaticBoxSizer3_StaticBoxObj,wxHORIZONTAL); WxBoxSizer2->Add(WxStaticBoxSizer3,1,wxALIGN_CENTER_HORIZONTAL | wxALL, 5); wxFlexGridSizer* WxFlexGridSizer1 = new wxFlexGridSizer(2,2,0,0); WxStaticBoxSizer3->Add(WxFlexGridSizer1,0,wxGROW | wxALL,0); wxBitmap BootloaderInstallButton (tools2_3d_xpm); WxBitmapButton4 = new wxBitmapButton(WxPanel1, ID_BOOTLOADER_BTN, BootloaderInstallButton, wxPoint(0,0), wxSize(64,54), wxRAISED_BORDER | wxBU_AUTODRAW); WxBitmapButton4->SetToolTip(_("Instructions for installing the " "Rockbox bootloader on your audio device")); WxFlexGridSizer1->Add(WxBitmapButton4, 0, wxALIGN_CENTER_HORIZONTAL | wxALIGN_CENTER_VERTICAL | wxALL,5); wxStaticText* WxStaticText5 = new wxStaticText(WxPanel1, wxID_ANY, _("Bootloader installation instructions\n\n" "Before Rockbox can be installed on your audio player, you " "may have to\ninstall a bootloader. This can not currently " "be done automatically, but is\nonly necessary the first time " "Rockbox is installed.")); WxFlexGridSizer1->Add(WxStaticText5, 0, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxALL,5); wxBitmap WxBitmapButton1_BITMAP (install_3d_xpm); WxBitmapButton1 = new wxBitmapButton(WxPanel1, ID_INSTALL_BTN, WxBitmapButton1_BITMAP, wxPoint(0,0), wxSize(64,54), wxRAISED_BORDER | wxBU_AUTODRAW, wxDefaultValidator, wxT("WxBitmapButton1")); WxBitmapButton1->SetToolTip(_("Install Rockbox")); WxFlexGridSizer1->Add(WxBitmapButton1,0, wxALIGN_CENTER_HORIZONTAL | wxALIGN_CENTER_VERTICAL | wxALL,5); WxStaticText2 = new wxStaticText(WxPanel1, ID_WXSTATICTEXT2, _("Install Rockbox on your audio player"), wxPoint(70,16), wxSize(175,17), 0, wxT("WxStaticText2")); WxFlexGridSizer1->Add(WxStaticText2,0, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxALL,5); wxBitmap FontInstallButton (fonts_3d_xpm); WxBitmapButton3 = new wxBitmapButton(WxPanel1, ID_FONT_BTN, FontInstallButton, wxPoint(0,0), wxSize(64,54), wxRAISED_BORDER | wxBU_AUTODRAW); WxBitmapButton3->SetToolTip(_("Download the most up to date " "Rockbox fonts.")); WxFlexGridSizer1->Add(WxBitmapButton3, 0, wxALIGN_CENTER_HORIZONTAL | wxALIGN_CENTER_VERTICAL | wxALL,5); wxStaticText* WxStaticText4 = new wxStaticText(WxPanel1, wxID_ANY, _("Install the Rockbox fonts package\n\n" "This step is only needed if you have installed " "a daily build and want\nthe full set of Rockbox fonts. You " "will not need to download these\nagain unless you uninstall " "Rockbox.")); WxFlexGridSizer1->Add(WxStaticText4, 0, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxALL,5); wxBitmap WxBitmapButton2_BITMAP (uninstall_3d_xpm); WxBitmapButton2 = new wxBitmapButton(WxPanel1, ID_REMOVE_BTN, WxBitmapButton2_BITMAP, wxPoint(0,0), wxSize(64,54), wxRAISED_BORDER | wxBU_AUTODRAW, wxDefaultValidator, wxT("WxBitmapButton2")); WxBitmapButton2->SetToolTip(_("Uninstall Rockbox")); WxFlexGridSizer1->Add(WxBitmapButton2,0, wxALIGN_CENTER_HORIZONTAL | wxALIGN_CENTER_VERTICAL | wxALL,5); WxStaticText3 = new wxStaticText(WxPanel1, ID_WXSTATICTEXT3, _("Remove Rockbox from your audio player"), wxPoint(60,66), wxSize(196,17), 0, wxT("WxStaticText3")); WxFlexGridSizer1->Add(WxStaticText3,0, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxALL,5); WxMenuBar1 = new wxMenuBar(); wxMenu *ID_FILE_MENU_Mnu_Obj = new wxMenu(0); WxMenuBar1->Append(ID_FILE_MENU_Mnu_Obj, _("&File")); ID_FILE_MENU_Mnu_Obj->Append(ID_FILE_WIPECACHE, _("&Empty local download cache"), wxT(""), wxITEM_NORMAL); if (! gv->portable ) { ID_FILE_MENU_Mnu_Obj->Append(ID_PORTABLE_INSTALL, _("&Install Rockbox Utility on device"), wxT(""), wxITEM_NORMAL); } ID_FILE_MENU_Mnu_Obj->Append(ID_FILE_ABOUT, _("&About"), wxT(""), wxITEM_NORMAL); ID_FILE_MENU_Mnu_Obj->Append(ID_FILE_EXIT, _("E&xit\tCtrl+X"), wxT(""), wxITEM_NORMAL); this->SetMenuBar(WxMenuBar1); GetSizer()->Fit(this); GetSizer()->SetSizeHints(this); if (gv->portable) { this->SetTitle(_("Rockbox Utility (portable)")); } else { this->SetTitle(_("Rockbox Utility")); } this->Center(); wxIcon rbutilFrm_ICON (rbutilFrm_XPM); this->SetIcon(rbutilFrm_XPM); this->SetToolTip(wxT("Install Rockbox")); wxLogVerbose("=== end rbutilFrm::CreateGUIControls"); } void rbutilFrm::rbutilFrmClose(wxCloseEvent& event) { wxLogVerbose("=== begin rbutilFrm::rbutilFrmClose(event)"); Destroy(); wxLogVerbose("=== end rbutilFrm::rbutilFrmClose"); } /* * OnFileExit */ void rbutilFrm::OnFileExit(wxCommandEvent& event) { wxLogVerbose("=== begin rbutilFrm::OnFileExit(event)"); Close(); wxLogVerbose("=== end rbutilFrm::OnFileExit"); } // The routines this code uses are in the wxWidgets documentation, but // not yet the library (2.7.0-1). This code can be re-enabled later. void rbutilFrm::OnFileAbout(wxCommandEvent& event) { /* wxAboutDialogInfo *info = new wxAboutDialogInfo(); info->SetName(_(RBUTIL_FULLNAME)); info->SetVersion(_(RBUTIL_VERSION)); info->SetCopyright(_(RBUTIL_COPYRIGHT)); info->SetDescription(_(RBUTIL_DESCRIPTION)); info->SetWebSite(_(RBUTIL_WEBSITE)); long i = 0; while (rbutil_developers[i] != "") { info->AddDeveloper(wxT(rbutil_developers[i++])); } wxAboutBox(*info); delete info; */ AboutDlg(this).ShowModal(); } void rbutilFrm::OnFileWipeCache(wxCommandEvent& event) { wxString cacheloc, datadir; datadir = gv->stdpaths->GetUserDataDir(); if (datadir == "") { ERR_DIALOG(_("Can't locate user data directory. Unable to delete " "cache."), _("Delete download cache.") ); return; } cacheloc.Printf(wxT("%s" PATH_SEP "download"), datadir.c_str()); if (! rm_rf(cacheloc) ) { MESG_DIALOG(_("Local download cache has been deleted.")); } else { MESG_DIALOG(_("Errors occured deleting the local download cache.")); } wxMkdir(cacheloc, 0777); } void rbutilFrm::OnBootloaderBtn(wxCommandEvent& event) { if (!wxLaunchDefaultBrowser(wxT( "http://www.rockbox.org/twiki/bin/view/Main/" "DocsIndex#Rockbox_Installation_Instruction") ) ) { ERR_DIALOG(_("Unable to launch external browser"), _("Boot loader install instructions.")); } } void rbutilFrm::OnInstallBtn(wxCommandEvent& event) { wxString src, dest, buf; wxDateTime date; wxTimeSpan day(24); wxLogVerbose("=== begin rbutilFrm::OnInstallBtn(event)"); wxFileSystem fs; wxFileConfig* buildinfo; wxDateSpan oneday; wxWizard *wizard = new wxWizard(this, wxID_ANY, _("Rockbox Installation Wizard"), wxBitmap(wizard_xpm), wxDefaultPosition, wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER); wxPlatformPage* page1 = new wxPlatformPage(wizard); wxLocationPage* page2 = new wxLocationPage(wizard); wxBuildPage* page3 = new wxBuildPage(wizard); page1->SetNext(page2); page2->SetPrev(page1); page2->SetNext(page3); page3->SetPrev(page2); wizard->GetPageAreaSizer()->Add(page1); if (wizard->RunWizard(page1) ) { switch (gv->curbuild) { case BUILD_RELEASE: // This is a URL - don't use PATH_SEP src.Printf("%s%s-%s-%s.zip", gv->download_url.c_str(), gv->prog_name.c_str(), gv->last_release.c_str(), gv->curplat.c_str()); dest.Printf("%s" PATH_SEP "download" PATH_SEP "%s-%s-%s.zip", gv->stdpaths->GetUserDataDir().c_str(), gv->prog_name.c_str(), gv->last_release.c_str(), gv->curplat.c_str()); break; case BUILD_DAILY: dest.Printf("%s" PATH_SEP "download" PATH_SEP "build-info", gv->stdpaths->GetUserDataDir().c_str()); if (DownloadURL(gv->server_conf_url, dest)) { WARN_DIALOG(_("Unable to download build status."), _("Install")); buf = ""; } else { buildinfo = new wxFileConfig(wxEmptyString, wxEmptyString, dest); buf = buildinfo->Read(wxT("/dailies/date")); buildinfo->DeleteAll(); if (buf.Len() != 8) { dest.Printf(_("Invalid build date: %s"), buf.c_str()); WARN_DIALOG(dest, _("Install")); buf = ""; } } if (buf == "") { WARN_DIALOG(_("Can't get date of latest build from " "server. Using yesterday's date."), _("Install") ); date = wxDateTime::Now(); date.Subtract(oneday.Day()); buf = date.Format(wxT("%Y%m%d")); // yes, we want UTC } src.Printf("%s%s/%s-%s-%s.zip", gv->daily_url.c_str(), gv->curplat.c_str(), gv->prog_name.c_str(), gv->curplat.c_str(), buf.c_str() ); dest.Printf("%s" PATH_SEP "download" PATH_SEP "%s-%s-%s.zip", gv->stdpaths->GetUserDataDir().c_str(), gv->prog_name.c_str(), gv->curplat.c_str(), buf.c_str() ); break; case BUILD_BLEEDING: src.Printf("%s%s/%s.zip", gv->bleeding_url.c_str(), gv->curplat.c_str(), gv->prog_name.c_str() ); dest.Printf("%s" PATH_SEP "download" PATH_SEP "%s.zip", gv->stdpaths->GetUserDataDir().c_str(), gv->prog_name.c_str() ); break; default: ERR_DIALOG(_("Something seriously odd has happened."), _("Install")); return; break; } if (gv->nocache || ( ! wxFileExists(dest) ) ) { if ( DownloadURL(src, dest) ) { wxRemoveFile(dest); buf.Printf(_("Unable to download %s"), src.c_str() ); ERR_DIALOG(buf, _("Install")); return; } } if ( !UnzipFile(dest, gv->curdestdir, true) ) { MESG_DIALOG(_("Rockbox has been installed on your device.") ); } else { wxRemoveFile(dest); buf.Printf(_("Unable to unzip %s"), dest.c_str() ); ERR_DIALOG(buf, _("Install")); } } else { MESG_DIALOG(_("The installation wizard was cancelled") ); } wxLogVerbose("=== end rbutilFrm::OnInstallBtn"); } void rbutilFrm::OnFontBtn(wxCommandEvent& event) { wxString src, dest, buf; wxDateTime date; wxTimeSpan day(24); wxLogVerbose("=== begin rbutilFrm::OnFontBtn(event)"); wxFileSystem fs; wxFileConfig* buildinfo; wxDateSpan oneday; wxWizard *wizard = new wxWizard(this, wxID_ANY, _("Rockbox Font Installation Wizard"), wxBitmap(wizard_xpm), wxDefaultPosition, wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER); wxLocationPage* page1 = new wxLocationPage(wizard); wizard->GetPageAreaSizer()->Add(page1); if (wizard->RunWizard(page1) ) { buf.Printf(wxT("%s" PATH_SEP ".rockbox"), gv->curdestdir.c_str()) ; if (! wxDirExists(buf) ) { buf.Printf(_("Rockbox is not yet installed on %s - install " "Rockbox first."), buf.c_str() ); WARN_DIALOG(buf, _("Can't install fonts") ); return; } dest.Printf(wxT("%s" PATH_SEP "download" PATH_SEP "build-info"), gv->stdpaths->GetUserDataDir().c_str()); if (DownloadURL(gv->server_conf_url, dest)) { WARN_DIALOG(_("Unable to download build status."), _("Font Install")); buf = ""; } else { buildinfo = new wxFileConfig(wxEmptyString, wxEmptyString, dest); buf = buildinfo->Read(wxT("/dailies/date")); buildinfo->DeleteAll(); if (buf.Len() != 8) { dest.Printf(_("Invalid build date: %s"), buf.c_str()); WARN_DIALOG(dest, _("Font Install")); buf = ""; } } if (buf == "") { WARN_DIALOG(_("Can't get date of latest build from " "server. Using yesterday's date."), _("Font Install") ); date = wxDateTime::Now(); date.Subtract(oneday.Day()); buf = date.Format(wxT("%Y%m%d")); // yes, we want UTC } src.Printf("%s%s.zip", gv->font_url.c_str(), buf.c_str() ); dest.Printf("%s" PATH_SEP "download" PATH_SEP "rockbox-fonts-%s.zip", gv->stdpaths->GetUserDataDir().c_str(), buf.c_str() ); if ( ! wxFileExists(dest) ) { if ( DownloadURL(src, dest) ) { wxRemoveFile(dest); buf.Printf(_("Unable to download %s"), src.c_str() ); ERR_DIALOG(buf, _("Font Install")); return; } } if ( !UnzipFile(dest, gv->curdestdir, true) ) { MESG_DIALOG(_("The Rockbox fonts have been installed on your device.") ); } else { wxRemoveFile(dest); buf.Printf(_("Unable to unzip %s"), dest.c_str() ); ERR_DIALOG(buf, _("Font Install")); } } else { MESG_DIALOG(_("The font installation wizard was cancelled") ); } wxLogVerbose("=== end rbutilFrm::OnFontBtn"); } void rbutilFrm::OnRemoveBtn(wxCommandEvent& event) { wxLogVerbose("=== begin rbutilFrm::OnRemoveBtn(event)"); wxWizard *wizard = new wxWizard(this, wxID_ANY, _("Rockbox Uninstallation Wizard"), wxBitmap(wizard_xpm), wxDefaultPosition, wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER); wxLocationPage* page1 = new wxLocationPage(wizard); wxFullUninstallPage *page2 = new wxFullUninstallPage(wizard); page1->SetNext(page2); page2->SetPrev(page1); wizard->GetPageAreaSizer()->Add(page1); if (wizard->RunWizard(page1) ) { if (Uninstall(gv->curdestdir, gv->curisfull) ) { MESG_DIALOG( _("The uninstallation wizard was cancelled or completed with " "some errors.") ); } else { MESG_DIALOG(_("The uninstall wizard completed successfully") ); } } else { MESG_DIALOG(_("The uninstallation wizard was cancelled.") ); } wxLogVerbose("=== end rbutilFrm::OnRemoveBtn"); } void rbutilFrm::OnPortableInstall(wxCommandEvent& event) { wxString src, dest, buf; wxLogVerbose("=== begin rbutilFrm::OnPortableInstall(event)"); wxFileSystem fs; wxFileConfig* buildinfo; wxDateSpan oneday; wxWizard *wizard = new wxWizard(this, wxID_ANY, _("Rockbox Utility Portable Installation Wizard"), wxBitmap(wizard_xpm), wxDefaultPosition, wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER); wxLocationPage* page1 = new wxLocationPage(wizard); wizard->GetPageAreaSizer()->Add(page1); if (wizard->RunWizard(page1) ) { if ( InstallRbutil(gv->curdestdir) ) { MESG_DIALOG(_("The Rockbox Utility has been installed on your device.") ); } else { ERR_DIALOG(_("Installation failed"), _("Portable Install")); } } else { MESG_DIALOG(_("The portable installation wizard was cancelled") ); } wxLogVerbose("=== end rbutilFrm::OnUnstallPortable"); } AboutDlg::AboutDlg(rbutilFrm* parent) : wxDialog(parent, -1, _("About"), wxDefaultPosition, wxDefaultSize, wxDEFAULT_DIALOG_STYLE) { wxBoxSizer* WxBoxSizer1 = new wxBoxSizer(wxVERTICAL); this->SetSizer(WxBoxSizer1); this->SetAutoLayout(TRUE); wxBoxSizer* WxBoxSizer2 = new wxBoxSizer(wxHORIZONTAL); wxBitmap WxBitmap1 = wxBitmap(rbutilFrm_XPM); wxStaticBitmap* WxStaticBitmap1 = new wxStaticBitmap(this, wxID_ANY, WxBitmap1); WxBoxSizer2->Add(WxStaticBitmap1, 0, wxALL | wxCENTER, 5); wxStaticText* WxStaticText1 = new wxStaticText(this, wxID_ANY, _(RBUTIL_FULLNAME), wxDefaultPosition, wxDefaultSize, wxALIGN_CENTER | wxST_NO_AUTORESIZE ); WxBoxSizer2->Add(WxStaticText1, 0, wxALL | wxCENTER, 5); WxBoxSizer1->Add(WxBoxSizer2, 0, wxALL, 5); wxStaticText* WxStaticText2 = new wxStaticText(this, wxID_ANY, _(RBUTIL_VERSION "\n" RBUTIL_DESCRIPTION "\n\n" RBUTIL_COPYRIGHT)); WxStaticText2->Wrap(400); WxBoxSizer1->Add(WxStaticText2, 0, wxALL, 5); wxHyperlinkCtrl* WxHyperlink1 = new wxHyperlinkCtrl(this, wxID_ANY, wxT(RBUTIL_WEBSITE), wxT(RBUTIL_WEBSITE) ); WxBoxSizer1->Add(WxHyperlink1, 0, wxALL, 5); wxStaticBox* WxStaticBox1 = new wxStaticBox(this, wxID_ANY, _("Contributors:")); wxStaticBoxSizer* WxStaticBoxSizer2 = new wxStaticBoxSizer(WxStaticBox1, wxVERTICAL); wxTextCtrl* WxTextCtrl1 = new wxTextCtrl(this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_MULTILINE | wxTE_READONLY); long i = 0; while ( rbutil_developers[i] != "") { WxTextCtrl1->AppendText(rbutil_developers[i++]); WxTextCtrl1->AppendText("\n"); } WxBoxSizer1->Add(WxStaticBoxSizer2, 1, wxGROW | wxALL, 5); WxStaticBoxSizer2->Add(WxTextCtrl1, 1, wxGROW | wxALL, 0); wxStdDialogButtonSizer* WxStdDialogButtonSizer1 = new wxStdDialogButtonSizer(); wxButton* WxOKButton = new wxButton(this, wxID_OK); WxStdDialogButtonSizer1->AddButton(WxOKButton); WxStdDialogButtonSizer1->Realize(); WxBoxSizer1->Add(WxStdDialogButtonSizer1, 0, wxALL | wxCENTER, 5); GetSizer()->Fit(this); GetSizer()->SetSizeHints(this); //this->Center(); this->Show(); } AboutDlg::~AboutDlg() { }