Module: wine Branch: master Commit: 4121ac12243ba94e6a320df9d450976dc06678e1 URL: http://source.winehq.org/git/wine.git/?a=commit;h=4121ac12243ba94e6a320df9d4...
Author: David Hedberg dhedberg@codeweavers.com Date: Mon Jan 3 03:47:38 2011 +0100
urlmon: Add new on_error function to protocol vtbl.
---
dlls/urlmon/ftp.c | 8 +++++++- dlls/urlmon/gopher.c | 8 +++++++- dlls/urlmon/http.c | 8 +++++++- dlls/urlmon/protocol.c | 40 ++++++++++++++++++++++++---------------- dlls/urlmon/urlmon_main.h | 2 ++ 5 files changed, 47 insertions(+), 19 deletions(-)
diff --git a/dlls/urlmon/ftp.c b/dlls/urlmon/ftp.c index deb611b..854f169 100644 --- a/dlls/urlmon/ftp.c +++ b/dlls/urlmon/ftp.c @@ -99,13 +99,19 @@ static void FtpProtocol_close_connection(Protocol *prot) { }
+static void FtpProtocol_on_error(Protocol *prot, DWORD error) +{ + FIXME("(%p) %d - stub\n", prot, error); +} + #undef ASYNCPROTOCOL_THIS
static const ProtocolVtbl AsyncProtocolVtbl = { FtpProtocol_open_request, FtpProtocol_end_request, FtpProtocol_start_downloading, - FtpProtocol_close_connection + FtpProtocol_close_connection, + FtpProtocol_on_error };
static HRESULT WINAPI FtpProtocol_QueryInterface(IInternetProtocolEx *iface, REFIID riid, void **ppv) diff --git a/dlls/urlmon/gopher.c b/dlls/urlmon/gopher.c index da241e9..5964882 100644 --- a/dlls/urlmon/gopher.c +++ b/dlls/urlmon/gopher.c @@ -70,13 +70,19 @@ static void GopherProtocol_close_connection(Protocol *prot) { }
+static void GopherProtocol_on_error(Protocol *prot, DWORD error) +{ + FIXME("(%p) %d - stub\n", prot, error); +} + #undef ASYNCPROTOCOL_THIS
static const ProtocolVtbl AsyncProtocolVtbl = { GopherProtocol_open_request, GopherProtocol_end_request, GopherProtocol_start_downloading, - GopherProtocol_close_connection + GopherProtocol_close_connection, + GopherProtocol_on_error };
#define PROTOCOL_THIS(iface) DEFINE_THIS(GopherProtocol, IInternetProtocol, iface) diff --git a/dlls/urlmon/http.c b/dlls/urlmon/http.c index cfa2fc6..a62323b 100644 --- a/dlls/urlmon/http.c +++ b/dlls/urlmon/http.c @@ -388,13 +388,19 @@ static void HttpProtocol_close_connection(Protocol *prot) } }
+static void HttpProtocol_on_error(Protocol *prot, DWORD error) +{ + FIXME("(%p) %d - stub\n", prot, error); +} + #undef ASYNCPROTOCOL_THIS
static const ProtocolVtbl AsyncProtocolVtbl = { HttpProtocol_open_request, HttpProtocol_end_request, HttpProtocol_start_downloading, - HttpProtocol_close_connection + HttpProtocol_close_connection, + HttpProtocol_on_error };
static HRESULT WINAPI HttpProtocol_QueryInterface(IInternetProtocolEx *iface, REFIID riid, void **ppv) diff --git a/dlls/urlmon/protocol.c b/dlls/urlmon/protocol.c index 2ca1629..1b8b5e3 100644 --- a/dlls/urlmon/protocol.c +++ b/dlls/urlmon/protocol.c @@ -76,25 +76,27 @@ static void request_complete(Protocol *protocol, INTERNET_ASYNC_RESULT *ar)
TRACE("(%p)->(%p)\n", protocol, ar);
- if(!ar->dwResult) { - WARN("request failed: %d\n", ar->dwError); - return; - } - - protocol->flags |= FLAG_REQUEST_COMPLETE; - - if(!protocol->request) { - TRACE("setting request handle %p\n", (HINTERNET)ar->dwResult); - protocol->request = (HINTERNET)ar->dwResult; - } - /* PROTOCOLDATA same as native */ memset(&data, 0, sizeof(data)); data.dwState = 0xf1000000; - if(protocol->flags & FLAG_FIRST_CONTINUE_COMPLETE) - data.pData = (LPVOID)BINDSTATUS_ENDDOWNLOADCOMPONENTS; - else - data.pData = (LPVOID)BINDSTATUS_DOWNLOADINGDATA; + + if(ar->dwResult) { + protocol->flags |= FLAG_REQUEST_COMPLETE; + + if(!protocol->request) { + TRACE("setting request handle %p\n", (HINTERNET)ar->dwResult); + protocol->request = (HINTERNET)ar->dwResult; + } + + if(protocol->flags & FLAG_FIRST_CONTINUE_COMPLETE) + data.pData = (LPVOID)BINDSTATUS_ENDDOWNLOADCOMPONENTS; + else + data.pData = (LPVOID)BINDSTATUS_DOWNLOADINGDATA; + + }else { + protocol->flags |= FLAG_ERROR; + data.pData = (LPVOID)ar->dwError; + }
if (protocol->bindf & BINDF_FROMURLMON) IInternetProtocolSink_Switch(protocol->protocol_sink, &data); @@ -301,6 +303,12 @@ HRESULT protocol_continue(Protocol *protocol, PROTOCOLDATA *data) return S_OK; }
+ if(protocol->flags & FLAG_ERROR) { + protocol->flags &= ~FLAG_ERROR; + protocol->vtbl->on_error(protocol, (DWORD)data->pData); + return S_OK; + } + if(protocol->post_stream) return write_post_stream(protocol);
diff --git a/dlls/urlmon/urlmon_main.h b/dlls/urlmon/urlmon_main.h index dc6d3fc..719c2eb 100644 --- a/dlls/urlmon/urlmon_main.h +++ b/dlls/urlmon/urlmon_main.h @@ -113,6 +113,7 @@ struct ProtocolVtbl { HRESULT (*end_request)(Protocol*); HRESULT (*start_downloading)(Protocol*); void (*close_connection)(Protocol*); + void (*on_error)(Protocol*,DWORD); };
/* Flags are needed for, among other things, return HRESULTs from the Read function @@ -144,6 +145,7 @@ struct ProtocolVtbl { #define FLAG_ALL_DATA_READ 0x0008 #define FLAG_LAST_DATA_REPORTED 0x0010 #define FLAG_RESULT_REPORTED 0x0020 +#define FLAG_ERROR 0x0040
HRESULT protocol_start(Protocol*,IInternetProtocol*,IUri*,IInternetProtocolSink*,IInternetBindInfo*); HRESULT protocol_continue(Protocol*,PROTOCOLDATA*);