Huw Davies : sapi: Add a stub SpObjectTokenEnum object implementation.

Alexandre Julliard julliard at winehq.org
Thu Sep 28 18:36:35 CDT 2017


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

Author: Huw Davies <huw at codeweavers.com>
Date:   Thu Sep 28 08:40:48 2017 +0100

sapi: Add a stub SpObjectTokenEnum object implementation.

Signed-off-by: Huw Davies <huw at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/sapi/main.c         |   3 +
 dlls/sapi/sapi_private.h |   1 +
 dlls/sapi/token.c        | 165 +++++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 169 insertions(+)

diff --git a/dlls/sapi/main.c b/dlls/sapi/main.c
index edbb5d9..ea164a5 100644
--- a/dlls/sapi/main.c
+++ b/dlls/sapi/main.c
@@ -107,6 +107,7 @@ static const struct IClassFactoryVtbl class_factory_vtbl =
 };
 
 static struct class_factory data_key_cf       = { { &class_factory_vtbl }, data_key_create };
+static struct class_factory token_enum_cf     = { { &class_factory_vtbl }, token_enum_create };
 
 /******************************************************************
  *             DllGetClassObject
@@ -119,6 +120,8 @@ HRESULT WINAPI DllGetClassObject( REFCLSID clsid, REFIID iid, void **obj )
 
     if (IsEqualCLSID( clsid, &CLSID_SpDataKey ))
         cf = &data_key_cf.IClassFactory_iface;
+    else if (IsEqualCLSID( clsid, &CLSID_SpObjectTokenEnum ))
+        cf = &token_enum_cf.IClassFactory_iface;
 
     if (!cf) return CLASS_E_CLASSNOTAVAILABLE;
 
diff --git a/dlls/sapi/sapi_private.h b/dlls/sapi/sapi_private.h
index 7809f50..7a5c14e 100644
--- a/dlls/sapi/sapi_private.h
+++ b/dlls/sapi/sapi_private.h
@@ -19,6 +19,7 @@
  */
 
 HRESULT data_key_create( IUnknown *outer, REFIID iid, void **obj ) DECLSPEC_HIDDEN;
+HRESULT token_enum_create( IUnknown *outer, REFIID iid, void **obj ) DECLSPEC_HIDDEN;
 
 static inline void * __WINE_ALLOC_SIZE(1) heap_alloc(size_t len)
 {
diff --git a/dlls/sapi/token.c b/dlls/sapi/token.c
index a274f5f..03ce0a7 100644
--- a/dlls/sapi/token.c
+++ b/dlls/sapi/token.c
@@ -226,3 +226,168 @@ HRESULT data_key_create( IUnknown *outer, REFIID iid, void **obj )
     ISpRegDataKey_Release( &This->ISpRegDataKey_iface );
     return hr;
 }
+
+struct token_enum
+{
+    ISpObjectTokenEnumBuilder ISpObjectTokenEnumBuilder_iface;
+    LONG ref;
+};
+
+struct token_enum *impl_from_ISpObjectTokenEnumBuilder( ISpObjectTokenEnumBuilder *iface )
+{
+    return CONTAINING_RECORD( iface, struct token_enum, ISpObjectTokenEnumBuilder_iface );
+}
+
+static HRESULT WINAPI token_enum_QueryInterface( ISpObjectTokenEnumBuilder *iface,
+                                                 REFIID iid, void **obj )
+{
+    struct token_enum *This = impl_from_ISpObjectTokenEnumBuilder( iface );
+
+    TRACE( "(%p)->(%s %p)\n", This, debugstr_guid( iid ), obj );
+
+    if (IsEqualIID( iid, &IID_IUnknown ) ||
+        IsEqualIID( iid, &IID_IEnumSpObjectTokens ) ||
+        IsEqualIID( iid, &IID_ISpObjectTokenEnumBuilder ))
+    {
+        ISpObjectTokenEnumBuilder_AddRef( iface );
+        *obj = iface;
+        return S_OK;
+    }
+
+    FIXME( "interface %s not implemented\n", debugstr_guid( iid ) );
+    *obj = NULL;
+    return E_NOINTERFACE;
+}
+
+static ULONG WINAPI token_enum_AddRef( ISpObjectTokenEnumBuilder *iface )
+{
+    struct token_enum *This = impl_from_ISpObjectTokenEnumBuilder( iface );
+    ULONG ref = InterlockedIncrement( &This->ref );
+
+    TRACE( "(%p) ref = %u\n", This, ref );
+    return ref;
+}
+
+static ULONG WINAPI token_enum_Release( ISpObjectTokenEnumBuilder *iface )
+{
+    struct token_enum *This = impl_from_ISpObjectTokenEnumBuilder( iface );
+    ULONG ref = InterlockedDecrement(&This->ref);
+
+    TRACE( "(%p) ref = %u\n", This, ref );
+
+    if (!ref)
+        heap_free( This );
+
+    return ref;
+}
+
+static HRESULT WINAPI token_enum_Next( ISpObjectTokenEnumBuilder *iface,
+                                       ULONG num, ISpObjectToken **tokens,
+                                       ULONG *fetched )
+{
+    FIXME( "stub\n" );
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI token_enum_Skip( ISpObjectTokenEnumBuilder *iface,
+                                       ULONG num )
+{
+    FIXME( "stub\n" );
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI token_enum_Reset( ISpObjectTokenEnumBuilder *iface)
+{
+    FIXME( "stub\n" );
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI token_enum_Clone( ISpObjectTokenEnumBuilder *iface,
+                                        IEnumSpObjectTokens **clone )
+{
+    FIXME( "stub\n" );
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI token_enum_Item( ISpObjectTokenEnumBuilder *iface,
+                                       ULONG index, ISpObjectToken **token )
+{
+    FIXME( "stub\n" );
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI token_enum_GetCount( ISpObjectTokenEnumBuilder *iface,
+                                           ULONG *count )
+{
+    FIXME( "stub\n" );
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI token_enum_SetAttribs( ISpObjectTokenEnumBuilder *iface,
+                                             LPCWSTR req, LPCWSTR opt)
+{
+    FIXME( "stub\n" );
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI token_enum_AddTokens( ISpObjectTokenEnumBuilder *iface,
+                                            ULONG num, ISpObjectToken **tokens )
+{
+    FIXME( "stub\n" );
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI token_enum_AddTokensFromDataKey( ISpObjectTokenEnumBuilder *iface,
+                                                       ISpDataKey *data_key,
+                                                       LPCWSTR sub_key, LPCWSTR cat_id )
+{
+    FIXME( "stub\n" );
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI token_enum_AddTokensFromTokenEnum( ISpObjectTokenEnumBuilder *iface,
+                                                         IEnumSpObjectTokens *token_enum )
+{
+    FIXME( "stub\n" );
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI token_enum_Sort( ISpObjectTokenEnumBuilder *iface,
+                                       LPCWSTR first )
+{
+    FIXME( "stub\n" );
+    return E_NOTIMPL;
+}
+
+const struct ISpObjectTokenEnumBuilderVtbl token_enum_vtbl =
+{
+    token_enum_QueryInterface,
+    token_enum_AddRef,
+    token_enum_Release,
+    token_enum_Next,
+    token_enum_Skip,
+    token_enum_Reset,
+    token_enum_Clone,
+    token_enum_Item,
+    token_enum_GetCount,
+    token_enum_SetAttribs,
+    token_enum_AddTokens,
+    token_enum_AddTokensFromDataKey,
+    token_enum_AddTokensFromTokenEnum,
+    token_enum_Sort
+};
+
+HRESULT token_enum_create( IUnknown *outer, REFIID iid, void **obj )
+{
+    struct token_enum *This = heap_alloc( sizeof(*This) );
+    HRESULT hr;
+
+    if (!This) return E_OUTOFMEMORY;
+    This->ISpObjectTokenEnumBuilder_iface.lpVtbl = &token_enum_vtbl;
+    This->ref = 1;
+
+    hr = ISpObjectTokenEnumBuilder_QueryInterface( &This->ISpObjectTokenEnumBuilder_iface, iid, obj );
+
+    ISpObjectTokenEnumBuilder_Release( &This->ISpObjectTokenEnumBuilder_iface );
+    return hr;
+}




More information about the wine-cvs mailing list