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
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");