wininet: Support ICU_ENCODE_PERCENT, ICU_ENCODE_SPACES_ONLY, and ICU_NO_META.
Alex Henrie
alexhenrie24 at gmail.com
Wed Jul 18 20:33:03 CDT 2012
Without this patch, Internet Explorer 6 produces a lot of messages like
"fixme:wininet:InternetCanonicalizeUrlW Unhandled flags 0x04000000"
Wine's wininet.h was missing ICU_ENCODE_PERCENT, which is present in
the wininet.h from the Windows 7 SDK.
Wine previously treated ICU_ESCAPE like ICU_DECODE. This is incorrect,
MSDN and empirical tests agree that ICU_ESCAPE should be ignored:
http://msdn.microsoft.com/en-us/library/windows/desktop/aa384342(v=vs.85).aspx
https://testbot.winehq.org/JobDetails.pl?Key=20155
---
dlls/wininet/internet.c | 96 ++++++++++++++++++-----------------------------
include/wininet.h | 1 +
2 files changed, 37 insertions(+), 60 deletions(-)
diff --git a/dlls/wininet/internet.c b/dlls/wininet/internet.c
index 2b659da..694b2c3 100644
--- a/dlls/wininet/internet.c
+++ b/dlls/wininet/internet.c
@@ -1963,6 +1963,36 @@ DWORD WINAPI InternetAttemptConnect(DWORD dwReserved)
/***********************************************************************
+ * convert_url_canonicalization_flags
+ *
+ * Helper for InternetCanonicalizeUrl
+ *
+ * PARAMS
+ * dwFlags [I] Flags suitable for InternetCanonicalizeUrl
+ *
+ * RETURNS
+ * Flags suitable for UrlCanonicalize
+ */
+static DWORD convert_url_canonicalization_flags(DWORD dwFlags)
+{
+ DWORD dwUrlFlags = URL_WININET_COMPATIBILITY | URL_ESCAPE_UNSAFE;
+
+ if (dwFlags & ICU_BROWSER_MODE) dwUrlFlags |= URL_BROWSER_MODE;
+ if (dwFlags & ICU_DECODE) dwUrlFlags |= URL_UNESCAPE;
+ if (dwFlags & ICU_ENCODE_PERCENT) dwUrlFlags |= URL_ESCAPE_PERCENT;
+ if (dwFlags & ICU_ENCODE_SPACES_ONLY) dwUrlFlags |= URL_ESCAPE_SPACES_ONLY;
+ /* Flip this bit to correspond to URL_ESCAPE_UNSAFE */
+ if (dwFlags & ICU_NO_ENCODE) dwUrlFlags ^= URL_ESCAPE_UNSAFE;
+ if (dwFlags & ICU_NO_META) dwUrlFlags |= URL_NO_META;
+
+ dwFlags &= ~(ICU_BROWSER_MODE|ICU_DECODE|ICU_ENCODE_PERCENT|ICU_ENCODE_SPACES_ONLY|ICU_NO_ENCODE|ICU_NO_META);
+ if (dwFlags)
+ FIXME("Unhandled flags 0x%08x\n", dwFlags);
+
+ return dwUrlFlags;
+}
+
+/***********************************************************************
* InternetCanonicalizeUrlA (WININET.@)
*
* Escape unsafe characters and spaces
@@ -1976,43 +2006,16 @@ BOOL WINAPI InternetCanonicalizeUrlA(LPCSTR lpszUrl, LPSTR lpszBuffer,
LPDWORD lpdwBufferLength, DWORD dwFlags)
{
HRESULT hr;
- DWORD dwURLFlags = URL_WININET_COMPATIBILITY | URL_ESCAPE_UNSAFE;
TRACE("(%s, %p, %p, 0x%08x) bufferlength: %d\n", debugstr_a(lpszUrl), lpszBuffer,
lpdwBufferLength, dwFlags, lpdwBufferLength ? *lpdwBufferLength : -1);
- if(dwFlags & ICU_DECODE)
- {
- dwURLFlags |= URL_UNESCAPE;
- dwFlags &= ~ICU_DECODE;
- }
-
- if(dwFlags & ICU_ESCAPE)
- {
- dwURLFlags |= URL_UNESCAPE;
- dwFlags &= ~ICU_ESCAPE;
- }
-
- if(dwFlags & ICU_BROWSER_MODE)
- {
- dwURLFlags |= URL_BROWSER_MODE;
- dwFlags &= ~ICU_BROWSER_MODE;
- }
-
- if(dwFlags & ICU_NO_ENCODE)
- {
- /* Flip this bit to correspond to URL_ESCAPE_UNSAFE */
- dwURLFlags ^= URL_ESCAPE_UNSAFE;
- dwFlags &= ~ICU_NO_ENCODE;
- }
-
- if (dwFlags) FIXME("Unhandled flags 0x%08x\n", dwFlags);
-
- hr = UrlCanonicalizeA(lpszUrl, lpszBuffer, lpdwBufferLength, dwURLFlags);
+ dwFlags = convert_url_canonicalization_flags(dwFlags);
+ hr = UrlCanonicalizeA(lpszUrl, lpszBuffer, lpdwBufferLength, dwFlags);
if (hr == E_POINTER) SetLastError(ERROR_INSUFFICIENT_BUFFER);
if (hr == E_INVALIDARG) SetLastError(ERROR_INVALID_PARAMETER);
- return (hr == S_OK) ? TRUE : FALSE;
+ return hr == S_OK;
}
/***********************************************************************
@@ -2029,43 +2032,16 @@ BOOL WINAPI InternetCanonicalizeUrlW(LPCWSTR lpszUrl, LPWSTR lpszBuffer,
LPDWORD lpdwBufferLength, DWORD dwFlags)
{
HRESULT hr;
- DWORD dwURLFlags = URL_WININET_COMPATIBILITY | URL_ESCAPE_UNSAFE;
TRACE("(%s, %p, %p, 0x%08x) bufferlength: %d\n", debugstr_w(lpszUrl), lpszBuffer,
lpdwBufferLength, dwFlags, lpdwBufferLength ? *lpdwBufferLength : -1);
- if(dwFlags & ICU_DECODE)
- {
- dwURLFlags |= URL_UNESCAPE;
- dwFlags &= ~ICU_DECODE;
- }
-
- if(dwFlags & ICU_ESCAPE)
- {
- dwURLFlags |= URL_UNESCAPE;
- dwFlags &= ~ICU_ESCAPE;
- }
-
- if(dwFlags & ICU_BROWSER_MODE)
- {
- dwURLFlags |= URL_BROWSER_MODE;
- dwFlags &= ~ICU_BROWSER_MODE;
- }
-
- if(dwFlags & ICU_NO_ENCODE)
- {
- /* Flip this bit to correspond to URL_ESCAPE_UNSAFE */
- dwURLFlags ^= URL_ESCAPE_UNSAFE;
- dwFlags &= ~ICU_NO_ENCODE;
- }
-
- if (dwFlags) FIXME("Unhandled flags 0x%08x\n", dwFlags);
-
- hr = UrlCanonicalizeW(lpszUrl, lpszBuffer, lpdwBufferLength, dwURLFlags);
+ dwFlags = convert_url_canonicalization_flags(dwFlags);
+ hr = UrlCanonicalizeW(lpszUrl, lpszBuffer, lpdwBufferLength, dwFlags);
if (hr == E_POINTER) SetLastError(ERROR_INSUFFICIENT_BUFFER);
if (hr == E_INVALIDARG) SetLastError(ERROR_INVALID_PARAMETER);
- return (hr == S_OK) ? TRUE : FALSE;
+ return hr == S_OK;
}
/* #################################################### */
diff --git a/include/wininet.h b/include/wininet.h
index 530a693..4c47902 100644
--- a/include/wininet.h
+++ b/include/wininet.h
@@ -421,6 +421,7 @@ BOOLAPI InternetCombineUrlW(LPCWSTR ,LPCWSTR ,LPWSTR ,LPDWORD ,DWORD);
#define ICU_NO_META 0x08000000
#define ICU_ENCODE_SPACES_ONLY 0x04000000
#define ICU_BROWSER_MODE 0x02000000
+#define ICU_ENCODE_PERCENT 0x00001000
INTERNETAPI HINTERNET WINAPI InternetOpenA(LPCSTR ,DWORD ,LPCSTR ,LPCSTR ,DWORD);
INTERNETAPI HINTERNET WINAPI InternetOpenW(LPCWSTR ,DWORD ,LPCWSTR ,LPCWSTR ,DWORD);
--
1.7.9.5
More information about the wine-patches
mailing list