]> git.ipfire.org Git - thirdparty/cups.git/commitdiff
Add support for Mac OS X driver bundles.
authormike <mike@7a7537e8-13f0-0310-91df-b6672ffda945>
Wed, 20 Apr 2011 21:59:16 +0000 (21:59 +0000)
committermike <mike@7a7537e8-13f0-0310-91df-b6672ffda945>
Wed, 20 Apr 2011 21:59:16 +0000 (21:59 +0000)
git-svn-id: svn+ssh://src.apple.com/svn/cups/cups.org/trunk@9703 7a7537e8-13f0-0310-91df-b6672ffda945

scheduler/cups-driverd.cxx

index 58ceb8c369c174202875e86e231868cd930260ff..5acb38bac64f7e36806bc44279e25cb8116bb69a 100644 (file)
@@ -543,7 +543,10 @@ cat_static(const char *name,               /* I - PPD name */
   const char   *datadir;               /* CUPS_DATADIR env var */
   char         line[1024],             /* Line/filename */
                message[2048];          /* status-message */
-
+#ifdef __APPLE__
+  const char   *printerDriver,         /* Pointer to .printerDriver extension */
+               *slash;                 /* Pointer to next slash */
+#endif /* __APPLE__ */
 
   if (name[0] == '/' || strstr(name, "../") || strstr(name, "/.."))
   {
@@ -575,7 +578,19 @@ cat_static(const char *name,               /* I - PPD name */
 
 #ifdef __APPLE__
   if (!strncmp(name, "System/Library/Printers/PPDs/Contents/Resources/", 48) ||
-      !strncmp(name, "Library/Printers/PPDs/Contents/Resources/", 41))
+      !strncmp(name, "Library/Printers/PPDs/Contents/Resources/", 41) ||
+      (!strncmp(name, "System/Library/Printers/", 24) &&
+       (printerDriver =
+           strstr(name + 24,
+                  ".printerDriver/Contents/Resources/PPDs")) != NULL &&
+       (slash = strchr(name + 24, '/')) != NULL &&
+       slash > printerDriver) ||
+      (!strncmp(name, "Library/Printers/", 17) &&
+       (printerDriver =
+           strstr(name + 17,
+                  ".printerDriver/Contents/Resources/PPDs")) != NULL &&
+       (slash = strchr(name + 17, '/')) != NULL &&
+       slash > printerDriver))
   {
    /*
     * Map ppd-name to Mac OS X standard locations...
@@ -583,7 +598,6 @@ cat_static(const char *name,                /* I - PPD name */
 
     snprintf(line, sizeof(line), "/%s", name);
   }
-  else
 
 #elif defined(__linux)
   if (!strncmp(name, "lsb/usr/", 8))
@@ -872,10 +886,14 @@ list_ppds(int        request_id,  /* I - Request ID */
   * Load PPDs from standard Mac OS X locations...
   */
 
+  load_ppds("/Library/Printers",
+            "Library/Printers", 0);
   load_ppds("/Library/Printers/PPDs/Contents/Resources",
             "Library/Printers/PPDs/Contents/Resources", 0);
   load_ppds("/Library/Printers/PPDs/Contents/Resources/en.lproj",
             "Library/Printers/PPDs/Contents/Resources/en.lproj", 0);
+  load_ppds("/System/Library/Printers",
+            "System/Library/Printers", 0);
   load_ppds("/System/Library/Printers/PPDs/Contents/Resources",
             "System/Library/Printers/PPDs/Contents/Resources", 0);
   load_ppds("/System/Library/Printers/PPDs/Contents/Resources/en.lproj",
@@ -1850,11 +1868,29 @@ load_ppds(const char *d,                /* I - Actual directory */
       */
 
       if (descend)
+      {
        if (!load_ppds(filename, name, 1))
        {
          cupsDirClose(dir);
          return (1);
        }
+      }
+      else if ((ptr = filename + strlen(filename) - 14) > filename &&
+              !strcmp(ptr, ".printerDriver"))
+      {
+       /*
+        * Load PPDs in a printer driver bundle.
+       */
+
+       strlcat(filename, "/Contents/Resources/PPDs", sizeof(filename));
+       strlcat(name, "/Contents/Resources/PPDs", sizeof(name));
+
+       if (!load_ppds(filename, name, 0))
+       {
+         cupsDirClose(dir);
+         return (1);
+       }
+      }
 
       continue;
     }