Jacek Caban : urlmon: Added IInternetBindInfo implementation to BindStatusCallback object.

Alexandre Julliard julliard at wine.codeweavers.com
Thu Feb 26 09:17:00 CST 2015


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

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Thu Feb 26 11:00:27 2015 +0100

urlmon: Added IInternetBindInfo implementation to BindStatusCallback object.

---

 dlls/urlmon/bindctx.c   | 62 +++++++++++++++++++++++++++++++++++++++++++++++++
 dlls/urlmon/tests/url.c | 11 +++++++++
 2 files changed, 73 insertions(+)

diff --git a/dlls/urlmon/bindctx.c b/dlls/urlmon/bindctx.c
index b2d2776..d8bba1b 100644
--- a/dlls/urlmon/bindctx.c
+++ b/dlls/urlmon/bindctx.c
@@ -29,6 +29,7 @@ extern IID IID_IBindStatusCallbackHolder;
 
 typedef struct {
     IBindStatusCallbackEx IBindStatusCallbackEx_iface;
+    IInternetBindInfo     IInternetBindInfo_iface;
     IServiceProvider      IServiceProvider_iface;
     IHttpNegotiate2       IHttpNegotiate2_iface;
     IAuthenticate         IAuthenticate_iface;
@@ -126,6 +127,9 @@ static HRESULT WINAPI BindStatusCallback_QueryInterface(IBindStatusCallbackEx *i
     }else if(IsEqualGUID(&IID_IAuthenticate, riid)) {
         TRACE("(%p)->(IID_IAuthenticate, %p)\n", This, ppv);
         *ppv = &This->IAuthenticate_iface;
+    }else if(IsEqualGUID(&IID_IInternetBindInfo, riid)) {
+        TRACE("(%p)->(IID_IInternetBindInfo, %p)\n", This, ppv);
+        *ppv = &This->IInternetBindInfo_iface;
     }
 
     if(*ppv) {
@@ -497,6 +501,63 @@ static const IAuthenticateVtbl BSCAuthenticateVtbl = {
     BSCAuthenticate_Authenticate
 };
 
+static inline BindStatusCallback *impl_from_IInternetBindInfo(IInternetBindInfo *iface)
+{
+    return CONTAINING_RECORD(iface, BindStatusCallback, IInternetBindInfo_iface);
+}
+
+static HRESULT WINAPI BSCInternetBindInfo_QueryInterface(IInternetBindInfo *iface, REFIID riid, void **ppv)
+{
+    BindStatusCallback *This = impl_from_IInternetBindInfo(iface);
+    return IBindStatusCallbackEx_QueryInterface(&This->IBindStatusCallbackEx_iface, riid, ppv);
+}
+
+static ULONG WINAPI BSCInternetBindInfo_AddRef(IInternetBindInfo *iface)
+{
+    BindStatusCallback *This = impl_from_IInternetBindInfo(iface);
+    return IBindStatusCallbackEx_AddRef(&This->IBindStatusCallbackEx_iface);
+}
+
+static ULONG WINAPI BSCInternetBindInfo_Release(IInternetBindInfo *iface)
+{
+    BindStatusCallback *This = impl_from_IInternetBindInfo(iface);
+    return IBindStatusCallbackEx_Release(&This->IBindStatusCallbackEx_iface);
+}
+
+static HRESULT WINAPI BSCInternetBindInfo_GetBindInfo(IInternetBindInfo *iface, DWORD *bindf, BINDINFO *bindinfo)
+{
+    BindStatusCallback *This = impl_from_IInternetBindInfo(iface);
+    FIXME("(%p)->(%p %p)\n", This, bindf, bindinfo);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI BSCInternetBindInfo_GetBindString(IInternetBindInfo *iface, ULONG string_type,
+        WCHAR **strs, ULONG cnt, ULONG *fetched)
+{
+    BindStatusCallback *This = impl_from_IInternetBindInfo(iface);
+    IInternetBindInfo *bind_info;
+    HRESULT hres;
+
+    TRACE("(%p)->(%d %p %d %p)\n", This, string_type, strs, cnt, fetched);
+
+    hres = IBindStatusCallback_QueryInterface(This->callback, &IID_IInternetBindInfo, (void**)&bind_info);
+    if(FAILED(hres))
+        return hres;
+
+    hres = IInternetBindInfo_GetBindString(bind_info, string_type, strs, cnt, fetched);
+
+    IInternetBindInfo_Release(bind_info);
+    return hres;
+}
+
+static IInternetBindInfoVtbl BSCInternetBindInfoVtbl = {
+    BSCInternetBindInfo_QueryInterface,
+    BSCInternetBindInfo_AddRef,
+    BSCInternetBindInfo_Release,
+    BSCInternetBindInfo_GetBindInfo,
+    BSCInternetBindInfo_GetBindString
+};
+
 static void set_callback(BindStatusCallback *This, IBindStatusCallback *bsc)
 {
     IServiceProvider *serv_prov;
@@ -523,6 +584,7 @@ HRESULT wrap_callback(IBindStatusCallback *bsc, IBindStatusCallback **ret_iface)
         return E_OUTOFMEMORY;
 
     ret->IBindStatusCallbackEx_iface.lpVtbl = &BindStatusCallbackExVtbl;
+    ret->IInternetBindInfo_iface.lpVtbl = &BSCInternetBindInfoVtbl;
     ret->IServiceProvider_iface.lpVtbl = &BSCServiceProviderVtbl;
     ret->IHttpNegotiate2_iface.lpVtbl = &BSCHttpNegotiateVtbl;
     ret->IAuthenticate_iface.lpVtbl = &BSCAuthenticateVtbl;
diff --git a/dlls/urlmon/tests/url.c b/dlls/urlmon/tests/url.c
index ab564f7..dd3a52d 100644
--- a/dlls/urlmon/tests/url.c
+++ b/dlls/urlmon/tests/url.c
@@ -2564,6 +2564,7 @@ static BOOL test_bscholder(IBindStatusCallback *holder)
     IHttpNegotiate *http_negotiate, *http_negotiate_serv;
     IHttpNegotiate2 *http_negotiate2, *http_negotiate2_serv;
     IAuthenticate *authenticate, *authenticate_serv;
+    IInternetBindInfo *bind_info;
     IInternetProtocol *protocol;
     BINDINFO bindinfo = {sizeof(bindinfo)};
     BOOL ret = TRUE;
@@ -2678,6 +2679,16 @@ static BOOL test_bscholder(IBindStatusCallback *holder)
     IAuthenticate_Release(authenticate);
     IAuthenticate_Release(authenticate_serv);
 
+    hres = IBindStatusCallback_QueryInterface(holder, &IID_IInternetBindInfo, (void**)&bind_info);
+    ok(hres == S_OK || broken(hres == E_NOINTERFACE /* win2k */), "Could not get IInternetBindInfo interface: %08x\n", hres);
+
+    if(SUCCEEDED(hres)) {
+        hres = IInternetBindInfo_GetBindString(bind_info, BINDSTRING_USER_AGENT, &wstr, 1, &dw);
+        ok(hres == E_NOINTERFACE, "GetBindString(BINDSTRING_USER_AGENT) failed: %08x\n", hres);
+
+        IInternetBindInfo_Release(bind_info);
+    }
+
     SET_EXPECT(OnStopBinding);
     hres = IBindStatusCallback_OnStopBinding(holder, S_OK, NULL);
     ok(hres == S_OK, "OnStopBinding failed: %08x\n", hres);




More information about the wine-cvs mailing list