Jacek Caban : urlmon: Added "CBinding Context" bind option support.

Alexandre Julliard julliard at winehq.org
Mon Dec 31 12:32:21 CST 2007


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

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Sun Dec 30 17:44:02 2007 +0100

urlmon: Added "CBinding Context" bind option support.

---

 dlls/urlmon/binding.c |   82 ++++++++++++++++++++++++++++++++++++------------
 1 files changed, 61 insertions(+), 21 deletions(-)

diff --git a/dlls/urlmon/binding.c b/dlls/urlmon/binding.c
index 23b11bd..683dfe3 100644
--- a/dlls/urlmon/binding.c
+++ b/dlls/urlmon/binding.c
@@ -21,6 +21,8 @@
 
 WINE_DEFAULT_DEBUG_CHANNEL(urlmon);
 
+static WCHAR cbinding_contextW[] = {'C','B','i','n','d','i','n','g',' ','C','o','n','t','e','x','t',0};
+
 typedef struct Binding Binding;
 
 struct _task_header_t;
@@ -661,6 +663,25 @@ static HRESULT WINAPI Binding_GetBindResult(IBinding *iface, CLSID *pclsidProtoc
     return E_NOTIMPL;
 }
 
+static Binding *get_bctx_binding(IBindCtx *bctx)
+{
+    IBinding *binding;
+    IUnknown *unk;
+    HRESULT hres;
+
+    hres = IBindCtx_GetObjectParam(bctx, cbinding_contextW, &unk);
+    if(FAILED(hres))
+        return NULL;
+
+    hres = IUnknown_QueryInterface(unk, &IID_IBinding, (void*)&binding);
+    IUnknown_Release(unk);
+    if(FAILED(hres))
+        return NULL;
+
+    /* FIXME!!! */
+    return BINDING_THIS(binding);
+}
+
 #undef BINDING_THIS
 
 static const IBindingVtbl BindingVtbl = {
@@ -1159,7 +1180,7 @@ static BOOL is_urlmon_protocol(LPCWSTR url)
     return FALSE;
 }
 
-static HRESULT Binding_Create(LPCWSTR url, IBindCtx *pbc, REFIID riid, Binding **binding)
+static HRESULT Binding_Create(Binding *binding_ctx, LPCWSTR url, IBindCtx *pbc, REFIID riid, Binding **binding)
 {
     Binding *ret;
     HRESULT hres;
@@ -1182,7 +1203,7 @@ static HRESULT Binding_Create(LPCWSTR url, IBindCtx *pbc, REFIID riid, Binding *
 
     ret->apartment_thread = GetCurrentThreadId();
     ret->notif_hwnd = get_notif_hwnd();
-    ret->report_mime = TRUE;
+    ret->report_mime = !binding_ctx;
     ret->download_state = BEFORE_DOWNLOAD;
 
     ret->bindinfo.cbSize = sizeof(BINDINFO);
@@ -1200,11 +1221,16 @@ static HRESULT Binding_Create(LPCWSTR url, IBindCtx *pbc, REFIID riid, Binding *
     IBindStatusCallback_QueryInterface(ret->callback, &IID_IServiceProvider,
                                        (void**)&ret->service_provider);
 
-    hres = create_binding_protocol(url, TRUE, &ret->protocol);
-    if(FAILED(hres)) {
-        WARN("Could not get protocol handler\n");
-        IBinding_Release(BINDING(ret));
-        return hres;
+    if(binding_ctx) {
+        ret->protocol = binding_ctx->protocol;
+        IInternetProtocol_AddRef(ret->protocol);
+    }else {
+        hres = create_binding_protocol(url, TRUE, &ret->protocol);
+        if(FAILED(hres)) {
+            WARN("Could not get protocol handler\n");
+            IBinding_Release(BINDING(ret));
+            return hres;
+        }
     }
 
     hres = IBindStatusCallback_GetBindInfo(ret->callback, &ret->bindf, &ret->bindinfo);
@@ -1223,7 +1249,14 @@ static HRESULT Binding_Create(LPCWSTR url, IBindCtx *pbc, REFIID riid, Binding *
 
     ret->url = heap_strdupW(url);
 
-    ret->stream = create_stream(ret->protocol);
+    if(binding_ctx) {
+        ret->stream = binding_ctx->stream;
+        IStream_AddRef(STREAM(ret->stream));
+        ret->clipboard_format = binding_ctx->clipboard_format;
+    }else {
+        ret->stream = create_stream(ret->protocol);
+    }
+
     ret->stgmed.tymed = TYMED_ISTREAM;
     ret->stgmed.u.pstm = STREAM(ret->stream);
     ret->stgmed.pUnkForRelease = (IUnknown*)BINDING(ret); /* NOTE: Windows uses other IUnknown */
@@ -1232,13 +1265,13 @@ static HRESULT Binding_Create(LPCWSTR url, IBindCtx *pbc, REFIID riid, Binding *
     return S_OK;
 }
 
-static HRESULT start_binding(LPCWSTR url, IBindCtx *pbc, REFIID riid, Binding **ret)
+static HRESULT start_binding(Binding *binding_ctx, LPCWSTR url, IBindCtx *pbc, REFIID riid, Binding **ret)
 {
     Binding *binding = NULL;
     HRESULT hres;
     MSG msg;
 
-    hres = Binding_Create(url, pbc, riid, &binding);
+    hres = Binding_Create(binding_ctx, url, pbc, riid, &binding);
     if(FAILED(hres))
         return hres;
 
@@ -1250,18 +1283,21 @@ static HRESULT start_binding(LPCWSTR url, IBindCtx *pbc, REFIID riid, Binding **
         return hres;
     }
 
-    hres = IInternetProtocol_Start(binding->protocol, url, PROTSINK(binding),
-             BINDINF(binding), 0, 0);
-
-    TRACE("start ret %08x\n", hres);
+    if(binding_ctx) {
+        set_binding_sink(binding->protocol, PROTSINK(binding));
+        report_data(binding, 0, 0, 0);
+    }else {
+        hres = IInternetProtocol_Start(binding->protocol, url, PROTSINK(binding),
+                 BINDINF(binding), 0, 0);
 
-    if(FAILED(hres)) {
-        WARN("Start failed: %08x\n", hres);
+        TRACE("start ret %08x\n", hres);
 
-        stop_binding(binding, hres, NULL);
-        IBinding_Release(BINDING(binding));
+        if(FAILED(hres)) {
+            stop_binding(binding, hres, NULL);
+            IBinding_Release(BINDING(binding));
 
-        return hres;
+            return hres;
+        }
     }
 
     while(!(binding->bindf & BINDF_ASYNCHRONOUS) &&
@@ -1279,12 +1315,16 @@ static HRESULT start_binding(LPCWSTR url, IBindCtx *pbc, REFIID riid, Binding **
 
 HRESULT bind_to_storage(LPCWSTR url, IBindCtx *pbc, REFIID riid, void **ppv)
 {
-    Binding *binding;
+    Binding *binding = NULL, *binding_ctx;
     HRESULT hres;
 
     *ppv = NULL;
 
-    hres = start_binding(url, pbc, riid, &binding);
+    binding_ctx = get_bctx_binding(pbc);
+
+    hres = start_binding(binding_ctx, url, pbc, riid, &binding);
+    if(binding_ctx)
+        IBinding_Release(BINDING(binding_ctx));
     if(FAILED(hres))
         return hres;
 




More information about the wine-cvs mailing list