if ( !email )
return false;
- wxStrncpy(address, email, maxSize - 1);
- address[maxSize - 1] = wxT('\0');
+ wxStrlcpy(address, email, maxSize);
return true;
}
// Launch document with default app
// ----------------------------------------------------------------------------
-bool wxLaunchDefaultApplication(const wxString &document, int flags)
+bool wxLaunchDefaultApplication(const wxString& document, int flags)
{
wxUnusedVar(flags);
-#ifdef __UNIX__
+#ifdef __WXMAC__
+ static const char * const OPEN_CMD = "/usr/bin/open";
+ if ( wxFileExists(OPEN_CMD) &&
+ wxExecute(wxString(OPEN_CMD) + " " + document) )
+ return true;
+#elif defined(__UNIX__)
// Our best best is to use xdg-open from freedesktop.org cross-desktop
// compatibility suite xdg-utils
// (see http://portland.freedesktop.org/wiki/) -- this is installed on
if ( wxExecute(xdg_open + " " + document) )
return true;
}
+#elif defined(__WXMSW__)
+ WinStruct<SHELLEXECUTEINFO> sei;
+ sei.lpFile = document.wx_str();
+ sei.lpVerb = _T("open");
+ sei.nShow = SW_SHOWDEFAULT;
+
+ // avoid Windows message box in case of error for consistency with
+ // wxLaunchDefaultBrowser() even if don't show the error ourselves in this
+ // function
+ sei.fMask = SEE_MASK_FLAG_NO_UI;
+
+ if ( ::ShellExecuteEx(&sei) )
+ return true;
#endif
- return false;
+ return false;
}
// ----------------------------------------------------------------------------
wxRegKey keyDDE(key, wxT("DDEExec"));
if ( keyDDE.Exists() )
{
- const wxString ddeTopic = wxRegKey(keyDDE, wxT("topic"));
-
// we only know the syntax of WWW_OpenURL DDE request for IE,
// optimistically assume that all other browsers are compatible
// with it
+ static const wxChar *TOPIC_OPEN_URL = wxT("WWW_OpenURL");
wxString ddeCmd;
- bool ok = ddeTopic == wxT("WWW_OpenURL");
+ wxRegKey keyTopic(keyDDE, wxT("topic"));
+ bool ok = keyTopic.Exists() &&
+ keyTopic.QueryDefaultValue() == TOPIC_OPEN_URL;
if ( ok )
{
ddeCmd = keyDDE.QueryDefaultValue();
// in is -1 (meaning "current") by default, replace it with
// 0 which means "new" (see KB article 160957)
ok = ddeCmd.Replace(wxT("-1"), wxT("0"),
- false /* only first occurence */) == 1;
+ false /* only first occurrence */) == 1;
}
if ( ok )
wxLogNull noLog;
const wxString ddeServer = wxRegKey(keyDDE, wxT("application"));
- if ( wxExecuteDDE(ddeServer, ddeTopic, ddeCmd) )
+ if ( wxExecuteDDE(ddeServer, TOPIC_OPEN_URL, ddeCmd) )
return true;
// this is not necessarily an error: maybe browser is
sei.lpFile = url.c_str();
sei.lpVerb = _T("open");
sei.nShow = SW_SHOWNORMAL;
+ sei.fMask = SEE_MASK_FLAG_NO_UI; // we give error message ourselves
- ::ShellExecuteEx(&sei);
-
- const INT_PTR nResult = (INT_PTR)sei.hInstApp;
-
- // Firefox returns file not found for some reason, so make an exception
- // for it
- if ( nResult > 32 || nResult == SE_ERR_FNF )
- {
-#ifdef __WXDEBUG__
- // Log something if SE_ERR_FNF happens
- if ( nResult == SE_ERR_FNF )
- wxLogDebug(wxT("SE_ERR_FNF from ShellExecute -- maybe FireFox?"));
-#endif // __WXDEBUG__
+ if ( ::ShellExecuteEx(&sei) )
return true;
- }
#elif defined(__WXCOCOA__)
// NOTE: We need to call the real implementation from src/cocoa/utils.mm
// because the code must use Objective-C features.