[winspool 3/6] Make sure that all of the driver directories for a print environment are created.

Jeremy White jwhite at codeweavers.com
Wed Dec 23 14:20:49 CST 2009


---
 dlls/winspool.drv/info.c |   89 ++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 89 insertions(+), 0 deletions(-)

diff --git a/dlls/winspool.drv/info.c b/dlls/winspool.drv/info.c
index 2a8c348..7a0dfe3 100644
--- a/dlls/winspool.drv/info.c
+++ b/dlls/winspool.drv/info.c
@@ -422,6 +422,94 @@ static HKEY WINSPOOL_OpenDriverReg( LPCVOID pEnvironment)
     return retval;
 }
 
+/*****************************************************************************
+ *          WINSPOOL_GetPPDName[internal]
+ *
+ *    Return the file name where we expect to find this ppd
+ *
+ */
+static char * WINSPOOL_GetPPDName(const printenv_t *env, const char *name)
+{
+    char *ppdFileName = NULL;
+    DWORD needed;
+    char *envname;
+    char *envversion;
+    const static char *ppd_ext = ".ppd";
+    TRACE("(%s)\n", name);
+
+    if (! env)
+    {
+        needed = strlen(name) + strlen(ppd_ext) + 1;
+        ppdFileName = HeapAlloc(GetProcessHeap(), 0, needed);
+        strcpy(ppdFileName, name);
+        strcat(ppdFileName, ppd_ext);
+    }
+    else
+    {
+        envname = strdupWtoA(env->envname);
+        envversion = strdupWtoA(env->versionsubdir);
+        if (!GetPrinterDriverDirectoryA(NULL, envname, 1, NULL, 0, &needed))
+        {
+            needed += strlen(envversion) + 1 + strlen(name) + strlen(ppd_ext);
+
+            ppdFileName = HeapAlloc(GetProcessHeap(), 0, needed);
+            if (GetPrinterDriverDirectoryA(NULL, envname, 1, (LPBYTE) ppdFileName, needed, &needed))
+            {
+                strcat(ppdFileName, envversion);
+                strcat(ppdFileName, "\\");
+                strcat(ppdFileName, name);
+                strcat(ppdFileName, ppd_ext);
+            }
+        }
+        HeapFree(GetProcessHeap(), 0, envname);
+        HeapFree(GetProcessHeap(), 0, envversion);
+    }
+    TRACE("(-> %s)\n", ppdFileName ? ppdFileName : "NULL");
+    return ppdFileName;
+}
+
+static BOOL is_driver_directory_missing(const printenv_t *env)
+{
+    char *buf, *p;
+    DWORD attr = INVALID_FILE_ATTRIBUTES;
+
+    buf = WINSPOOL_GetPPDName(env, "dummy");
+    for (p = buf + strlen(buf) - 1; p >= buf; p--)
+        if (*p == '\\')
+        {
+            *p = 0;
+            break;
+        }
+
+    if (p >= buf)
+        attr = GetFileAttributesA(buf);
+    HeapFree(GetProcessHeap(), 0, buf);
+    if (attr == INVALID_FILE_ATTRIBUTES || !(attr & FILE_ATTRIBUTE_DIRECTORY))
+        return TRUE;
+    return FALSE;
+}
+
+static void create_driver_directories(void)
+{
+    int i;
+    char *buf, *p, *q;
+    for (i = 0; i < sizeof(all_printenv)/sizeof(all_printenv[0]); i++)
+    {
+        if (! is_driver_directory_missing(all_printenv[i]))
+            continue;
+
+        buf = WINSPOOL_GetPPDName(all_printenv[i], "dummy");
+        for (p = buf, q = strchr(p + 1, '\\'); q; q = strchr(p + 1, '\\'))
+        {
+            *q = '\0';
+            CreateDirectoryA(buf, NULL);
+            *q = '\\';
+            p = q;
+        }
+        HeapFree(GetProcessHeap(), 0, buf);
+    }
+}
+
 static BOOL add_printer_driver(const char *name)
 {
     DRIVER_INFO_3A di3a;
@@ -1058,6 +1146,7 @@ void WINSPOOL_LoadSystemPrinters(void)
         HeapFree(GetProcessHeap(), 0, pi);
     }
 
+    create_driver_directories();
 
 #ifdef SONAME_LIBCUPS
     if (CUPS_LoadLibrary())



More information about the wine-patches mailing list