fix wxExecute() return code checks and removed not working code to open URLs in new window
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@35668 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -520,189 +520,67 @@ long wxExecute(const wxString& command,
|
|||||||
// Launch default browser
|
// Launch default browser
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
bool wxLaunchDefaultBrowser(const wxString& url)
|
bool wxLaunchDefaultBrowser(const wxString& urlOrig)
|
||||||
{
|
{
|
||||||
bool success = true;
|
// set the scheme of url to http if it does not have one
|
||||||
|
wxString url(urlOrig);
|
||||||
|
if ( !wxURI(url).HasScheme() )
|
||||||
|
url.Prepend(wxT("http://"));
|
||||||
|
|
||||||
wxString finalurl = url;
|
#if defined(__WXMSW__)
|
||||||
|
WinStruct<SHELLEXECUTEINFO> sei;
|
||||||
|
sei.lpFile = url.c_str();
|
||||||
|
sei.lpVerb = _T("open");
|
||||||
|
sei.nShow = SW_SHOWNORMAL;
|
||||||
|
|
||||||
//if it isn't a full url, try appending http:// to it
|
::ShellExecuteEx(&sei);
|
||||||
if(wxURI(url).IsReference())
|
|
||||||
finalurl = wxString(wxT("http://")) + url;
|
|
||||||
|
|
||||||
#if defined(__WXMSW__) && wxUSE_CONFIG_NATIVE
|
const int nResult = (int) sei.hInstApp;
|
||||||
|
|
||||||
wxString command;
|
// Firefox returns file not found for some reason, so make an exception
|
||||||
|
// for it
|
||||||
// ShellExecute() always opens in the same window,
|
if ( nResult > 32 || nResult == SE_ERR_FNF )
|
||||||
// so do it manually for new window (from Mahogany)
|
|
||||||
wxRegKey key(wxRegKey::HKCR, url.BeforeFirst(':') + wxT("\\shell\\open"));
|
|
||||||
if ( key.Exists() )
|
|
||||||
{
|
{
|
||||||
wxRegKey keyDDE(key, wxT("DDEExec"));
|
|
||||||
if ( keyDDE.Exists() )
|
|
||||||
{
|
|
||||||
wxRegKey keyTopic(keyDDE, wxT("topic"));
|
|
||||||
wxString ddeTopic = keyTopic.QueryDefaultValue();
|
|
||||||
|
|
||||||
// we only know the syntax of WWW_OpenURL DDE request
|
|
||||||
if ( ddeTopic == wxT("WWW_OpenURL") )
|
|
||||||
{
|
|
||||||
wxString ddeCmd = keyDDE.QueryDefaultValue();
|
|
||||||
|
|
||||||
// this is a bit naive but should work as -1 can't appear
|
|
||||||
// elsewhere in the DDE topic, normally
|
|
||||||
if ( ddeCmd.Replace(wxT("-1"), wxT("0"),
|
|
||||||
false /* only first occurence */) == 1 )
|
|
||||||
{
|
|
||||||
// and also replace the parameters
|
|
||||||
if ( ddeCmd.Replace(wxT("%1"), url, false) == 1 )
|
|
||||||
{
|
|
||||||
// magic incantation understood by wxMSW
|
|
||||||
command << wxT("WX_DDE#")
|
|
||||||
<< wxRegKey(key, wxT("command")).QueryDefaultValue() << wxT('#')
|
|
||||||
<< wxRegKey(keyDDE, wxT("application")).QueryDefaultValue()
|
|
||||||
<< wxT('#') << ddeTopic << wxT('#')
|
|
||||||
<< ddeCmd;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//Try wxExecute - if it doesn't work or the regkey stuff
|
|
||||||
//above failed, fallback to opening the file in the same
|
|
||||||
//browser window
|
|
||||||
if ( command.empty() || wxExecute(command) == -1)
|
|
||||||
{
|
|
||||||
int nResult; //HINSTANCE error code
|
|
||||||
|
|
||||||
#if !defined(__WXWINCE__)
|
|
||||||
// CYGWIN and MINGW may have problems - so load ShellExecute
|
|
||||||
// dynamically
|
|
||||||
typedef HINSTANCE (WINAPI *LPShellExecute)(HWND hwnd, const wxChar* lpOperation,
|
|
||||||
const wxChar* lpFile,
|
|
||||||
const wxChar* lpParameters,
|
|
||||||
const wxChar* lpDirectory,
|
|
||||||
INT nShowCmd);
|
|
||||||
|
|
||||||
HINSTANCE hShellDll = ::LoadLibrary(wxT("shell32.dll"));
|
|
||||||
if(hShellDll == NULL)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
LPShellExecute lpShellExecute =
|
|
||||||
(LPShellExecute) ::GetProcAddress(hShellDll,
|
|
||||||
wxString::Format(wxT("ShellExecute%s"),
|
|
||||||
|
|
||||||
#if wxUSE_UNICODE
|
|
||||||
wxT("W")
|
|
||||||
#else
|
|
||||||
wxT("A")
|
|
||||||
#endif
|
|
||||||
#ifdef __WXWINCE__
|
|
||||||
)
|
|
||||||
#else
|
|
||||||
).mb_str(wxConvLocal)
|
|
||||||
#endif
|
|
||||||
);
|
|
||||||
if(lpShellExecute == NULL)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
// Windows sometimes doesn't open the browser correctly when using mime
|
|
||||||
// types, so do ShellExecute - i.e. start <url> (from James Carroll)
|
|
||||||
nResult = (int) (*lpShellExecute)(NULL, NULL, finalurl.c_str(),
|
|
||||||
NULL, wxT(""), SW_SHOWNORMAL);
|
|
||||||
// Unload Shell32.dll
|
|
||||||
::FreeLibrary(hShellDll);
|
|
||||||
#else
|
|
||||||
//Windows CE does not have normal ShellExecute - but it has
|
|
||||||
//ShellExecuteEx all the way back to version 1.0
|
|
||||||
|
|
||||||
|
|
||||||
//Set up the SHELLEXECUTEINFO structure to pass to ShellExecuteEx
|
|
||||||
SHELLEXECUTEINFO sei;
|
|
||||||
sei.cbSize = sizeof(SHELLEXECUTEINFO);
|
|
||||||
sei.dwHotKey = 0;
|
|
||||||
sei.fMask = 0;
|
|
||||||
sei.hIcon = NULL;
|
|
||||||
sei.hInstApp = NULL;
|
|
||||||
sei.hkeyClass = NULL;
|
|
||||||
// Not in WinCE
|
|
||||||
#if 0
|
|
||||||
sei.hMonitor = NULL;
|
|
||||||
#endif
|
|
||||||
sei.hProcess = NULL;
|
|
||||||
sei.hwnd = NULL;
|
|
||||||
sei.lpClass = NULL;
|
|
||||||
sei.lpDirectory = NULL;
|
|
||||||
sei.lpFile = finalurl.c_str();
|
|
||||||
sei.lpIDList = NULL;
|
|
||||||
sei.lpParameters = NULL;
|
|
||||||
sei.lpVerb = TEXT("open");
|
|
||||||
sei.nShow = SW_SHOWNORMAL;
|
|
||||||
|
|
||||||
//Call ShellExecuteEx
|
|
||||||
ShellExecuteEx(&sei);
|
|
||||||
|
|
||||||
//Get error code
|
|
||||||
nResult = (int) sei.hInstApp;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// Hack for Firefox (returns file not found for some reason)
|
|
||||||
// from Angelo Mandato's wxHyperlinksCtrl
|
|
||||||
// HINSTANCE_ERROR == 32 (HINSTANCE_ERROR does not exist on Windows CE)
|
|
||||||
if (nResult <= 32 && nResult != SE_ERR_FNF)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
#ifdef __WXDEBUG__
|
#ifdef __WXDEBUG__
|
||||||
// Log something if SE_ERR_FNF happens
|
// Log something if SE_ERR_FNF happens
|
||||||
if(nResult == SE_ERR_FNF)
|
if ( nResult == SE_ERR_FNF )
|
||||||
wxLogDebug(wxT("Got SE_ERR_FNF from ShellExecute - maybe FireFox"));
|
wxLogDebug(wxT("SE_ERR_FNF from ShellExecute -- maybe FireFox?"));
|
||||||
#endif
|
#endif // __WXDEBUG__
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
#elif wxUSE_MIMETYPE
|
#elif wxUSE_MIMETYPE
|
||||||
|
|
||||||
// Non-windows way
|
// Non-windows way
|
||||||
wxFileType *ft = wxTheMimeTypesManager->GetFileTypeFromExtension (_T("html"));
|
wxFileType *ft = wxTheMimeTypesManager->GetFileTypeFromExtension (_T("html"));
|
||||||
if (!ft)
|
if ( ft )
|
||||||
{
|
{
|
||||||
wxLogError(_T("No default application can open .html extension"));
|
wxString mt;
|
||||||
return false;
|
ft->GetMimeType(&mt);
|
||||||
}
|
|
||||||
|
|
||||||
wxString mt;
|
wxString cmd;
|
||||||
ft->GetMimeType(&mt);
|
bool ok = ft->GetOpenCommand(&cmd, wxFileType::MessageParameters(url));
|
||||||
|
delete ft;
|
||||||
|
|
||||||
wxString cmd;
|
if ( !ok || cmd.empty() )
|
||||||
bool ok = ft->GetOpenCommand (&cmd, wxFileType::MessageParameters(finalurl));
|
|
||||||
delete ft;
|
|
||||||
|
|
||||||
if (ok)
|
|
||||||
{
|
|
||||||
if( wxExecute (cmd, wxEXEC_ASYNC) == -1 )
|
|
||||||
{
|
{
|
||||||
wxLogError(_T("Failed to launch application for wxLaunchDefaultBrowser"));
|
// fallback to checking for the BROWSER environment variable
|
||||||
return false;
|
cmd = wxGetenv(wxT("BROWSER"));
|
||||||
|
if ( !cmd.empty() )
|
||||||
|
cmd << _T(' ') << url;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ( !cmd.empty() && wxExecute(cmd) )
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
else
|
else // no file type for html extension
|
||||||
{
|
{
|
||||||
// fallback to checking for the BROWSER environment variable
|
wxLogError(_T("No default application configured for HTML files."));
|
||||||
cmd = wxGetenv(wxT("BROWSER"));
|
|
||||||
if ( cmd.empty() || wxExecute(cmd + wxT(" ") + finalurl) == -1)
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
#endif // !wxUSE_MIMETYPE && !__WXMSW__
|
||||||
|
|
||||||
|
wxLogSysError(_T("Failed to open URL \"%s\" in default browser."),
|
||||||
|
url.c_str());
|
||||||
|
|
||||||
#else // !wxUSE_MIMETYPE && !(WXMSW && wxUSE_NATIVE_CONFIG)
|
return false;
|
||||||
|
|
||||||
success = false;
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
//success - hopefully
|
|
||||||
return success;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
|
Reference in New Issue
Block a user