From a30ffca108d905e4e77d1cc6651722d8ce671085 Mon Sep 17 00:00:00 2001 From: Jacek Caban Date: Mon, 2 Mar 2009 03:20:09 +0100 Subject: [PATCH] urlmon: Move close_connection implementation to common Protocol object. --- dlls/urlmon/http.c | 61 +++++++++++++++++++-------------------- dlls/urlmon/protocol.c | 14 +++++++++ dlls/urlmon/urlmon_main.h | 9 ++++++ 3 files changed, 53 insertions(+), 31 deletions(-) diff --git a/dlls/urlmon/http.c b/dlls/urlmon/http.c index ab5aa38d63..5d102a60f1 100644 --- a/dlls/urlmon/http.c +++ b/dlls/urlmon/http.c @@ -80,9 +80,32 @@ typedef struct { static const WCHAR wszHeaders[] = {'A','c','c','e','p','t','-','E','n','c','o','d','i','n','g', ':',' ','g','z','i','p',',',' ','d','e','f','l','a','t','e',0}; -/* - * Helpers - */ +#define ASYNCPROTOCOL_THIS(iface) DEFINE_THIS2(HttpProtocol, base, iface) + +static void HttpProtocol_close_connection(Protocol *prot) +{ + HttpProtocol *This = ASYNCPROTOCOL_THIS(prot); + + if(This->connection) + InternetCloseHandle(This->connection); + + if(This->http_negotiate) { + IHttpNegotiate_Release(This->http_negotiate); + This->http_negotiate = 0; + } + + if(This->full_header) { + if(This->full_header != wszHeaders) + heap_free(This->full_header); + This->full_header = 0; + } +} + +#undef ASYNCPROTOCOL_THIS + +static const ProtocolVtbl AsyncProtocolVtbl = { + HttpProtocol_close_connection +}; static void HTTPPROTOCOL_ReportResult(HttpProtocol *This, HRESULT hres) { @@ -129,31 +152,6 @@ static void HTTPPROTOCOL_AllDataRead(HttpProtocol *This) HTTPPROTOCOL_ReportResult(This, S_OK); } -static void HTTPPROTOCOL_Close(HttpProtocol *This) -{ - if (This->http_negotiate) - { - IHttpNegotiate_Release(This->http_negotiate); - This->http_negotiate = 0; - } - if (This->base.request) - InternetCloseHandle(This->base.request); - if (This->connection) - InternetCloseHandle(This->connection); - if (This->base.internet) - { - InternetCloseHandle(This->base.internet); - This->base.internet = 0; - } - if (This->full_header) - { - if (This->full_header != wszHeaders) - heap_free(This->full_header); - This->full_header = 0; - } - This->base.flags = 0; -} - static void CALLBACK HTTPPROTOCOL_InternetStatusCallback( HINTERNET hInternet, DWORD_PTR dwContext, DWORD dwInternetStatus, LPVOID lpvStatusInformation, DWORD dwStatusInformationLength) @@ -269,7 +267,7 @@ static ULONG WINAPI HttpProtocol_Release(IInternetProtocol *iface) TRACE("(%p) ref=%d\n", This, ref); if(!ref) { - HTTPPROTOCOL_Close(This); + protocol_close_connection(&This->base); heap_free(This); URLMON_UnlockModule(); @@ -523,7 +521,7 @@ done: if (hres != S_OK) { IInternetProtocolSink_ReportResult(This->base.protocol_sink, hres, 0, NULL); - HTTPPROTOCOL_Close(This); + protocol_close_connection(&This->base); } CoTaskMemFree(post_cookie); @@ -714,8 +712,8 @@ static HRESULT WINAPI HttpProtocol_Terminate(IInternetProtocol *iface, DWORD dwO HttpProtocol *This = PROTOCOL_THIS(iface); TRACE("(%p)->(%08x)\n", This, dwOptions); - HTTPPROTOCOL_Close(This); + protocol_close_connection(&This->base); return S_OK; } @@ -915,6 +913,7 @@ static HRESULT create_http_protocol(BOOL https, void **ppobj) if(!ret) return E_OUTOFMEMORY; + ret->base.vtbl = &AsyncProtocolVtbl; ret->lpInternetProtocolVtbl = &HttpProtocolVtbl; ret->lpInternetPriorityVtbl = &HttpPriorityVtbl; diff --git a/dlls/urlmon/protocol.c b/dlls/urlmon/protocol.c index b25c9dedac..a2e801b0a5 100644 --- a/dlls/urlmon/protocol.c +++ b/dlls/urlmon/protocol.c @@ -42,3 +42,17 @@ HRESULT protocol_unlock_request(Protocol *protocol) return S_OK; } + +void protocol_close_connection(Protocol *protocol) +{ + protocol->vtbl->close_connection(protocol); + + if(protocol->request) + InternetCloseHandle(protocol->request); + if(protocol->internet) { + InternetCloseHandle(protocol->internet); + protocol->internet = 0; + } + + protocol->flags = 0; +} diff --git a/dlls/urlmon/urlmon_main.h b/dlls/urlmon/urlmon_main.h index 906cd31512..6519630efb 100644 --- a/dlls/urlmon/urlmon_main.h +++ b/dlls/urlmon/urlmon_main.h @@ -79,7 +79,11 @@ 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 ProtocolVtbl ProtocolVtbl; + typedef struct { + const ProtocolVtbl *vtbl; + IInternetProtocol *protocol; IInternetProtocolSink *protocol_sink; @@ -98,8 +102,13 @@ typedef struct { LONG priority; } Protocol; +struct ProtocolVtbl { + void (*close_connection)(Protocol*); +}; + HRESULT protocol_lock_request(Protocol*); HRESULT protocol_unlock_request(Protocol*); +void protocol_close_connection(Protocol*); static inline void *heap_alloc(size_t len) { -- 2.32.0.93.g670b81a890