urlmon: Move some HttpProtocol variables to generic Protocol object.

This commit is contained in:
Jacek Caban 2009-03-02 03:19:00 +01:00 committed by Alexandre Julliard
parent b105b084a2
commit b0a9ddae67
2 changed files with 138 additions and 120 deletions

View File

@ -60,21 +60,17 @@ WINE_DEFAULT_DEBUG_CHANNEL(urlmon);
#define FLAG_RESULT_REPORTED 0x20
typedef struct {
Protocol base;
const IInternetProtocolVtbl *lpInternetProtocolVtbl;
const IInternetPriorityVtbl *lpInternetPriorityVtbl;
BOOL https;
DWORD flags, grfBINDF;
BINDINFO bind_info;
IInternetProtocolSink *protocol_sink;
IHttpNegotiate *http_negotiate;
HINTERNET internet, connect, request;
LPWSTR full_header;
HANDLE lock;
ULONG current_position, content_length, available_bytes;
LONG priority;
LONG ref;
BOOL https;
IHttpNegotiate *http_negotiate;
LPWSTR full_header;
HINTERNET connection;
} HttpProtocol;
#define PROTOCOL(x) ((IInternetProtocol*) &(x)->lpInternetProtocolVtbl)
@ -90,45 +86,45 @@ static const WCHAR wszHeaders[] = {'A','c','c','e','p','t','-','E','n','c','o','
static void HTTPPROTOCOL_ReportResult(HttpProtocol *This, HRESULT hres)
{
if (!(This->flags & FLAG_RESULT_REPORTED) &&
This->protocol_sink)
if (!(This->base.flags & FLAG_RESULT_REPORTED) &&
This->base.protocol_sink)
{
This->flags |= FLAG_RESULT_REPORTED;
IInternetProtocolSink_ReportResult(This->protocol_sink, hres, 0, NULL);
This->base.flags |= FLAG_RESULT_REPORTED;
IInternetProtocolSink_ReportResult(This->base.protocol_sink, hres, 0, NULL);
}
}
static void HTTPPROTOCOL_ReportData(HttpProtocol *This)
{
DWORD bscf;
if (!(This->flags & FLAG_LAST_DATA_REPORTED) &&
This->protocol_sink)
if (!(This->base.flags & FLAG_LAST_DATA_REPORTED) &&
This->base.protocol_sink)
{
if (This->flags & FLAG_FIRST_DATA_REPORTED)
if (This->base.flags & FLAG_FIRST_DATA_REPORTED)
{
bscf = BSCF_INTERMEDIATEDATANOTIFICATION;
}
else
{
This->flags |= FLAG_FIRST_DATA_REPORTED;
This->base.flags |= FLAG_FIRST_DATA_REPORTED;
bscf = BSCF_FIRSTDATANOTIFICATION;
}
if (This->flags & FLAG_ALL_DATA_READ &&
!(This->flags & FLAG_LAST_DATA_REPORTED))
if (This->base.flags & FLAG_ALL_DATA_READ &&
!(This->base.flags & FLAG_LAST_DATA_REPORTED))
{
This->flags |= FLAG_LAST_DATA_REPORTED;
This->base.flags |= FLAG_LAST_DATA_REPORTED;
bscf |= BSCF_LASTDATANOTIFICATION;
}
IInternetProtocolSink_ReportData(This->protocol_sink, bscf,
This->current_position+This->available_bytes,
This->content_length);
IInternetProtocolSink_ReportData(This->base.protocol_sink, bscf,
This->base.current_position+This->base.available_bytes,
This->base.content_length);
}
}
static void HTTPPROTOCOL_AllDataRead(HttpProtocol *This)
{
if (!(This->flags & FLAG_ALL_DATA_READ))
This->flags |= FLAG_ALL_DATA_READ;
if (!(This->base.flags & FLAG_ALL_DATA_READ))
This->base.flags |= FLAG_ALL_DATA_READ;
HTTPPROTOCOL_ReportData(This);
HTTPPROTOCOL_ReportResult(This, S_OK);
}
@ -140,14 +136,14 @@ static void HTTPPROTOCOL_Close(HttpProtocol *This)
IHttpNegotiate_Release(This->http_negotiate);
This->http_negotiate = 0;
}
if (This->request)
InternetCloseHandle(This->request);
if (This->connect)
InternetCloseHandle(This->connect);
if (This->internet)
if (This->base.request)
InternetCloseHandle(This->base.request);
if (This->connection)
InternetCloseHandle(This->connection);
if (This->base.internet)
{
InternetCloseHandle(This->internet);
This->internet = 0;
InternetCloseHandle(This->base.internet);
This->base.internet = 0;
}
if (This->full_header)
{
@ -155,7 +151,7 @@ static void HTTPPROTOCOL_Close(HttpProtocol *This)
heap_free(This->full_header);
This->full_header = 0;
}
This->flags = 0;
This->base.flags = 0;
}
static void CALLBACK HTTPPROTOCOL_InternetStatusCallback(
@ -178,16 +174,16 @@ static void CALLBACK HTTPPROTOCOL_InternetStatusCallback(
ulStatusCode = BINDSTATUS_SENDINGREQUEST;
break;
case INTERNET_STATUS_REQUEST_COMPLETE:
This->flags |= FLAG_REQUEST_COMPLETE;
This->base.flags |= FLAG_REQUEST_COMPLETE;
/* PROTOCOLDATA same as native */
memset(&data, 0, sizeof(data));
data.dwState = 0xf1000000;
if (This->flags & FLAG_FIRST_CONTINUE_COMPLETE)
if (This->base.flags & FLAG_FIRST_CONTINUE_COMPLETE)
data.pData = (LPVOID)BINDSTATUS_ENDDOWNLOADCOMPONENTS;
else
data.pData = (LPVOID)BINDSTATUS_DOWNLOADINGDATA;
if (This->grfBINDF & BINDF_FROMURLMON)
IInternetProtocolSink_Switch(This->protocol_sink, &data);
if (This->base.bindf & BINDF_FROMURLMON)
IInternetProtocolSink_Switch(This->base.protocol_sink, &data);
else
IInternetProtocol_Continue(PROTOCOL(This), &data);
return;
@ -195,22 +191,22 @@ static void CALLBACK HTTPPROTOCOL_InternetStatusCallback(
IInternetProtocol_AddRef(PROTOCOL(This));
return;
case INTERNET_STATUS_HANDLE_CLOSING:
if (*(HINTERNET *)lpvStatusInformation == This->connect)
if (*(HINTERNET *)lpvStatusInformation == This->connection)
{
This->connect = 0;
This->connection = 0;
}
else if (*(HINTERNET *)lpvStatusInformation == This->request)
else if (*(HINTERNET *)lpvStatusInformation == This->base.request)
{
This->request = 0;
if (This->protocol_sink)
This->base.request = 0;
if (This->base.protocol_sink)
{
IInternetProtocolSink_Release(This->protocol_sink);
This->protocol_sink = 0;
IInternetProtocolSink_Release(This->base.protocol_sink);
This->base.protocol_sink = 0;
}
if (This->bind_info.cbSize)
if (This->base.bind_info.cbSize)
{
ReleaseBindInfo(&This->bind_info);
memset(&This->bind_info, 0, sizeof(This->bind_info));
ReleaseBindInfo(&This->base.bind_info);
memset(&This->base.bind_info, 0, sizeof(This->base.bind_info));
}
}
IInternetProtocol_Release(PROTOCOL(This));
@ -220,7 +216,7 @@ static void CALLBACK HTTPPROTOCOL_InternetStatusCallback(
return;
}
IInternetProtocolSink_ReportProgress(This->protocol_sink, ulStatusCode, (LPWSTR)lpvStatusInformation);
IInternetProtocolSink_ReportProgress(This->base.protocol_sink, ulStatusCode, (LPWSTR)lpvStatusInformation);
}
static inline LPWSTR strndupW(LPCWSTR string, int len)
@ -321,11 +317,11 @@ static HRESULT WINAPI HttpProtocol_Start(IInternetProtocol *iface, LPCWSTR szUrl
pOIBindInfo, grfPI, dwReserved);
IInternetProtocolSink_AddRef(pOIProtSink);
This->protocol_sink = pOIProtSink;
This->base.protocol_sink = pOIProtSink;
memset(&This->bind_info, 0, sizeof(This->bind_info));
This->bind_info.cbSize = sizeof(BINDINFO);
hres = IInternetBindInfo_GetBindInfo(pOIBindInfo, &This->grfBINDF, &This->bind_info);
memset(&This->base.bind_info, 0, sizeof(This->base.bind_info));
This->base.bind_info.cbSize = sizeof(BINDINFO);
hres = IInternetBindInfo_GetBindInfo(pOIBindInfo, &This->base.bindf, &This->base.bind_info);
if (hres != S_OK)
{
WARN("GetBindInfo failed: %08x\n", hres);
@ -356,8 +352,8 @@ static HRESULT WINAPI HttpProtocol_Start(IInternetProtocol *iface, LPCWSTR szUrl
if (!url.nPort)
url.nPort = This->https ? INTERNET_DEFAULT_HTTPS_PORT : INTERNET_DEFAULT_HTTP_PORT;
if(!(This->grfBINDF & BINDF_FROMURLMON))
IInternetProtocolSink_ReportProgress(This->protocol_sink, BINDSTATUS_DIRECTBIND, NULL);
if(!(This->base.bindf & BINDF_FROMURLMON))
IInternetProtocolSink_ReportProgress(This->base.protocol_sink, BINDSTATUS_DIRECTBIND, NULL);
hres = IInternetBindInfo_GetBindString(pOIBindInfo, BINDSTRING_USER_AGENT, &user_agent,
1, &num);
@ -388,8 +384,8 @@ static HRESULT WINAPI HttpProtocol_Start(IInternetProtocol *iface, LPCWSTR szUrl
heap_free(user_agenta);
}
This->internet = InternetOpenW(user_agent, 0, NULL, NULL, INTERNET_FLAG_ASYNC);
if (!This->internet)
This->base.internet = InternetOpenW(user_agent, 0, NULL, NULL, INTERNET_FLAG_ASYNC);
if (!This->base.internet)
{
WARN("InternetOpen failed: %d\n", GetLastError());
hres = INET_E_NO_SESSION;
@ -397,13 +393,13 @@ static HRESULT WINAPI HttpProtocol_Start(IInternetProtocol *iface, LPCWSTR szUrl
}
/* Native does not check for success of next call, so we won't either */
InternetSetStatusCallbackW(This->internet, HTTPPROTOCOL_InternetStatusCallback);
InternetSetStatusCallbackW(This->base.internet, HTTPPROTOCOL_InternetStatusCallback);
This->connect = InternetConnectW(This->internet, host, url.nPort, user,
This->connection = InternetConnectW(This->base.internet, host, url.nPort, user,
pass, INTERNET_SERVICE_HTTP,
This->https ? INTERNET_FLAG_SECURE : 0,
(DWORD_PTR)This);
if (!This->connect)
if (!This->connection)
{
WARN("InternetConnect failed: %d\n", GetLastError());
hres = INET_E_CANNOT_CONNECT;
@ -422,25 +418,25 @@ static HRESULT WINAPI HttpProtocol_Start(IInternetProtocol *iface, LPCWSTR szUrl
}
accept_mimes[num] = 0;
if (This->grfBINDF & BINDF_NOWRITECACHE)
if (This->base.bindf & BINDF_NOWRITECACHE)
request_flags |= INTERNET_FLAG_NO_CACHE_WRITE;
if (This->grfBINDF & BINDF_NEEDFILE)
if (This->base.bindf & BINDF_NEEDFILE)
request_flags |= INTERNET_FLAG_NEED_FILE;
if (This->https)
request_flags |= INTERNET_FLAG_SECURE;
This->request = HttpOpenRequestW(This->connect, This->bind_info.dwBindVerb < BINDVERB_CUSTOM ?
wszBindVerb[This->bind_info.dwBindVerb] :
This->bind_info.szCustomVerb,
This->base.request = HttpOpenRequestW(This->connection, This->base.bind_info.dwBindVerb < BINDVERB_CUSTOM ?
wszBindVerb[This->base.bind_info.dwBindVerb] :
This->base.bind_info.szCustomVerb,
path, NULL, NULL, (LPCWSTR *)accept_mimes,
request_flags, (DWORD_PTR)This);
if (!This->request)
if (!This->base.request)
{
WARN("HttpOpenRequest failed: %d\n", GetLastError());
hres = INET_E_RESOURCE_NOT_FOUND;
goto done;
}
hres = IInternetProtocolSink_QueryInterface(This->protocol_sink, &IID_IServiceProvider,
hres = IInternetProtocolSink_QueryInterface(This->base.protocol_sink, &IID_IServiceProvider,
(void **)&service_provider);
if (hres != S_OK)
{
@ -501,13 +497,13 @@ static HRESULT WINAPI HttpProtocol_Start(IInternetProtocol *iface, LPCWSTR szUrl
/* FIXME: Handle security_id. Native calls undocumented function IsHostInProxyBypassList. */
if (This->bind_info.dwBindVerb == BINDVERB_POST)
if (This->base.bind_info.dwBindVerb == BINDVERB_POST)
{
num = 0;
hres = IInternetBindInfo_GetBindString(pOIBindInfo, BINDSTRING_POST_COOKIE, &post_cookie,
1, &num);
if (hres == S_OK && num &&
!InternetSetOptionW(This->request, INTERNET_OPTION_SECONDARY_CACHE_KEY,
!InternetSetOptionW(This->base.request, INTERNET_OPTION_SECONDARY_CACHE_KEY,
post_cookie, lstrlenW(post_cookie)))
{
WARN("InternetSetOption INTERNET_OPTION_SECONDARY_CACHE_KEY failed: %d\n",
@ -515,18 +511,18 @@ static HRESULT WINAPI HttpProtocol_Start(IInternetProtocol *iface, LPCWSTR szUrl
}
}
if (This->bind_info.dwBindVerb != BINDVERB_GET)
if (This->base.bind_info.dwBindVerb != BINDVERB_GET)
{
/* Native does not use GlobalLock/GlobalUnlock, so we won't either */
if (This->bind_info.stgmedData.tymed != TYMED_HGLOBAL)
if (This->base.bind_info.stgmedData.tymed != TYMED_HGLOBAL)
WARN("Expected This->bind_info.stgmedData.tymed to be TYMED_HGLOBAL, not %d\n",
This->bind_info.stgmedData.tymed);
This->base.bind_info.stgmedData.tymed);
else
optional = (LPWSTR)This->bind_info.stgmedData.u.hGlobal;
optional = (LPWSTR)This->base.bind_info.stgmedData.u.hGlobal;
}
if (!HttpSendRequestW(This->request, This->full_header, lstrlenW(This->full_header),
if (!HttpSendRequestW(This->base.request, This->full_header, lstrlenW(This->full_header),
optional,
optional ? This->bind_info.cbstgmedData : 0) &&
optional ? This->base.bind_info.cbstgmedData : 0) &&
GetLastError() != ERROR_IO_PENDING)
{
WARN("HttpSendRequest failed: %d\n", GetLastError());
@ -538,7 +534,7 @@ static HRESULT WINAPI HttpProtocol_Start(IInternetProtocol *iface, LPCWSTR szUrl
done:
if (hres != S_OK)
{
IInternetProtocolSink_ReportResult(This->protocol_sink, hres, 0, NULL);
IInternetProtocolSink_ReportResult(This->base.protocol_sink, hres, 0, NULL);
HTTPPROTOCOL_Close(This);
}
@ -578,7 +574,7 @@ static HRESULT WINAPI HttpProtocol_Continue(IInternetProtocol *iface, PROTOCOLDA
WARN("Expected pProtocolData to be non-NULL\n");
return S_OK;
}
else if (!This->request)
else if (!This->base.request)
{
WARN("Expected request to be non-NULL\n");
return S_OK;
@ -588,7 +584,7 @@ static HRESULT WINAPI HttpProtocol_Continue(IInternetProtocol *iface, PROTOCOLDA
WARN("Expected IHttpNegotiate pointer to be non-NULL\n");
return S_OK;
}
else if (!This->protocol_sink)
else if (!This->base.protocol_sink)
{
WARN("Expected IInternetProtocolSink pointer to be non-NULL\n");
return S_OK;
@ -596,7 +592,7 @@ static HRESULT WINAPI HttpProtocol_Continue(IInternetProtocol *iface, PROTOCOLDA
if (pProtocolData->pData == (LPVOID)BINDSTATUS_DOWNLOADINGDATA)
{
if (!HttpQueryInfoW(This->request, HTTP_QUERY_STATUS_CODE | HTTP_QUERY_FLAG_NUMBER,
if (!HttpQueryInfoW(This->base.request, HTTP_QUERY_STATUS_CODE | HTTP_QUERY_FLAG_NUMBER,
&status_code, &len, NULL))
{
WARN("HttpQueryInfo failed: %d\n", GetLastError());
@ -604,11 +600,11 @@ static HRESULT WINAPI HttpProtocol_Continue(IInternetProtocol *iface, PROTOCOLDA
else
{
len = 0;
if ((!HttpQueryInfoW(This->request, HTTP_QUERY_RAW_HEADERS_CRLF, response_headers, &len,
if ((!HttpQueryInfoW(This->base.request, HTTP_QUERY_RAW_HEADERS_CRLF, response_headers, &len,
NULL) &&
GetLastError() != ERROR_INSUFFICIENT_BUFFER) ||
!(response_headers = heap_alloc(len)) ||
!HttpQueryInfoW(This->request, HTTP_QUERY_RAW_HEADERS_CRLF, response_headers, &len,
!HttpQueryInfoW(This->base.request, HTTP_QUERY_RAW_HEADERS_CRLF, response_headers, &len,
NULL))
{
WARN("HttpQueryInfo failed: %d\n", GetLastError());
@ -626,17 +622,17 @@ static HRESULT WINAPI HttpProtocol_Continue(IInternetProtocol *iface, PROTOCOLDA
}
if(This->https)
IInternetProtocolSink_ReportProgress(This->protocol_sink, BINDSTATUS_ACCEPTRANGES, NULL);
IInternetProtocolSink_ReportProgress(This->base.protocol_sink, BINDSTATUS_ACCEPTRANGES, NULL);
len = 0;
if ((!HttpQueryInfoW(This->request, HTTP_QUERY_CONTENT_TYPE, content_type, &len, NULL) &&
if ((!HttpQueryInfoW(This->base.request, HTTP_QUERY_CONTENT_TYPE, content_type, &len, NULL) &&
GetLastError() != ERROR_INSUFFICIENT_BUFFER) ||
!(content_type = heap_alloc(len)) ||
!HttpQueryInfoW(This->request, HTTP_QUERY_CONTENT_TYPE, content_type, &len, NULL))
!HttpQueryInfoW(This->base.request, HTTP_QUERY_CONTENT_TYPE, content_type, &len, NULL))
{
WARN("HttpQueryInfo failed: %d\n", GetLastError());
IInternetProtocolSink_ReportProgress(This->protocol_sink,
(This->grfBINDF & BINDF_FROMURLMON) ?
IInternetProtocolSink_ReportProgress(This->base.protocol_sink,
(This->base.bindf & BINDF_FROMURLMON) ?
BINDSTATUS_MIMETYPEAVAILABLE :
BINDSTATUS_RAWMIMETYPE,
wszDefaultContentType);
@ -647,35 +643,35 @@ static HRESULT WINAPI HttpProtocol_Continue(IInternetProtocol *iface, PROTOCOLDA
LPWSTR p = strchrW(content_type, ';');
if (p) *p = '\0';
IInternetProtocolSink_ReportProgress(This->protocol_sink,
(This->grfBINDF & BINDF_FROMURLMON) ?
IInternetProtocolSink_ReportProgress(This->base.protocol_sink,
(This->base.bindf & BINDF_FROMURLMON) ?
BINDSTATUS_MIMETYPEAVAILABLE :
BINDSTATUS_RAWMIMETYPE,
content_type);
}
len = 0;
if ((!HttpQueryInfoW(This->request, HTTP_QUERY_CONTENT_LENGTH, content_length, &len, NULL) &&
if ((!HttpQueryInfoW(This->base.request, HTTP_QUERY_CONTENT_LENGTH, content_length, &len, NULL) &&
GetLastError() != ERROR_INSUFFICIENT_BUFFER) ||
!(content_length = heap_alloc(len)) ||
!HttpQueryInfoW(This->request, HTTP_QUERY_CONTENT_LENGTH, content_length, &len, NULL))
!HttpQueryInfoW(This->base.request, HTTP_QUERY_CONTENT_LENGTH, content_length, &len, NULL))
{
WARN("HttpQueryInfo failed: %d\n", GetLastError());
This->content_length = 0;
This->base.content_length = 0;
}
else
{
This->content_length = atoiW(content_length);
This->base.content_length = atoiW(content_length);
}
if(This->grfBINDF & BINDF_NEEDFILE) {
if(This->base.bindf & BINDF_NEEDFILE) {
WCHAR cache_file[MAX_PATH];
DWORD buflen = sizeof(cache_file);
if(InternetQueryOptionW(This->request, INTERNET_OPTION_DATAFILE_NAME,
if(InternetQueryOptionW(This->base.request, INTERNET_OPTION_DATAFILE_NAME,
cache_file, &buflen))
{
IInternetProtocolSink_ReportProgress(This->protocol_sink,
IInternetProtocolSink_ReportProgress(This->base.protocol_sink,
BINDSTATUS_CACHEFILENAMEAVAILABLE,
cache_file);
}else {
@ -683,7 +679,7 @@ static HRESULT WINAPI HttpProtocol_Continue(IInternetProtocol *iface, PROTOCOLDA
}
}
This->flags |= FLAG_FIRST_CONTINUE_COMPLETE;
This->base.flags |= FLAG_FIRST_CONTINUE_COMPLETE;
}
if (pProtocolData->pData >= (LPVOID)BINDSTATUS_DOWNLOADINGDATA)
@ -691,19 +687,19 @@ static HRESULT WINAPI HttpProtocol_Continue(IInternetProtocol *iface, PROTOCOLDA
/* InternetQueryDataAvailable may immediately fork and perform its asynchronous
* read, so clear the flag _before_ calling so it does not incorrectly get cleared
* after the status callback is called */
This->flags &= ~FLAG_REQUEST_COMPLETE;
if (!InternetQueryDataAvailable(This->request, &This->available_bytes, 0, 0))
This->base.flags &= ~FLAG_REQUEST_COMPLETE;
if (!InternetQueryDataAvailable(This->base.request, &This->base.available_bytes, 0, 0))
{
if (GetLastError() != ERROR_IO_PENDING)
{
This->flags |= FLAG_REQUEST_COMPLETE;
This->base.flags |= FLAG_REQUEST_COMPLETE;
WARN("InternetQueryDataAvailable failed: %d\n", GetLastError());
HTTPPROTOCOL_ReportResult(This, INET_E_DATA_NOT_AVAILABLE);
}
}
else
{
This->flags |= FLAG_REQUEST_COMPLETE;
This->base.flags |= FLAG_REQUEST_COMPLETE;
HTTPPROTOCOL_ReportData(This);
}
}
@ -758,20 +754,20 @@ static HRESULT WINAPI HttpProtocol_Read(IInternetProtocol *iface, void *pv,
TRACE("(%p)->(%p %u %p)\n", This, pv, cb, pcbRead);
if (!(This->flags & FLAG_REQUEST_COMPLETE))
if (!(This->base.flags & FLAG_REQUEST_COMPLETE))
{
hres = E_PENDING;
}
else while (!(This->flags & FLAG_ALL_DATA_READ) &&
else while (!(This->base.flags & FLAG_ALL_DATA_READ) &&
read < cb)
{
if (This->available_bytes == 0)
if (This->base.available_bytes == 0)
{
/* InternetQueryDataAvailable may immediately fork and perform its asynchronous
* read, so clear the flag _before_ calling so it does not incorrectly get cleared
* after the status callback is called */
This->flags &= ~FLAG_REQUEST_COMPLETE;
if (!InternetQueryDataAvailable(This->request, &This->available_bytes, 0, 0))
This->base.flags &= ~FLAG_REQUEST_COMPLETE;
if (!InternetQueryDataAvailable(This->base.request, &This->base.available_bytes, 0, 0))
{
if (GetLastError() == ERROR_IO_PENDING)
{
@ -785,16 +781,16 @@ static HRESULT WINAPI HttpProtocol_Read(IInternetProtocol *iface, void *pv,
}
goto done;
}
else if (This->available_bytes == 0)
else if (This->base.available_bytes == 0)
{
HTTPPROTOCOL_AllDataRead(This);
}
}
else
{
if (!InternetReadFile(This->request, ((BYTE *)pv)+read,
This->available_bytes > cb-read ?
cb-read : This->available_bytes, &len))
if (!InternetReadFile(This->base.request, ((BYTE *)pv)+read,
This->base.available_bytes > cb-read ?
cb-read : This->base.available_bytes, &len))
{
WARN("InternetReadFile failed: %d\n", GetLastError());
hres = INET_E_DOWNLOAD_FAILURE;
@ -808,8 +804,8 @@ static HRESULT WINAPI HttpProtocol_Read(IInternetProtocol *iface, void *pv,
else
{
read += len;
This->current_position += len;
This->available_bytes -= len;
This->base.current_position += len;
This->base.available_bytes -= len;
}
}
}
@ -824,7 +820,7 @@ done:
*pcbRead = read;
if (hres != E_PENDING)
This->flags |= FLAG_REQUEST_COMPLETE;
This->base.flags |= FLAG_REQUEST_COMPLETE;
return hres;
}
@ -843,7 +839,7 @@ static HRESULT WINAPI HttpProtocol_LockRequest(IInternetProtocol *iface, DWORD d
TRACE("(%p)->(%08x)\n", This, dwOptions);
if (!InternetLockRequestFile(This->request, &This->lock))
if (!InternetLockRequestFile(This->base.request, &This->base.lock))
WARN("InternetLockRequest failed: %d\n", GetLastError());
return S_OK;
@ -855,11 +851,11 @@ static HRESULT WINAPI HttpProtocol_UnlockRequest(IInternetProtocol *iface)
TRACE("(%p)\n", This);
if (This->lock)
if (This->base.lock)
{
if (!InternetUnlockRequestFile(This->lock))
if (!InternetUnlockRequestFile(This->base.lock))
WARN("InternetUnlockRequest failed: %d\n", GetLastError());
This->lock = 0;
This->base.lock = 0;
}
return S_OK;
@ -893,7 +889,7 @@ static HRESULT WINAPI HttpPriority_SetPriority(IInternetPriority *iface, LONG nP
TRACE("(%p)->(%d)\n", This, nPriority);
This->priority = nPriority;
This->base.priority = nPriority;
return S_OK;
}
@ -903,7 +899,7 @@ static HRESULT WINAPI HttpPriority_GetPriority(IInternetPriority *iface, LONG *p
TRACE("(%p)->(%p)\n", This, pnPriority);
*pnPriority = This->priority;
*pnPriority = This->base.priority;
return S_OK;
}

View File

@ -1,5 +1,6 @@
/*
* Copyright 2002 Huw D M Davies for CodeWeavers
* Copyright 2009 Jacek Caban for CodeWeavers
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@ -30,6 +31,7 @@
#include "winuser.h"
#include "ole2.h"
#include "urlmon.h"
#include "wininet.h"
#include "wine/unicode.h"
@ -50,7 +52,8 @@ static inline void URLMON_LockModule(void) { InterlockedIncrement( &URLMON_refCo
static inline void URLMON_UnlockModule(void) { InterlockedDecrement( &URLMON_refCount ); }
#define ICOM_THIS_MULTI(impl,field,iface) impl* const This=(impl*)((char*)(iface) - offsetof(impl,field))
#define DEFINE_THIS(cls,ifc,iface) ((cls*)((BYTE*)(iface)-offsetof(cls,lp ## ifc ## Vtbl)))
#define DEFINE_THIS2(cls,ifc,iface) ((cls*)((BYTE*)(iface)-offsetof(cls,ifc)))
#define DEFINE_THIS(cls,ifc,iface) DEFINE_THIS2(cls,lp ## ifc ## Vtbl,iface)
typedef struct
{
@ -76,6 +79,25 @@ HRESULT bind_to_object(IMoniker *mon, LPCWSTR url, IBindCtx *pbc, REFIID riid, v
HRESULT create_binding_protocol(LPCWSTR url, BOOL from_urlmon, IInternetProtocol **protocol);
void set_binding_sink(IInternetProtocol *bind_protocol, IInternetProtocolSink *sink);
typedef struct {
IInternetProtocol *protocol;
IInternetProtocolSink *protocol_sink;
DWORD bindf;
BINDINFO bind_info;
HINTERNET internet;
HINTERNET request;
DWORD flags;
HANDLE lock;
ULONG current_position;
ULONG content_length;
ULONG available_bytes;
LONG priority;
} Protocol;
static inline void *heap_alloc(size_t len)
{
return HeapAlloc(GetProcessHeap(), 0, len);