// ---------------------------------------------------------------------------- // Pass an uninitialized file object. The function will ask the user for the // filename and try to open it. It returns true on success (file was opened), // false if file couldn't be opened/created and -1 if the file selection // dialog was canceled. // static bool OpenLogFile(wxFile& file, wxString& filename, wxWindow *parent) { filename = wxSaveFileSelector(L"log", L"txt", L"log.txt", parent); if ( !filename ) return false; // canceled if( wxFile::Exists(filename) ) { bool bAppend = false; wxString strMsg; strMsg.Printf(L"Append log to file '%s' (choosing [No] will overwrite it)?", filename.c_str()); switch ( Msgbox::ShowModal( _("Save log question"), strMsg, MsgButtons().YesNo().Cancel() ) ) { case wxID_YES: bAppend = true; break; case wxID_NO: bAppend = false; break; case wxID_CANCEL: return false; default: pxFailDev( "invalid message box return value" ); } return ( bAppend ) ? file.Open(filename, wxFile::write_append) : file.Create(filename, true /* overwrite */); } return file.Create(filename); }
void pxLogConsole::DoLog( wxLogLevel level, const wxChar *szString, time_t t ) { wxString message(szString); #else void pxLogConsole::DoLogRecord(wxLogLevel level, const wxString &message, const wxLogRecordInfo &info) { #endif switch ( level ) { case wxLOG_Trace: case wxLOG_Debug: { wxString str; TimeStamp( &str ); MSW_OutputDebugString( str + message + L"\n" ); } break; case wxLOG_FatalError: // This one is unused by wx, and unused by PCSX2 (we prefer exceptions, thanks). pxFailDev( "Stop using FatalError and use assertions or exceptions instead." ); break; case wxLOG_Status: // Also unsed by wx, and unused by PCSX2 also (we prefer direct API calls to our main window!) pxFailDev( "Stop using wxLogStatus just access the Pcsx2App functions directly instead." ); break; case wxLOG_Info: if ( !GetVerbose() ) return; // fallthrough! case wxLOG_Message: Console.WriteLn( L"[wx] %s", WX_STR(message)); break; case wxLOG_Error: Console.Error(L"[wx] %s", WX_STR(message)); break; case wxLOG_Warning: Console.Warning(L"[wx] %s", WX_STR(message)); break; } } // ---------------------------------------------------------------------------- void ConsoleTestThread::ExecuteTaskInThread() { static int numtrack = 0; while( !m_done ) { // Two lines, both formatted, and varied colors. This makes for a fairly realistic // worst case scenario (without being entirely unrealistic). Console.WriteLn( L"This is a threaded logging test. Something bad could happen... %d", ++numtrack ); Console.Warning( L"Testing high stress loads %s", L"(multi-color)" ); Yield( 0 ); } } // ---------------------------------------------------------------------------- // Pass an uninitialized file object. The function will ask the user for the // filename and try to open it. It returns true on success (file was opened), // false if file couldn't be opened/created and -1 if the file selection // dialog was canceled. // static bool OpenLogFile(wxFile& file, wxString& filename, wxWindow *parent) { filename = wxSaveFileSelector(L"log", L"txt", L"log.txt", parent); if ( !filename ) return false; // canceled if( wxFile::Exists(filename) ) { bool bAppend = false; wxString strMsg; strMsg.Printf(L"Append log to file '%s' (choosing [No] will overwrite it)?", filename.c_str()); switch ( Msgbox::ShowModal( _("Save log question"), strMsg, MsgButtons().YesNo().Cancel() ) ) { case wxID_YES: bAppend = true; break; case wxID_NO: bAppend = false; break; case wxID_CANCEL: return false; default: pxFailDev( "invalid message box return value" ); } return ( bAppend ) ? file.Open(filename, wxFile::write_append) : file.Create(filename, true /* overwrite */); } return file.Create(filename); }
// Portable installations are assumed to be run in either administrator rights mode, or run // from "insecure media" such as a removable flash drive. In these cases, the default path for // PCSX2 user documents becomes ".", which is the current working directory. // // Portable installation mode is typically enabled via the presence of an INI file in the // same directory that PCSX2 is installed to. // wxConfigBase* Pcsx2App::TestForPortableInstall() { InstallationMode = InstallMode_Registered; const wxFileName portableIniFile( GetPortableIniPath() ); const wxDirName portableDocsFolder( portableIniFile.GetPath() ); if (Startup.PortableMode || portableIniFile.FileExists()) { wxString FilenameStr = portableIniFile.GetFullPath(); if (Startup.PortableMode) Console.WriteLn( L"(UserMode) Portable mode requested via commandline switch!" ); else Console.WriteLn( L"(UserMode) Found portable install ini @ %s", FilenameStr.c_str() ); // Just because the portable ini file exists doesn't mean we can actually run in portable // mode. In order to determine our read/write permissions to the PCSX2, we must try to // modify the configured documents folder, and catch any ensuing error. ScopedPtr<wxFileConfig> conf_portable( OpenFileConfig( portableIniFile.GetFullPath() ) ); conf_portable->SetRecordDefaults(false); while( true ) { wxString accessFailedStr, createFailedStr; if (TestUserPermissionsRights( portableDocsFolder, createFailedStr, accessFailedStr )) break; wxDialogWithHelpers dialog( NULL, AddAppName(_("Portable mode error - %s")) ); wxTextCtrl* scrollText = new wxTextCtrl( &dialog, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_READONLY | wxTE_MULTILINE | wxTE_WORDWRAP ); if (!createFailedStr.IsEmpty()) scrollText->AppendText( createFailedStr + L"\n" ); if (!accessFailedStr.IsEmpty()) scrollText->AppendText( accessFailedStr + L"\n" ); dialog += dialog.Heading( _("PCSX2 has been installed as a portable application but cannot run due to the following errors:" ) ); dialog += scrollText | pxExpand.Border(wxALL, 16); dialog += 6; dialog += dialog.Text( GetMsg_PortableModeRights() ); // [TODO] : Add url for platform-relevant user permissions tutorials? (low priority) wxWindowID result = pxIssueConfirmation( dialog, MsgButtons().Retry().Cancel().Custom(_("Switch to User Documents Mode"), "switchmode") ); switch (result) { case wxID_CANCEL: throw Exception::StartupAborted( L"User canceled portable mode due to insufficient user access/permissions." ); case wxID_RETRY: // do nothing (continues while loop) break; case pxID_CUSTOM: wxDialogWithHelpers dialog2( NULL, AddAppName(_("%s is switching to local install mode.")) ); dialog2 += dialog2.Heading( _("Try to remove the file called \"portable.ini\" from your installation directory manually." ) ); dialog2 += 6; pxIssueConfirmation( dialog2, MsgButtons().OK() ); conf_portable.DetachPtr(); // Not sure but can't hurt return NULL; } } // Success -- all user-based folders have write access. PCSX2 should be able to run error-free! // Force-set the custom documents mode, and set the InstallationMode = InstallMode_Portable; DocsFolderMode = DocsFolder_Custom; CustomDocumentsFolder = portableDocsFolder; return conf_portable.DetachPtr(); } return NULL; }
bool YesNo( const wxString& text, const wxString& caption, int icon ) { return ShowModal(caption, text, MsgButtons().YesNo()) == wxID_YES; }
// Pops up a dialog box with Ok/Cancel buttons. Returns the result of the inquiry, // true if OK, false if cancel. bool OkCancel( const wxString& text, const wxString& caption, int icon ) { return ShowModal(caption, text, MsgButtons().OKCancel()) == wxID_OK; }
// Pops up an alert Dialog Box with a singular "OK" button. // Always returns false. bool Alert( const wxString& text, const wxString& caption, int icon ) { ShowModal( caption, text, MsgButtons().OK() ); return false; }