rockbox/rbutil/rbutilFrm.cpp
Dave Chapman 27b2e7502c Unix targets require a second (mode) parameter to wxMkdir. rbutil now compiles cleanly for me on Linux with the just-released wxWidgets 2.8.0
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@11735 a1c6a512-1295-4272-9138-f99709370657
2006-12-12 16:01:27 +00:00

533 lines
18 KiB
C++

//---------------------------------------------------------------------------
//
// Name: rbutilFrm.cpp
// Author: Christi Scarborough
// Created: 03/12/2005 00:35:02
//
//---------------------------------------------------------------------------
#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)
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,50), wxSize(60,50),
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(60,50),
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,50), wxSize(60,50),
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,50), wxSize(60,50),
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);
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);
this->SetTitle(wxT("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_LONGNAME));
info->SetVersion(_(RBUTIL_VERSION));
info->SetCopyright(_(RBUTIL_COPYRIGHT));
info->SetDescription(_(RBUTIL_DESCRIPTION));
info->SetWebsite(_(RBUTIL_WEBSITE));
ind
wxArrayString *array = new wxArrayString(sizeof(rbutil_developers[]).
rbutil_developers);
info->SetDevelopers(array);
delete array;
// array = new wxArrayString(sizeof(rbutil_translators[]),
// rbutil_translators);
// info->SetTranslators(array);
// delete array;
wxAboutBox(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) )
{
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."),
_("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) )
{
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");
}
AboutDlg::AboutDlg(rbutilFrm* parent)
: wxDialog(parent, -1, _("About"), wxDefaultPosition, wxDefaultSize,
wxDEFAULT_DIALOG_STYLE)
{
wxBoxSizer* WxBoxSizer1 = new wxBoxSizer(wxVERTICAL);
this->SetSizer(WxBoxSizer1);
this->SetAutoLayout(TRUE);
wxBitmap WxBitmap1 = wxBitmap(rblogo_xpm);
wxStaticBitmap* WxStaticBitmap1 = new wxStaticBitmap(this, wxID_ANY,
WxBitmap1);
WxBoxSizer1->Add(WxStaticBitmap1, 0, wxALL, 5);
wxStaticText* WxStaticText1 = new wxStaticText(this, wxID_ANY,
_(RBUTIL_FULLNAME "\n" RBUTIL_VERSION "\n" RBUTIL_DESCRIPTION "\n\n"
RBUTIL_COPYRIGHT));
WxBoxSizer1->Add(WxStaticText1, 0, wxALL, 5);
wxHyperlinkCtrl* WxHyperlink1 = new wxHyperlinkCtrl(this, wxID_ANY,
wxT(RBUTIL_WEBSITE), wxT(RBUTIL_WEBSITE) );
WxBoxSizer1->Add(WxHyperlink1, 0, wxALL, 5);
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()
{
}