Jacek Caban : wininet: Store request object instead of handle in error dialog.

Alexandre Julliard julliard at winehq.org
Thu Jun 7 13:39:17 CDT 2012


Module: wine
Branch: master
Commit: b5fec3c03380c066d36531d963a8d54596fb241d
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=b5fec3c03380c066d36531d963a8d54596fb241d

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Thu Jun  7 15:41:08 2012 +0200

wininet: Store request object instead of handle in error dialog.

---

 dlls/wininet/dialogs.c        |   83 +++++++++++++++++++++++++++--------------
 dlls/wininet/tests/internet.c |    4 +-
 2 files changed, 57 insertions(+), 30 deletions(-)

diff --git a/dlls/wininet/dialogs.c b/dlls/wininet/dialogs.c
index 7bcfb15..bd80ea3 100644
--- a/dlls/wininet/dialogs.c
+++ b/dlls/wininet/dialogs.c
@@ -50,8 +50,8 @@ WINE_DEFAULT_DEBUG_CHANNEL(wininet);
 
 struct WININET_ErrorDlgParams
 {
+    http_request_t *req;
     HWND       hWnd;
-    HINTERNET  hRequest;
     DWORD      dwError;
     DWORD      dwFlags;
     LPVOID*    lppvData;
@@ -317,7 +317,7 @@ static INT_PTR WINAPI WININET_ProxyPasswordDialog(
         SetWindowLongPtrW( hdlg, GWLP_USERDATA, lParam );
 
         /* extract the Realm from the proxy response and show it */
-        if( WININET_GetAuthRealm( params->hRequest,
+        if( WININET_GetAuthRealm( params->req->hdr.hInternet,
                                   szRealm, sizeof szRealm/sizeof(WCHAR), TRUE ) )
         {
             hitem = GetDlgItem( hdlg, IDC_REALM );
@@ -325,7 +325,7 @@ static INT_PTR WINAPI WININET_ProxyPasswordDialog(
         }
 
         /* extract the name of the proxy server */
-        if( WININET_GetProxyServer( params->hRequest, 
+        if( WININET_GetProxyServer( params->req->hdr.hInternet,
                                     szServer, sizeof szServer/sizeof(WCHAR)) )
         {
             hitem = GetDlgItem( hdlg, IDC_PROXY );
@@ -360,14 +360,14 @@ static INT_PTR WINAPI WININET_ProxyPasswordDialog(
             hitem = GetDlgItem( hdlg, IDC_SAVEPASSWORD );
             if( hitem &&
                 SendMessageW( hitem, BM_GETSTATE, 0, 0 ) &&
-                WININET_GetAuthRealm( params->hRequest,
+                WININET_GetAuthRealm( params->req->hdr.hInternet,
                                   szRealm, sizeof szRealm/sizeof(WCHAR), TRUE ) &&
-                WININET_GetProxyServer( params->hRequest, 
+                WININET_GetProxyServer( params->req->hdr.hInternet,
                                     szServer, sizeof szServer/sizeof(WCHAR)) )
             {
                 WININET_GetSetPassword( hdlg, szServer, szRealm, TRUE );
             }
-            WININET_SetAuthorization( params->hRequest, username, password, TRUE );
+            WININET_SetAuthorization( params->req->hdr.hInternet, username, password, TRUE );
 
             EndDialog( hdlg, ERROR_INTERNET_FORCE_RETRY );
             return TRUE;
@@ -401,7 +401,7 @@ static INT_PTR WINAPI WININET_PasswordDialog(
         SetWindowLongPtrW( hdlg, GWLP_USERDATA, lParam );
 
         /* extract the Realm from the response and show it */
-        if( WININET_GetAuthRealm( params->hRequest,
+        if( WININET_GetAuthRealm( params->req->hdr.hInternet,
                                   szRealm, sizeof szRealm/sizeof(WCHAR), FALSE ) )
         {
             hitem = GetDlgItem( hdlg, IDC_REALM );
@@ -409,7 +409,7 @@ static INT_PTR WINAPI WININET_PasswordDialog(
         }
 
         /* extract the name of the server */
-        if( WININET_GetServer( params->hRequest,
+        if( WININET_GetServer( params->req->hdr.hInternet,
                                szServer, sizeof szServer/sizeof(WCHAR)) )
         {
             hitem = GetDlgItem( hdlg, IDC_SERVER );
@@ -444,14 +444,14 @@ static INT_PTR WINAPI WININET_PasswordDialog(
             hitem = GetDlgItem( hdlg, IDC_SAVEPASSWORD );
             if( hitem &&
                 SendMessageW( hitem, BM_GETSTATE, 0, 0 ) &&
-                WININET_GetAuthRealm( params->hRequest,
+                WININET_GetAuthRealm( params->req->hdr.hInternet,
                                   szRealm, sizeof szRealm/sizeof(WCHAR), FALSE ) &&
-                WININET_GetServer( params->hRequest,
+                WININET_GetServer( params->req->hdr.hInternet,
                                    szServer, sizeof szServer/sizeof(WCHAR)) )
             {
                 WININET_GetSetPassword( hdlg, szServer, szRealm, TRUE );
             }
-            WININET_SetAuthorization( params->hRequest, username, password, FALSE );
+            WININET_SetAuthorization( params->req->hdr.hInternet, username, password, FALSE );
 
             EndDialog( hdlg, ERROR_INTERNET_FORCE_RETRY );
             return TRUE;
@@ -524,9 +524,10 @@ static INT_PTR WINAPI WININET_InvalidCertificateDialog(
 
             if( params->dwFlags & FLAGS_ERROR_UI_FLAGS_CHANGE_OPTIONS )
             {
+                http_request_t *req = params->req;
                 DWORD flags, size = sizeof(flags);
 
-                InternetQueryOptionW( params->hRequest, INTERNET_OPTION_SECURITY_FLAGS, &flags, &size );
+                InternetQueryOptionW( req->hdr.hInternet, INTERNET_OPTION_SECURITY_FLAGS, &flags, &size );
                 switch( params->dwError )
                 {
                 case ERROR_INTERNET_INVALID_CA:
@@ -549,7 +550,7 @@ static INT_PTR WINAPI WININET_InvalidCertificateDialog(
                         flags |= SECURITY_FLAG_IGNORE_CERT_DATE_INVALID;
                     break;
                 }
-                res = InternetSetOptionW( params->hRequest, INTERNET_OPTION_SECURITY_FLAGS, &flags, size );
+                res = InternetSetOptionW( params->req->hdr.hInternet, INTERNET_OPTION_SECURITY_FLAGS, &flags, size );
                 if(!res)
                     WARN("InternetSetOption(INTERNET_OPTION_SECURITY_FLAGS) failed.\n");
             }
@@ -592,7 +593,6 @@ static INT WININET_GetConnectionStatus( HINTERNET hRequest )
     return dwStatus;
 }
 
-
 /***********************************************************************
  *         InternetErrorDlg
  */
@@ -600,15 +600,24 @@ DWORD WINAPI InternetErrorDlg(HWND hWnd, HINTERNET hRequest,
                  DWORD dwError, DWORD dwFlags, LPVOID* lppvData)
 {
     struct WININET_ErrorDlgParams params;
-    INT dwStatus;
+    http_request_t *req = NULL;
+    DWORD res = ERROR_SUCCESS;
 
     TRACE("%p %p %d %08x %p\n", hWnd, hRequest, dwError, dwFlags, lppvData);
 
     if( !hWnd && !(dwFlags & FLAGS_ERROR_UI_FLAGS_NO_UI) )
         return ERROR_INVALID_HANDLE;
 
+    if(hRequest) {
+        req = (http_request_t*)get_handle_object(hRequest);
+        if(!req)
+            return ERROR_INVALID_HANDLE;
+        if(req->hdr.htype != WH_HHTTPREQ)
+            return ERROR_SUCCESS; /* Yes, that was tested */
+    }
+
+    params.req = req;
     params.hWnd = hWnd;
-    params.hRequest = hRequest;
     params.dwError = dwError;
     params.dwFlags = dwFlags;
     params.lppvData = lppvData;
@@ -616,40 +625,58 @@ DWORD WINAPI InternetErrorDlg(HWND hWnd, HINTERNET hRequest,
     switch( dwError )
     {
     case ERROR_SUCCESS:
-    case ERROR_INTERNET_INCORRECT_PASSWORD:
+    case ERROR_INTERNET_INCORRECT_PASSWORD: {
+        DWORD dwStatus;
+
         if( !dwError && !(dwFlags & FLAGS_ERROR_UI_FILTER_FOR_ERRORS ) )
-            return 0;
+            break;
+        if(!req)
+            return ERROR_INVALID_HANDLE;
 
         dwStatus = WININET_GetConnectionStatus( hRequest );
         switch (dwStatus)
         {
         case HTTP_STATUS_PROXY_AUTH_REQ:
-            return DialogBoxParamW( WININET_hModule, MAKEINTRESOURCEW( IDD_PROXYDLG ),
-                                    hWnd, WININET_ProxyPasswordDialog, (LPARAM) &params );
+            res = DialogBoxParamW( WININET_hModule, MAKEINTRESOURCEW( IDD_PROXYDLG ),
+                                   hWnd, WININET_ProxyPasswordDialog, (LPARAM) &params );
+            break;
         case HTTP_STATUS_DENIED:
-            return DialogBoxParamW( WININET_hModule, MAKEINTRESOURCEW( IDD_AUTHDLG ),
+            res = DialogBoxParamW( WININET_hModule, MAKEINTRESOURCEW( IDD_AUTHDLG ),
                                     hWnd, WININET_PasswordDialog, (LPARAM) &params );
+            break;
         default:
             WARN("unhandled status %u\n", dwStatus);
-            return 0;
         }
+        break;
+    }
     case ERROR_INTERNET_SEC_CERT_ERRORS:
     case ERROR_INTERNET_SEC_CERT_CN_INVALID:
     case ERROR_INTERNET_SEC_CERT_DATE_INVALID:
     case ERROR_INTERNET_INVALID_CA:
-        if( dwFlags & FLAGS_ERROR_UI_FLAGS_NO_UI )
-            return ERROR_CANCELLED;
+        if( dwFlags & FLAGS_ERROR_UI_FLAGS_NO_UI ) {
+            res = ERROR_CANCELLED;
+            break;
+        }
+        if(!req)
+            return ERROR_INVALID_HANDLE;
+
 
         if( dwFlags & ~FLAGS_ERROR_UI_FLAGS_CHANGE_OPTIONS )
             FIXME("%08x contains unsupported flags.\n", dwFlags);
 
-        return DialogBoxParamW( WININET_hModule, MAKEINTRESOURCEW( IDD_INVCERTDLG ),
-                                hWnd, WININET_InvalidCertificateDialog, (LPARAM) &params );
+        res = DialogBoxParamW( WININET_hModule, MAKEINTRESOURCEW( IDD_INVCERTDLG ),
+                               hWnd, WININET_InvalidCertificateDialog, (LPARAM) &params );
+        break;
     case ERROR_INTERNET_HTTP_TO_HTTPS_ON_REDIR:
     case ERROR_INTERNET_POST_IS_NON_SECURE:
         FIXME("Need to display dialog for error %d\n", dwError);
-        return ERROR_SUCCESS;
+        res = ERROR_SUCCESS;
+        break;
+    default:
+        res = ERROR_NOT_SUPPORTED;
     }
 
-    return ERROR_NOT_SUPPORTED;
+    if(req)
+        WININET_Release(&req->hdr);
+    return res;
 }
diff --git a/dlls/wininet/tests/internet.c b/dlls/wininet/tests/internet.c
index 3567cc8..57fc7c4 100644
--- a/dlls/wininet/tests/internet.c
+++ b/dlls/wininet/tests/internet.c
@@ -1303,11 +1303,11 @@ static void test_InternetErrorDlg(void)
         res = InternetErrorDlg(hwnd, (HANDLE)0xdeadbeef, i, flags, NULL);
         if(res == ERROR_CALL_NOT_IMPLEMENTED)
         {
-            todo_wine ok(test_flags & FLAG_UNIMPL, "%i is unexpectedly unimplemented.\n", i);
+            ok(test_flags & FLAG_UNIMPL, "%i is unexpectedly unimplemented.\n", i);
             continue;
         }
         else
-            todo_wine ok(res == ERROR_INVALID_HANDLE, "Got %d (%d)\n", res, i);
+            ok(res == ERROR_INVALID_HANDLE, "Got %d (%d)\n", res, i);
 
         /* With a valid req */
         if(i == ERROR_INTERNET_NEED_UI)




More information about the wine-cvs mailing list