Commit b0a9ddae authored by Jacek Caban's avatar Jacek Caban Committed by Alexandre Julliard

urlmon: Move some HttpProtocol variables to generic Protocol object.

parent b105b084
...@@ -60,21 +60,17 @@ WINE_DEFAULT_DEBUG_CHANNEL(urlmon); ...@@ -60,21 +60,17 @@ WINE_DEFAULT_DEBUG_CHANNEL(urlmon);
#define FLAG_RESULT_REPORTED 0x20 #define FLAG_RESULT_REPORTED 0x20
typedef struct { typedef struct {
Protocol base;
const IInternetProtocolVtbl *lpInternetProtocolVtbl; const IInternetProtocolVtbl *lpInternetProtocolVtbl;
const IInternetPriorityVtbl *lpInternetPriorityVtbl; const IInternetPriorityVtbl *lpInternetPriorityVtbl;
LONG ref;
BOOL https; BOOL https;
DWORD flags, grfBINDF;
BINDINFO bind_info;
IInternetProtocolSink *protocol_sink;
IHttpNegotiate *http_negotiate; IHttpNegotiate *http_negotiate;
HINTERNET internet, connect, request;
LPWSTR full_header; LPWSTR full_header;
HANDLE lock; HINTERNET connection;
ULONG current_position, content_length, available_bytes;
LONG priority;
LONG ref;
} HttpProtocol; } HttpProtocol;
#define PROTOCOL(x) ((IInternetProtocol*) &(x)->lpInternetProtocolVtbl) #define PROTOCOL(x) ((IInternetProtocol*) &(x)->lpInternetProtocolVtbl)
...@@ -90,45 +86,45 @@ static const WCHAR wszHeaders[] = {'A','c','c','e','p','t','-','E','n','c','o',' ...@@ -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) static void HTTPPROTOCOL_ReportResult(HttpProtocol *This, HRESULT hres)
{ {
if (!(This->flags & FLAG_RESULT_REPORTED) && if (!(This->base.flags & FLAG_RESULT_REPORTED) &&
This->protocol_sink) This->base.protocol_sink)
{ {
This->flags |= FLAG_RESULT_REPORTED; This->base.flags |= FLAG_RESULT_REPORTED;
IInternetProtocolSink_ReportResult(This->protocol_sink, hres, 0, NULL); IInternetProtocolSink_ReportResult(This->base.protocol_sink, hres, 0, NULL);
} }
} }
static void HTTPPROTOCOL_ReportData(HttpProtocol *This) static void HTTPPROTOCOL_ReportData(HttpProtocol *This)
{ {
DWORD bscf; DWORD bscf;
if (!(This->flags & FLAG_LAST_DATA_REPORTED) && if (!(This->base.flags & FLAG_LAST_DATA_REPORTED) &&
This->protocol_sink) This->base.protocol_sink)
{ {
if (This->flags & FLAG_FIRST_DATA_REPORTED) if (This->base.flags & FLAG_FIRST_DATA_REPORTED)
{ {
bscf = BSCF_INTERMEDIATEDATANOTIFICATION; bscf = BSCF_INTERMEDIATEDATANOTIFICATION;
} }
else else
{ {
This->flags |= FLAG_FIRST_DATA_REPORTED; This->base.flags |= FLAG_FIRST_DATA_REPORTED;
bscf = BSCF_FIRSTDATANOTIFICATION; bscf = BSCF_FIRSTDATANOTIFICATION;
} }
if (This->flags & FLAG_ALL_DATA_READ && if (This->base.flags & FLAG_ALL_DATA_READ &&
!(This->flags & FLAG_LAST_DATA_REPORTED)) !(This->base.flags & FLAG_LAST_DATA_REPORTED))
{ {
This->flags |= FLAG_LAST_DATA_REPORTED; This->base.flags |= FLAG_LAST_DATA_REPORTED;
bscf |= BSCF_LASTDATANOTIFICATION; bscf |= BSCF_LASTDATANOTIFICATION;
} }
IInternetProtocolSink_ReportData(This->protocol_sink, bscf, IInternetProtocolSink_ReportData(This->base.protocol_sink, bscf,
This->current_position+This->available_bytes, This->base.current_position+This->base.available_bytes,
This->content_length); This->base.content_length);
} }
} }
static void HTTPPROTOCOL_AllDataRead(HttpProtocol *This) static void HTTPPROTOCOL_AllDataRead(HttpProtocol *This)
{ {
if (!(This->flags & FLAG_ALL_DATA_READ)) if (!(This->base.flags & FLAG_ALL_DATA_READ))
This->flags |= FLAG_ALL_DATA_READ; This->base.flags |= FLAG_ALL_DATA_READ;
HTTPPROTOCOL_ReportData(This); HTTPPROTOCOL_ReportData(This);
HTTPPROTOCOL_ReportResult(This, S_OK); HTTPPROTOCOL_ReportResult(This, S_OK);
} }
...@@ -140,14 +136,14 @@ static void HTTPPROTOCOL_Close(HttpProtocol *This) ...@@ -140,14 +136,14 @@ static void HTTPPROTOCOL_Close(HttpProtocol *This)
IHttpNegotiate_Release(This->http_negotiate); IHttpNegotiate_Release(This->http_negotiate);
This->http_negotiate = 0; This->http_negotiate = 0;
} }
if (This->request) if (This->base.request)
InternetCloseHandle(This->request); InternetCloseHandle(This->base.request);
if (This->connect) if (This->connection)
InternetCloseHandle(This->connect); InternetCloseHandle(This->connection);
if (This->internet) if (This->base.internet)
{ {
InternetCloseHandle(This->internet); InternetCloseHandle(This->base.internet);
This->internet = 0; This->base.internet = 0;
} }
if (This->full_header) if (This->full_header)
{ {
...@@ -155,7 +151,7 @@ static void HTTPPROTOCOL_Close(HttpProtocol *This) ...@@ -155,7 +151,7 @@ static void HTTPPROTOCOL_Close(HttpProtocol *This)
heap_free(This->full_header); heap_free(This->full_header);
This->full_header = 0; This->full_header = 0;
} }
This->flags = 0; This->base.flags = 0;
} }
static void CALLBACK HTTPPROTOCOL_InternetStatusCallback( static void CALLBACK HTTPPROTOCOL_InternetStatusCallback(
...@@ -178,16 +174,16 @@ static void CALLBACK HTTPPROTOCOL_InternetStatusCallback( ...@@ -178,16 +174,16 @@ static void CALLBACK HTTPPROTOCOL_InternetStatusCallback(
ulStatusCode = BINDSTATUS_SENDINGREQUEST; ulStatusCode = BINDSTATUS_SENDINGREQUEST;
break; break;
case INTERNET_STATUS_REQUEST_COMPLETE: case INTERNET_STATUS_REQUEST_COMPLETE:
This->flags |= FLAG_REQUEST_COMPLETE; This->base.flags |= FLAG_REQUEST_COMPLETE;
/* PROTOCOLDATA same as native */ /* PROTOCOLDATA same as native */
memset(&data, 0, sizeof(data)); memset(&data, 0, sizeof(data));
data.dwState = 0xf1000000; data.dwState = 0xf1000000;
if (This->flags & FLAG_FIRST_CONTINUE_COMPLETE) if (This->base.flags & FLAG_FIRST_CONTINUE_COMPLETE)
data.pData = (LPVOID)BINDSTATUS_ENDDOWNLOADCOMPONENTS; data.pData = (LPVOID)BINDSTATUS_ENDDOWNLOADCOMPONENTS;
else else
data.pData = (LPVOID)BINDSTATUS_DOWNLOADINGDATA; data.pData = (LPVOID)BINDSTATUS_DOWNLOADINGDATA;
if (This->grfBINDF & BINDF_FROMURLMON) if (This->base.bindf & BINDF_FROMURLMON)
IInternetProtocolSink_Switch(This->protocol_sink, &data); IInternetProtocolSink_Switch(This->base.protocol_sink, &data);
else else
IInternetProtocol_Continue(PROTOCOL(This), &data); IInternetProtocol_Continue(PROTOCOL(This), &data);
return; return;
...@@ -195,22 +191,22 @@ static void CALLBACK HTTPPROTOCOL_InternetStatusCallback( ...@@ -195,22 +191,22 @@ static void CALLBACK HTTPPROTOCOL_InternetStatusCallback(
IInternetProtocol_AddRef(PROTOCOL(This)); IInternetProtocol_AddRef(PROTOCOL(This));
return; return;
case INTERNET_STATUS_HANDLE_CLOSING: 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; This->base.request = 0;
if (This->protocol_sink) if (This->base.protocol_sink)
{ {
IInternetProtocolSink_Release(This->protocol_sink); IInternetProtocolSink_Release(This->base.protocol_sink);
This->protocol_sink = 0; This->base.protocol_sink = 0;
} }
if (This->bind_info.cbSize) if (This->base.bind_info.cbSize)
{ {
ReleaseBindInfo(&This->bind_info); ReleaseBindInfo(&This->base.bind_info);
memset(&This->bind_info, 0, sizeof(This->bind_info)); memset(&This->base.bind_info, 0, sizeof(This->base.bind_info));
} }
} }
IInternetProtocol_Release(PROTOCOL(This)); IInternetProtocol_Release(PROTOCOL(This));
...@@ -220,7 +216,7 @@ static void CALLBACK HTTPPROTOCOL_InternetStatusCallback( ...@@ -220,7 +216,7 @@ static void CALLBACK HTTPPROTOCOL_InternetStatusCallback(
return; 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) static inline LPWSTR strndupW(LPCWSTR string, int len)
...@@ -321,11 +317,11 @@ static HRESULT WINAPI HttpProtocol_Start(IInternetProtocol *iface, LPCWSTR szUrl ...@@ -321,11 +317,11 @@ static HRESULT WINAPI HttpProtocol_Start(IInternetProtocol *iface, LPCWSTR szUrl
pOIBindInfo, grfPI, dwReserved); pOIBindInfo, grfPI, dwReserved);
IInternetProtocolSink_AddRef(pOIProtSink); IInternetProtocolSink_AddRef(pOIProtSink);
This->protocol_sink = pOIProtSink; This->base.protocol_sink = pOIProtSink;
memset(&This->bind_info, 0, sizeof(This->bind_info)); memset(&This->base.bind_info, 0, sizeof(This->base.bind_info));
This->bind_info.cbSize = sizeof(BINDINFO); This->base.bind_info.cbSize = sizeof(BINDINFO);
hres = IInternetBindInfo_GetBindInfo(pOIBindInfo, &This->grfBINDF, &This->bind_info); hres = IInternetBindInfo_GetBindInfo(pOIBindInfo, &This->base.bindf, &This->base.bind_info);
if (hres != S_OK) if (hres != S_OK)
{ {
WARN("GetBindInfo failed: %08x\n", hres); WARN("GetBindInfo failed: %08x\n", hres);
...@@ -356,8 +352,8 @@ static HRESULT WINAPI HttpProtocol_Start(IInternetProtocol *iface, LPCWSTR szUrl ...@@ -356,8 +352,8 @@ static HRESULT WINAPI HttpProtocol_Start(IInternetProtocol *iface, LPCWSTR szUrl
if (!url.nPort) if (!url.nPort)
url.nPort = This->https ? INTERNET_DEFAULT_HTTPS_PORT : INTERNET_DEFAULT_HTTP_PORT; url.nPort = This->https ? INTERNET_DEFAULT_HTTPS_PORT : INTERNET_DEFAULT_HTTP_PORT;
if(!(This->grfBINDF & BINDF_FROMURLMON)) if(!(This->base.bindf & BINDF_FROMURLMON))
IInternetProtocolSink_ReportProgress(This->protocol_sink, BINDSTATUS_DIRECTBIND, NULL); IInternetProtocolSink_ReportProgress(This->base.protocol_sink, BINDSTATUS_DIRECTBIND, NULL);
hres = IInternetBindInfo_GetBindString(pOIBindInfo, BINDSTRING_USER_AGENT, &user_agent, hres = IInternetBindInfo_GetBindString(pOIBindInfo, BINDSTRING_USER_AGENT, &user_agent,
1, &num); 1, &num);
...@@ -388,8 +384,8 @@ static HRESULT WINAPI HttpProtocol_Start(IInternetProtocol *iface, LPCWSTR szUrl ...@@ -388,8 +384,8 @@ static HRESULT WINAPI HttpProtocol_Start(IInternetProtocol *iface, LPCWSTR szUrl
heap_free(user_agenta); heap_free(user_agenta);
} }
This->internet = InternetOpenW(user_agent, 0, NULL, NULL, INTERNET_FLAG_ASYNC); This->base.internet = InternetOpenW(user_agent, 0, NULL, NULL, INTERNET_FLAG_ASYNC);
if (!This->internet) if (!This->base.internet)
{ {
WARN("InternetOpen failed: %d\n", GetLastError()); WARN("InternetOpen failed: %d\n", GetLastError());
hres = INET_E_NO_SESSION; hres = INET_E_NO_SESSION;
...@@ -397,13 +393,13 @@ static HRESULT WINAPI HttpProtocol_Start(IInternetProtocol *iface, LPCWSTR szUrl ...@@ -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 */ /* 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, pass, INTERNET_SERVICE_HTTP,
This->https ? INTERNET_FLAG_SECURE : 0, This->https ? INTERNET_FLAG_SECURE : 0,
(DWORD_PTR)This); (DWORD_PTR)This);
if (!This->connect) if (!This->connection)
{ {
WARN("InternetConnect failed: %d\n", GetLastError()); WARN("InternetConnect failed: %d\n", GetLastError());
hres = INET_E_CANNOT_CONNECT; hres = INET_E_CANNOT_CONNECT;
...@@ -422,25 +418,25 @@ static HRESULT WINAPI HttpProtocol_Start(IInternetProtocol *iface, LPCWSTR szUrl ...@@ -422,25 +418,25 @@ static HRESULT WINAPI HttpProtocol_Start(IInternetProtocol *iface, LPCWSTR szUrl
} }
accept_mimes[num] = 0; accept_mimes[num] = 0;
if (This->grfBINDF & BINDF_NOWRITECACHE) if (This->base.bindf & BINDF_NOWRITECACHE)
request_flags |= INTERNET_FLAG_NO_CACHE_WRITE; request_flags |= INTERNET_FLAG_NO_CACHE_WRITE;
if (This->grfBINDF & BINDF_NEEDFILE) if (This->base.bindf & BINDF_NEEDFILE)
request_flags |= INTERNET_FLAG_NEED_FILE; request_flags |= INTERNET_FLAG_NEED_FILE;
if (This->https) if (This->https)
request_flags |= INTERNET_FLAG_SECURE; request_flags |= INTERNET_FLAG_SECURE;
This->request = HttpOpenRequestW(This->connect, This->bind_info.dwBindVerb < BINDVERB_CUSTOM ? This->base.request = HttpOpenRequestW(This->connection, This->base.bind_info.dwBindVerb < BINDVERB_CUSTOM ?
wszBindVerb[This->bind_info.dwBindVerb] : wszBindVerb[This->base.bind_info.dwBindVerb] :
This->bind_info.szCustomVerb, This->base.bind_info.szCustomVerb,
path, NULL, NULL, (LPCWSTR *)accept_mimes, path, NULL, NULL, (LPCWSTR *)accept_mimes,
request_flags, (DWORD_PTR)This); request_flags, (DWORD_PTR)This);
if (!This->request) if (!This->base.request)
{ {
WARN("HttpOpenRequest failed: %d\n", GetLastError()); WARN("HttpOpenRequest failed: %d\n", GetLastError());
hres = INET_E_RESOURCE_NOT_FOUND; hres = INET_E_RESOURCE_NOT_FOUND;
goto done; goto done;
} }
hres = IInternetProtocolSink_QueryInterface(This->protocol_sink, &IID_IServiceProvider, hres = IInternetProtocolSink_QueryInterface(This->base.protocol_sink, &IID_IServiceProvider,
(void **)&service_provider); (void **)&service_provider);
if (hres != S_OK) if (hres != S_OK)
{ {
...@@ -501,13 +497,13 @@ static HRESULT WINAPI HttpProtocol_Start(IInternetProtocol *iface, LPCWSTR szUrl ...@@ -501,13 +497,13 @@ static HRESULT WINAPI HttpProtocol_Start(IInternetProtocol *iface, LPCWSTR szUrl
/* FIXME: Handle security_id. Native calls undocumented function IsHostInProxyBypassList. */ /* 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; num = 0;
hres = IInternetBindInfo_GetBindString(pOIBindInfo, BINDSTRING_POST_COOKIE, &post_cookie, hres = IInternetBindInfo_GetBindString(pOIBindInfo, BINDSTRING_POST_COOKIE, &post_cookie,
1, &num); 1, &num);
if (hres == S_OK && 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))) post_cookie, lstrlenW(post_cookie)))
{ {
WARN("InternetSetOption INTERNET_OPTION_SECONDARY_CACHE_KEY failed: %d\n", WARN("InternetSetOption INTERNET_OPTION_SECONDARY_CACHE_KEY failed: %d\n",
...@@ -515,18 +511,18 @@ static HRESULT WINAPI HttpProtocol_Start(IInternetProtocol *iface, LPCWSTR szUrl ...@@ -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 */ /* 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", 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 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,
optional ? This->bind_info.cbstgmedData : 0) && optional ? This->base.bind_info.cbstgmedData : 0) &&
GetLastError() != ERROR_IO_PENDING) GetLastError() != ERROR_IO_PENDING)
{ {
WARN("HttpSendRequest failed: %d\n", GetLastError()); WARN("HttpSendRequest failed: %d\n", GetLastError());
...@@ -538,7 +534,7 @@ static HRESULT WINAPI HttpProtocol_Start(IInternetProtocol *iface, LPCWSTR szUrl ...@@ -538,7 +534,7 @@ static HRESULT WINAPI HttpProtocol_Start(IInternetProtocol *iface, LPCWSTR szUrl
done: done:
if (hres != S_OK) if (hres != S_OK)
{ {
IInternetProtocolSink_ReportResult(This->protocol_sink, hres, 0, NULL); IInternetProtocolSink_ReportResult(This->base.protocol_sink, hres, 0, NULL);
HTTPPROTOCOL_Close(This); HTTPPROTOCOL_Close(This);
} }
...@@ -578,7 +574,7 @@ static HRESULT WINAPI HttpProtocol_Continue(IInternetProtocol *iface, PROTOCOLDA ...@@ -578,7 +574,7 @@ static HRESULT WINAPI HttpProtocol_Continue(IInternetProtocol *iface, PROTOCOLDA
WARN("Expected pProtocolData to be non-NULL\n"); WARN("Expected pProtocolData to be non-NULL\n");
return S_OK; return S_OK;
} }
else if (!This->request) else if (!This->base.request)
{ {
WARN("Expected request to be non-NULL\n"); WARN("Expected request to be non-NULL\n");
return S_OK; return S_OK;
...@@ -588,7 +584,7 @@ static HRESULT WINAPI HttpProtocol_Continue(IInternetProtocol *iface, PROTOCOLDA ...@@ -588,7 +584,7 @@ static HRESULT WINAPI HttpProtocol_Continue(IInternetProtocol *iface, PROTOCOLDA
WARN("Expected IHttpNegotiate pointer to be non-NULL\n"); WARN("Expected IHttpNegotiate pointer to be non-NULL\n");
return S_OK; return S_OK;
} }
else if (!This->protocol_sink) else if (!This->base.protocol_sink)
{ {
WARN("Expected IInternetProtocolSink pointer to be non-NULL\n"); WARN("Expected IInternetProtocolSink pointer to be non-NULL\n");
return S_OK; return S_OK;
...@@ -596,7 +592,7 @@ static HRESULT WINAPI HttpProtocol_Continue(IInternetProtocol *iface, PROTOCOLDA ...@@ -596,7 +592,7 @@ static HRESULT WINAPI HttpProtocol_Continue(IInternetProtocol *iface, PROTOCOLDA
if (pProtocolData->pData == (LPVOID)BINDSTATUS_DOWNLOADINGDATA) 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)) &status_code, &len, NULL))
{ {
WARN("HttpQueryInfo failed: %d\n", GetLastError()); WARN("HttpQueryInfo failed: %d\n", GetLastError());
...@@ -604,11 +600,11 @@ static HRESULT WINAPI HttpProtocol_Continue(IInternetProtocol *iface, PROTOCOLDA ...@@ -604,11 +600,11 @@ static HRESULT WINAPI HttpProtocol_Continue(IInternetProtocol *iface, PROTOCOLDA
else else
{ {
len = 0; 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) && NULL) &&
GetLastError() != ERROR_INSUFFICIENT_BUFFER) || GetLastError() != ERROR_INSUFFICIENT_BUFFER) ||
!(response_headers = heap_alloc(len)) || !(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)) NULL))
{ {
WARN("HttpQueryInfo failed: %d\n", GetLastError()); WARN("HttpQueryInfo failed: %d\n", GetLastError());
...@@ -626,17 +622,17 @@ static HRESULT WINAPI HttpProtocol_Continue(IInternetProtocol *iface, PROTOCOLDA ...@@ -626,17 +622,17 @@ static HRESULT WINAPI HttpProtocol_Continue(IInternetProtocol *iface, PROTOCOLDA
} }
if(This->https) if(This->https)
IInternetProtocolSink_ReportProgress(This->protocol_sink, BINDSTATUS_ACCEPTRANGES, NULL); IInternetProtocolSink_ReportProgress(This->base.protocol_sink, BINDSTATUS_ACCEPTRANGES, NULL);
len = 0; 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) || GetLastError() != ERROR_INSUFFICIENT_BUFFER) ||
!(content_type = heap_alloc(len)) || !(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()); WARN("HttpQueryInfo failed: %d\n", GetLastError());
IInternetProtocolSink_ReportProgress(This->protocol_sink, IInternetProtocolSink_ReportProgress(This->base.protocol_sink,
(This->grfBINDF & BINDF_FROMURLMON) ? (This->base.bindf & BINDF_FROMURLMON) ?
BINDSTATUS_MIMETYPEAVAILABLE : BINDSTATUS_MIMETYPEAVAILABLE :
BINDSTATUS_RAWMIMETYPE, BINDSTATUS_RAWMIMETYPE,
wszDefaultContentType); wszDefaultContentType);
...@@ -647,35 +643,35 @@ static HRESULT WINAPI HttpProtocol_Continue(IInternetProtocol *iface, PROTOCOLDA ...@@ -647,35 +643,35 @@ static HRESULT WINAPI HttpProtocol_Continue(IInternetProtocol *iface, PROTOCOLDA
LPWSTR p = strchrW(content_type, ';'); LPWSTR p = strchrW(content_type, ';');
if (p) *p = '\0'; if (p) *p = '\0';
IInternetProtocolSink_ReportProgress(This->protocol_sink, IInternetProtocolSink_ReportProgress(This->base.protocol_sink,
(This->grfBINDF & BINDF_FROMURLMON) ? (This->base.bindf & BINDF_FROMURLMON) ?
BINDSTATUS_MIMETYPEAVAILABLE : BINDSTATUS_MIMETYPEAVAILABLE :
BINDSTATUS_RAWMIMETYPE, BINDSTATUS_RAWMIMETYPE,
content_type); content_type);
} }
len = 0; 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) || GetLastError() != ERROR_INSUFFICIENT_BUFFER) ||
!(content_length = heap_alloc(len)) || !(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()); WARN("HttpQueryInfo failed: %d\n", GetLastError());
This->content_length = 0; This->base.content_length = 0;
} }
else 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]; WCHAR cache_file[MAX_PATH];
DWORD buflen = sizeof(cache_file); 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)) cache_file, &buflen))
{ {
IInternetProtocolSink_ReportProgress(This->protocol_sink, IInternetProtocolSink_ReportProgress(This->base.protocol_sink,
BINDSTATUS_CACHEFILENAMEAVAILABLE, BINDSTATUS_CACHEFILENAMEAVAILABLE,
cache_file); cache_file);
}else { }else {
...@@ -683,7 +679,7 @@ static HRESULT WINAPI HttpProtocol_Continue(IInternetProtocol *iface, PROTOCOLDA ...@@ -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) if (pProtocolData->pData >= (LPVOID)BINDSTATUS_DOWNLOADINGDATA)
...@@ -691,19 +687,19 @@ static HRESULT WINAPI HttpProtocol_Continue(IInternetProtocol *iface, PROTOCOLDA ...@@ -691,19 +687,19 @@ static HRESULT WINAPI HttpProtocol_Continue(IInternetProtocol *iface, PROTOCOLDA
/* InternetQueryDataAvailable may immediately fork and perform its asynchronous /* InternetQueryDataAvailable may immediately fork and perform its asynchronous
* read, so clear the flag _before_ calling so it does not incorrectly get cleared * read, so clear the flag _before_ calling so it does not incorrectly get cleared
* after the status callback is called */ * after the status callback is called */
This->flags &= ~FLAG_REQUEST_COMPLETE; This->base.flags &= ~FLAG_REQUEST_COMPLETE;
if (!InternetQueryDataAvailable(This->request, &This->available_bytes, 0, 0)) if (!InternetQueryDataAvailable(This->base.request, &This->base.available_bytes, 0, 0))
{ {
if (GetLastError() != ERROR_IO_PENDING) if (GetLastError() != ERROR_IO_PENDING)
{ {
This->flags |= FLAG_REQUEST_COMPLETE; This->base.flags |= FLAG_REQUEST_COMPLETE;
WARN("InternetQueryDataAvailable failed: %d\n", GetLastError()); WARN("InternetQueryDataAvailable failed: %d\n", GetLastError());
HTTPPROTOCOL_ReportResult(This, INET_E_DATA_NOT_AVAILABLE); HTTPPROTOCOL_ReportResult(This, INET_E_DATA_NOT_AVAILABLE);
} }
} }
else else
{ {
This->flags |= FLAG_REQUEST_COMPLETE; This->base.flags |= FLAG_REQUEST_COMPLETE;
HTTPPROTOCOL_ReportData(This); HTTPPROTOCOL_ReportData(This);
} }
} }
...@@ -758,20 +754,20 @@ static HRESULT WINAPI HttpProtocol_Read(IInternetProtocol *iface, void *pv, ...@@ -758,20 +754,20 @@ static HRESULT WINAPI HttpProtocol_Read(IInternetProtocol *iface, void *pv,
TRACE("(%p)->(%p %u %p)\n", This, pv, cb, pcbRead); 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; hres = E_PENDING;
} }
else while (!(This->flags & FLAG_ALL_DATA_READ) && else while (!(This->base.flags & FLAG_ALL_DATA_READ) &&
read < cb) read < cb)
{ {
if (This->available_bytes == 0) if (This->base.available_bytes == 0)
{ {
/* InternetQueryDataAvailable may immediately fork and perform its asynchronous /* InternetQueryDataAvailable may immediately fork and perform its asynchronous
* read, so clear the flag _before_ calling so it does not incorrectly get cleared * read, so clear the flag _before_ calling so it does not incorrectly get cleared
* after the status callback is called */ * after the status callback is called */
This->flags &= ~FLAG_REQUEST_COMPLETE; This->base.flags &= ~FLAG_REQUEST_COMPLETE;
if (!InternetQueryDataAvailable(This->request, &This->available_bytes, 0, 0)) if (!InternetQueryDataAvailable(This->base.request, &This->base.available_bytes, 0, 0))
{ {
if (GetLastError() == ERROR_IO_PENDING) if (GetLastError() == ERROR_IO_PENDING)
{ {
...@@ -785,16 +781,16 @@ static HRESULT WINAPI HttpProtocol_Read(IInternetProtocol *iface, void *pv, ...@@ -785,16 +781,16 @@ static HRESULT WINAPI HttpProtocol_Read(IInternetProtocol *iface, void *pv,
} }
goto done; goto done;
} }
else if (This->available_bytes == 0) else if (This->base.available_bytes == 0)
{ {
HTTPPROTOCOL_AllDataRead(This); HTTPPROTOCOL_AllDataRead(This);
} }
} }
else else
{ {
if (!InternetReadFile(This->request, ((BYTE *)pv)+read, if (!InternetReadFile(This->base.request, ((BYTE *)pv)+read,
This->available_bytes > cb-read ? This->base.available_bytes > cb-read ?
cb-read : This->available_bytes, &len)) cb-read : This->base.available_bytes, &len))
{ {
WARN("InternetReadFile failed: %d\n", GetLastError()); WARN("InternetReadFile failed: %d\n", GetLastError());
hres = INET_E_DOWNLOAD_FAILURE; hres = INET_E_DOWNLOAD_FAILURE;
...@@ -808,8 +804,8 @@ static HRESULT WINAPI HttpProtocol_Read(IInternetProtocol *iface, void *pv, ...@@ -808,8 +804,8 @@ static HRESULT WINAPI HttpProtocol_Read(IInternetProtocol *iface, void *pv,
else else
{ {
read += len; read += len;
This->current_position += len; This->base.current_position += len;
This->available_bytes -= len; This->base.available_bytes -= len;
} }
} }
} }
...@@ -824,7 +820,7 @@ done: ...@@ -824,7 +820,7 @@ done:
*pcbRead = read; *pcbRead = read;
if (hres != E_PENDING) if (hres != E_PENDING)
This->flags |= FLAG_REQUEST_COMPLETE; This->base.flags |= FLAG_REQUEST_COMPLETE;
return hres; return hres;
} }
...@@ -843,7 +839,7 @@ static HRESULT WINAPI HttpProtocol_LockRequest(IInternetProtocol *iface, DWORD d ...@@ -843,7 +839,7 @@ static HRESULT WINAPI HttpProtocol_LockRequest(IInternetProtocol *iface, DWORD d
TRACE("(%p)->(%08x)\n", This, dwOptions); 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()); WARN("InternetLockRequest failed: %d\n", GetLastError());
return S_OK; return S_OK;
...@@ -855,11 +851,11 @@ static HRESULT WINAPI HttpProtocol_UnlockRequest(IInternetProtocol *iface) ...@@ -855,11 +851,11 @@ static HRESULT WINAPI HttpProtocol_UnlockRequest(IInternetProtocol *iface)
TRACE("(%p)\n", This); 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()); WARN("InternetUnlockRequest failed: %d\n", GetLastError());
This->lock = 0; This->base.lock = 0;
} }
return S_OK; return S_OK;
...@@ -893,7 +889,7 @@ static HRESULT WINAPI HttpPriority_SetPriority(IInternetPriority *iface, LONG nP ...@@ -893,7 +889,7 @@ static HRESULT WINAPI HttpPriority_SetPriority(IInternetPriority *iface, LONG nP
TRACE("(%p)->(%d)\n", This, nPriority); TRACE("(%p)->(%d)\n", This, nPriority);
This->priority = nPriority; This->base.priority = nPriority;
return S_OK; return S_OK;
} }
...@@ -903,7 +899,7 @@ static HRESULT WINAPI HttpPriority_GetPriority(IInternetPriority *iface, LONG *p ...@@ -903,7 +899,7 @@ static HRESULT WINAPI HttpPriority_GetPriority(IInternetPriority *iface, LONG *p
TRACE("(%p)->(%p)\n", This, pnPriority); TRACE("(%p)->(%p)\n", This, pnPriority);
*pnPriority = This->priority; *pnPriority = This->base.priority;
return S_OK; return S_OK;
} }
......
/* /*
* Copyright 2002 Huw D M Davies for CodeWeavers * 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 * This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public * modify it under the terms of the GNU Lesser General Public
...@@ -30,6 +31,7 @@ ...@@ -30,6 +31,7 @@
#include "winuser.h" #include "winuser.h"
#include "ole2.h" #include "ole2.h"
#include "urlmon.h" #include "urlmon.h"
#include "wininet.h"
#include "wine/unicode.h" #include "wine/unicode.h"
...@@ -50,7 +52,8 @@ static inline void URLMON_LockModule(void) { InterlockedIncrement( &URLMON_refCo ...@@ -50,7 +52,8 @@ static inline void URLMON_LockModule(void) { InterlockedIncrement( &URLMON_refCo
static inline void URLMON_UnlockModule(void) { InterlockedDecrement( &URLMON_refCount ); } 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 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 typedef struct
{ {
...@@ -76,6 +79,25 @@ HRESULT bind_to_object(IMoniker *mon, LPCWSTR url, IBindCtx *pbc, REFIID riid, v ...@@ -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); HRESULT create_binding_protocol(LPCWSTR url, BOOL from_urlmon, IInternetProtocol **protocol);
void set_binding_sink(IInternetProtocol *bind_protocol, IInternetProtocolSink *sink); 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) static inline void *heap_alloc(size_t len)
{ {
return HeapAlloc(GetProcessHeap(), 0, len); return HeapAlloc(GetProcessHeap(), 0, len);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment