[PATCH 4/7] localspl: Implement GetForm().

Huw Davies huw at codeweavers.com
Wed May 19 08:43:10 CDT 2021


Signed-off-by: Huw Davies <huw at codeweavers.com>
---
 dlls/localspl/provider.c | 40 ++++++++++++++++++++++++++++++++++++++--
 1 file changed, 38 insertions(+), 2 deletions(-)

diff --git a/dlls/localspl/provider.c b/dlls/localspl/provider.c
index 69f70cdf541..c17983e3037 100644
--- a/dlls/localspl/provider.c
+++ b/dlls/localspl/provider.c
@@ -2714,8 +2714,44 @@ static BOOL WINAPI fpDeleteForm( HANDLE printer, WCHAR *name )
 
 static BOOL WINAPI fpGetForm( HANDLE printer, WCHAR *name, DWORD level, BYTE *form, DWORD size, DWORD *needed )
 {
-    FIXME( "(%p, %s, %d, %p, %d, %p): stub\n", printer, debugstr_w( name ), level, form, size, needed );
-    return FALSE;
+    size_t struct_size = form_struct_size( level );
+    const struct builtin_form *builtin = NULL;
+    WCHAR *strings = NULL;
+    BYTE *base = form;
+    DWORD i;
+
+    TRACE( "(%p, %s, %d, %p, %d, %p)\n", printer, debugstr_w( name ), level, form, size, needed );
+
+    *needed = 0;
+
+    if (!struct_size) return FALSE;
+
+    for (i = 0; i < ARRAY_SIZE(builtin_forms); i++)
+    {
+        if (!wcscmp( name, builtin_forms[i].name ))
+        {
+            builtin = builtin_forms + i;
+            break;
+        }
+    }
+
+    if (!builtin)
+    {
+        SetLastError( ERROR_INVALID_FORM_NAME );
+        return FALSE;
+    }
+
+    *needed = struct_size;
+    if (*needed < size) strings = (WCHAR *)(form + *needed);
+
+    fill_builtin_form_info( &base, &strings, builtin, level, size, needed );
+
+    if (*needed > size)
+    {
+        SetLastError( ERROR_INSUFFICIENT_BUFFER );
+        return FALSE;
+    }
+    return TRUE;
 }
 
 static BOOL WINAPI fpSetForm( HANDLE printer, WCHAR *name, DWORD level, BYTE *form )
-- 
2.23.0




More information about the wine-devel mailing list