kernel32 [3/3]: Forward LZOpenFileA to LZOpenFileW, not the other way around

James Hawkins truiken at gmail.com
Fri Nov 17 20:14:34 CST 2006


Hi,

Changelog:
* Forward LZOpenFileA to LZOpenFileW, not the other way around.

 dlls/kernel32/lzexpand.c |  141 +++++++++++++++++++++++++++++++++-------------
 1 files changed, 102 insertions(+), 39 deletions(-)

-- 
James Hawkins
-------------- next part --------------
diff --git a/dlls/kernel32/lzexpand.c b/dlls/kernel32/lzexpand.c
index a198459..6978333 100644
--- a/dlls/kernel32/lzexpand.c
+++ b/dlls/kernel32/lzexpand.c
@@ -527,66 +527,129 @@ #undef BUFLEN
 }
 
 /* reverses GetExpandedPathname */
-static LPSTR LZEXPAND_MangleName( LPCSTR fn )
+static LPWSTR LZEXPAND_MangleName(LPCWSTR fn)
 {
-    char *p;
-    char *mfn = HeapAlloc( GetProcessHeap(), 0, strlen(fn) + 3 ); /* "._" and \0 */
-    if(mfn == NULL) return NULL;
-    strcpy( mfn, fn );
-    if (!(p = strrchr( mfn, '\\' ))) p = mfn;
-    if ((p = strchr( p, '.' )))
+    LPWSTR p, mfn;
+    DWORD len;
+
+    static const WCHAR underscore[] = {'_',0};
+    static const WCHAR dotunder[] = {'.','_',0};
+
+    len = lstrlenW(fn) + 3; /* "._" and \0 */
+    mfn = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR));
+    if(!mfn)
+        return NULL;
+
+    lstrcpyW(mfn, fn);
+    if (!(p = strrchrW( mfn, '\\' ))) p = mfn;
+    if ((p = strchrW( p, '.' )))
     {
         p++;
-        if (strlen(p) < 3) strcat( p, "_" );  /* append '_' */
-        else p[strlen(p)-1] = '_';  /* replace last character */
+        if (lstrlenW(p) < 3) lstrcatW( p, underscore );  /* append '_' */
+        else p[lstrlenW(p)-1] = '_';  /* replace last character */
     }
-    else strcat( mfn, "._" );	/* append "._" */
+    else lstrcatW( mfn, dotunder );	/* append "._" */
     return mfn;
 }
 
-
 /***********************************************************************
  *           LZOpenFileA   (KERNEL32.@)
  *
- * Opens a file. If not compressed, open it as a normal file.
+ * See LZOpenFileW.
  */
-HFILE WINAPI LZOpenFileA( LPSTR fn, LPOFSTRUCT ofs, WORD mode )
+HFILE WINAPI LZOpenFileA(LPSTR fn, LPOFSTRUCT ofs, WORD mode)
 {
-	HFILE	fd,cfd;
+    HFILE ret;
+    DWORD len;
+    LPWSTR fileW;
 
-	TRACE("(%s,%p,%d)\n",fn,ofs,mode);
-	/* 0x70 represents all OF_SHARE_* flags, ignore them for the check */
-	fd=OpenFile(fn,ofs,mode);
-	if (fd==HFILE_ERROR)
-        {
-            LPSTR mfn = LZEXPAND_MangleName(fn);
-            fd = OpenFile(mfn,ofs,mode);
-            HeapFree( GetProcessHeap(), 0, mfn );
-	}
-	if ((mode&~0x70)!=OF_READ)
-		return fd;
-	if (fd==HFILE_ERROR)
-		return HFILE_ERROR;
-	cfd=LZInit(fd);
-	if ((INT)cfd <= 0) return fd;
-	return cfd;
+    if (!fn || !*fn)
+        return LZERROR_BADINHANDLE;
+
+    len = MultiByteToWideChar(CP_ACP, 0, fn, -1, NULL, 0);
+    fileW = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR));
+    if (!fileW)
+        return LZERROR_GLOBALLOC;
+
+    MultiByteToWideChar(CP_ACP, 0, fn, -1, fileW, len);
+
+    ret = LZOpenFileW(fileW, ofs, mode);
+
+    HeapFree(GetProcessHeap(), 0, fileW);
+    return ret;
 }
 
+/* Wrapper for CreateFile that takes OF_* mode flags. */
+static HANDLE create_file_OF(LPWSTR path, INT mode)
+{
+    DWORD access, sharing, creation;
+
+    if (mode & OF_CREATE)
+    {
+        creation = CREATE_ALWAYS;
+        access = GENERIC_READ | GENERIC_WRITE;
+    }
+    else
+    {
+        creation = OPEN_EXISTING;
+        switch(mode & 0x03)
+        {
+        case OF_READ:      access = GENERIC_READ; break;
+        case OF_WRITE:     access = GENERIC_WRITE; break;
+        case OF_READWRITE: access = GENERIC_READ | GENERIC_WRITE; break;
+        default:           access = 0; break;
+        }
+    }
+
+    switch(mode & 0x70)
+    {
+    case OF_SHARE_EXCLUSIVE:  sharing = 0; break;
+    case OF_SHARE_DENY_WRITE: sharing = FILE_SHARE_READ; break;
+    case OF_SHARE_DENY_READ:  sharing = FILE_SHARE_WRITE; break;
+    case OF_SHARE_DENY_NONE:
+    case OF_SHARE_COMPAT:
+    default:                  sharing = FILE_SHARE_READ | FILE_SHARE_WRITE; break;
+    }
+
+    return CreateFileW(path, access, sharing, NULL, creation, FILE_ATTRIBUTE_NORMAL, 0);
+}
 
 /***********************************************************************
  *           LZOpenFileW   (KERNEL32.@)
+ *
+ * Opens a file. If not compressed, open it as a normal file.
  */
-HFILE WINAPI LZOpenFileW( LPWSTR fn, LPOFSTRUCT ofs, WORD mode )
+HFILE WINAPI LZOpenFileW(LPWSTR fn, LPOFSTRUCT ofs, WORD mode)
 {
-    HFILE ret;
-    DWORD len = WideCharToMultiByte( CP_ACP, 0, fn, -1, NULL, 0, NULL, NULL );
-    LPSTR xfn = HeapAlloc( GetProcessHeap(), 0, len );
-    WideCharToMultiByte( CP_ACP, 0, fn, -1, xfn, len, NULL, NULL );
-    ret = LZOpenFileA(xfn,ofs,mode);
-    HeapFree( GetProcessHeap(), 0, xfn );
-    return ret;
-}
+    HFILE cfd, ret;
+    HANDLE file;
+    LPWSTR mfn;
+
+    TRACE("(%s, %p, %d)\n", debugstr_w(fn), ofs, mode);
+
+    file = create_file_OF(fn, mode);
+    if (file == INVALID_HANDLE_VALUE)
+    {
+        mfn = LZEXPAND_MangleName(fn);
+        file = create_file_OF(mfn, mode);
+        HeapFree(GetProcessHeap(), 0, mfn);
+    }
 
+    if (file == INVALID_HANDLE_VALUE)
+        return HFILE_ERROR;
+
+    ret = (HFILE)file;
+
+    /* 0x70 represents all OF_SHARE_* flags, ignore them for the check */
+    if ((mode & ~0x70) != OF_READ)
+        return ret;
+
+    cfd = LZInit(ret);
+    if (cfd <= 0)
+        return ret;
+
+    return cfd;
+}
 
 /***********************************************************************
  *           LZClose   (KERNEL32.@)
-- 
1.4.2.4


More information about the wine-patches mailing list