Jacek Caban : urlmon: Added beginning BindProtocol implementation.

Alexandre Julliard julliard at wine.codeweavers.com
Wed Jan 24 06:18:19 CST 2007


Module: wine
Branch: master
Commit: 60df6e06a51a3febf8738300011fad819aad3c5a
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=60df6e06a51a3febf8738300011fad819aad3c5a

Author: Jacek Caban <jacek at 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;




More information about the wine-cvs mailing list