printui: [try 3] Parse args for PrintUIEntryW
Detlef Riekenberg
wine.dev at web.de
Thu Jul 12 13:58:40 CDT 2007
Changelog:
printui: Parse args for PrintUIEntryW
Replaced #define with an enum and
replace unportable initialization.
--
By by ... Detlef
-------------- next part --------------
>From 67076f6891b5e03afcf4bc6fbab4f17bf7061f6f Mon Sep 17 00:00:00 2001
From: Detlef Riekenberg <wine.dev at web.de>
Date: Thu, 12 Jul 2007 20:56:45 +0200
Subject: [PATCH] printui: Parse args for PrintUIEntry
---
dlls/printui/Makefile.in | 2
dlls/printui/printui.c | 217 ++++++++++++++++++++++++++++++++++++++++
dlls/printui/printui_private.h | 72 +++++++++++++
3 files changed, 288 insertions(+), 3 deletions(-)
diff --git a/dlls/printui/Makefile.in b/dlls/printui/Makefile.in
index 2cb44b9..65aa7f6 100644
--- a/dlls/printui/Makefile.in
+++ b/dlls/printui/Makefile.in
@@ -3,7 +3,7 @@ TOPOBJDIR = ../..
SRCDIR = @srcdir@
VPATH = @srcdir@
MODULE = printui.dll
-IMPORTS = kernel32
+IMPORTS = kernel32 shell32
C_SRCS = \
printui.c
diff --git a/dlls/printui/printui.c b/dlls/printui/printui.c
index 06cbaa2..be1cbb9 100644
--- a/dlls/printui/printui.c
+++ b/dlls/printui/printui.c
@@ -1,7 +1,7 @@
/*
* Implementation of the Printer User Interface Dialogs
*
- * Copyright 2006 Detlef Riekenberg
+ * Copyright 2006-2007 Detlef Riekenberg
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -30,14 +30,190 @@ #include "winuser.h"
#include "winreg.h"
#include "winver.h"
#include "winnls.h"
+#include "shellapi.h"
#include "wine/unicode.h"
#include "wine/debug.h"
+#include "printui_private.h"
WINE_DEFAULT_DEBUG_CHANNEL(printui);
HINSTANCE PRINTUI_hInstance = NULL;
+/* ################################# */
+
+/* Must be in order with OPT_* */
+static WCHAR optionsW[OPT_MAX+1]={'a','b','c','f','h','j','l','m','n','t','r','v',0};
+
+/* Must be in order with FLAG_* */
+static WCHAR flagsW[FLAG_MAX+1]={'q','w','y','z','Z',0};
+
+
+/* ################################
+ * get_next_wstr() [Internal]
+ *
+ * Get the next WSTR, when available
+ *
+ */
+
+static LPWSTR get_next_wstr(context_t * cx)
+{
+ LPWSTR ptr;
+
+ ptr = cx->pNextCharW;
+ if (ptr && ptr[0]) {
+ cx->pNextCharW = NULL;
+ return ptr;
+ }
+
+ /* Get the next Parameter, when available */
+ if (cx->next_arg < cx->argc) {
+ ptr = cx->argv[cx->next_arg];
+ cx->next_arg++;
+ cx->pNextCharW = NULL;
+ return ptr;
+ }
+ return NULL;
+}
+
+
+/* ################################
+ * get_next_wchar() [Internal]
+ *
+ * Get the next WCHAR from the Commandline or from the File (@ Filename)
+ *
+ * ToDo: Support Parameter from a File ( "@Filename" )
+ *
+ */
+
+static WCHAR get_next_wchar(context_t * cx, BOOL use_next_parameter)
+{
+ WCHAR c;
+
+ /* Try the next WCHAR in the actual Parameter */
+ if (cx->pNextCharW) {
+ c = *cx->pNextCharW;
+ if (c) {
+ cx->pNextCharW++;
+ return c;
+ }
+ /* We reached the end of the Parameter */
+ cx->pNextCharW = NULL;
+ }
+
+ /* Get the next Parameter, when available and allowed */
+ if ((cx->pNextCharW == NULL) && (cx->next_arg < cx->argc) && (use_next_parameter)) {
+ cx->pNextCharW = cx->argv[cx->next_arg];
+ cx->next_arg++;
+ }
+
+ if (cx->pNextCharW) {
+ c = *cx->pNextCharW;
+ if (c) {
+ cx->pNextCharW++;
+ }
+ else
+ {
+ /* We reached the end of the Parameter */
+ cx->pNextCharW = NULL;
+ }
+ return c;
+ }
+ return '\0';
+}
+
+/* ################################ */
+static BOOL parse_rundll(context_t * cx)
+{
+ LPWSTR ptr;
+ DWORD index;
+ WCHAR txtW[2];
+ WCHAR c;
+
+
+ c = get_next_wchar(cx, TRUE);
+ txtW[1] = '\0';
+
+ while (c)
+ {
+
+ while ( (c == ' ') || (c == '\t'))
+ {
+ c = get_next_wchar(cx, TRUE);
+ }
+ txtW[0] = c;
+
+ if (c == '@') {
+ /* read commands from a File */
+ ptr = get_next_wstr(cx);
+ FIXME("redir not supported: %s\n", debugstr_w(ptr));
+ return FALSE;
+ }
+ else if (c == '/') {
+ c = get_next_wchar(cx, FALSE);
+ while ( c )
+ {
+ txtW[0] = c;
+ ptr = strchrW(optionsW, c);
+ if (ptr) {
+ index = ptr - optionsW;
+ cx->options[index] = get_next_wstr(cx);
+ TRACE(" opt: %s %s\n", debugstr_w(txtW), debugstr_w(cx->options[index]));
+ c = 0;
+ }
+ else
+ {
+ ptr = strchrW(flagsW, c);
+ if (ptr) {
+ index = ptr - flagsW;
+ cx->flags[index] = TRUE;
+ TRACE("flag: %s\n", debugstr_w(txtW));
+ }
+ else
+ {
+ cx->command = c;
+ cx->subcommand = '\0';
+ TRACE(" cmd: %s\n", debugstr_w(txtW));
+ }
+
+ /* help has priority over all commands */
+ if (c == '?') {
+ return TRUE;
+ }
+
+ c = get_next_wchar(cx, FALSE);
+
+ /* Some commands use two wchar */
+ if ((cx->command == 'd') || (cx->command == 'g') || (cx->command == 'i') ||
+ (cx->command == 'S') || (cx->command == 'X') ){
+ cx->subcommand = c;
+ txtW[0] = c;
+ TRACE(" sub: %s\n", debugstr_w(txtW));
+ c = get_next_wchar(cx, FALSE);
+ }
+ }
+ }
+ c = get_next_wchar(cx, TRUE);
+
+ }
+ else
+ {
+ /* The commands 'S' and 'X' have additional Parameter */
+ if ((cx->command == 'S') || (cx->command == 'X')) {
+
+ /* the actual WCHAR is the start from the extra Parameter */
+ cx->pNextCharW--;
+ TRACE("%d extra Parameter, starting with %s\n", 1 + (cx->argc - cx->next_arg), debugstr_w(cx->pNextCharW));
+ return TRUE;
+ }
+ FIXME("0x%x: %s is unknown\n", c, debugstr_wn(&c, 1));
+ return FALSE;
+ }
+
+ }
+ return TRUE;
+}
+
/*****************************************************
* DllMain
*/
@@ -66,5 +242,42 @@ BOOL WINAPI DllMain(HINSTANCE hinstDLL,
*/
void WINAPI PrintUIEntryW(HWND hWnd, HINSTANCE hInst, LPCWSTR pCommand, DWORD nCmdShow)
{
- FIXME("(%p, %p, %s, 0x%x) stub\n", hWnd, hInst, debugstr_w(pCommand), nCmdShow);
+ context_t cx;
+ BOOL res = FALSE;
+
+ TRACE("(%p, %p, %s, 0x%x)\n", hWnd, hInst, debugstr_w(pCommand), nCmdShow);
+
+ memset(&cx, 0, sizeof(context_t));
+ cx.hWnd = hWnd;
+ cx.nCmdShow = nCmdShow;
+
+ if ((pCommand) && (pCommand[0])) {
+ /* result is allocated with GlobalAlloc() */
+ cx.argv = CommandLineToArgvW(pCommand, &cx.argc);
+ TRACE("got %d args at %p\n", cx.argc, cx.argv);
+
+ res = parse_rundll(&cx);
+ }
+
+ if (res && cx.command) {
+ switch (cx.command)
+ {
+
+ default:
+ {
+ WCHAR txtW[3];
+ txtW[0] = cx.command;
+ txtW[1] = cx.subcommand;
+ txtW[2] = '\0';
+ FIXME("command not implemented: %s\n", debugstr_w(txtW));
+ }
+ }
+ }
+
+ if ((res == FALSE) || (cx.command == '\0')) {
+ FIXME("dialog: Printer / The operation was not successful\n");
+ }
+
+ GlobalFree(cx.argv);
+
}
diff --git a/dlls/printui/printui_private.h b/dlls/printui/printui_private.h
new file mode 100644
index 0000000..0b40c9f
--- /dev/null
+++ b/dlls/printui/printui_private.h
@@ -0,0 +1,72 @@
+/*
+ * Implementation of the Printer User Interface Dialogs: private Header
+ *
+ * Copyright 2007 Detlef Riekenberg
+ *
+ * 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
+ */
+
+#ifndef __WINE_PRINTUI_PRIVATE__
+#define __WINE_PRINTUI_PRIVATE__
+
+/* Index for Options with an argument */
+/* Must be in order with optionsW */
+typedef enum _OPT_INDEX {
+ OPT_A = 0,
+ OPT_B,
+ OPT_C,
+ OPT_F,
+ OPT_H,
+ OPT_J,
+ OPT_L,
+ OPT_M,
+ OPT_N,
+ OPT_R,
+ OPT_T,
+ OPT_V,
+ OPT_MAX
+} OPT_INDEX;
+
+/* Index for Flags without an argument */
+/* Must be in order with flagsW */
+typedef enum _FLAG_INDEX {
+ FLAG_Q = 0,
+ FLAG_W,
+ FLAG_Y,
+ FLAG_Z,
+ FLAG_ZZ,
+ FLAG_MAX
+} FLAG_INDEX;
+
+
+typedef struct tag_context {
+ HWND hWnd;
+ DWORD nCmdShow;
+ LPWSTR * argv;
+ LPWSTR pNextCharW;
+ int argc;
+ int next_arg;
+ WCHAR command;
+ WCHAR subcommand;
+ LPWSTR options[OPT_MAX];
+ BOOL flags[FLAG_MAX];
+} context_t;
+
+
+/* ## DLL-wide Globals ## */
+extern HINSTANCE PRINTUI_hInstance;
+
+
+#endif
--
1.4.1
More information about the wine-patches
mailing list