Module: wine Branch: master Commit: 60df6e06a51a3febf8738300011fad819aad3c5a URL: http://source.winehq.org/git/wine.git/?a=commit;h=60df6e06a51a3febf873830001...
Author: Jacek Caban jacek@codeweavers.com Date: Tue Jan 23 19:36:09 2007 +0100
urlmon: Added beginning BindProtocol implementation.
---
dlls/urlmon/bindprot.c | 127 +++++++++++++++++++++++++++++++++++++++++++----- 1 files changed, 114 insertions(+), 13 deletions(-)
diff --git a/dlls/urlmon/bindprot.c b/dlls/urlmon/bindprot.c index 5ae24ac..c3ad2b0 100644 --- a/dlls/urlmon/bindprot.c +++ b/dlls/urlmon/bindprot.c @@ -38,6 +38,10 @@ typedef struct { const IInternetProtocolSinkVtbl *lpInternetProtocolSinkVtbl;
LONG ref; + + IInternetProtocol *protocol; + IInternetBindInfo *bind_info; + IInternetProtocolSink *protocol_sink; } BindProtocol;
#define PROTOCOL(x) ((IInternetProtocol*) &(x)->lpInternetProtocolVtbl) @@ -101,6 +105,13 @@ static ULONG WINAPI BindProtocol_Release TRACE("(%p) ref=%d\n", This, ref);
if(!ref) { + if(This->protocol) + IInternetProtocol_Release(This->protocol); + if(This->bind_info) + IInternetBindInfo_Release(This->bind_info); + if(This->protocol_sink) + IInternetProtocolSink_Release(This->protocol_sink); + HeapFree(GetProcessHeap(), 0, This);
URLMON_UnlockModule(); @@ -114,14 +125,60 @@ static HRESULT WINAPI BindProtocol_Start DWORD grfPI, DWORD dwReserved) { BindProtocol *This = PROTOCOL_THIS(iface); + IInternetProtocol *protocol = NULL; + IServiceProvider *service_provider; + CLSID clsid = IID_NULL; + LPOLESTR clsid_str; + HRESULT hres;
- FIXME("(%p)->(%s %p %p %08x %d)\n", This, debugstr_w(szUrl), pOIProtSink, + TRACE("(%p)->(%s %p %p %08x %d)\n", This, debugstr_w(szUrl), pOIProtSink, pOIBindInfo, grfPI, dwReserved);
if(!szUrl || !pOIProtSink || !pOIBindInfo) return E_INVALIDARG;
- return E_NOTIMPL; + hres = IInternetProtocolSink_QueryInterface(pOIProtSink, &IID_IServiceProvider, + (void**)&service_provider); + if(SUCCEEDED(hres)) { + /* FIXME: What's protocol CLSID here? */ + IServiceProvider_QueryService(service_provider, &IID_IInternetProtocol, + &IID_IInternetProtocol, (void**)&protocol); + IServiceProvider_Release(service_provider); + } + + if(!protocol) { + IClassFactory *cf; + IUnknown *unk; + + hres = get_protocol_handler(szUrl, &clsid, &cf); + if(FAILED(hres)) + return hres; + + hres = IClassFactory_CreateInstance(cf, (IUnknown*)BINDINFO(This), + &IID_IUnknown, (void**)&unk); + IClassFactory_Release(cf); + if(FAILED(hres)) + return hres; + + hres = IUnknown_QueryInterface(unk, &IID_IInternetProtocol, (void**)&protocol); + IUnknown_Release(unk); + if(FAILED(hres)) + return hres; + } + + StringFromCLSID(&clsid, &clsid_str); + IInternetProtocolSink_ReportProgress(pOIProtSink, BINDSTATUS_PROTOCOLCLASSID, clsid_str); + CoTaskMemFree(clsid_str); + + This->protocol = protocol; + + IInternetBindInfo_AddRef(pOIBindInfo); + This->bind_info = pOIBindInfo; + + IInternetProtocolSink_AddRef(pOIProtSink); + This->protocol_sink = pOIProtSink; + + return IInternetProtocol_Start(protocol, szUrl, PROTSINK(This), BINDINFO(This), 0, 0); }
static HRESULT WINAPI BindProtocol_Continue(IInternetProtocol *iface, PROTOCOLDATA *pProtocolData) @@ -142,8 +199,11 @@ static HRESULT WINAPI BindProtocol_Abort static HRESULT WINAPI BindProtocol_Terminate(IInternetProtocol *iface, DWORD dwOptions) { BindProtocol *This = PROTOCOL_THIS(iface); - FIXME("(%p)->(%08x)\n", This, dwOptions); - return E_NOTIMPL; + + TRACE("(%p)->(%08x)\n", This, dwOptions); + + IInternetProtocol_Terminate(This->protocol, 0); + return S_OK; }
static HRESULT WINAPI BindProtocol_Suspend(IInternetProtocol *iface) @@ -164,8 +224,15 @@ static HRESULT WINAPI BindProtocol_Read( ULONG cb, ULONG *pcbRead) { BindProtocol *This = PROTOCOL_THIS(iface); - FIXME("(%p)->(%p %u %p)\n", This, pv, cb, pcbRead); - return E_NOTIMPL; + ULONG read = 0; + HRESULT hres; + + TRACE("(%p)->(%p %u %p)\n", This, pv, cb, pcbRead); + + hres = IInternetProtocol_Read(This->protocol, pv, cb, &read); + + *pcbRead = read; + return hres; }
static HRESULT WINAPI BindProtocol_Seek(IInternetProtocol *iface, LARGE_INTEGER dlibMove, @@ -233,8 +300,18 @@ static HRESULT WINAPI BindInfo_GetBindIn DWORD *grfBINDF, BINDINFO *pbindinfo) { BindProtocol *This = BINDINFO_THIS(iface); - FIXME("(%p)->(%p %p)\n", This, grfBINDF, pbindinfo); - return E_NOTIMPL; + HRESULT hres; + + TRACE("(%p)->(%p %p)\n", This, grfBINDF, pbindinfo); + + hres = IInternetBindInfo_GetBindInfo(This->bind_info, grfBINDF, pbindinfo); + if(FAILED(hres)) { + WARN("GetBindInfo failed: %08x\n", hres); + return hres; + } + + *grfBINDF |= BINDF_FROMURLMON; + return hres; }
static HRESULT WINAPI BindInfo_GetBindString(IInternetBindInfo *iface, @@ -334,7 +411,23 @@ static HRESULT WINAPI InternetProtocolSi ULONG ulStatusCode, LPCWSTR szStatusText) { BindProtocol *This = PROTSINK_THIS(iface); - FIXME("(%p)->(%u %s)\n", This, ulStatusCode, debugstr_w(szStatusText)); + + TRACE("(%p)->(%u %s)\n", This, ulStatusCode, debugstr_w(szStatusText)); + + switch(ulStatusCode) { + case BINDSTATUS_SENDINGREQUEST: + return IInternetProtocolSink_ReportProgress(This->protocol_sink, + ulStatusCode, NULL); + case BINDSTATUS_CACHEFILENAMEAVAILABLE: + return IInternetProtocolSink_ReportProgress(This->protocol_sink, + ulStatusCode, szStatusText); + case BINDSTATUS_VERIFIEDMIMETYPEAVAILABLE: + return IInternetProtocolSink_ReportProgress(This->protocol_sink, + BINDSTATUS_MIMETYPEAVAILABLE, szStatusText); + default: + FIXME("unsupported ulStatusCode %u\n", ulStatusCode); + } + return E_NOTIMPL; }
@@ -342,16 +435,20 @@ static HRESULT WINAPI InternetProtocolSi DWORD grfBSCF, ULONG ulProgress, ULONG ulProgressMax) { BindProtocol *This = PROTSINK_THIS(iface); - FIXME("(%p)->(%d %u %u)\n", This, grfBSCF, ulProgress, ulProgressMax); - return E_NOTIMPL; + + TRACE("(%p)->(%d %u %u)\n", This, grfBSCF, ulProgress, ulProgressMax); + + return S_OK; }
static HRESULT WINAPI InternetProtocolSink_ReportResult(IInternetProtocolSink *iface, HRESULT hrResult, DWORD dwError, LPCWSTR szResult) { BindProtocol *This = PROTSINK_THIS(iface); - FIXME("(%p)->(%08x %d %s)\n", This, hrResult, dwError, debugstr_w(szResult)); - return E_NOTIMPL; + + TRACE("(%p)->(%08x %d %s)\n", This, hrResult, dwError, debugstr_w(szResult)); + + return IInternetProtocolSink_ReportResult(This->protocol_sink, hrResult, dwError, szResult); }
#undef PROTSINK_THIS @@ -374,7 +471,11 @@ HRESULT create_binding_protocol(LPCWSTR ret->lpInternetBindInfoVtbl = &InternetBindInfoVtbl; ret->lpInternetPriorityVtbl = &InternetPriorityVtbl; ret->lpInternetProtocolSinkVtbl = &InternetProtocolSinkVtbl; + ret->ref = 1; + ret->protocol = NULL; + ret->bind_info = NULL; + ret->protocol_sink = NULL;
*protocol = PROTOCOL(ret); return S_OK;