Hans Leidekker : wbemdisp: Add a stub implementation of ISWbemLocator.

Alexandre Julliard julliard at winehq.org
Fri Aug 16 14:23:47 CDT 2013


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

Author: Hans Leidekker <hans at codeweavers.com>
Date:   Fri Aug 16 14:19:51 2013 +0200

wbemdisp: Add a stub implementation of ISWbemLocator.

---

 dlls/wbemdisp/Makefile.in        |    2 +
 dlls/wbemdisp/locator.c          |  267 ++++++++++++++++++++++++++++++++++++++
 dlls/wbemdisp/wbemdisp_private.h |   30 +++++
 3 files changed, 299 insertions(+), 0 deletions(-)

diff --git a/dlls/wbemdisp/Makefile.in b/dlls/wbemdisp/Makefile.in
index 917ebb4..b6b3217 100644
--- a/dlls/wbemdisp/Makefile.in
+++ b/dlls/wbemdisp/Makefile.in
@@ -1,6 +1,8 @@
 MODULE    = wbemdisp.dll
+IMPORTS   = oleaut32
 
 C_SRCS = \
+	locator.c \
 	main.c
 
 IDL_R_SRCS = wbemdisp_classes.idl
diff --git a/dlls/wbemdisp/locator.c b/dlls/wbemdisp/locator.c
new file mode 100644
index 0000000..6f3af95
--- /dev/null
+++ b/dlls/wbemdisp/locator.c
@@ -0,0 +1,267 @@
+/*
+ * Copyright 2013 Hans Leidekker for CodeWeavers
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#define COBJMACROS
+
+#include "config.h"
+#include <stdarg.h>
+
+#include "windef.h"
+#include "winbase.h"
+#include "initguid.h"
+#include "objbase.h"
+#include "wbemdisp.h"
+
+#include "wine/debug.h"
+#include "wine/unicode.h"
+#include "wbemdisp_private.h"
+
+WINE_DEFAULT_DEBUG_CHANNEL(wbemdisp);
+
+struct locator
+{
+    ISWbemLocator ISWbemLocator_iface;
+    LONG refs;
+};
+
+static inline struct locator *impl_from_ISWbemLocator( ISWbemLocator *iface )
+{
+    return CONTAINING_RECORD( iface, struct locator, ISWbemLocator_iface );
+}
+
+static ULONG WINAPI locator_AddRef(
+    ISWbemLocator *iface )
+{
+    struct locator *locator = impl_from_ISWbemLocator( iface );
+    return InterlockedIncrement( &locator->refs );
+}
+
+static ULONG WINAPI locator_Release(
+    ISWbemLocator *iface )
+{
+    struct locator *locator = impl_from_ISWbemLocator( iface );
+    LONG refs = InterlockedDecrement( &locator->refs );
+    if (!refs)
+    {
+        TRACE( "destroying %p\n", locator );
+        heap_free( locator );
+    }
+    return refs;
+}
+
+static HRESULT WINAPI locator_QueryInterface(
+    ISWbemLocator *iface,
+    REFIID riid,
+    void **ppvObject )
+{
+    struct locator *locator = impl_from_ISWbemLocator( iface );
+
+    TRACE( "%p, %s, %p\n", locator, debugstr_guid( riid ), ppvObject );
+
+    if (IsEqualGUID( riid, &IID_ISWbemLocator ) ||
+        IsEqualGUID( riid, &IID_IDispatch ) ||
+        IsEqualGUID( riid, &IID_IUnknown ))
+    {
+        *ppvObject = iface;
+    }
+    else
+    {
+        FIXME( "interface %s not implemented\n", debugstr_guid(riid) );
+        return E_NOINTERFACE;
+    }
+    ISWbemLocator_AddRef( iface );
+    return S_OK;
+}
+
+static HRESULT WINAPI locator_GetTypeInfoCount(
+    ISWbemLocator *iface,
+    UINT *count )
+{
+    struct locator *locator = impl_from_ISWbemLocator( iface );
+
+    TRACE( "%p, %p\n", locator, count );
+    *count = 1;
+    return S_OK;
+}
+
+enum type_id
+{
+    ISWbemLocator_tid,
+    last_tid
+};
+
+static ITypeLib *wbemdisp_typelib;
+static ITypeInfo *wbemdisp_typeinfo[last_tid];
+
+static REFIID wbemdisp_tid_id[] =
+{
+    &IID_ISWbemLocator
+};
+
+static HRESULT get_typeinfo( enum type_id tid, ITypeInfo **ret )
+{
+    HRESULT hr;
+
+    if (!wbemdisp_typelib)
+    {
+        ITypeLib *typelib;
+
+        hr = LoadRegTypeLib( &LIBID_WbemScripting, 1, 2, LOCALE_SYSTEM_DEFAULT, &typelib );
+        if (FAILED( hr ))
+        {
+            ERR( "LoadRegTypeLib failed: %08x\n", hr );
+            return hr;
+        }
+        if (InterlockedCompareExchangePointer( (void **)&wbemdisp_typelib, typelib, NULL ))
+            ITypeLib_Release( typelib );
+    }
+    if (!wbemdisp_typeinfo[tid])
+    {
+        ITypeInfo *typeinfo;
+
+        hr = ITypeLib_GetTypeInfoOfGuid( wbemdisp_typelib, wbemdisp_tid_id[tid], &typeinfo );
+        if (FAILED( hr ))
+        {
+            ERR( "GetTypeInfoOfGuid(%s) failed: %08x\n", debugstr_guid(wbemdisp_tid_id[tid]), hr );
+            return hr;
+        }
+        if (InterlockedCompareExchangePointer( (void **)(wbemdisp_typeinfo + tid), typeinfo, NULL ))
+            ITypeInfo_Release( typeinfo );
+    }
+    *ret = wbemdisp_typeinfo[tid];
+    return S_OK;
+}
+
+static HRESULT WINAPI locator_GetTypeInfo(
+    ISWbemLocator *iface,
+    UINT index,
+    LCID lcid,
+    ITypeInfo **info )
+{
+    struct locator *locator = impl_from_ISWbemLocator( iface );
+    TRACE( "%p, %u, %u, %p\n", locator, index, lcid, info );
+
+    return get_typeinfo( ISWbemLocator_tid, info );
+}
+
+static HRESULT WINAPI locator_GetIDsOfNames(
+    ISWbemLocator *iface,
+    REFIID riid,
+    LPOLESTR *names,
+    UINT count,
+    LCID lcid,
+    DISPID *dispid )
+{
+    struct locator *locator = impl_from_ISWbemLocator( iface );
+    ITypeInfo *typeinfo;
+    HRESULT hr;
+
+    TRACE( "%p, %s, %p, %u, %u, %p\n", locator, debugstr_guid(riid), names, count, lcid, dispid );
+
+    if (!names || !count || !dispid) return E_INVALIDARG;
+
+    hr = get_typeinfo( ISWbemLocator_tid, &typeinfo );
+    if (SUCCEEDED(hr))
+    {
+        hr = ITypeInfo_GetIDsOfNames( typeinfo, names, count, dispid );
+        ITypeInfo_Release( typeinfo );
+    }
+    return hr;
+}
+
+static HRESULT WINAPI locator_Invoke(
+    ISWbemLocator *iface,
+    DISPID member,
+    REFIID riid,
+    LCID lcid,
+    WORD flags,
+    DISPPARAMS *params,
+    VARIANT *result,
+    EXCEPINFO *excep_info,
+    UINT *arg_err )
+{
+    struct locator *locator = impl_from_ISWbemLocator( iface );
+    ITypeInfo *typeinfo;
+    HRESULT hr;
+
+    TRACE( "%p, %d, %s, %d, %d, %p, %p, %p, %p\n", locator, member, debugstr_guid(riid),
+           lcid, flags, params, result, excep_info, arg_err );
+
+    hr = get_typeinfo( ISWbemLocator_tid, &typeinfo );
+    if (SUCCEEDED(hr))
+    {
+        hr = ITypeInfo_Invoke( typeinfo, &locator->ISWbemLocator_iface, member, flags,
+                               params, result, excep_info, arg_err );
+        ITypeInfo_Release( typeinfo );
+    }
+    return hr;
+}
+
+static HRESULT WINAPI locator_ConnectServer(
+    ISWbemLocator *iface,
+    BSTR strServer,
+    BSTR strNamespace,
+    BSTR strUser,
+    BSTR strPassword,
+    BSTR strLocale,
+    BSTR strAuthority,
+    LONG iSecurityFlags,
+    IDispatch *objWbemNamedValueSet,
+    ISWbemServices **objWbemServices )
+{
+    FIXME( "%p, %s, %s, %s, %p, %s, %s, 0x%08x, %p, %p\n", iface, debugstr_w(strServer),
+           debugstr_w(strNamespace), debugstr_w(strUser), strPassword, debugstr_w(strLocale),
+           debugstr_w(strAuthority), iSecurityFlags, objWbemNamedValueSet, objWbemServices );
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI locator_get_Security_(
+    ISWbemLocator *iface,
+    ISWbemSecurity **objWbemSecurity )
+{
+    FIXME( "%p, %p\n", iface, objWbemSecurity );
+    return E_NOTIMPL;
+}
+
+static const ISWbemLocatorVtbl locator_vtbl =
+{
+    locator_QueryInterface,
+    locator_AddRef,
+    locator_Release,
+    locator_GetTypeInfoCount,
+    locator_GetTypeInfo,
+    locator_GetIDsOfNames,
+    locator_Invoke,
+    locator_ConnectServer,
+    locator_get_Security_
+};
+
+HRESULT SWbemLocator_create( IUnknown *unk, void **obj )
+{
+    struct locator *locator;
+
+    TRACE( "%p, %p\n", unk, obj );
+
+    if (!(locator = heap_alloc( sizeof(*locator) ))) return E_OUTOFMEMORY;
+    locator->ISWbemLocator_iface.lpVtbl = &locator_vtbl;
+    locator->refs = 1;
+
+    *obj = &locator->ISWbemLocator_iface;
+    TRACE( "returning iface %p\n", *obj );
+    return S_OK;
+}
diff --git a/dlls/wbemdisp/wbemdisp_private.h b/dlls/wbemdisp/wbemdisp_private.h
new file mode 100644
index 0000000..549cb28
--- /dev/null
+++ b/dlls/wbemdisp/wbemdisp_private.h
@@ -0,0 +1,30 @@
+/*
+ * Copyright 2013 Hans Leidekker for CodeWeavers
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+HRESULT SWbemLocator_create(IUnknown *, LPVOID *) DECLSPEC_HIDDEN;
+
+static void *heap_alloc( size_t len ) __WINE_ALLOC_SIZE(1);
+static inline void *heap_alloc( size_t len )
+{
+    return HeapAlloc( GetProcessHeap(), 0, len );
+}
+
+static inline BOOL heap_free( void *mem )
+{
+    return HeapFree( GetProcessHeap(), 0, mem );
+}




More information about the wine-cvs mailing list