[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