[PATCH] msado15: Implement _Command get/put CommandText

Aaro Altonen a.altonen at hotmail.com
Wed May 27 09:19:03 CDT 2020


Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=49264
Signed-off-by: Aaro Altonen <a.altonen at hotmail.com>
---
 dlls/msado15/command.c       | 30 +++++++++++++++++++++++-------
 dlls/msado15/tests/msado15.c | 26 ++++++++++++++++++++++++++
 2 files changed, 49 insertions(+), 7 deletions(-)

diff --git a/dlls/msado15/command.c b/dlls/msado15/command.c
index 9081f1554f..eb7b3a035e 100644
--- a/dlls/msado15/command.c
+++ b/dlls/msado15/command.c
@@ -31,9 +31,10 @@ WINE_DEFAULT_DEBUG_CHANNEL(msado15);
 
 struct command
 {
-    _Command        Command_iface;
-    LONG            ref;
-    CommandTypeEnum type;
+    _Command         Command_iface;
+    LONG             ref;
+    CommandTypeEnum  type;
+    BSTR             text;
 };
 
 static inline struct command *impl_from_Command( _Command *iface )
@@ -79,6 +80,7 @@ static ULONG WINAPI command_Release( _Command *iface )
     if (!ref)
     {
         TRACE( "destroying %p\n", command );
+        heap_free( command->text );
         heap_free( command );
     }
     return ref;
@@ -137,14 +139,27 @@ static HRESULT WINAPI command_put_ActiveConnection( _Command *iface, VARIANT con
 
 static HRESULT WINAPI command_get_CommandText( _Command *iface, BSTR *text )
 {
-    FIXME( "%p, %p\n", iface, text );
-    return E_NOTIMPL;
+    struct command *command = impl_from_Command( iface );
+    BSTR cmd_text = NULL;
+
+    TRACE( "%p, %p\n", command, text );
+
+    if (command->text && !(cmd_text = SysAllocString( command->text ))) return E_OUTOFMEMORY;
+    *text = cmd_text;
+    return S_OK;
 }
 
 static HRESULT WINAPI command_put_CommandText( _Command *iface, BSTR text )
 {
-    FIXME( "%p, %s\n", iface, debugstr_w(text) );
-    return E_NOTIMPL;
+    struct command *command = impl_from_Command( iface );
+    WCHAR *source = NULL;
+
+    TRACE( "%p, %s\n", command, debugstr_w( text ) );
+
+    if (text && !(source = strdupW( text ))) return E_OUTOFMEMORY;
+    heap_free( command->text );
+    command->text = source;
+    return S_OK;
 }
 
 static HRESULT WINAPI command_get_CommandTimeout( _Command *iface, LONG *timeout )
@@ -327,6 +342,7 @@ HRESULT Command_create( void **obj )
     if (!(command = heap_alloc( sizeof(*command) ))) return E_OUTOFMEMORY;
     command->Command_iface.lpVtbl = &command_vtbl;
     command->type = adCmdUnknown;
+    command->text = NULL;
     command->ref = 1;
 
     *obj = &command->Command_iface;
diff --git a/dlls/msado15/tests/msado15.c b/dlls/msado15/tests/msado15.c
index b17430a93d..0125f228b2 100644
--- a/dlls/msado15/tests/msado15.c
+++ b/dlls/msado15/tests/msado15.c
@@ -743,6 +743,7 @@ static void test_Command(void)
     Command15 *command15;
     Command25 *command25;
     CommandTypeEnum cmd_type = adCmdUnspecified;
+    BSTR cmd_text = (BSTR)"test";
 
     hr = CoCreateInstance( &CLSID_Command, NULL, CLSCTX_INPROC_SERVER, &IID__Command, (void **)&command );
     ok( hr == S_OK, "got %08x\n", hr );
@@ -771,6 +772,31 @@ static void test_Command(void)
     hr = _Command_put_CommandType( command, 0xdeadbeef );
     ok( hr == MAKE_ADO_HRESULT( adErrInvalidArgument ), "got %08x\n", hr );
 
+    hr = _Command_get_CommandText( command, &cmd_text );
+    ok( hr == S_OK, "got %08x\n", hr );
+    ok( !cmd_text, "got %s\n", cmd_text );
+
+    hr = _Command_put_CommandText( command, NULL );
+    ok( hr == S_OK, "got %08x\n", hr );
+
+    cmd_text = SysAllocString( L"" );
+    hr = _Command_put_CommandText( command, cmd_text );
+    ok( hr == S_OK, "got %08x\n", hr );
+    SysFreeString( cmd_text );
+
+    hr = _Command_get_CommandText( command,  &cmd_text );
+    ok( hr == S_OK, "got %08x\n", hr );
+    ok( cmd_text && !*cmd_text, "got %p\n", cmd_text );
+
+    cmd_text = SysAllocString( L"test" );
+    hr = _Command_put_CommandText( command, cmd_text );
+    ok( hr == S_OK, "got %08x\n", hr );
+    SysFreeString( cmd_text );
+
+    hr = _Command_get_CommandText( command,  &cmd_text );
+    ok( hr == S_OK, "got %08x\n", hr );
+    ok( !wcscmp( L"test", cmd_text ), "got %p\n", wine_dbgstr_w( cmd_text ) );
+
     _Command_Release( command );
 }
 
-- 
2.26.2




More information about the wine-devel mailing list