[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