Fix for broken wxMSWUniv after wxLaunchDefaultBrowser introduction. Source cleaning (should not happen in new code).

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@33879 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Włodzimierz Skiba 2005-04-25 15:51:57 +00:00
parent 3bce55ac06
commit 657a7545e0

View File

@ -122,13 +122,13 @@
wxChar * wxChar *
copystring (const wxChar *s) copystring (const wxChar *s)
{ {
if (s == NULL) s = wxEmptyString; if (s == NULL) s = wxEmptyString;
size_t len = wxStrlen (s) + 1; size_t len = wxStrlen (s) + 1;
wxChar *news = new wxChar[len]; wxChar *news = new wxChar[len];
memcpy (news, s, len * sizeof(wxChar)); // Should be the fastest memcpy (news, s, len * sizeof(wxChar)); // Should be the fastest
return news; return news;
} }
#endif // WXWIN_COMPATIBILITY_2_4 #endif // WXWIN_COMPATIBILITY_2_4
@ -145,65 +145,65 @@ WXDLLIMPEXP_DATA_BASE(const wxChar *) wxDoubleToStringStr = wxT("%.2f");
void void
StringToFloat (const wxChar *s, float *number) StringToFloat (const wxChar *s, float *number)
{ {
if (s && *s && number) if (s && *s && number)
*number = (float) wxStrtod (s, (wxChar **) NULL); *number = (float) wxStrtod (s, (wxChar **) NULL);
} }
void void
StringToDouble (const wxChar *s, double *number) StringToDouble (const wxChar *s, double *number)
{ {
if (s && *s && number) if (s && *s && number)
*number = wxStrtod (s, (wxChar **) NULL); *number = wxStrtod (s, (wxChar **) NULL);
} }
wxChar * wxChar *
FloatToString (float number, const wxChar *fmt) FloatToString (float number, const wxChar *fmt)
{ {
static wxChar buf[256]; static wxChar buf[256];
wxSprintf (buf, fmt, number); wxSprintf (buf, fmt, number);
return buf; return buf;
} }
wxChar * wxChar *
DoubleToString (double number, const wxChar *fmt) DoubleToString (double number, const wxChar *fmt)
{ {
static wxChar buf[256]; static wxChar buf[256];
wxSprintf (buf, fmt, number); wxSprintf (buf, fmt, number);
return buf; return buf;
} }
void void
StringToInt (const wxChar *s, int *number) StringToInt (const wxChar *s, int *number)
{ {
if (s && *s && number) if (s && *s && number)
*number = (int) wxStrtol (s, (wxChar **) NULL, 10); *number = (int) wxStrtol (s, (wxChar **) NULL, 10);
} }
void void
StringToLong (const wxChar *s, long *number) StringToLong (const wxChar *s, long *number)
{ {
if (s && *s && number) if (s && *s && number)
*number = wxStrtol (s, (wxChar **) NULL, 10); *number = wxStrtol (s, (wxChar **) NULL, 10);
} }
wxChar * wxChar *
IntToString (int number) IntToString (int number)
{ {
static wxChar buf[20]; static wxChar buf[20];
wxSprintf (buf, wxT("%d"), number); wxSprintf (buf, wxT("%d"), number);
return buf; return buf;
} }
wxChar * wxChar *
LongToString (long number) LongToString (long number)
{ {
static wxChar buf[20]; static wxChar buf[20];
wxSprintf (buf, wxT("%ld"), number); wxSprintf (buf, wxT("%ld"), number);
return buf; return buf;
} }
#endif // WXWIN_COMPATIBILITY_2_4 #endif // WXWIN_COMPATIBILITY_2_4
@ -214,29 +214,29 @@ static wxChar hexArray[] = wxT("0123456789ABCDEF");
// Convert 2-digit hex number to decimal // Convert 2-digit hex number to decimal
int wxHexToDec(const wxString& buf) int wxHexToDec(const wxString& buf)
{ {
int firstDigit, secondDigit; int firstDigit, secondDigit;
if (buf.GetChar(0) >= wxT('A')) if (buf.GetChar(0) >= wxT('A'))
firstDigit = buf.GetChar(0) - wxT('A') + 10; firstDigit = buf.GetChar(0) - wxT('A') + 10;
else else
firstDigit = buf.GetChar(0) - wxT('0'); firstDigit = buf.GetChar(0) - wxT('0');
if (buf.GetChar(1) >= wxT('A')) if (buf.GetChar(1) >= wxT('A'))
secondDigit = buf.GetChar(1) - wxT('A') + 10; secondDigit = buf.GetChar(1) - wxT('A') + 10;
else else
secondDigit = buf.GetChar(1) - wxT('0'); secondDigit = buf.GetChar(1) - wxT('0');
return (firstDigit & 0xF) * 16 + (secondDigit & 0xF ); return (firstDigit & 0xF) * 16 + (secondDigit & 0xF );
} }
// Convert decimal integer to 2-character hex string // Convert decimal integer to 2-character hex string
void wxDecToHex(int dec, wxChar *buf) void wxDecToHex(int dec, wxChar *buf)
{ {
int firstDigit = (int)(dec/16.0); int firstDigit = (int)(dec/16.0);
int secondDigit = (int)(dec - (firstDigit*16.0)); int secondDigit = (int)(dec - (firstDigit*16.0));
buf[0] = hexArray[firstDigit]; buf[0] = hexArray[firstDigit];
buf[1] = hexArray[secondDigit]; buf[1] = hexArray[secondDigit];
buf[2] = 0; buf[2] = 0;
} }
// Convert decimal integer to 2-character hex string // Convert decimal integer to 2-character hex string
@ -539,7 +539,8 @@ bool wxLaunchDefaultBrowser(const wxString& url)
if(wxURI(url).IsReference()) if(wxURI(url).IsReference())
finalurl = wxString(wxT("http://")) + url; finalurl = wxString(wxT("http://")) + url;
#ifdef __WINDOWS__ #if defined(__WXMSW__) && wxUSE_CONFIG_NATIVE
wxString command; wxString command;
// ShellExecute() always opens in the same window, // ShellExecute() always opens in the same window,
@ -550,58 +551,58 @@ bool wxLaunchDefaultBrowser(const wxString& url)
wxRegKey keyDDE(key, wxT("DDEExec")); wxRegKey keyDDE(key, wxT("DDEExec"));
if ( keyDDE.Exists() ) if ( keyDDE.Exists() )
{ {
wxString ddeTopic = wxRegKey(keyDDE, wxT("topic")); wxString ddeTopic = wxRegKey(keyDDE, wxT("topic"));
// we only know the syntax of WWW_OpenURL DDE request // we only know the syntax of WWW_OpenURL DDE request
if ( ddeTopic == wxT("WWW_OpenURL") ) if ( ddeTopic == wxT("WWW_OpenURL") )
{ {
wxString ddeCmd = keyDDE; wxString ddeCmd = keyDDE;
// this is a bit naive but should work as -1 can't appear // this is a bit naive but should work as -1 can't appear
// elsewhere in the DDE topic, normally // elsewhere in the DDE topic, normally
if ( ddeCmd.Replace(wxT("-1"), wxT("0"), if ( ddeCmd.Replace(wxT("-1"), wxT("0"),
FALSE /* only first occurence */) == 1 ) false /* only first occurence */) == 1 )
{ {
// and also replace the parameters // and also replace the parameters
if ( ddeCmd.Replace(wxT("%1"), url, FALSE) == 1 ) if ( ddeCmd.Replace(wxT("%1"), url, false) == 1 )
{ {
// magic incantation understood by wxMSW // magic incantation understood by wxMSW
command << wxT("WX_DDE#") command << wxT("WX_DDE#")
<< wxRegKey(key, wxT("command")).QueryDefaultValue() << wxT('#') << wxRegKey(key, wxT("command")).QueryDefaultValue() << wxT('#')
<< wxRegKey(keyDDE, wxT("application")).QueryDefaultValue() << wxRegKey(keyDDE, wxT("application")).QueryDefaultValue()
<< wxT('#') << ddeTopic << wxT('#') << wxT('#') << ddeTopic << wxT('#')
<< ddeCmd; << ddeCmd;
} }
} }
} }
} }
} }
//Try wxExecute - if it doesn't work or the regkey stuff //Try wxExecute - if it doesn't work or the regkey stuff
//above failed, fallback to opening the file in the same //above failed, fallback to opening the file in the same
//browser window //browser window
if ( command.empty() || wxExecute(command) == -1) if ( command.empty() || wxExecute(command) == -1)
{ {
// CYGWIN and MINGW may have problems - so load ShellExecute // CYGWIN and MINGW may have problems - so load ShellExecute
// dynamically // dynamically
typedef HINSTANCE (*LPShellExecute)(HWND hwnd, const wxChar* lpOperation, typedef HINSTANCE (*LPShellExecute)(HWND hwnd, const wxChar* lpOperation,
const wxChar* lpFile, const wxChar* lpFile,
const wxChar* lpParameters, const wxChar* lpParameters,
const wxChar* lpDirectory, const wxChar* lpDirectory,
INT nShowCmd); INT nShowCmd);
HINSTANCE hShellDll = ::LoadLibrary(wxT("shell32.dll")); HINSTANCE hShellDll = ::LoadLibrary(wxT("shell32.dll"));
if(hShellDll == NULL) if(hShellDll == NULL)
return false; return false;
LPShellExecute lpShellExecute = LPShellExecute lpShellExecute =
(LPShellExecute) ::GetProcAddress(hShellDll, (LPShellExecute) ::GetProcAddress(hShellDll,
wxString::Format(wxT("ShellExecute%s"), wxString::Format(wxT("ShellExecute%s"),
#ifdef __WXUNICODE__ #ifdef __WXUNICODE__
wxT("W") wxT("W")
#else #else
wxT("A") wxT("A")
#endif #endif
#ifdef __WXWINCE__ #ifdef __WXWINCE__
) )
@ -609,13 +610,13 @@ bool wxLaunchDefaultBrowser(const wxString& url)
).mb_str(wxConvLocal) ).mb_str(wxConvLocal)
#endif #endif
); );
if(lpShellExecute == NULL) if(lpShellExecute == NULL)
return false; return false;
// Windows sometimes doesn't open the browser correctly when using mime // Windows sometimes doesn't open the browser correctly when using mime
// types, so do ShellExecute - i.e. start <url> (from James Carroll) // types, so do ShellExecute - i.e. start <url> (from James Carroll)
unsigned int nResult = (int) (*lpShellExecute)(NULL, NULL, finalurl.c_str(), unsigned int nResult = (int) (*lpShellExecute)(NULL, NULL, finalurl.c_str(),
NULL, wxT(""), SW_SHOWNORMAL); NULL, wxT(""), SW_SHOWNORMAL);
// Unload Shell32.dll // Unload Shell32.dll
::FreeLibrary(hShellDll); ::FreeLibrary(hShellDll);
@ -624,37 +625,33 @@ bool wxLaunchDefaultBrowser(const wxString& url)
// from Angelo Mandato's wxHyperlinksCtrl // from Angelo Mandato's wxHyperlinksCtrl
// HINSTANCE_ERROR == 32 // HINSTANCE_ERROR == 32
if (nResult <= HINSTANCE_ERROR && nResult != SE_ERR_FNF) if (nResult <= HINSTANCE_ERROR && nResult != SE_ERR_FNF)
return false; 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("Got SE_ERR_FNF from ShellExecute - maybe FireFox"));
# endif #endif
} }
#elif wxUSE_MIMETYPE
#else
#if wxUSE_MIMETYPE
// Non-windows way // Non-windows way
wxFileType *ft = wxFileType *ft = wxTheMimeTypesManager->GetFileTypeFromExtension (_T("html"));
wxTheMimeTypesManager->GetFileTypeFromExtension (_T("html")); if (!ft)
if (!ft) {
{ wxLogError(_T("No default application can open .html extension"));
wxLogError(_T("No default application can open .html extension")); return false;
return false; }
}
wxString mt; wxString mt;
ft->GetMimeType(&mt); ft->GetMimeType(&mt);
wxString cmd; wxString cmd;
bool ok = bool ok = ft->GetOpenCommand (&cmd, wxFileType::MessageParameters(finalurl));
ft->GetOpenCommand (&cmd, delete ft;
wxFileType::MessageParameters (finalurl.c_str(),
_T(""))); if (ok)
delete ft;
if (ok)
{ {
if( wxExecute (cmd, wxEXEC_ASYNC) == -1 ) if( wxExecute (cmd, wxEXEC_ASYNC) == -1 )
{ {
@ -663,10 +660,11 @@ bool wxLaunchDefaultBrowser(const wxString& url)
} }
} }
else else
return false; return false;
#else
return false; #else // !wxUSE_MIMETYPE && !(WXMSW && wxUSE_NATIVE_CONFIG)
#endif //!wxUSE_MIMETYPE
return false;
#endif #endif