Huw Davies : localspl: Only store the file part of the filenames in the registry.

Alexandre Julliard julliard at winehq.org
Wed May 16 14:22:39 CDT 2012


Module: wine
Branch: master
Commit: 67886fe54fd7b3c91896b0c004ec79d1e22ca36a
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=67886fe54fd7b3c91896b0c004ec79d1e22ca36a

Author: Huw Davies <huw at codeweavers.com>
Date:   Wed May 16 13:48:18 2012 +0100

localspl: Only store the file part of the filenames in the registry.

---

 dlls/localspl/provider.c |   96 +++++++++++++++++++++++-----------------------
 1 files changed, 48 insertions(+), 48 deletions(-)

diff --git a/dlls/localspl/provider.c b/dlls/localspl/provider.c
index 848d11e..392b8ed 100644
--- a/dlls/localspl/provider.c
+++ b/dlls/localspl/provider.c
@@ -212,41 +212,29 @@ static LPWSTR strdupW(LPCWSTR p)
  *  Failure: FALSE
  *
  */
-static BOOL apd_copyfile(LPWSTR filename, apd_data_t *apd)
+static BOOL apd_copyfile( WCHAR *pathname, WCHAR *file_part, apd_data_t *apd )
 {
-    LPWSTR  ptr;
-    LPWSTR  srcname;
-    DWORD   res;
+    WCHAR *srcname;
+    DWORD res;
 
     apd->src[apd->srclen] = '\0';
     apd->dst[apd->dstlen] = '\0';
 
-    if (!filename || !filename[0]) {
+    if (!pathname || !pathname[0]) {
         /* nothing to copy */
         return TRUE;
     }
 
-    ptr = strrchrW(filename, '\\');
-    if (ptr) {
-        ptr++;
-    }
-    else
-    {
-        ptr = filename;
-    }
-
-    if (apd->copyflags & APD_COPY_FROM_DIRECTORY) {
-        /* we have an absolute Path */
-        srcname = filename;
-    }
+    if (apd->copyflags & APD_COPY_FROM_DIRECTORY)
+        srcname = pathname;
     else
     {
         srcname = apd->src;
-        lstrcatW(srcname, ptr);
+        strcatW( srcname, file_part );
     }
-    lstrcatW(apd->dst, ptr);
+    strcatW( apd->dst, file_part );
 
-    TRACE("%s => %s\n", debugstr_w(filename), debugstr_w(apd->dst));
+    TRACE("%s => %s\n", debugstr_w(srcname), debugstr_w(apd->dst));
 
     /* FIXME: handle APD_COPY_NEW_FILES */
     res = CopyFileW(srcname, apd->dst, FALSE);
@@ -1284,6 +1272,12 @@ end:
     return (HANDLE)printer;
 }
 
+static inline WCHAR *get_file_part( WCHAR *name )
+{
+    WCHAR *ptr = strrchrW( name, '\\' );
+    if (ptr) return ptr + 1;
+    return name;
+}
 
 /******************************************************************************
  *  myAddPrinterDriverEx [internal]
@@ -1299,7 +1293,7 @@ static BOOL myAddPrinterDriverEx(DWORD level, LPBYTE pDriverInfo, DWORD dwFileCo
     DRIVER_INFO_8W di;
     BOOL    (WINAPI *pDrvDriverEvent)(DWORD, DWORD, LPBYTE, LPARAM);
     HMODULE hui;
-    LPWSTR  ptr;
+    WCHAR *file;
     HKEY    hroot;
     HKEY    hdrv;
     DWORD   disposition;
@@ -1378,43 +1372,49 @@ static BOOL myAddPrinterDriverEx(DWORD level, LPBYTE pDriverInfo, DWORD dwFileCo
     RegSetValueExW(hdrv, versionW, 0, REG_DWORD, (const BYTE*) &env->driverversion,
                    sizeof(DWORD));
 
-    RegSetValueExW(hdrv, driverW, 0, REG_SZ, (LPBYTE) di.pDriverPath,
-                   (lstrlenW(di.pDriverPath)+1)* sizeof(WCHAR));
-    apd_copyfile(di.pDriverPath, &apd);
+    file = get_file_part( di.pDriverPath );
+    RegSetValueExW( hdrv, driverW, 0, REG_SZ, (LPBYTE)file, (strlenW( file ) + 1) * sizeof(WCHAR) );
+    apd_copyfile( di.pDriverPath, file, &apd );
 
-    RegSetValueExW(hdrv, data_fileW, 0, REG_SZ, (LPBYTE) di.pDataFile,
-                   (lstrlenW(di.pDataFile)+1)* sizeof(WCHAR));
-    apd_copyfile(di.pDataFile, &apd);
+    file = get_file_part( di.pDataFile );
+    RegSetValueExW( hdrv, data_fileW, 0, REG_SZ, (LPBYTE)file, (strlenW( file ) + 1) * sizeof(WCHAR) );
+    apd_copyfile( di.pDataFile, file, &apd );
 
-    RegSetValueExW(hdrv, configuration_fileW, 0, REG_SZ, (LPBYTE) di.pConfigFile,
-                   (lstrlenW(di.pConfigFile)+1)* sizeof(WCHAR));
-    apd_copyfile(di.pConfigFile, &apd);
+    file = get_file_part( di.pConfigFile );
+    RegSetValueExW( hdrv, configuration_fileW, 0, REG_SZ, (LPBYTE)file, (strlenW( file ) + 1) * sizeof(WCHAR) );
+    apd_copyfile( di.pConfigFile, file, &apd );
 
     /* settings for level 3 */
     if (di.pHelpFile)
-        RegSetValueExW(hdrv, help_fileW, 0, REG_SZ, (LPBYTE) di.pHelpFile,
-                       (lstrlenW(di.pHelpFile)+1)* sizeof(WCHAR));
+    {
+        file = get_file_part( di.pHelpFile );
+        RegSetValueExW( hdrv, help_fileW, 0, REG_SZ, (LPBYTE)file, (strlenW( file ) + 1) * sizeof(WCHAR) );
+        apd_copyfile( di.pHelpFile, file, &apd );
+    }
     else
-        RegSetValueExW(hdrv, help_fileW, 0, REG_SZ, (const BYTE*)emptyW, sizeof(emptyW));
-    apd_copyfile(di.pHelpFile, &apd);
+        RegSetValueExW( hdrv, help_fileW, 0, REG_SZ, (const BYTE*)emptyW, sizeof(emptyW) );
 
+    if (di.pDependentFiles && *di.pDependentFiles)
+    {
+        WCHAR *reg, *reg_ptr, *in_ptr;
+        reg = reg_ptr = HeapAlloc( GetProcessHeap(), 0, multi_sz_lenW( di.pDependentFiles ) );
 
-    ptr = di.pDependentFiles;
-    if (ptr)
-        RegSetValueExW(hdrv, dependent_filesW, 0, REG_MULTI_SZ, (LPBYTE) di.pDependentFiles,
-                       multi_sz_lenW(di.pDependentFiles));
-    else
-        RegSetValueExW(hdrv, dependent_filesW, 0, REG_MULTI_SZ, (const BYTE*)emptyW, sizeof(emptyW));
-    while ((ptr != NULL) && (ptr[0])) {
-        if (apd_copyfile(ptr, &apd)) {
-            ptr += lstrlenW(ptr) + 1;
-        }
-        else
+        for (in_ptr = di.pDependentFiles; *in_ptr; in_ptr += strlenW( in_ptr ) + 1)
         {
-            WARN("Failed to copy %s\n", debugstr_w(ptr));
-            ptr = NULL;
+            file = get_file_part( in_ptr );
+            len = strlenW( file ) + 1;
+            memcpy( reg_ptr, file, len * sizeof(WCHAR) );
+            reg_ptr += len;
+            apd_copyfile( in_ptr, file, &apd );
         }
+        *reg_ptr = 0;
+
+        RegSetValueExW( hdrv, dependent_filesW, 0, REG_MULTI_SZ, (LPBYTE)reg, (reg_ptr - reg + 1) * sizeof(WCHAR) );
+        HeapFree( GetProcessHeap(), 0, reg );
     }
+    else
+        RegSetValueExW(hdrv, dependent_filesW, 0, REG_MULTI_SZ, (const BYTE*)emptyW, sizeof(emptyW));
+
     /* The language-Monitor was already copied by the caller to "%SystemRoot%\system32" */
     if (di.pMonitorName)
         RegSetValueExW(hdrv, monitorW, 0, REG_SZ, (LPBYTE) di.pMonitorName,




More information about the wine-cvs mailing list