shell32: Implement CheckEscapesA/W

Rolf Kalbermatter rolf.kalbermatter at citeng.com
Wed Mar 26 10:31:28 CST 2003


Changelog
  * dlls/shell32/shell32.spec
    Fix signature of CheckEscapesA/W as observed on W2K
  * dlls/shell32/undocshell.h
    Add function declarations for CheckEscapesA/W
  * dlls/shell32/shellstring.c
    Implement CheckEscapesA/W

License: X11/LGPL

Rolf Kalbermatter

Index: dlls/shell32/shell32.spec
===================================================================
RCS file: /home/wine/wine/dlls/shell32/shell32.spec,v
retrieving revision 1.66
diff -u -r1.66 shell32.spec
--- dlls/shell32/shell32.spec	21 Mar 2003 21:23:33 -0000	1.66
+++ dlls/shell32/shell32.spec	26 Mar 2003 16:26:16 -0000
@@ -17,12 +17,12 @@
   19 stdcall ILCloneFirst (ptr)
   20 stdcall ILGlobalClone (ptr)
   21 stdcall ILIsEqual (ptr ptr)
-  23 stdcall ILIsParent (long long long)
-  24 stdcall ILFindChild (long long)
+  23 stdcall ILIsParent (ptr ptr long)
+  24 stdcall ILFindChild (ptr ptr)
   25 stdcall ILCombine(ptr ptr)
   26 stdcall ILLoadFromStream (ptr ptr)
   27 stdcall ILSaveToStream(ptr ptr)
-  28 stdcall SHILCreateFromPath (long long long) SHILCreateFromPathAW
+  28 stdcall SHILCreateFromPath(ptr ptr ptr) SHILCreateFromPathAW
   29 stdcall PathIsRoot(ptr) PathIsRootAW
   30 stdcall PathBuildRoot(ptr long) PathBuildRootAW
   31 stdcall PathFindExtension(ptr) PathFindExtensionAW
@@ -190,7 +190,7 @@
  209 stub Int64ToString
  210 stub LargeIntegerToString
  211 stub Printers_GetPidl
- 212 stub Printer_AddPrinterPropPages
+ 212 stub Printers_AddPrinterPropPages
  213 stub Printers_RegisterWindowW
  214 stub Printers_UnregisterWindow
  215 stub SHStartNetConnectionDialog at 12
@@ -306,8 +306,8 @@
 # version 4.0 (win95)
 # _WIN32_IE >= 0x0200
 #
-@ stdcall CheckEscapesA(str long long ptr ptr long)
-@ stdcall CheckEscapesW(wstr long long ptr ptr long)
+@ stdcall CheckEscapesA(str long)
+@ stdcall CheckEscapesW(wstr long)
 @ stdcall CommandLineToArgvW(wstr ptr)
 @ stdcall Control_FillCache_RunDLL(long long long long)
 @ stub Control_FillCache_RunDLLA

Index: dlls/shell32/undocshell.h
===================================================================
RCS file: /home/wine/wine/dlls/shell32/undocshell.h,v
retrieving revision 1.8
diff -u -r1.8 undocshell.h
--- dlls/shell32/undocshell.h	21 Mar 2003 21:26:25 -0000	1.8
+++ dlls/shell32/undocshell.h	26 Mar 2003 16:19:33 -0000
@@ -901,6 +901,9 @@
 	UINT uFlags);
 #define SHGetNewLinkInfo WINELIB_NAME_AW(SHGetNewLinkInfo)
 
+DWORD WINAPI CheckEscapesA(LPSTR string, DWORD len);
+DWORD WINAPI CheckEscapesW(LPWSTR string, DWORD len);
+
 /* policy functions */
 BOOL WINAPI SHInitRestricted(LPCVOID unused, LPCVOID inpRegKey);
 DWORD WINAPI SHRestricted (DWORD policy);

Index: dlls/shell32/shellstring.c
===================================================================
RCS file: /home/wine/wine/dlls/shell32/shellstring.c,v
retrieving revision 1.25
diff -u -r1.25 shellstring.c
--- dlls/shell32/shellstring.c	7 Jan 2003 20:36:24 -0000	1.25
+++ dlls/shell32/shellstring.c	26 Mar 2003 16:21:17 -0000
@@ -29,6 +29,7 @@
 
 #include "shlobj.h"
 #include "shellapi.h"
+#include "shlwapi.h"
 #include "shell32_main.h"
 #include "undocshell.h"
 #include "wine/unicode.h"
@@ -217,40 +218,66 @@
 
 
 /*************************************************************************
- * CheckEscapes [SHELL32]
+ * CheckEscapesA             [SHELL32.@]
+ *
+ * Checks a string for special characters which are not allowed in a path
+ * and encloses it in quotes if that is the case.
+ *
+ * PARAMS
+ *  string     [I/O] string to check and on return eventually quoted
+ *  len        [I]   length of string
+ *
+ * RETURNS
+ *  length of actual string
+ *
+ * NOTES
+ *  Not really sure if this function returns actually a value at all. 
  */
 DWORD WINAPI CheckEscapesA(
-    LPSTR    string,         /* [in]    string to check ??*/
-           DWORD    b,              /* [???]   is 0 */
-           DWORD    c,              /* [???]   is 0 */
-           LPDWORD  d,              /* [???]   is address */
-           LPDWORD  e,              /* [???]   is address */
-           DWORD    handle )        /* [in]    looks like handle but not */
-{
-    FIXME("(%p<%s> %ld %ld %p<%ld> %p<%ld> 0x%08lx) stub\n",
-   string, debugstr_a(string),
-   b,
-   c,
-   d, (d) ? *d : 0xabbacddc,
-   e, (e) ? *e : 0xabbacddd,
-   handle);
-    return 0;
+	LPSTR	string,         /* [I/O]   string to check ??*/
+	DWORD	len)            /* [I]      is 0 */
+{
+	LPWSTR wString;
+	DWORD ret = 0;
+
+	TRACE("(%s %ld)\n", debugstr_a(string), len);
+	wString = (LPWSTR)LocalAlloc(LPTR, len * sizeof(WCHAR));
+	if (wString)
+	{
+	  MultiByteToWideChar(CP_ACP, 0, string, len, wString, len);
+	  ret = CheckEscapesW(wString, len);
+	  WideCharToMultiByte(CP_ACP, 0, wString, len, string, len, NULL, NULL);
+	  LocalFree(wString);
+	}
+	return ret;
 }
 
+static const WCHAR strEscapedChars[] = {' ','"',',',';','^',0};
+
+/*************************************************************************
+ * CheckEscapesW             [SHELL32.@]
+ *
+ * see CheckEscapesA
+ */
 DWORD WINAPI CheckEscapesW(
-    LPWSTR   string,         /* [in]    string to check ??*/
-           DWORD    b,              /* [???]   is 0 */
-           DWORD    c,              /* [???]   is 0 */
-           LPDWORD  d,              /* [???]   is address */
-           LPDWORD  e,              /* [???]   is address */
-           DWORD    handle )        /* [in]    looks like handle but not */
-{
-    FIXME("(%p<%s> %ld %ld %p<%ld> %p<%ld> 0x%08lx) stub\n",
-   string, debugstr_w(string),
-   b,
-   c,
-   d, (d) ? *d : 0xabbacddc,
-   e, (e) ? *e : 0xabbacddd,
-   handle);
-    return 0;
+	LPWSTR	string,
+	DWORD	len)
+{
+	DWORD size = lstrlenW(string);
+	LPWSTR s, d;
+
+	TRACE("(%s %ld) stub\n", debugstr_w(string), len);
+
+	if (StrPBrkW(string, strEscapedChars) && size + 2 <= len)
+	{
+	  s = &string[size - 1];
+	  d = &string[size + 2];
+	  *d-- = 0;
+	  *d-- = '"';
+	  for (;d > string;)
+	    *d-- = *s--;
+	  *d = '"';
+	  return size + 2;
+	}
+	return size;
 }




More information about the wine-patches mailing list