From d98014d3993438de9e43b6b9e02c53730fb6b310 Mon Sep 17 00:00:00 2001 From: "L. David Baron" Date: Wed, 3 Dec 2008 13:36:09 -0800 Subject: [PATCH] Backed out changeset ba0d099c6eb6 on suspicion of causing make check and mochitest timeouts on Windows related to exthandler tests. --- uriloader/exthandler/win/nsMIMEInfoWin.cpp | 111 ++++++++------------- 1 file changed, 42 insertions(+), 69 deletions(-) diff --git a/uriloader/exthandler/win/nsMIMEInfoWin.cpp b/uriloader/exthandler/win/nsMIMEInfoWin.cpp index 604335ed32a..bb43512ef31 100755 --- a/uriloader/exthandler/win/nsMIMEInfoWin.cpp +++ b/uriloader/exthandler/win/nsMIMEInfoWin.cpp @@ -56,16 +56,6 @@ #include "nsOSHelperAppService.h" #include "nsUnicharUtils.h" -#ifdef WINCE -#ifdef UNICODE -#define SHELLEXECUTEINFOW SHELLEXECUTEINFO -#define ShellExecuteExW ShellExecuteEx -#else -#error "we don't support narrow char wince" -#endif -#endif - - NS_IMPL_ISUPPORTS_INHERITED1(nsMIMEInfoWin, nsMIMEInfoBase, nsIPropertyBag) nsMIMEInfoWin::~nsMIMEInfoWin() @@ -133,23 +123,23 @@ nsMIMEInfoWin::LaunchWithFile(nsIFile* aFile) if (!GetDllLaunchInfo(executable, locFile, args, PR_FALSE)) return NS_ERROR_INVALID_ARG; - SHELLEXECUTEINFOW seinfo; - memset(&seinfo, 0, sizeof(seinfo)); - seinfo.cbSize = sizeof(SHELLEXECUTEINFOW); - seinfo.fMask = NULL; - seinfo.hwnd = NULL; - seinfo.lpVerb = NULL; - seinfo.lpFile = L"rundll32.exe"; - seinfo.lpParameters = args.get(); - seinfo.lpDirectory = NULL; - seinfo.nShow = SW_SHOWNORMAL; - if (ShellExecuteExW(&seinfo)) + int result = (int) + ::ShellExecuteW(NULL, NULL, L"rundll32.exe", args.get(), + NULL, SW_SHOWNORMAL); + // Returns a value greater than 32 if successful. See msdn. + if (result > 32) return NS_OK; - switch ((int)seinfo.hInstApp) { + switch (result) { case 0: case SE_ERR_OOM: return NS_ERROR_OUT_OF_MEMORY; + case ERROR_FILE_NOT_FOUND: + return NS_ERROR_FILE_NOT_FOUND; + case ERROR_PATH_NOT_FOUND: + return NS_ERROR_FILE_UNRECOGNIZED_PATH; + case ERROR_BAD_FORMAT: + return NS_ERROR_FILE_CORRUPTED; case SE_ERR_ACCESSDENIED: return NS_ERROR_FILE_ACCESS_DENIED; case SE_ERR_ASSOCINCOMPLETE: @@ -163,16 +153,6 @@ nsMIMEInfoWin::LaunchWithFile(nsIFile* aFile) return NS_ERROR_FAILURE; case SE_ERR_SHARE: return NS_ERROR_FILE_IS_LOCKED; - default: - switch(GetLastError()) { - case ERROR_FILE_NOT_FOUND: - return NS_ERROR_FILE_NOT_FOUND; - case ERROR_PATH_NOT_FOUND: - return NS_ERROR_FILE_UNRECOGNIZED_PATH; - case ERROR_BAD_FORMAT: - return NS_ERROR_FILE_CORRUPTED; - } - } return NS_ERROR_FILE_EXECUTION_FAILED; } @@ -248,14 +228,12 @@ nsMIMEInfoWin::GetProperty(const nsAString& aName, nsIVariant* *_retval) return NS_OK; } -#ifndef WINCE typedef HRESULT (STDMETHODCALLTYPE *MySHParseDisplayName) (PCWSTR pszName, IBindCtx *pbc, LPITEMIDLIST *ppidl, SFGAOF sfgaoIn, SFGAOF *psfgaoOut); -#endif // this implementation was pretty much copied verbatime from // Tony Robinson's code in nsExternalProtocolWin.cpp @@ -284,49 +262,44 @@ nsMIMEInfoWin::LoadUriInternal(nsIURI * aURL) if (urlSpec.Length() > maxSafeURL) return NS_ERROR_FAILURE; - HMODULE hDll = NULL; - - static const PRUnichar cmdVerb[] = L"open"; - SHELLEXECUTEINFOW sinfo; - memset(&sinfo, 0, sizeof(sinfo)); - sinfo.cbSize = sizeof(sinfo); -#ifdef WINCE - sinfo.fMask = NULL; -#else - sinfo.fMask = SEE_MASK_FLAG_DDEWAIT | - SEE_MASK_FLAG_NO_UI ; -#endif - sinfo.hwnd = NULL; - sinfo.lpVerb = (LPWSTR)&cmdVerb; - sinfo.nShow = SW_SHOWNORMAL; - -#ifndef WINCE LPITEMIDLIST pidl; SFGAOF sfgao; // Bug 394974 - hDll = ::LoadLibraryW(L"shell32.dll"); + HMODULE hDll = ::LoadLibraryW(L"shell32.dll"); MySHParseDisplayName pMySHParseDisplayName = NULL; // Version 6.0 and higher - if ((pMySHParseDisplayName = (MySHParseDisplayName) - ::GetProcAddress(hDll, "SHParseDisplayName")) && - (SUCCEEDED(pMySHParseDisplayName(NS_ConvertUTF8toUTF16(urlSpec).get(), - NULL, &pidl, 0, &sfgao)))) { + if (pMySHParseDisplayName = + (MySHParseDisplayName)::GetProcAddress(hDll, + "SHParseDisplayName")) { + if (SUCCEEDED(pMySHParseDisplayName(NS_ConvertUTF8toUTF16(urlSpec).get(), + NULL, &pidl, 0, &sfgao))) { + static const PRUnichar cmdVerb[] = L"open"; + SHELLEXECUTEINFOW sinfo; + memset(&sinfo, 0, sizeof(sinfo)); + sinfo.cbSize = sizeof(sinfo); + sinfo.fMask = SEE_MASK_FLAG_DDEWAIT | + SEE_MASK_FLAG_NO_UI | + SEE_MASK_INVOKEIDLIST; + sinfo.hwnd = NULL; + sinfo.lpVerb = (LPWSTR)&cmdVerb; + sinfo.nShow = SW_SHOWNORMAL; sinfo.lpIDList = pidl; - sinfo.fMask |= SEE_MASK_INVOKEIDLIST; - } else -#endif - { - sinfo.lpFile = NS_ConvertUTF8toUTF16(urlSpec).get(); - } - BOOL result = ShellExecuteExW(&sinfo); - if (!result || ((int)sinfo.hInstApp) < 32) - rv = NS_ERROR_FAILURE; + + BOOL result = ShellExecuteExW(&sinfo); -#ifndef WINCE - if (pidl) - CoTaskMemFree(pidl); -#endif + CoTaskMemFree(pidl); + + if (!result || ((int)sinfo.hInstApp) < 32) + rv = NS_ERROR_FAILURE; + } + } else { + // Version of shell32.dll < 6.0 + int r = (int) ::ShellExecuteW(NULL, L"open", NS_ConvertUTF8toUTF16(urlSpec).get(), + NULL, NULL, SW_SHOWNORMAL); + if (r < 32) + rv = NS_ERROR_FAILURE; + } if (hDll) ::FreeLibrary(hDll); }