[prev in list] [next in list] [prev in thread] [next in thread] 

List:       wine-devel
Subject:    Re: your winhttp work
From:       Hans Leidekker <hans () it ! vu ! nl>
Date:       2008-01-28 16:03:20
Message-ID: 200801281703.21247.hans () it ! vu ! nl
[Download RAW message or body]

On Sunday 27 January 2008 15:11:23 Hans Leidekker wrote:

> I think layering can be done in a relatively clean way by making wininet
> handle the superset of wininet and winhttp callbacks and adding callback
> filtering as required by winhttp. Old wininet behavior can then be obtained
> by an implicit filter on the wininet subset of callbacks.

Here's a patch to show how it can be done.

 -Hans

["winhttp_23.diff" (text/x-diff)]

93e179e81c0daca89257767313d3e8b26d66408f
diff --git a/dlls/wininet/ftp.c b/dlls/wininet/ftp.c
index 44a5d33..18aab3b 100644
--- a/dlls/wininet/ftp.c
+++ b/dlls/wininet/ftp.c
@@ -296,7 +296,7 @@ BOOL WINAPI FTP_FtpPutFileW(LPWININETFTPSESSIONW lpwfs, LPCWSTR \
lpszLocalFile,  
     hIC = lpwfs->lpAppInfo;
 
-    SendAsyncCallback(&lpwfs->hdr, lpwfs->hdr.dwContext, \
INTERNET_STATUS_SENDING_REQUEST, NULL, 0); +    SendAsyncCallback(&lpwfs->hdr, \
lpwfs->hdr.dwContext, CALLBACK_STATUS_SENDING_REQUEST, NULL, 0);  
     if (FTP_SendStore(lpwfs, lpszNewRemoteFile, dwFlags))
     {
@@ -327,7 +327,7 @@ BOOL WINAPI FTP_FtpPutFileW(LPWININETFTPSESSIONW lpwfs, LPCWSTR \
lpszLocalFile,  
         iar.dwResult = (DWORD)bSuccess;
         iar.dwError = bSuccess ? ERROR_SUCCESS : INTERNET_GetLastError();
-        SendAsyncCallback(&lpwfs->hdr, lpwfs->hdr.dwContext, \
INTERNET_STATUS_REQUEST_COMPLETE, +        SendAsyncCallback(&lpwfs->hdr, \
lpwfs->hdr.dwContext, CALLBACK_STATUS_REQUEST_COMPLETE,  &iar, \
sizeof(INTERNET_ASYNC_RESULT));  }
 
@@ -476,7 +476,7 @@ lend:
 
         iar.dwResult = (DWORD)bSuccess;
         iar.dwError = bSuccess ? ERROR_SUCCESS : ERROR_INTERNET_EXTENDED_ERROR;
-        SendAsyncCallback(&lpwfs->hdr, lpwfs->hdr.dwContext, \
INTERNET_STATUS_REQUEST_COMPLETE, +        SendAsyncCallback(&lpwfs->hdr, \
lpwfs->hdr.dwContext, CALLBACK_STATUS_REQUEST_COMPLETE,  &iar, \
sizeof(INTERNET_ASYNC_RESULT));  }
     return bSuccess;
@@ -622,7 +622,7 @@ lend:
 
         iar.dwResult = (DWORD)bSuccess;
         iar.dwError = bSuccess ? ERROR_SUCCESS : INTERNET_GetLastError();
-        SendAsyncCallback(&lpwfs->hdr, lpwfs->hdr.dwContext, \
INTERNET_STATUS_REQUEST_COMPLETE, +        SendAsyncCallback(&lpwfs->hdr, \
lpwfs->hdr.dwContext, CALLBACK_STATUS_REQUEST_COMPLETE,  &iar, \
sizeof(INTERNET_ASYNC_RESULT));  }
 
@@ -800,13 +800,13 @@ lend:
 	{
             iar.dwResult = (DWORD)hFindNext;
             iar.dwError = ERROR_SUCCESS;
-            SendAsyncCallback(&lpwfs->hdr, lpwfs->hdr.dwContext, \
INTERNET_STATUS_HANDLE_CREATED, +            SendAsyncCallback(&lpwfs->hdr, \
lpwfs->hdr.dwContext, CALLBACK_STATUS_HANDLE_CREATED,  &iar, \
sizeof(INTERNET_ASYNC_RESULT));  }
 
         iar.dwResult = (DWORD)hFindNext;
         iar.dwError = hFindNext ? ERROR_SUCCESS : INTERNET_GetLastError();
-        SendAsyncCallback(&lpwfs->hdr, lpwfs->hdr.dwContext, \
INTERNET_STATUS_REQUEST_COMPLETE, +        SendAsyncCallback(&lpwfs->hdr, \
lpwfs->hdr.dwContext, CALLBACK_STATUS_REQUEST_COMPLETE,  &iar, \
sizeof(INTERNET_ASYNC_RESULT));  }
 
@@ -1010,7 +1010,7 @@ lend:
 
         iar.dwResult = (DWORD)bSuccess;
         iar.dwError = bSuccess ? ERROR_SUCCESS : ERROR_INTERNET_EXTENDED_ERROR;
-        SendAsyncCallback(&lpwfs->hdr, lpwfs->hdr.dwContext, \
INTERNET_STATUS_REQUEST_COMPLETE, +        SendAsyncCallback(&lpwfs->hdr, \
lpwfs->hdr.dwContext, CALLBACK_STATUS_REQUEST_COMPLETE,  &iar, \
sizeof(INTERNET_ASYNC_RESULT));  }
 
@@ -1204,13 +1204,13 @@ HINTERNET FTP_FtpOpenFileW(LPWININETFTPSESSIONW lpwfs,
 	{
             iar.dwResult = (DWORD)handle;
             iar.dwError = ERROR_SUCCESS;
-            SendAsyncCallback(&lpwfs->hdr, lpwfs->hdr.dwContext, \
INTERNET_STATUS_HANDLE_CREATED, +            SendAsyncCallback(&lpwfs->hdr, \
lpwfs->hdr.dwContext, CALLBACK_STATUS_HANDLE_CREATED,  &iar, \
sizeof(INTERNET_ASYNC_RESULT));  }
 
         iar.dwResult = (DWORD)bSuccess;
         iar.dwError = bSuccess ? ERROR_SUCCESS : INTERNET_GetLastError();
-        SendAsyncCallback(&lpwfs->hdr, lpwfs->hdr.dwContext, \
INTERNET_STATUS_REQUEST_COMPLETE, +        SendAsyncCallback(&lpwfs->hdr, \
lpwfs->hdr.dwContext, CALLBACK_STATUS_REQUEST_COMPLETE,  &iar, \
sizeof(INTERNET_ASYNC_RESULT));  }
 
@@ -1411,7 +1411,7 @@ BOOL WINAPI FTP_FtpGetFileW(LPWININETFTPSESSIONW lpwfs, LPCWSTR \
lpszRemoteFile,  
         iar.dwResult = (DWORD)bSuccess;
         iar.dwError = bSuccess ? ERROR_SUCCESS : INTERNET_GetLastError();
-        SendAsyncCallback(&lpwfs->hdr, lpwfs->hdr.dwContext, \
INTERNET_STATUS_REQUEST_COMPLETE, +        SendAsyncCallback(&lpwfs->hdr, \
lpwfs->hdr.dwContext, CALLBACK_STATUS_REQUEST_COMPLETE,  &iar, \
sizeof(INTERNET_ASYNC_RESULT));  }
 
@@ -1568,7 +1568,7 @@ lend:
 
         iar.dwResult = (DWORD)bSuccess;
         iar.dwError = bSuccess ? ERROR_SUCCESS : INTERNET_GetLastError();
-        SendAsyncCallback(&lpwfs->hdr, lpwfs->hdr.dwContext, \
INTERNET_STATUS_REQUEST_COMPLETE, +        SendAsyncCallback(&lpwfs->hdr, \
lpwfs->hdr.dwContext, CALLBACK_STATUS_REQUEST_COMPLETE,  &iar, \
sizeof(INTERNET_ASYNC_RESULT));  }
 
@@ -1714,7 +1714,7 @@ lend:
 
         iar.dwResult = (DWORD)bSuccess;
         iar.dwError = bSuccess ? ERROR_SUCCESS : INTERNET_GetLastError();
-        SendAsyncCallback(&lpwfs->hdr, lpwfs->hdr.dwContext, \
INTERNET_STATUS_REQUEST_COMPLETE, +        SendAsyncCallback(&lpwfs->hdr, \
lpwfs->hdr.dwContext, CALLBACK_STATUS_REQUEST_COMPLETE,  &iar, \
sizeof(INTERNET_ASYNC_RESULT));  }
 
@@ -1871,7 +1871,7 @@ lend:
 
         iar.dwResult = (DWORD)bSuccess;
         iar.dwError = bSuccess ? ERROR_SUCCESS : INTERNET_GetLastError();
-        SendAsyncCallback(&lpwfs->hdr, lpwfs->hdr.dwContext, \
INTERNET_STATUS_REQUEST_COMPLETE, +        SendAsyncCallback(&lpwfs->hdr, \
lpwfs->hdr.dwContext, CALLBACK_STATUS_REQUEST_COMPLETE,  &iar, \
sizeof(INTERNET_ASYNC_RESULT));  }
 
@@ -2129,11 +2129,11 @@ HINTERNET FTP_Connect(LPWININETAPPINFOW hIC, LPCWSTR \
lpszServerName,  iar.dwError = ERROR_SUCCESS;
 
         SendAsyncCallback(&hIC->hdr, dwContext,
-                      INTERNET_STATUS_HANDLE_CREATED, &iar,
+                      CALLBACK_STATUS_HANDLE_CREATED, &iar,
                       sizeof(INTERNET_ASYNC_RESULT));
     }
         
-    SendAsyncCallback(&hIC->hdr, dwContext, INTERNET_STATUS_RESOLVING_NAME,
+    SendAsyncCallback(&hIC->hdr, dwContext, CALLBACK_STATUS_RESOLVING_NAME,
         (LPWSTR) lpszServerName, strlenW(lpszServerName));
 
     if (!GetAddress(lpszServerName, nServerPort, &socketAddr))
@@ -2142,7 +2142,7 @@ HINTERNET FTP_Connect(LPWININETAPPINFOW hIC, LPCWSTR \
lpszServerName,  goto lerror;
     }
 
-    SendAsyncCallback(&hIC->hdr, dwContext, INTERNET_STATUS_NAME_RESOLVED,
+    SendAsyncCallback(&hIC->hdr, dwContext, CALLBACK_STATUS_NAME_RESOLVED,
         (LPWSTR) lpszServerName, strlenW(lpszServerName));
 
     nsocket = socket(AF_INET,SOCK_STREAM,0);
@@ -2152,7 +2152,7 @@ HINTERNET FTP_Connect(LPWININETAPPINFOW hIC, LPCWSTR \
lpszServerName,  goto lerror;
     }
 
-    SendAsyncCallback(&hIC->hdr, dwContext, INTERNET_STATUS_CONNECTING_TO_SERVER,
+    SendAsyncCallback(&hIC->hdr, dwContext, CALLBACK_STATUS_CONNECTING_TO_SERVER,
         &socketAddr, sizeof(struct sockaddr_in));
 
     if (connect(nsocket, (struct sockaddr *)&socketAddr, sizeof(socketAddr)) < 0)
@@ -2164,7 +2164,7 @@ HINTERNET FTP_Connect(LPWININETAPPINFOW hIC, LPCWSTR \
lpszServerName,  {
         TRACE("Connected to server\n");
 	lpwfs->sndSocket = nsocket;
-        SendAsyncCallback(&hIC->hdr, dwContext, INTERNET_STATUS_CONNECTED_TO_SERVER,
+        SendAsyncCallback(&hIC->hdr, dwContext, CALLBACK_STATUS_CONNECTED_TO_SERVER,
             &socketAddr, sizeof(struct sockaddr_in));
 
 	sock_namelen = sizeof(lpwfs->socketAddress);
@@ -2192,7 +2192,7 @@ lerror:
 
         iar.dwResult = bSuccess ? (DWORD_PTR)lpwfs : 0;
         iar.dwError = bSuccess ? ERROR_SUCCESS : INTERNET_GetLastError();
-        SendAsyncCallback(&hIC->hdr, dwContext, INTERNET_STATUS_REQUEST_COMPLETE,
+        SendAsyncCallback(&hIC->hdr, dwContext, CALLBACK_STATUS_REQUEST_COMPLETE,
             &iar, sizeof(INTERNET_ASYNC_RESULT));
     }
 
@@ -2266,7 +2266,7 @@ static BOOL FTP_SendCommandA(INT nSocket, FTP_COMMAND ftpCmd, \
LPCSTR lpszParam,  
 	if (lpfnStatusCB)
         {
-            lpfnStatusCB(hdr->hInternet, dwContext, INTERNET_STATUS_SENDING_REQUEST, \
NULL, 0); +            lpfnStatusCB(hdr->hInternet, dwContext, \
CALLBACK_STATUS_SENDING_REQUEST, NULL, 0);  }
 
 	dwParamLen = lpszParam?strlen(lpszParam)+1:0;
@@ -2290,7 +2290,7 @@ static BOOL FTP_SendCommandA(INT nSocket, FTP_COMMAND ftpCmd, \
LPCSTR lpszParam,  
 	if (lpfnStatusCB)
         {
-            lpfnStatusCB(hdr->hInternet, dwContext, INTERNET_STATUS_REQUEST_SENT,
+            lpfnStatusCB(hdr->hInternet, dwContext, CALLBACK_STATUS_REQUEST_SENT,
                          &nBytesSent, sizeof(DWORD));
         }
 
@@ -2340,7 +2340,7 @@ INT FTP_ReceiveResponse(LPWININETFTPSESSIONW lpwfs, DWORD_PTR \
dwContext)  TRACE("socket(%d)\n", lpwfs->sndSocket);
 
     hIC = lpwfs->lpAppInfo;
-    SendAsyncCallback(&lpwfs->hdr, dwContext, INTERNET_STATUS_RECEIVING_RESPONSE, \
NULL, 0); +    SendAsyncCallback(&lpwfs->hdr, dwContext, \
CALLBACK_STATUS_RECEIVING_RESPONSE, NULL, 0);  
     while(1)
     {
@@ -2373,7 +2373,7 @@ INT FTP_ReceiveResponse(LPWININETFTPSESSIONW lpwfs, DWORD_PTR \
dwContext)  {
         rc = atoi(lpszResponse);
 
-        SendAsyncCallback(&lpwfs->hdr, dwContext, INTERNET_STATUS_RESPONSE_RECEIVED,
+        SendAsyncCallback(&lpwfs->hdr, dwContext, CALLBACK_STATUS_RESPONSE_RECEIVED,
 		    &nRecv, sizeof(DWORD));
     }
 
@@ -3088,7 +3088,7 @@ lend:
                                                INTERNET_GetLastError();
 
         INTERNET_SendCallback(&lpwh->hdr, lpwh->hdr.dwContext,
-                              INTERNET_STATUS_REQUEST_COMPLETE, &iar,
+                              CALLBACK_STATUS_REQUEST_COMPLETE, &iar,
                               sizeof(INTERNET_ASYNC_RESULT));
     }
 
diff --git a/dlls/wininet/http.c b/dlls/wininet/http.c
index 16e1ec7..74d7176 100644
--- a/dlls/wininet/http.c
+++ b/dlls/wininet/http.c
@@ -842,14 +842,14 @@ BOOL WINAPI HttpEndRequestW(HINTERNET hRequest,
     /* We appear to do nothing with lpBuffersOut.. is that correct? */
 
     SendAsyncCallback(&lpwhr->hdr, lpwhr->hdr.dwContext,
-            INTERNET_STATUS_RECEIVING_RESPONSE, NULL, 0);
+            CALLBACK_STATUS_RECEIVING_RESPONSE, NULL, 0);
 
     responseLen = HTTP_GetResponseHeaders(lpwhr);
     if (responseLen)
 	    rc = TRUE;
 
     SendAsyncCallback(&lpwhr->hdr, lpwhr->hdr.dwContext,
-            INTERNET_STATUS_RESPONSE_RECEIVED, &responseLen, sizeof(DWORD));
+            CALLBACK_STATUS_RESPONSE_RECEIVED, &responseLen, sizeof(DWORD));
 
     /* process headers here. Is this right? */
     HTTP_ProcessHeaders(lpwhr);
@@ -1314,7 +1314,7 @@ static BOOL HTTP_ResolveName(LPWININETHTTPREQW lpwhr)
     LPWININETHTTPSESSIONW lpwhs = lpwhr->lpHttpSession;
 
     INTERNET_SendCallback(&lpwhr->hdr, lpwhr->hdr.dwContext,
-                          INTERNET_STATUS_RESOLVING_NAME,
+                          CALLBACK_STATUS_RESOLVING_NAME,
                           lpwhs->lpszServerName,
                           strlenW(lpwhs->lpszServerName)+1);
 
@@ -1328,7 +1328,7 @@ static BOOL HTTP_ResolveName(LPWININETHTTPREQW lpwhr)
     inet_ntop(lpwhs->socketAddress.sin_family, &lpwhs->socketAddress.sin_addr,
               szaddr, sizeof(szaddr));
     INTERNET_SendCallback(&lpwhr->hdr, lpwhr->hdr.dwContext,
-                          INTERNET_STATUS_NAME_RESOLVED,
+                          CALLBACK_STATUS_NAME_RESOLVED,
                           szaddr, strlen(szaddr)+1);
     return TRUE;
 }
@@ -1489,7 +1489,7 @@ HINTERNET WINAPI HTTP_HttpOpenRequestW(LPWININETHTTPSESSIONW \
lpwhs,  
 
     INTERNET_SendCallback(&lpwhs->hdr, dwContext,
-                          INTERNET_STATUS_HANDLE_CREATED, &handle,
+                          CALLBACK_STATUS_HANDLE_CREATED, &handle,
                           sizeof(handle));
 
     /*
@@ -2654,13 +2654,13 @@ BOOL WINAPI HTTP_HttpSendRequestW(LPWININETHTTPREQW lpwhr, \
LPCWSTR lpszHeaders,  TRACE("full request -> %s\n", debugstr_a(ascii_req) );
 
         INTERNET_SendCallback(&lpwhr->hdr, lpwhr->hdr.dwContext,
-                              INTERNET_STATUS_SENDING_REQUEST, NULL, 0);
+                              CALLBACK_STATUS_SENDING_REQUEST, NULL, 0);
 
         NETCON_send(&lpwhr->netConnection, ascii_req, len, 0, &cnt);
         HeapFree( GetProcessHeap(), 0, ascii_req );
 
         INTERNET_SendCallback(&lpwhr->hdr, lpwhr->hdr.dwContext,
-                              INTERNET_STATUS_REQUEST_SENT,
+                              CALLBACK_STATUS_REQUEST_SENT,
                               &len, sizeof(DWORD));
 
         if (bEndRequest)
@@ -2669,7 +2669,7 @@ BOOL WINAPI HTTP_HttpSendRequestW(LPWININETHTTPREQW lpwhr, \
LPCWSTR lpszHeaders,  DWORD dwStatusCode;
 
             INTERNET_SendCallback(&lpwhr->hdr, lpwhr->hdr.dwContext,
-                                INTERNET_STATUS_RECEIVING_RESPONSE, NULL, 0);
+                                CALLBACK_STATUS_RECEIVING_RESPONSE, NULL, 0);
     
             if (cnt < 0)
                 goto lend;
@@ -2679,7 +2679,7 @@ BOOL WINAPI HTTP_HttpSendRequestW(LPWININETHTTPREQW lpwhr, \
LPCWSTR lpszHeaders,  bSuccess = TRUE;
     
             INTERNET_SendCallback(&lpwhr->hdr, lpwhr->hdr.dwContext,
-                                INTERNET_STATUS_RESPONSE_RECEIVED, &responseLen,
+                                CALLBACK_STATUS_RESPONSE_RECEIVED, &responseLen,
                                 sizeof(DWORD));
 
             HTTP_ProcessHeaders(lpwhr);
@@ -2706,7 +2706,7 @@ BOOL WINAPI HTTP_HttpSendRequestW(LPWININETHTTPREQW lpwhr, \
LPCWSTR lpszHeaders,  {
                     HTTP_DrainContent(lpwhr);
                     INTERNET_SendCallback(&lpwhr->hdr, lpwhr->hdr.dwContext,
-                                          INTERNET_STATUS_REDIRECT, szNewLocation,
+                                          CALLBACK_STATUS_REDIRECT, szNewLocation,
                                           dwBufferSize);
                     bSuccess = HTTP_HandleRedirect(lpwhr, szNewLocation);
                     if (bSuccess)
@@ -2767,7 +2767,7 @@ lend:
     iar.dwError = bSuccess ? ERROR_SUCCESS : INTERNET_GetLastError();
 
     INTERNET_SendCallback(&lpwhr->hdr, lpwhr->hdr.dwContext,
-                          INTERNET_STATUS_REQUEST_COMPLETE, &iar,
+                          CALLBACK_STATUS_REQUEST_COMPLETE, &iar,
                           sizeof(INTERNET_ASYNC_RESULT));
 
     TRACE("<--\n");
@@ -2851,7 +2851,7 @@ HINTERNET HTTP_Connect(LPWININETAPPINFOW hIC, LPCWSTR \
lpszServerName,  if (!(lpwhs->hdr.dwInternalFlags & INET_OPENURL))
     {
         INTERNET_SendCallback(&hIC->hdr, dwContext,
-                              INTERNET_STATUS_HANDLE_CREATED, &handle,
+                              CALLBACK_STATUS_HANDLE_CREATED, &handle,
                               sizeof(handle));
     }
 
@@ -2909,7 +2909,7 @@ static BOOL HTTP_OpenConnection(LPWININETHTTPREQW lpwhr)
     inet_ntop(lpwhs->socketAddress.sin_family, &lpwhs->socketAddress.sin_addr,
               szaddr, sizeof(szaddr));
     INTERNET_SendCallback(&lpwhr->hdr, lpwhr->hdr.dwContext,
-                          INTERNET_STATUS_CONNECTING_TO_SERVER,
+                          CALLBACK_STATUS_CONNECTING_TO_SERVER,
                           szaddr,
                           strlen(szaddr)+1);
 
@@ -2943,7 +2943,7 @@ static BOOL HTTP_OpenConnection(LPWININETHTTPREQW lpwhr)
     }
 
     INTERNET_SendCallback(&lpwhr->hdr, lpwhr->hdr.dwContext,
-                          INTERNET_STATUS_CONNECTED_TO_SERVER,
+                          CALLBACK_STATUS_CONNECTED_TO_SERVER,
                           szaddr, strlen(szaddr)+1);
 
     bSuccess = TRUE;
@@ -3354,12 +3354,12 @@ static void HTTP_CloseConnection(LPWININETHANDLEHEADER hdr)
     hIC = lpwhs->lpAppInfo;
 
     INTERNET_SendCallback(&lpwhr->hdr, lpwhr->hdr.dwContext,
-                          INTERNET_STATUS_CLOSING_CONNECTION, 0, 0);
+                          CALLBACK_STATUS_CLOSING_CONNECTION, 0, 0);
 
     NETCON_close(&lpwhr->netConnection);
 
     INTERNET_SendCallback(&lpwhr->hdr, lpwhr->hdr.dwContext,
-                          INTERNET_STATUS_CONNECTION_CLOSED, 0, 0);
+                          CALLBACK_STATUS_CONNECTION_CLOSED, 0, 0);
 }
 
 
diff --git a/dlls/wininet/internet.c b/dlls/wininet/internet.c
index 2c3e9a9..0b3c149 100644
--- a/dlls/wininet/internet.c
+++ b/dlls/wininet/internet.c
@@ -181,7 +181,7 @@ BOOL WININET_Release( LPWININETHANDLEHEADER info )
             info->close_connection( info );
         }
         INTERNET_SendCallback(info, info->dwContext,
-                              INTERNET_STATUS_HANDLE_CLOSING, &info->hInternet,
+                              CALLBACK_STATUS_HANDLE_CLOSING, &info->hInternet,
                               sizeof(HINTERNET));
         TRACE( "destroying object %p\n", info);
         if ( info->htype != WH_HINIT )
@@ -1603,7 +1603,7 @@ BOOL WINAPI InternetCanonicalizeUrlW(LPCWSTR lpszUrl, LPWSTR \
lpszBuffer,  /* #################################################### */
 
 static INTERNET_STATUS_CALLBACK set_status_callback(
-    LPWININETHANDLEHEADER lpwh, INTERNET_STATUS_CALLBACK callback, BOOL unicode)
+    LPWININETHANDLEHEADER lpwh, INTERNET_STATUS_CALLBACK callback, DWORD filter, \
BOOL unicode)  {
     INTERNET_STATUS_CALLBACK ret;
 
@@ -1613,6 +1613,7 @@ static INTERNET_STATUS_CALLBACK set_status_callback(
     ret = lpwh->lpfnStatusCB;
     lpwh->lpfnStatusCB = callback;
 
+    lpwh->dwCallbackFilter = filter;
     return ret;
 }
 
@@ -1638,7 +1639,7 @@ INTERNET_STATUS_CALLBACK WINAPI InternetSetStatusCallbackA(
     if (!(lpwh = WININET_GetObject(hInternet)))
         return INTERNET_INVALID_STATUS_CALLBACK;
 
-    retVal = set_status_callback(lpwh, lpfnIntCB, FALSE);
+    retVal = set_status_callback(lpwh, lpfnIntCB, 0, FALSE);
 
     WININET_Release( lpwh );
     return retVal;
@@ -1666,7 +1667,7 @@ INTERNET_STATUS_CALLBACK WINAPI InternetSetStatusCallbackW(
     if (!(lpwh = WININET_GetObject(hInternet)))
         return INTERNET_INVALID_STATUS_CALLBACK;
 
-    retVal = set_status_callback(lpwh, lpfnIntCB, TRUE);
+    retVal = set_status_callback(lpwh, lpfnIntCB, 0, TRUE);
 
     WININET_Release( lpwh );
     return retVal;
@@ -1806,7 +1807,7 @@ BOOL INTERNET_ReadFile(LPWININETHANDLEHEADER lpwh, LPVOID \
lpBuffer,  INTERNET_GetLastError();
 
         INTERNET_SendCallback(lpwh, lpwh->dwContext,
-                              INTERNET_STATUS_REQUEST_COMPLETE, &iar,
+                              CALLBACK_STATUS_REQUEST_COMPLETE, &iar,
                               sizeof(INTERNET_ASYNC_RESULT));
     }
     return retval;
@@ -1907,7 +1908,7 @@ BOOL WINAPI InternetReadFileExA(HINTERNET hFile, \
LPINTERNET_BUFFERSA lpBuffersOu  }
 
     INTERNET_SendCallback(lpwh, lpwh->dwContext,
-                          INTERNET_STATUS_RECEIVING_RESPONSE, NULL, 0);
+                          CALLBACK_STATUS_RECEIVING_RESPONSE, NULL, 0);
 
     /* FIXME: IRF_ASYNC may not be the right thing to test here;
      * hIC->hdr.dwFlags & INTERNET_FLAG_ASYNC is probably better */
@@ -1945,7 +1946,7 @@ BOOL WINAPI InternetReadFileExA(HINTERNET hFile, \
LPINTERNET_BUFFERSA lpBuffersOu  {
         DWORD dwBytesReceived = lpBuffersOut->dwBufferLength;
         INTERNET_SendCallback(lpwh, lpwh->dwContext,
-                              INTERNET_STATUS_RESPONSE_RECEIVED, &dwBytesReceived,
+                              CALLBACK_STATUS_RESPONSE_RECEIVED, &dwBytesReceived,
                               sizeof(dwBytesReceived));
     }
 
@@ -2414,7 +2415,20 @@ BOOL WINAPI InternetSetOptionW(HINTERNET hInternet, DWORD \
dwOption,  case INTERNET_OPTION_CALLBACK:
       {
         INTERNET_STATUS_CALLBACK callback = *(INTERNET_STATUS_CALLBACK *)lpBuffer;
-        ret = (set_status_callback(lpwhh, callback, TRUE) != \
INTERNET_INVALID_STATUS_CALLBACK); +        ret = (set_status_callback(lpwhh, \
callback, 0, TRUE) != INTERNET_INVALID_STATUS_CALLBACK); +        break;
+      }
+    case INTERNET_OPTION_CALLBACK_FILTERED:
+      {
+        struct
+        {
+            DWORD filter;
+            INTERNET_STATUS_CALLBACK new;
+            INTERNET_STATUS_CALLBACK old;
+        } *cbf = lpBuffer;
+
+        cbf->old = set_status_callback(lpwhh, cbf->new, cbf->filter, TRUE);
+        if (cbf->old == INTERNET_INVALID_STATUS_CALLBACK) ret = FALSE;
         break;
       }
     case INTERNET_OPTION_HTTP_VERSION:
@@ -2545,7 +2559,7 @@ BOOL WINAPI InternetSetOptionA(HINTERNET hInternet, DWORD \
                dwOption,
         INTERNET_STATUS_CALLBACK callback = *(INTERNET_STATUS_CALLBACK *)lpBuffer;
 
         if (!(lpwh = (LPWININETHANDLEHEADER)WININET_GetObject(hInternet))) return \
                FALSE;
-        r = (set_status_callback(lpwh, callback, FALSE) != \
INTERNET_INVALID_STATUS_CALLBACK); +        r = (set_status_callback(lpwh, callback, \
0, FALSE) != INTERNET_INVALID_STATUS_CALLBACK);  WININET_Release(lpwh);
         return r;
         }
@@ -3367,7 +3381,7 @@ void AsyncInternetQueryDataAvailableProc(WORKREQUEST \
                *workRequest)
                                        lpwhr->dwContentLength - \
lpwhr->dwContentRead),  MSG_PEEK, (int *)&iar.dwError);
         INTERNET_SendCallback(workRequest->hdr, workRequest->hdr->dwContext,
-                              INTERNET_STATUS_REQUEST_COMPLETE, &iar,
+                              CALLBACK_STATUS_REQUEST_COMPLETE, &iar,
                               sizeof(INTERNET_ASYNC_RESULT));
         break;
 
diff --git a/dlls/wininet/internet.h b/dlls/wininet/internet.h
index 0f283e1..1394bf5 100644
--- a/dlls/wininet/internet.h
+++ b/dlls/wininet/internet.h
@@ -130,6 +130,42 @@ typedef enum
     WH_HHTTPREQ = INTERNET_HANDLE_TYPE_HTTP_REQUEST,
 } WH_TYPE;
 
+#define INTERNET_OPTION_CALLBACK_FILTERED       10000   /* Wine extension */
+
+#define CALLBACK_STATUS_RESOLVING_NAME          0
+#define CALLBACK_STATUS_NAME_RESOLVED           1
+#define CALLBACK_STATUS_CONNECTING_TO_SERVER    2
+#define CALLBACK_STATUS_CONNECTED_TO_SERVER     3
+#define CALLBACK_STATUS_SENDING_REQUEST         4
+#define CALLBACK_STATUS_REQUEST_SENT            5
+#define CALLBACK_STATUS_RECEIVING_RESPONSE      6
+#define CALLBACK_STATUS_RESPONSE_RECEIVED       7
+#define CALLBACK_STATUS_CTL_RESPONSE_RECEIVED   8
+#define CALLBACK_STATUS_PREFETCH                9
+#define CALLBACK_STATUS_CLOSING_CONNECTION      10
+#define CALLBACK_STATUS_CONNECTION_CLOSED       11
+#define CALLBACK_STATUS_HANDLE_CREATED          12
+#define CALLBACK_STATUS_HANDLE_CLOSING          13
+#define CALLBACK_STATUS_DETECTING_PROXY         14
+#define CALLBACK_STATUS_REQUEST_COMPLETE        15
+#define CALLBACK_STATUS_REDIRECT                16
+#define CALLBACK_STATUS_INTERMEDIATE_RESPONSE   17
+#define CALLBACK_STATUS_USER_INPUT_REQUIRED     18
+#define CALLBACK_STATUS_STATE_CHANGE            19
+#define CALLBACK_STATUS_COOKIE_SENT             20
+#define CALLBACK_STATUS_COOKIE_RECEIVED         21
+#define CALLBACK_STATUS_PRIVACY_IMPACTED        22
+#define CALLBACK_STATUS_P3P_HEADER              23
+#define CALLBACK_STATUS_P3P_POLICYREF           24
+#define CALLBACK_STATUS_COOKIE_HISTORY          25
+#define CALLBACK_STATUS_SECURE_FAILURE          26
+#define CALLBACK_STATUS_HEADERS_AVAILABLE       27
+#define CALLBACK_STATUS_DATA_AVAILABLE          28
+#define CALLBACK_STATUS_READ_COMPLETE           29
+#define CALLBACK_STATUS_WRITE_COMPLETE          30
+#define CALLBACK_STATUS_REQUEST_ERROR           31
+#define CALLBACK_STATUS_SENDREQUEST_COMPLETE    32
+
 #define INET_OPENURL 0x0001
 #define INET_CALLBACKW 0x0002
 
@@ -147,6 +183,7 @@ struct _WININETHANDLEHEADER
     DWORD  dwError;
     DWORD  dwInternalFlags;
     DWORD  dwRefCount;
+    DWORD  dwCallbackFilter;
     WININET_object_function close_connection;
     WININET_object_function destroy;
     INTERNET_STATUS_CALLBACK lpfnStatusCB;
diff --git a/dlls/wininet/utility.c b/dlls/wininet/utility.c
index 97b4be5..c072caa 100644
--- a/dlls/wininet/utility.c
+++ b/dlls/wininet/utility.c
@@ -171,93 +171,145 @@ BOOL GetAddress(LPCWSTR lpszServerName, INTERNET_PORT \
                nServerPort,
  * Helper function for sending async Callbacks
  */
 
-static const char *get_callback_name(DWORD dwInternetStatus) {
-    static const wininet_flag_info internet_status[] = {
+static const char *get_callback_name(DWORD status) {
+    static const wininet_flag_info callback_status[] = {
 #define FE(x) { x, #x }
-	FE(INTERNET_STATUS_RESOLVING_NAME),
-	FE(INTERNET_STATUS_NAME_RESOLVED),
-	FE(INTERNET_STATUS_CONNECTING_TO_SERVER),
-	FE(INTERNET_STATUS_CONNECTED_TO_SERVER),
-	FE(INTERNET_STATUS_SENDING_REQUEST),
-	FE(INTERNET_STATUS_REQUEST_SENT),
-	FE(INTERNET_STATUS_RECEIVING_RESPONSE),
-	FE(INTERNET_STATUS_RESPONSE_RECEIVED),
-	FE(INTERNET_STATUS_CTL_RESPONSE_RECEIVED),
-	FE(INTERNET_STATUS_PREFETCH),
-	FE(INTERNET_STATUS_CLOSING_CONNECTION),
-	FE(INTERNET_STATUS_CONNECTION_CLOSED),
-	FE(INTERNET_STATUS_HANDLE_CREATED),
-	FE(INTERNET_STATUS_HANDLE_CLOSING),
-	FE(INTERNET_STATUS_REQUEST_COMPLETE),
-	FE(INTERNET_STATUS_REDIRECT),
-	FE(INTERNET_STATUS_INTERMEDIATE_RESPONSE),
-	FE(INTERNET_STATUS_USER_INPUT_REQUIRED),
-	FE(INTERNET_STATUS_STATE_CHANGE),
-	FE(INTERNET_STATUS_COOKIE_SENT),
-	FE(INTERNET_STATUS_COOKIE_RECEIVED),
-	FE(INTERNET_STATUS_PRIVACY_IMPACTED),
-	FE(INTERNET_STATUS_P3P_HEADER),
-	FE(INTERNET_STATUS_P3P_POLICYREF),
-	FE(INTERNET_STATUS_COOKIE_HISTORY)
+   FE(CALLBACK_STATUS_RESOLVING_NAME),
+   FE(CALLBACK_STATUS_NAME_RESOLVED),
+   FE(CALLBACK_STATUS_CONNECTING_TO_SERVER),
+   FE(CALLBACK_STATUS_CONNECTED_TO_SERVER),
+   FE(CALLBACK_STATUS_SENDING_REQUEST),
+   FE(CALLBACK_STATUS_REQUEST_SENT),
+   FE(CALLBACK_STATUS_RECEIVING_RESPONSE),
+   FE(CALLBACK_STATUS_RESPONSE_RECEIVED),
+   FE(CALLBACK_STATUS_CTL_RESPONSE_RECEIVED),
+   FE(CALLBACK_STATUS_PREFETCH),
+   FE(CALLBACK_STATUS_CLOSING_CONNECTION),
+   FE(CALLBACK_STATUS_CONNECTION_CLOSED),
+   FE(CALLBACK_STATUS_HANDLE_CREATED),
+   FE(CALLBACK_STATUS_HANDLE_CLOSING),
+   FE(CALLBACK_STATUS_DETECTING_PROXY),
+   FE(CALLBACK_STATUS_REQUEST_COMPLETE),
+   FE(CALLBACK_STATUS_REDIRECT),
+   FE(CALLBACK_STATUS_INTERMEDIATE_RESPONSE),
+   FE(CALLBACK_STATUS_USER_INPUT_REQUIRED),
+   FE(CALLBACK_STATUS_STATE_CHANGE),
+   FE(CALLBACK_STATUS_COOKIE_SENT),
+   FE(CALLBACK_STATUS_COOKIE_RECEIVED),
+   FE(CALLBACK_STATUS_PRIVACY_IMPACTED),
+   FE(CALLBACK_STATUS_P3P_HEADER),
+   FE(CALLBACK_STATUS_P3P_POLICYREF),
+   FE(CALLBACK_STATUS_COOKIE_HISTORY),
+   FE(CALLBACK_STATUS_SECURE_FAILURE),
+   FE(CALLBACK_STATUS_HEADERS_AVAILABLE),
+   FE(CALLBACK_STATUS_DATA_AVAILABLE),
+   FE(CALLBACK_STATUS_READ_COMPLETE),
+   FE(CALLBACK_STATUS_WRITE_COMPLETE),
+   FE(CALLBACK_STATUS_REQUEST_ERROR),
+   FE(CALLBACK_STATUS_SENDREQUEST_COMPLETE)
 #undef FE
     };
     DWORD i;
 
-    for (i = 0; i < (sizeof(internet_status) / sizeof(internet_status[0])); i++) {
-	if (internet_status[i].val == dwInternetStatus) return internet_status[i].name;
+    for (i = 0; i < (sizeof(callback_status) / sizeof(callback_status[0])); i++) {
+	if (callback_status[i].val == status) return callback_status[i].name;
     }
     return "Unknown";
 }
 
+static const struct
+{
+    DWORD code, flag;
+}
+status_map[] =
+{
+    { INTERNET_STATUS_RESOLVING_NAME,           0x00000001 },
+    { INTERNET_STATUS_NAME_RESOLVED,            0x00000002 },
+    { INTERNET_STATUS_CONNECTING_TO_SERVER,     0x00000004 },
+    { INTERNET_STATUS_CONNECTED_TO_SERVER,      0x00000008 },
+    { INTERNET_STATUS_SENDING_REQUEST,          0x00000010 },
+    { INTERNET_STATUS_REQUEST_SENT,             0x00000020 },
+    { INTERNET_STATUS_RECEIVING_RESPONSE,       0x00000040 },
+    { INTERNET_STATUS_RESPONSE_RECEIVED,        0x00000080 },
+    { INTERNET_STATUS_CTL_RESPONSE_RECEIVED,    0          },
+    { INTERNET_STATUS_PREFETCH,                 0          },
+    { INTERNET_STATUS_CLOSING_CONNECTION,       0x00000100 },
+    { INTERNET_STATUS_CONNECTION_CLOSED,        0x00000200 },
+    { INTERNET_STATUS_HANDLE_CREATED,           0x00000400 },
+    { INTERNET_STATUS_HANDLE_CLOSING,           0x00000800 },
+    { 0, /* STATUS_DETECTING_PROXY */           0x00001000 },
+    { INTERNET_STATUS_REQUEST_COMPLETE,         0          },
+    { INTERNET_STATUS_REDIRECT,                 0x00004000 },
+    { INTERNET_STATUS_INTERMEDIATE_RESPONSE,    0x00008000 },
+    { INTERNET_STATUS_USER_INPUT_REQUIRED,      0          },
+    { INTERNET_STATUS_STATE_CHANGE,             0          },
+    { INTERNET_STATUS_COOKIE_SENT,              0          },
+    { INTERNET_STATUS_COOKIE_RECEIVED,          0          },
+    { INTERNET_STATUS_PRIVACY_IMPACTED,         0          },
+    { INTERNET_STATUS_P3P_HEADER,               0          },
+    { INTERNET_STATUS_P3P_POLICYREF,            0          },
+    { INTERNET_STATUS_COOKIE_HISTORY,           0          },
+    { 0, /* STATUS_SECURE_FAILURE */            0x00010000 },
+    { 0, /* STATUS_HEADERS_AVAILABLE */         0x00020000 },
+    { 0, /* STATUS_DATA_AVAILABLE */            0x00040000 },
+    { 0, /* STATUS_READ_COMPLETE */             0x00080000 },
+    { 0, /* STATUS_WRITE_COMPLETE */            0x00100000 },
+    { 0, /* STATUS_REQUEST_ERROR */             0x00200000 },
+    { 0, /* STATUS_SENDREQUEST_COMPLETE */      0x00400000 },
+};
+
 VOID INTERNET_SendCallback(LPWININETHANDLEHEADER hdr, DWORD_PTR dwContext,
-                           DWORD dwInternetStatus, LPVOID lpvStatusInfo,
+                           DWORD dwStatus, LPVOID lpvStatusInfo,
                            DWORD dwStatusInfoLength)
 {
-    LPVOID lpvNewInfo = NULL;
+    LPVOID lpvNewInfo;
+    DWORD status;
 
     if( !hdr->lpfnStatusCB )
         return;
 
+    if (hdr->dwCallbackFilter)
+    {
+        status = status_map[dwStatus].flag;
+        if (!(hdr->dwCallbackFilter & status)) return;
+    }
+    else
+    {
+        status = status_map[dwStatus].code;
+        if (!status) return;
+    }
+
     /* the IE5 version of wininet does not
        send callbacks if dwContext is zero */
     if( !dwContext )
         return;
 
     lpvNewInfo = lpvStatusInfo;
-    if(hdr->dwInternalFlags & INET_CALLBACKW) {
-        switch(dwInternetStatus) {
-        case INTERNET_STATUS_NAME_RESOLVED:
-        case INTERNET_STATUS_CONNECTING_TO_SERVER:
-        case INTERNET_STATUS_CONNECTED_TO_SERVER:
+    switch (dwStatus)
+    {
+    case CALLBACK_STATUS_NAME_RESOLVED:
+    case CALLBACK_STATUS_CONNECTING_TO_SERVER:
+    case CALLBACK_STATUS_CONNECTED_TO_SERVER:
+        if (hdr->dwInternalFlags & INET_CALLBACKW)
             lpvNewInfo = WININET_strdup_AtoW(lpvStatusInfo);
-            break;
-        case INTERNET_STATUS_RESOLVING_NAME:
-        case INTERNET_STATUS_REDIRECT:
-            lpvNewInfo = WININET_strdupW(lpvStatusInfo);
-            break;
-        }
-    }else {
-        switch(dwInternetStatus)
-        {
-        case INTERNET_STATUS_NAME_RESOLVED:
-        case INTERNET_STATUS_CONNECTING_TO_SERVER:
-        case INTERNET_STATUS_CONNECTED_TO_SERVER:
+        else
             lpvNewInfo = HeapAlloc(GetProcessHeap(), 0, strlen(lpvStatusInfo) + 1);
             if (lpvNewInfo) strcpy(lpvNewInfo, lpvStatusInfo);
-            break;
-        case INTERNET_STATUS_RESOLVING_NAME:
-        case INTERNET_STATUS_REDIRECT:
+        break;
+    case CALLBACK_STATUS_RESOLVING_NAME:
+    case CALLBACK_STATUS_REDIRECT:
+        if (hdr->dwInternalFlags & INET_CALLBACKW)
+            lpvNewInfo = WININET_strdupW(lpvStatusInfo);
+        else
             lpvNewInfo = WININET_strdup_WtoA(lpvStatusInfo);
-            break;
-        }
+        break;
     }
     
     TRACE(" callback(%p) (%p (%p), %08lx, %d (%s), %p, %d)\n",
-	  hdr->lpfnStatusCB, hdr->hInternet, hdr, dwContext, dwInternetStatus, \
get_callback_name(dwInternetStatus), +	  hdr->lpfnStatusCB, hdr->hInternet, hdr, \
dwContext, dwStatus, get_callback_name(dwStatus),  lpvNewInfo, dwStatusInfoLength);
     
-    hdr->lpfnStatusCB(hdr->hInternet, dwContext, dwInternetStatus,
-                      lpvNewInfo, dwStatusInfoLength);
+    hdr->lpfnStatusCB(hdr->hInternet, dwContext, status, lpvNewInfo, \
dwStatusInfoLength);  
     TRACE(" end callback().\n");
 





[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic