diff --git a/dlls/urlmon/ftp.c b/dlls/urlmon/ftp.c index 4fa0924387d..86ddab75ee2 100644 --- a/dlls/urlmon/ftp.c +++ b/dlls/urlmon/ftp.c @@ -186,8 +186,10 @@ static HRESULT WINAPI FtpProtocol_Abort(IInternetProtocol *iface, HRESULT hrReas DWORD dwOptions) { FtpProtocol *This = PROTOCOL_THIS(iface); - FIXME("(%p)->(%08x %08x)\n", This, hrReason, dwOptions); - return E_NOTIMPL; + + TRACE("(%p)->(%08x %08x)\n", This, hrReason, dwOptions); + + return protocol_abort(&This->base, hrReason); } static HRESULT WINAPI FtpProtocol_Terminate(IInternetProtocol *iface, DWORD dwOptions) diff --git a/dlls/urlmon/gopher.c b/dlls/urlmon/gopher.c index d8781ce7925..4fb61b3006a 100644 --- a/dlls/urlmon/gopher.c +++ b/dlls/urlmon/gopher.c @@ -161,8 +161,10 @@ static HRESULT WINAPI GopherProtocol_Abort(IInternetProtocol *iface, HRESULT hrR DWORD dwOptions) { GopherProtocol *This = PROTOCOL_THIS(iface); - FIXME("(%p)->(%08x %08x)\n", This, hrReason, dwOptions); - return E_NOTIMPL; + + TRACE("(%p)->(%08x %08x)\n", This, hrReason, dwOptions); + + return protocol_abort(&This->base, hrReason); } static HRESULT WINAPI GopherProtocol_Terminate(IInternetProtocol *iface, DWORD dwOptions) diff --git a/dlls/urlmon/http.c b/dlls/urlmon/http.c index 722ec501b4d..52a24251b71 100644 --- a/dlls/urlmon/http.c +++ b/dlls/urlmon/http.c @@ -162,6 +162,7 @@ static HRESULT HttpProtocol_open_request(Protocol *prot, IUri *uri, DWORD reques &IID_IHttpNegotiate, (void **)&This->http_negotiate); if (hres != S_OK) { WARN("IServiceProvider_QueryService IID_IHttpNegotiate failed: %08x\n", hres); + IServiceProvider_Release(service_provider); return hres; } @@ -438,8 +439,10 @@ static HRESULT WINAPI HttpProtocol_Abort(IInternetProtocol *iface, HRESULT hrRea DWORD dwOptions) { HttpProtocol *This = PROTOCOL_THIS(iface); - FIXME("(%p)->(%08x %08x)\n", This, hrReason, dwOptions); - return E_NOTIMPL; + + TRACE("(%p)->(%08x %08x)\n", This, hrReason, dwOptions); + + return protocol_abort(&This->base, hrReason); } static HRESULT WINAPI HttpProtocol_Terminate(IInternetProtocol *iface, DWORD dwOptions) diff --git a/dlls/urlmon/protocol.c b/dlls/urlmon/protocol.c index b423c67354f..85af51338f5 100644 --- a/dlls/urlmon/protocol.c +++ b/dlls/urlmon/protocol.c @@ -428,6 +428,18 @@ HRESULT protocol_unlock_request(Protocol *protocol) return S_OK; } +HRESULT protocol_abort(Protocol *protocol, HRESULT reason) +{ + if(!protocol->protocol_sink) + return S_OK; + + if(protocol->flags & FLAG_RESULT_REPORTED) + return INET_E_RESULT_DISPATCHED; + + report_result(protocol, reason); + return S_OK; +} + void protocol_close_connection(Protocol *protocol) { protocol->vtbl->close_connection(protocol); diff --git a/dlls/urlmon/urlmon_main.h b/dlls/urlmon/urlmon_main.h index 3aada09ce60..62e461d5550 100644 --- a/dlls/urlmon/urlmon_main.h +++ b/dlls/urlmon/urlmon_main.h @@ -115,6 +115,7 @@ HRESULT protocol_continue(Protocol*,PROTOCOLDATA*); HRESULT protocol_read(Protocol*,void*,ULONG,ULONG*); HRESULT protocol_lock_request(Protocol*); HRESULT protocol_unlock_request(Protocol*); +HRESULT protocol_abort(Protocol*,HRESULT); void protocol_close_connection(Protocol*); typedef struct {