Hans Leidekker : winhttp: Implement IDispatch for WinHttpRequest.

Alexandre Julliard julliard at winehq.org
Tue Jul 19 12:42:53 CDT 2011


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

Author: Hans Leidekker <hans at codeweavers.com>
Date:   Tue Jul 19 09:53:22 2011 +0200

winhttp: Implement IDispatch for WinHttpRequest.

---

 dlls/winhttp/Makefile.in |    2 +-
 dlls/winhttp/request.c   |   95 ++++++++++++++++++++++++++++++++++++++++++----
 2 files changed, 88 insertions(+), 9 deletions(-)

diff --git a/dlls/winhttp/Makefile.in b/dlls/winhttp/Makefile.in
index 8cc2343..090c4ca 100644
--- a/dlls/winhttp/Makefile.in
+++ b/dlls/winhttp/Makefile.in
@@ -1,7 +1,7 @@
 MODULE    = winhttp.dll
 IMPORTLIB = winhttp
 IMPORTS   = uuid shlwapi
-DELAYIMPORTS = crypt32 advapi32
+DELAYIMPORTS = oleaut32 crypt32 advapi32
 EXTRALIBS = @SOCKETLIBS@
 
 C_SRCS = \
diff --git a/dlls/winhttp/request.c b/dlls/winhttp/request.c
index d36c657..c936fdd 100644
--- a/dlls/winhttp/request.c
+++ b/dlls/winhttp/request.c
@@ -2196,8 +2196,59 @@ static HRESULT WINAPI winhttp_request_GetTypeInfoCount(
     IWinHttpRequest *iface,
     UINT *count )
 {
-    FIXME("\n");
-    return E_NOTIMPL;
+    struct winhttp_request *request = impl_from_IWinHttpRequest( iface );
+
+    TRACE("%p, %p\n", request, count);
+    *count = 1;
+    return S_OK;
+}
+
+enum type_id
+{
+    IWinHttpRequest_tid,
+    last_tid
+};
+
+static ITypeLib *winhttp_typelib;
+static ITypeInfo *winhttp_typeinfo[last_tid];
+
+static REFIID winhttp_tid_id[] =
+{
+    &IID_IWinHttpRequest
+};
+
+static HRESULT get_typeinfo( enum type_id tid, ITypeInfo **ret )
+{
+    HRESULT hr;
+
+    if (!winhttp_typelib)
+    {
+        ITypeLib *typelib;
+
+        hr = LoadRegTypeLib( &LIBID_WinHttp, 5, 1, LOCALE_SYSTEM_DEFAULT, &typelib );
+        if (FAILED(hr))
+        {
+            ERR("LoadRegTypeLib failed: %08x\n", hr);
+            return hr;
+        }
+        if (InterlockedCompareExchangePointer( (void **)&winhttp_typelib, typelib, NULL ))
+            ITypeLib_Release( typelib );
+    }
+    if (!winhttp_typeinfo[tid])
+    {
+        ITypeInfo *typeinfo;
+
+        hr = ITypeLib_GetTypeInfoOfGuid( winhttp_typelib, winhttp_tid_id[tid], &typeinfo );
+        if (FAILED(hr))
+        {
+            ERR("GetTypeInfoOfGuid(%s) failed: %08x\n", debugstr_guid(winhttp_tid_id[tid]), hr);
+            return hr;
+        }
+        if (InterlockedCompareExchangePointer( (void **)(winhttp_typeinfo + tid), typeinfo, NULL ))
+            ITypeInfo_Release( typeinfo );
+    }
+    *ret = winhttp_typeinfo[tid];
+    return S_OK;
 }
 
 static HRESULT WINAPI winhttp_request_GetTypeInfo(
@@ -2206,8 +2257,10 @@ static HRESULT WINAPI winhttp_request_GetTypeInfo(
     LCID lcid,
     ITypeInfo **info )
 {
-    FIXME("\n");
-    return E_NOTIMPL;
+    struct winhttp_request *request = impl_from_IWinHttpRequest( iface );
+    TRACE("%p, %u, %u, %p\n", request, index, lcid, info);
+
+    return get_typeinfo( IWinHttpRequest_tid, info );
 }
 
 static HRESULT WINAPI winhttp_request_GetIDsOfNames(
@@ -2218,8 +2271,21 @@ static HRESULT WINAPI winhttp_request_GetIDsOfNames(
     LCID lcid,
     DISPID *dispid )
 {
-    FIXME("\n");
-    return E_NOTIMPL;
+    struct winhttp_request *request = impl_from_IWinHttpRequest( iface );
+    ITypeInfo *typeinfo;
+    HRESULT hr;
+
+    TRACE("%p, %s, %p, %u, %u, %p\n", request, debugstr_guid(riid), names, count, lcid, dispid);
+
+    if (!names || !count || !dispid) return E_INVALIDARG;
+
+    hr = get_typeinfo( IWinHttpRequest_tid, &typeinfo );
+    if (SUCCEEDED(hr))
+    {
+        hr = ITypeInfo_GetIDsOfNames( typeinfo, names, count, dispid );
+        ITypeInfo_Release( typeinfo );
+    }
+    return hr;
 }
 
 static HRESULT WINAPI winhttp_request_Invoke(
@@ -2233,8 +2299,21 @@ static HRESULT WINAPI winhttp_request_Invoke(
     EXCEPINFO *excep_info,
     UINT *arg_err )
 {
-    FIXME("\n");
-    return E_NOTIMPL;
+    struct winhttp_request *request = impl_from_IWinHttpRequest( iface );
+    ITypeInfo *typeinfo;
+    HRESULT hr;
+
+    TRACE("%p, %d, %s, %d, %d, %p, %p, %p, %p\n", request, member, debugstr_guid(riid),
+          lcid, flags, params, result, excep_info, arg_err);
+
+    hr = get_typeinfo( IWinHttpRequest_tid, &typeinfo );
+    if (SUCCEEDED(hr))
+    {
+        hr = ITypeInfo_Invoke( typeinfo, &request->IWinHttpRequest_iface, member, flags,
+                               params, result, excep_info, arg_err );
+        ITypeInfo_Release( typeinfo );
+    }
+    return hr;
 }
 
 static HRESULT WINAPI winhttp_request_SetProxy(




More information about the wine-cvs mailing list