Tim Waugh ba9bc8
diff -up cups-1.4.6/scheduler/ipp.c.icc cups-1.4.6/scheduler/ipp.c
Tim Waugh c45b42
--- cups-1.4.6/scheduler/ipp.c.icc	2011-01-12 16:12:56.306371255 +0000
Tim Waugh c45b42
+++ cups-1.4.6/scheduler/ipp.c	2011-01-12 16:13:02.525066340 +0000
Tim Waugh ba9bc8
@@ -32,10 +32,6 @@
Tim Waugh ba9bc8
  *                                 based upon the printer state...
Tim Waugh ba9bc8
  *   add_queued_job_count()      - Add the "queued-job-count" attribute for the
Tim Waugh ba9bc8
  *                                 specified printer or class.
Tim Waugh ba9bc8
- *   apple_init_profile()        - Initialize a color profile.
Tim Waugh ba9bc8
- *   apple_register_profiles()   - Register color profiles for a printer.
Tim Waugh ba9bc8
- *   apple_unregister_profiles() - Remove color profiles for the specified
Tim Waugh ba9bc8
- *                                 printer.
Tim Waugh ba9bc8
  *   apply_printer_defaults()    - Apply printer default options to a job.
Tim Waugh ba9bc8
  *   authenticate_job()          - Set job authentication info.
Tim Waugh ba9bc8
  *   cancel_all_jobs()           - Cancel all print jobs.
Tim Waugh ba9bc8
@@ -107,11 +103,9 @@
Tim Waugh ba9bc8
  */
Tim Waugh ba9bc8
 
Tim Waugh ba9bc8
 #include "cupsd.h"
Tim Waugh ba9bc8
-#include <cups/ppd-private.h>
Tim Waugh ba9bc8
 
Tim Waugh ba9bc8
 #ifdef __APPLE__
Tim Waugh ba9bc8
 #  include <ApplicationServices/ApplicationServices.h>
Tim Waugh ba9bc8
-#  include <CoreFoundation/CoreFoundation.h>
Tim Waugh ba9bc8
 #  ifdef HAVE_MEMBERSHIP_H
Tim Waugh ba9bc8
 #    include <membership.h>
Tim Waugh ba9bc8
 #  endif /* HAVE_MEMBERSHIP_H */
Tim Waugh ba9bc8
@@ -142,14 +136,6 @@ static void	add_printer(cupsd_client_t *
Tim Waugh ba9bc8
 static void	add_printer_state_reasons(cupsd_client_t *con,
Tim Waugh ba9bc8
 		                          cupsd_printer_t *p);
Tim Waugh ba9bc8
 static void	add_queued_job_count(cupsd_client_t *con, cupsd_printer_t *p);
Tim Waugh ba9bc8
-#ifdef __APPLE__
Tim Waugh ba9bc8
-static void	apple_init_profile(ppd_file_t *ppd, cups_array_t *languages,
Tim Waugh ba9bc8
-		                   CMDeviceProfileInfo *profile, unsigned id,
Tim Waugh ba9bc8
-		                   const char *name, const char *text,
Tim Waugh ba9bc8
-				   const char *iccfile);
Tim Waugh ba9bc8
-static void	apple_register_profiles(cupsd_printer_t *p);
Tim Waugh ba9bc8
-static void	apple_unregister_profiles(cupsd_printer_t *p);
Tim Waugh ba9bc8
-#endif /* __APPLE__ */
Tim Waugh ba9bc8
 static void	apply_printer_defaults(cupsd_printer_t *printer,
Tim Waugh ba9bc8
 				       cupsd_job_t *job);
Tim Waugh ba9bc8
 static void	authenticate_job(cupsd_client_t *con, ipp_attribute_t *uri);
Tim Waugh ba9bc8
@@ -2947,17 +2933,15 @@ add_printer(cupsd_client_t  *con,	/* I -
Tim Waugh ba9bc8
 
Tim Waugh ba9bc8
     cupsdSetPrinterReasons(printer, "none");
Tim Waugh ba9bc8
 
Tim Waugh ba9bc8
-#ifdef __APPLE__
Tim Waugh ba9bc8
    /*
Tim Waugh ba9bc8
     * (Re)register color profiles...
Tim Waugh ba9bc8
     */
Tim Waugh ba9bc8
 
Tim Waugh ba9bc8
     if (!RunUser)
Tim Waugh ba9bc8
     {
Tim Waugh ba9bc8
-      apple_unregister_profiles(printer);
Tim Waugh ba9bc8
-      apple_register_profiles(printer);
Tim Waugh ba9bc8
+      cupsdUnregisterColorProfiles(printer);
Tim Waugh ba9bc8
+      cupsdRegisterColorProfiles(printer);
Tim Waugh ba9bc8
     }
Tim Waugh ba9bc8
-#endif /* __APPLE__ */
Tim Waugh ba9bc8
   }
Tim Waugh ba9bc8
 
Tim Waugh ba9bc8
  /*
Tim Waugh ba9bc8
@@ -3093,553 +3077,6 @@ add_queued_job_count(
Tim Waugh ba9bc8
 }
Tim Waugh ba9bc8
 
Tim Waugh ba9bc8
 
Tim Waugh ba9bc8
-#ifdef __APPLE__
Tim Waugh ba9bc8
-/*
Tim Waugh ba9bc8
- * 'apple_init_profile()' - Initialize a color profile.
Tim Waugh ba9bc8
- */
Tim Waugh ba9bc8
-
Tim Waugh ba9bc8
-static void
Tim Waugh ba9bc8
-apple_init_profile(
Tim Waugh ba9bc8
-    ppd_file_t          *ppd,		/* I - PPD file */
Tim Waugh ba9bc8
-    cups_array_t	*languages,	/* I - Languages in the PPD file */
Tim Waugh ba9bc8
-    CMDeviceProfileInfo *profile,	/* I - Profile record */
Tim Waugh ba9bc8
-    unsigned            id,		/* I - Profile ID */
Tim Waugh ba9bc8
-    const char          *name,		/* I - Profile name */
Tim Waugh ba9bc8
-    const char          *text,		/* I - Profile UI text */
Tim Waugh ba9bc8
-    const char          *iccfile)	/* I - ICC filename */
Tim Waugh ba9bc8
-{
Tim Waugh ba9bc8
-  char			url[1024];	/* URL for profile filename */
Tim Waugh ba9bc8
-  CFMutableDictionaryRef dict;		/* Dictionary for name */
Tim Waugh ba9bc8
-  char			*language;	/* Current language */
Tim Waugh ba9bc8
-  ppd_attr_t		*attr;		/* Profile attribute */
Tim Waugh ba9bc8
-  CFStringRef		cflang,		/* Language string */
Tim Waugh ba9bc8
-			cftext;		/* Localized text */
Tim Waugh ba9bc8
-
Tim Waugh ba9bc8
-
Tim Waugh ba9bc8
- /*
Tim Waugh ba9bc8
-  * Build the profile name dictionary...
Tim Waugh ba9bc8
-  */
Tim Waugh ba9bc8
-
Tim Waugh ba9bc8
-  dict = CFDictionaryCreateMutable(kCFAllocatorDefault, 0,
Tim Waugh ba9bc8
-				   &kCFTypeDictionaryKeyCallBacks,
Tim Waugh ba9bc8
-				   &kCFTypeDictionaryValueCallBacks);
Tim Waugh ba9bc8
-
Tim Waugh ba9bc8
-  cftext = CFStringCreateWithCString(kCFAllocatorDefault, text,
Tim Waugh ba9bc8
-				     kCFStringEncodingUTF8);
Tim Waugh ba9bc8
-
Tim Waugh ba9bc8
-  if (cftext)
Tim Waugh ba9bc8
-  {
Tim Waugh ba9bc8
-    CFDictionarySetValue(dict, CFSTR("en"), cftext);
Tim Waugh ba9bc8
-    CFRelease(cftext);
Tim Waugh ba9bc8
-  }
Tim Waugh ba9bc8
-
Tim Waugh ba9bc8
-  if (languages)
Tim Waugh ba9bc8
-  {
Tim Waugh ba9bc8
-   /*
Tim Waugh ba9bc8
-    * Find localized names for the color profiles...
Tim Waugh ba9bc8
-    */
Tim Waugh ba9bc8
-
Tim Waugh ba9bc8
-    cupsArraySave(ppd->sorted_attrs);
Tim Waugh ba9bc8
-
Tim Waugh ba9bc8
-    for (language = (char *)cupsArrayFirst(languages);
Tim Waugh ba9bc8
-	 language;
Tim Waugh ba9bc8
-	 language = (char *)cupsArrayNext(languages))
Tim Waugh ba9bc8
-    {
Tim Waugh ba9bc8
-      if (iccfile)
Tim Waugh ba9bc8
-      {
Tim Waugh ba9bc8
-        if ((attr = _ppdLocalizedAttr(ppd, "cupsICCProfile", name,
Tim Waugh ba9bc8
-	                              language)) == NULL)
Tim Waugh ba9bc8
-	  attr = _ppdLocalizedAttr(ppd, "APTiogaProfile", name, language);
Tim Waugh ba9bc8
-      }
Tim Waugh ba9bc8
-      else
Tim Waugh ba9bc8
-        attr = _ppdLocalizedAttr(ppd, "ColorModel", name, language);
Tim Waugh ba9bc8
-
Tim Waugh ba9bc8
-      if (attr && attr->text[0])
Tim Waugh ba9bc8
-      {
Tim Waugh ba9bc8
-	cflang = CFStringCreateWithCString(kCFAllocatorDefault, language,
Tim Waugh ba9bc8
-					   kCFStringEncodingUTF8);
Tim Waugh ba9bc8
-	cftext = CFStringCreateWithCString(kCFAllocatorDefault, attr->text,
Tim Waugh ba9bc8
-					   kCFStringEncodingUTF8);
Tim Waugh ba9bc8
-
Tim Waugh ba9bc8
-        if (cflang && cftext)
Tim Waugh ba9bc8
-	  CFDictionarySetValue(dict, cflang, cftext);
Tim Waugh ba9bc8
-
Tim Waugh ba9bc8
-        if (cflang)
Tim Waugh ba9bc8
-	  CFRelease(cflang);
Tim Waugh ba9bc8
-
Tim Waugh ba9bc8
-        if (cftext)
Tim Waugh ba9bc8
-	  CFRelease(cftext);
Tim Waugh ba9bc8
-      }
Tim Waugh ba9bc8
-    }
Tim Waugh ba9bc8
-
Tim Waugh ba9bc8
-    cupsArrayRestore(ppd->sorted_attrs);
Tim Waugh ba9bc8
-  }
Tim Waugh ba9bc8
-
Tim Waugh ba9bc8
- /*
Tim Waugh ba9bc8
-  * Fill in the profile data...
Tim Waugh ba9bc8
-  */
Tim Waugh ba9bc8
-
Tim Waugh ba9bc8
-  if (iccfile)
Tim Waugh ba9bc8
-    httpAssembleURI(HTTP_URI_CODING_ALL, url, sizeof(url), "file", NULL, "", 0,
Tim Waugh ba9bc8
-		    iccfile);
Tim Waugh ba9bc8
-
Tim Waugh ba9bc8
-  profile->dataVersion        = cmDeviceProfileInfoVersion1;
Tim Waugh ba9bc8
-  profile->profileID          = id;
Tim Waugh ba9bc8
-  profile->profileLoc.locType = iccfile ? cmPathBasedProfile : cmNoProfileBase;
Tim Waugh ba9bc8
-  profile->profileName        = dict;
Tim Waugh ba9bc8
-
Tim Waugh ba9bc8
-  if (iccfile)
Tim Waugh ba9bc8
-    strlcpy(profile->profileLoc.u.pathLoc.path, iccfile,
Tim Waugh ba9bc8
-	    sizeof(profile->profileLoc.u.pathLoc.path));
Tim Waugh ba9bc8
-}
Tim Waugh ba9bc8
-
Tim Waugh ba9bc8
-
Tim Waugh ba9bc8
-/*
Tim Waugh ba9bc8
- * 'apple_register_profiles()' - Register color profiles for a printer.
Tim Waugh ba9bc8
- */
Tim Waugh ba9bc8
-
Tim Waugh ba9bc8
-static void
Tim Waugh ba9bc8
-apple_register_profiles(
Tim Waugh ba9bc8
-    cupsd_printer_t *p)			/* I - Printer */
Tim Waugh ba9bc8
-{
Tim Waugh ba9bc8
-  int			i;		/* Looping var */
Tim Waugh ba9bc8
-  char			ppdfile[1024],	/* PPD filename */
Tim Waugh ba9bc8
-			iccfile[1024],	/* ICC filename */
Tim Waugh ba9bc8
-			selector[PPD_MAX_NAME];
Tim Waugh ba9bc8
-					/* Profile selection string */
Tim Waugh ba9bc8
-  ppd_file_t		*ppd;		/* PPD file */
Tim Waugh ba9bc8
-  ppd_attr_t		*attr,		/* Profile attributes */
Tim Waugh ba9bc8
-			*profileid_attr,/* cupsProfileID attribute */
Tim Waugh ba9bc8
-			*q1_attr,	/* ColorModel (or other) qualifier */
Tim Waugh ba9bc8
-			*q2_attr,	/* MediaType (or other) qualifier */
Tim Waugh ba9bc8
-			*q3_attr;	/* Resolution (or other) qualifier */
Tim Waugh ba9bc8
-  char			q_keyword[PPD_MAX_NAME];
Tim Waugh ba9bc8
-					/* Qualifier keyword */
Tim Waugh ba9bc8
-  const char		*q1_choice,	/* ColorModel (or other) choice */
Tim Waugh ba9bc8
-			*q2_choice,	/* MediaType (or other) choice */
Tim Waugh ba9bc8
-			*q3_choice;	/* Resolution (or other) choice */
Tim Waugh ba9bc8
-  const char		*profile_key;	/* Profile keyword */
Tim Waugh ba9bc8
-  ppd_option_t		*cm_option;	/* Color model option */
Tim Waugh ba9bc8
-  ppd_choice_t		*cm_choice;	/* Color model choice */
Tim Waugh ba9bc8
-  int			num_profiles;	/* Number of profiles */
Tim Waugh ba9bc8
-  CMError		error;		/* Last error */
Tim Waugh ba9bc8
-  unsigned		device_id,	/* Printer device ID */
Tim Waugh ba9bc8
-			profile_id,	/* Profile ID */
Tim Waugh ba9bc8
-			default_profile_id = 0;
Tim Waugh ba9bc8
-					/* Default profile ID */
Tim Waugh ba9bc8
-  CFMutableDictionaryRef device_name;	/* Printer device name dictionary */
Tim Waugh ba9bc8
-  CFStringRef		printer_name;	/* Printer name string */
Tim Waugh ba9bc8
-  CMDeviceScope		scope =		/* Scope of the registration */
Tim Waugh ba9bc8
-			{
Tim Waugh ba9bc8
-			  kCFPreferencesAnyUser,
Tim Waugh ba9bc8
-			  kCFPreferencesCurrentHost
Tim Waugh ba9bc8
-			};
Tim Waugh ba9bc8
-  CMDeviceProfileArrayPtr profiles;	/* Profiles */
Tim Waugh ba9bc8
-  CMDeviceProfileInfo	*profile;	/* Current profile */
Tim Waugh ba9bc8
-  cups_array_t		*languages;	/* Languages array */
Tim Waugh ba9bc8
-
Tim Waugh ba9bc8
-
Tim Waugh ba9bc8
- /*
Tim Waugh ba9bc8
-  * Make sure ColorSync is available...
Tim Waugh ba9bc8
-  */
Tim Waugh ba9bc8
-
Tim Waugh ba9bc8
-  if (CMRegisterColorDevice == NULL)
Tim Waugh ba9bc8
-    return;
Tim Waugh ba9bc8
-
Tim Waugh ba9bc8
- /*
Tim Waugh ba9bc8
-  * Try opening the PPD file for this printer...
Tim Waugh ba9bc8
-  */
Tim Waugh ba9bc8
-
Tim Waugh ba9bc8
-  snprintf(ppdfile, sizeof(ppdfile), "%s/ppd/%s.ppd", ServerRoot, p->name);
Tim Waugh ba9bc8
-  if ((ppd = ppdOpenFile(ppdfile)) == NULL)
Tim Waugh ba9bc8
-    return;
Tim Waugh ba9bc8
-
Tim Waugh ba9bc8
- /*
Tim Waugh ba9bc8
-  * See if we have any profiles...
Tim Waugh ba9bc8
-  */
Tim Waugh ba9bc8
-
Tim Waugh ba9bc8
-  if ((attr = ppdFindAttr(ppd, "APTiogaProfile", NULL)) != NULL)
Tim Waugh ba9bc8
-    profile_key = "APTiogaProfile";
Tim Waugh ba9bc8
-  else
Tim Waugh ba9bc8
-  {
Tim Waugh ba9bc8
-    attr = ppdFindAttr(ppd, "cupsICCProfile", NULL);
Tim Waugh ba9bc8
-    profile_key = "cupsICCProfile";
Tim Waugh ba9bc8
-  }
Tim Waugh ba9bc8
-
Tim Waugh ba9bc8
-  for (num_profiles = 0; attr; attr = ppdFindNextAttr(ppd, profile_key, NULL))
Tim Waugh ba9bc8
-    if (attr->spec[0] && attr->value && attr->value[0])
Tim Waugh ba9bc8
-    {
Tim Waugh ba9bc8
-      if (attr->value[0] != '/')
Tim Waugh ba9bc8
-	snprintf(iccfile, sizeof(iccfile), "%s/profiles/%s", DataDir,
Tim Waugh ba9bc8
-		 attr->value);
Tim Waugh ba9bc8
-      else
Tim Waugh ba9bc8
-	strlcpy(iccfile, attr->value, sizeof(iccfile));
Tim Waugh ba9bc8
-
Tim Waugh ba9bc8
-      if (access(iccfile, 0))
Tim Waugh ba9bc8
-	continue;
Tim Waugh ba9bc8
-
Tim Waugh ba9bc8
-      num_profiles ++;
Tim Waugh ba9bc8
-    }
Tim Waugh ba9bc8
-
Tim Waugh ba9bc8
-
Tim Waugh ba9bc8
- /*
Tim Waugh ba9bc8
-  * If we have profiles, add them...
Tim Waugh ba9bc8
-  */
Tim Waugh ba9bc8
-
Tim Waugh ba9bc8
-  if (num_profiles > 0)
Tim Waugh ba9bc8
-  {
Tim Waugh ba9bc8
-    if (profile_key[0] == 'A')
Tim Waugh ba9bc8
-    {
Tim Waugh ba9bc8
-     /*
Tim Waugh ba9bc8
-      * For Tioga PPDs, get the default profile using the DefaultAPTiogaProfile
Tim Waugh ba9bc8
-      * attribute...
Tim Waugh ba9bc8
-      */
Tim Waugh ba9bc8
-
Tim Waugh ba9bc8
-      if ((attr = ppdFindAttr(ppd, "DefaultAPTiogaProfile", NULL)) != NULL &&
Tim Waugh ba9bc8
-	  attr->value)
Tim Waugh ba9bc8
-        default_profile_id = atoi(attr->value);
Tim Waugh ba9bc8
-
Tim Waugh ba9bc8
-      q1_choice = q2_choice = q3_choice = NULL;
Tim Waugh ba9bc8
-    }
Tim Waugh ba9bc8
-    else
Tim Waugh ba9bc8
-    {
Tim Waugh ba9bc8
-     /*
Tim Waugh ba9bc8
-      * For CUPS PPDs, figure out the default profile selector values...
Tim Waugh ba9bc8
-      */
Tim Waugh ba9bc8
-
Tim Waugh ba9bc8
-      if ((attr = ppdFindAttr(ppd, "cupsICCQualifier1", NULL)) != NULL &&
Tim Waugh ba9bc8
-	  attr->value && attr->value[0])
Tim Waugh ba9bc8
-      {
Tim Waugh ba9bc8
-	snprintf(q_keyword, sizeof(q_keyword), "Default%s", attr->value);
Tim Waugh ba9bc8
-	q1_attr = ppdFindAttr(ppd, q_keyword, NULL);
Tim Waugh ba9bc8
-      }
Tim Waugh ba9bc8
-      else if ((q1_attr = ppdFindAttr(ppd, "DefaultColorModel", NULL)) == NULL)
Tim Waugh ba9bc8
-	q1_attr = ppdFindAttr(ppd, "DefaultColorSpace", NULL);
Tim Waugh ba9bc8
-
Tim Waugh ba9bc8
-      if (q1_attr && q1_attr->value && q1_attr->value[0])
Tim Waugh ba9bc8
-	q1_choice = q1_attr->value;
Tim Waugh ba9bc8
-      else
Tim Waugh ba9bc8
-	q1_choice = "";
Tim Waugh ba9bc8
-
Tim Waugh ba9bc8
-      if ((attr = ppdFindAttr(ppd, "cupsICCQualifier2", NULL)) != NULL &&
Tim Waugh ba9bc8
-	  attr->value && attr->value[0])
Tim Waugh ba9bc8
-      {
Tim Waugh ba9bc8
-	snprintf(q_keyword, sizeof(q_keyword), "Default%s", attr->value);
Tim Waugh ba9bc8
-	q2_attr = ppdFindAttr(ppd, q_keyword, NULL);
Tim Waugh ba9bc8
-      }
Tim Waugh ba9bc8
-      else
Tim Waugh ba9bc8
-	q2_attr = ppdFindAttr(ppd, "DefaultMediaType", NULL);
Tim Waugh ba9bc8
-
Tim Waugh ba9bc8
-      if (q2_attr && q2_attr->value && q2_attr->value[0])
Tim Waugh ba9bc8
-	q2_choice = q2_attr->value;
Tim Waugh ba9bc8
-      else
Tim Waugh ba9bc8
-	q2_choice = NULL;
Tim Waugh ba9bc8
-
Tim Waugh ba9bc8
-      if ((attr = ppdFindAttr(ppd, "cupsICCQualifier3", NULL)) != NULL &&
Tim Waugh ba9bc8
-	  attr->value && attr->value[0])
Tim Waugh ba9bc8
-      {
Tim Waugh ba9bc8
-	snprintf(q_keyword, sizeof(q_keyword), "Default%s", attr->value);
Tim Waugh ba9bc8
-	q3_attr = ppdFindAttr(ppd, q_keyword, NULL);
Tim Waugh ba9bc8
-      }
Tim Waugh ba9bc8
-      else
Tim Waugh ba9bc8
-	q3_attr = ppdFindAttr(ppd, "DefaultResolution", NULL);
Tim Waugh ba9bc8
-
Tim Waugh ba9bc8
-      if (q3_attr && q3_attr->value && q3_attr->value[0])
Tim Waugh ba9bc8
-	q3_choice = q3_attr->value;
Tim Waugh ba9bc8
-      else
Tim Waugh ba9bc8
-	q3_choice = NULL;
Tim Waugh ba9bc8
-    }
Tim Waugh ba9bc8
-
Tim Waugh ba9bc8
-   /*
Tim Waugh ba9bc8
-    * Build the array of profiles...
Tim Waugh ba9bc8
-    *
Tim Waugh ba9bc8
-    * Note: This calloc actually requests slightly more memory than needed.
Tim Waugh ba9bc8
-    */
Tim Waugh ba9bc8
-
Tim Waugh ba9bc8
-    if ((profiles = calloc(num_profiles, sizeof(CMDeviceProfileArray))) == NULL)
Tim Waugh ba9bc8
-    {
Tim Waugh ba9bc8
-      cupsdLogMessage(CUPSD_LOG_ERROR,
Tim Waugh ba9bc8
-                      "Unable to allocate memory for %d profiles!",
Tim Waugh ba9bc8
-		      num_profiles);
Tim Waugh ba9bc8
-      ppdClose(ppd);
Tim Waugh ba9bc8
-      return;
Tim Waugh ba9bc8
-    }
Tim Waugh ba9bc8
-
Tim Waugh ba9bc8
-    profiles->profileCount = num_profiles;
Tim Waugh ba9bc8
-    languages              = _ppdGetLanguages(ppd);
Tim Waugh ba9bc8
-
Tim Waugh ba9bc8
-    for (profile = profiles->profiles,
Tim Waugh ba9bc8
-             attr = ppdFindAttr(ppd, profile_key, NULL);
Tim Waugh ba9bc8
-	 attr;
Tim Waugh ba9bc8
-	 attr = ppdFindNextAttr(ppd, profile_key, NULL))
Tim Waugh ba9bc8
-      if (attr->spec[0] && attr->value && attr->value[0])
Tim Waugh ba9bc8
-      {
Tim Waugh ba9bc8
-       /*
Tim Waugh ba9bc8
-        * Add this profile...
Tim Waugh ba9bc8
-	*/
Tim Waugh ba9bc8
-
Tim Waugh ba9bc8
-        if (attr->value[0] != '/')
Tim Waugh ba9bc8
-	  snprintf(iccfile, sizeof(iccfile), "%s/profiles/%s", DataDir,
Tim Waugh ba9bc8
-	           attr->value);
Tim Waugh ba9bc8
-        else
Tim Waugh ba9bc8
-	  strlcpy(iccfile, attr->value, sizeof(iccfile));
Tim Waugh ba9bc8
-
Tim Waugh ba9bc8
-        if (access(iccfile, 0))
Tim Waugh ba9bc8
-	  continue;
Tim Waugh ba9bc8
-
Tim Waugh ba9bc8
-        if (profile_key[0] == 'c')
Tim Waugh ba9bc8
-	{
Tim Waugh ba9bc8
-	  cupsArraySave(ppd->sorted_attrs);
Tim Waugh ba9bc8
-
Tim Waugh ba9bc8
-	  if ((profileid_attr = ppdFindAttr(ppd, "cupsProfileID",
Tim Waugh ba9bc8
-					    attr->spec)) != NULL &&
Tim Waugh ba9bc8
-	      profileid_attr->value && isdigit(profileid_attr->value[0] & 255))
Tim Waugh ba9bc8
-	    profile_id = (unsigned)strtoul(profileid_attr->value, NULL, 10);
Tim Waugh ba9bc8
-	  else
Tim Waugh ba9bc8
-	    profile_id = _ppdHashName(attr->spec);
Tim Waugh ba9bc8
-
Tim Waugh ba9bc8
-	  cupsArrayRestore(ppd->sorted_attrs);
Tim Waugh ba9bc8
-        }
Tim Waugh ba9bc8
-	else
Tim Waugh ba9bc8
-	  profile_id = atoi(attr->spec);
Tim Waugh ba9bc8
-
Tim Waugh ba9bc8
-        apple_init_profile(ppd, languages, profile, profile_id, attr->spec,
Tim Waugh ba9bc8
-	                   attr->text[0] ? attr->text : attr->spec, iccfile);
Tim Waugh ba9bc8
-
Tim Waugh ba9bc8
-	profile ++;
Tim Waugh ba9bc8
-
Tim Waugh ba9bc8
-       /*
Tim Waugh ba9bc8
-        * See if this is the default profile...
Tim Waugh ba9bc8
-	*/
Tim Waugh ba9bc8
-
Tim Waugh ba9bc8
-        if (!default_profile_id)
Tim Waugh ba9bc8
-	{
Tim Waugh ba9bc8
-	  if (q2_choice)
Tim Waugh ba9bc8
-	  {
Tim Waugh ba9bc8
-	    if (q3_choice)
Tim Waugh ba9bc8
-	    {
Tim Waugh ba9bc8
-	      snprintf(selector, sizeof(selector), "%s.%s.%s",
Tim Waugh ba9bc8
-	               q1_choice, q2_choice, q3_choice);
Tim Waugh ba9bc8
-              if (!strcmp(selector, attr->spec))
Tim Waugh ba9bc8
-	        default_profile_id = profile_id;
Tim Waugh ba9bc8
-            }
Tim Waugh ba9bc8
-
Tim Waugh ba9bc8
-            if (!default_profile_id)
Tim Waugh ba9bc8
-	    {
Tim Waugh ba9bc8
-	      snprintf(selector, sizeof(selector), "%s.%s.", q1_choice,
Tim Waugh ba9bc8
-	               q2_choice);
Tim Waugh ba9bc8
-              if (!strcmp(selector, attr->spec))
Tim Waugh ba9bc8
-	        default_profile_id = profile_id;
Tim Waugh ba9bc8
-	    }
Tim Waugh ba9bc8
-          }
Tim Waugh ba9bc8
-
Tim Waugh ba9bc8
-          if (!default_profile_id && q3_choice)
Tim Waugh ba9bc8
-	  {
Tim Waugh ba9bc8
-	    snprintf(selector, sizeof(selector), "%s..%s", q1_choice,
Tim Waugh ba9bc8
-	             q3_choice);
Tim Waugh ba9bc8
-	    if (!strcmp(selector, attr->spec))
Tim Waugh ba9bc8
-	      default_profile_id = profile_id;
Tim Waugh ba9bc8
-	  }
Tim Waugh ba9bc8
-
Tim Waugh ba9bc8
-          if (!default_profile_id)
Tim Waugh ba9bc8
-	  {
Tim Waugh ba9bc8
-	    snprintf(selector, sizeof(selector), "%s..", q1_choice);
Tim Waugh ba9bc8
-	    if (!strcmp(selector, attr->spec))
Tim Waugh ba9bc8
-	      default_profile_id = profile_id;
Tim Waugh ba9bc8
-	  }
Tim Waugh ba9bc8
-	}
Tim Waugh ba9bc8
-      }
Tim Waugh ba9bc8
-
Tim Waugh ba9bc8
-    _ppdFreeLanguages(languages);
Tim Waugh ba9bc8
-  }
Tim Waugh ba9bc8
-  else if ((cm_option = ppdFindOption(ppd, "ColorModel")) != NULL)
Tim Waugh ba9bc8
-  {
Tim Waugh ba9bc8
-   /*
Tim Waugh ba9bc8
-    * Extract profiles from ColorModel option...
Tim Waugh ba9bc8
-    */
Tim Waugh ba9bc8
-
Tim Waugh ba9bc8
-    const char *profile_name;		/* Name of generic profile */
Tim Waugh ba9bc8
-
Tim Waugh ba9bc8
-
Tim Waugh ba9bc8
-    num_profiles = cm_option->num_choices;
Tim Waugh ba9bc8
-
Tim Waugh ba9bc8
-    if ((profiles = calloc(num_profiles, sizeof(CMDeviceProfileArray))) == NULL)
Tim Waugh ba9bc8
-    {
Tim Waugh ba9bc8
-      cupsdLogMessage(CUPSD_LOG_ERROR,
Tim Waugh ba9bc8
-                      "Unable to allocate memory for %d profiles!",
Tim Waugh ba9bc8
-		      num_profiles);
Tim Waugh ba9bc8
-      ppdClose(ppd);
Tim Waugh ba9bc8
-      return;
Tim Waugh ba9bc8
-    }
Tim Waugh ba9bc8
-
Tim Waugh ba9bc8
-    profiles->profileCount = num_profiles;
Tim Waugh ba9bc8
-
Tim Waugh ba9bc8
-    for (profile = profiles->profiles, i = cm_option->num_choices,
Tim Waugh ba9bc8
-             cm_choice = cm_option->choices;
Tim Waugh ba9bc8
-         i > 0;
Tim Waugh ba9bc8
-	 i --, cm_choice ++, profile ++)
Tim Waugh ba9bc8
-    {
Tim Waugh ba9bc8
-      if (!strcmp(cm_choice->choice, "Gray") ||
Tim Waugh ba9bc8
-          !strcmp(cm_choice->choice, "Black"))
Tim Waugh ba9bc8
-        profile_name = "Gray";
Tim Waugh ba9bc8
-      else if (!strcmp(cm_choice->choice, "RGB") ||
Tim Waugh ba9bc8
-               !strcmp(cm_choice->choice, "CMY"))
Tim Waugh ba9bc8
-        profile_name = "RGB";
Tim Waugh ba9bc8
-      else if (!strcmp(cm_choice->choice, "CMYK") ||
Tim Waugh ba9bc8
-               !strcmp(cm_choice->choice, "KCMY"))
Tim Waugh ba9bc8
-        profile_name = "CMYK";
Tim Waugh ba9bc8
-      else
Tim Waugh ba9bc8
-        profile_name = "DeviceN";
Tim Waugh ba9bc8
-
Tim Waugh ba9bc8
-      snprintf(selector, sizeof(selector), "%s..", profile_name);
Tim Waugh ba9bc8
-      profile_id = _ppdHashName(selector);
Tim Waugh ba9bc8
-
Tim Waugh ba9bc8
-      apple_init_profile(ppd, NULL, profile, profile_id, cm_choice->choice,
Tim Waugh ba9bc8
-                         cm_choice->text, NULL);
Tim Waugh ba9bc8
-
Tim Waugh ba9bc8
-      if (cm_choice->marked)
Tim Waugh ba9bc8
-        default_profile_id = profile_id;
Tim Waugh ba9bc8
-    }
Tim Waugh ba9bc8
-  }
Tim Waugh ba9bc8
-  else
Tim Waugh ba9bc8
-  {
Tim Waugh ba9bc8
-   /*
Tim Waugh ba9bc8
-    * Use the default colorspace...
Tim Waugh ba9bc8
-    */
Tim Waugh ba9bc8
-
Tim Waugh ba9bc8
-    attr = ppdFindAttr(ppd, "DefaultColorSpace", NULL);
Tim Waugh ba9bc8
-
Tim Waugh ba9bc8
-    num_profiles = (attr && ppd->colorspace == PPD_CS_GRAY) ? 1 : 2;
Tim Waugh ba9bc8
-
Tim Waugh ba9bc8
-    if ((profiles = calloc(num_profiles, sizeof(CMDeviceProfileArray))) == NULL)
Tim Waugh ba9bc8
-    {
Tim Waugh ba9bc8
-      cupsdLogMessage(CUPSD_LOG_ERROR,
Tim Waugh ba9bc8
-                      "Unable to allocate memory for %d profiles!",
Tim Waugh ba9bc8
-		      num_profiles);
Tim Waugh ba9bc8
-      ppdClose(ppd);
Tim Waugh ba9bc8
-      return;
Tim Waugh ba9bc8
-    }
Tim Waugh ba9bc8
-
Tim Waugh ba9bc8
-    profiles->profileCount = num_profiles;
Tim Waugh ba9bc8
-
Tim Waugh ba9bc8
-    apple_init_profile(ppd, NULL, profiles->profiles, _ppdHashName("Gray.."),
Tim Waugh ba9bc8
-                       "Gray", "Gray", NULL);
Tim Waugh ba9bc8
-
Tim Waugh ba9bc8
-    switch (ppd->colorspace)
Tim Waugh ba9bc8
-    {
Tim Waugh ba9bc8
-      case PPD_CS_RGB :
Tim Waugh ba9bc8
-      case PPD_CS_CMY :
Tim Waugh ba9bc8
-          apple_init_profile(ppd, NULL, profiles->profiles + 1,
Tim Waugh ba9bc8
-	                     _ppdHashName("RGB.."), "RGB", "RGB", NULL);
Tim Waugh ba9bc8
-          break;
Tim Waugh ba9bc8
-      case PPD_CS_RGBK :
Tim Waugh ba9bc8
-      case PPD_CS_CMYK :
Tim Waugh ba9bc8
-          apple_init_profile(ppd, NULL, profiles->profiles + 1,
Tim Waugh ba9bc8
-	                     _ppdHashName("CMYK.."), "CMYK", "CMYK", NULL);
Tim Waugh ba9bc8
-          break;
Tim Waugh ba9bc8
-
Tim Waugh ba9bc8
-      case PPD_CS_GRAY :
Tim Waugh ba9bc8
-          if (attr)
Tim Waugh ba9bc8
-	    break;
Tim Waugh ba9bc8
-
Tim Waugh ba9bc8
-      case PPD_CS_N :
Tim Waugh ba9bc8
-          apple_init_profile(ppd, NULL, profiles->profiles + 1,
Tim Waugh ba9bc8
-	                     _ppdHashName("DeviceN.."), "DeviceN", "DeviceN",
Tim Waugh ba9bc8
-			     NULL);
Tim Waugh ba9bc8
-          break;
Tim Waugh ba9bc8
-    }
Tim Waugh ba9bc8
-  }
Tim Waugh ba9bc8
-
Tim Waugh ba9bc8
-  if (num_profiles > 0)
Tim Waugh ba9bc8
-  {
Tim Waugh ba9bc8
-   /*
Tim Waugh ba9bc8
-    * Make sure we have a default profile ID...
Tim Waugh ba9bc8
-    */
Tim Waugh ba9bc8
-
Tim Waugh ba9bc8
-    if (!default_profile_id)
Tim Waugh ba9bc8
-      default_profile_id = profiles->profiles[num_profiles - 1].profileID;
Tim Waugh ba9bc8
-
Tim Waugh ba9bc8
-   /*
Tim Waugh ba9bc8
-    * Get the device ID hash and pathelogical name dictionary.
Tim Waugh ba9bc8
-    */
Tim Waugh ba9bc8
-
Tim Waugh ba9bc8
-    cupsdLogMessage(CUPSD_LOG_INFO, "Registering ICC color profiles for \"%s\"",
Tim Waugh ba9bc8
-		    p->name);
Tim Waugh ba9bc8
-
Tim Waugh ba9bc8
-    device_id    = _ppdHashName(p->name);
Tim Waugh ba9bc8
-    device_name  = CFDictionaryCreateMutable(kCFAllocatorDefault, 0,
Tim Waugh ba9bc8
-					     &kCFTypeDictionaryKeyCallBacks,
Tim Waugh ba9bc8
-					     &kCFTypeDictionaryValueCallBacks);
Tim Waugh ba9bc8
-    printer_name = CFStringCreateWithCString(kCFAllocatorDefault,
Tim Waugh ba9bc8
-                                             p->name, kCFStringEncodingUTF8);
Tim Waugh ba9bc8
-
Tim Waugh ba9bc8
-    if (device_name && printer_name)
Tim Waugh ba9bc8
-    {
Tim Waugh ba9bc8
-      CFDictionarySetValue(device_name, CFSTR("en"), printer_name);
Tim Waugh ba9bc8
-
Tim Waugh ba9bc8
-     /*
Tim Waugh ba9bc8
-      * Register the device with ColorSync...
Tim Waugh ba9bc8
-      */
Tim Waugh ba9bc8
-
Tim Waugh ba9bc8
-      error = CMRegisterColorDevice(cmPrinterDeviceClass, device_id,
Tim Waugh ba9bc8
-                                    device_name, &scope);
Tim Waugh ba9bc8
-
Tim Waugh ba9bc8
-     /*
Tim Waugh ba9bc8
-      * Register the profiles...
Tim Waugh ba9bc8
-      */
Tim Waugh ba9bc8
-
Tim Waugh ba9bc8
-      if (error == noErr)
Tim Waugh ba9bc8
-	error = CMSetDeviceFactoryProfiles(cmPrinterDeviceClass, device_id,
Tim Waugh ba9bc8
-					   default_profile_id, profiles);
Tim Waugh ba9bc8
-    }
Tim Waugh ba9bc8
-    else
Tim Waugh ba9bc8
-      error = 1000;
Tim Waugh ba9bc8
-
Tim Waugh ba9bc8
-   /*
Tim Waugh ba9bc8
-    * Clean up...
Tim Waugh ba9bc8
-    */
Tim Waugh ba9bc8
-
Tim Waugh ba9bc8
-    if (error != noErr)
Tim Waugh ba9bc8
-      cupsdLogMessage(CUPSD_LOG_ERROR,
Tim Waugh ba9bc8
-		      "Unable to register ICC color profiles for \"%s\" - %d",
Tim Waugh ba9bc8
-		      p->name, (int)error);
Tim Waugh ba9bc8
-
Tim Waugh ba9bc8
-    for (profile = profiles->profiles;
Tim Waugh ba9bc8
-	 num_profiles > 0;
Tim Waugh ba9bc8
-	 profile ++, num_profiles --)
Tim Waugh ba9bc8
-      CFRelease(profile->profileName);
Tim Waugh ba9bc8
-
Tim Waugh ba9bc8
-    free(profiles);
Tim Waugh ba9bc8
-
Tim Waugh ba9bc8
-    if (printer_name)
Tim Waugh ba9bc8
-      CFRelease(printer_name);
Tim Waugh ba9bc8
-
Tim Waugh ba9bc8
-    if (device_name)
Tim Waugh ba9bc8
-      CFRelease(device_name);
Tim Waugh ba9bc8
-  }
Tim Waugh ba9bc8
-
Tim Waugh ba9bc8
-  ppdClose(ppd);
Tim Waugh ba9bc8
-}
Tim Waugh ba9bc8
-
Tim Waugh ba9bc8
-
Tim Waugh ba9bc8
-/*
Tim Waugh ba9bc8
- * 'apple_unregister_profiles()' - Remove color profiles for the specified
Tim Waugh ba9bc8
- *                                 printer.
Tim Waugh ba9bc8
- */
Tim Waugh ba9bc8
-
Tim Waugh ba9bc8
-static void
Tim Waugh ba9bc8
-apple_unregister_profiles(
Tim Waugh ba9bc8
-    cupsd_printer_t *p)			/* I - Printer */
Tim Waugh ba9bc8
-{
Tim Waugh ba9bc8
- /*
Tim Waugh ba9bc8
-  * Make sure ColorSync is available...
Tim Waugh ba9bc8
-  */
Tim Waugh ba9bc8
-
Tim Waugh ba9bc8
-  if (CMUnregisterColorDevice != NULL)
Tim Waugh ba9bc8
-    CMUnregisterColorDevice(cmPrinterDeviceClass, _ppdHashName(p->name));
Tim Waugh ba9bc8
-}
Tim Waugh ba9bc8
-#endif /* __APPLE__ */
Tim Waugh ba9bc8
-
Tim Waugh ba9bc8
 /*
Tim Waugh ba9bc8
  * 'apply_printer_defaults()' - Apply printer default options to a job.
Tim Waugh ba9bc8
  */
Tim Waugh ba9bc8
@@ -6532,7 +5969,7 @@ delete_printer(cupsd_client_t  *con,	/* 
Tim Waugh ba9bc8
   * Unregister color profiles...
Tim Waugh ba9bc8
   */
Tim Waugh ba9bc8
 
Tim Waugh ba9bc8
-  apple_unregister_profiles(printer);
Tim Waugh ba9bc8
+  cupsdUnregisterColorProfiles(printer);
Tim Waugh ba9bc8
 #endif /* __APPLE__ */
Tim Waugh ba9bc8
 
Tim Waugh ba9bc8
   if (dtype & CUPS_PRINTER_CLASS)
Tim Waugh ba9bc8
diff -up cups-1.4.6/scheduler/printers.c.icc cups-1.4.6/scheduler/printers.c
Tim Waugh c45b42
--- cups-1.4.6/scheduler/printers.c.icc	2011-01-12 16:12:56.347369245 +0000
Tim Waugh c45b42
+++ cups-1.4.6/scheduler/printers.c	2011-01-12 16:13:02.535065850 +0000
Tim Waugh c45b42
@@ -5,6 +5,7 @@
Tim Waugh c45b42
  *
Tim Waugh c45b42
  *   Copyright 2007-2010 by Apple Inc.
Tim Waugh c45b42
  *   Copyright 1997-2007 by Easy Software Products, all rights reserved.
Tim Waugh c45b42
+ *   Copyright 2011 by Red Hat Inc.
Tim Waugh c45b42
  *
Tim Waugh c45b42
  *   These coded instructions, statements, and computer programs are the
Tim Waugh c45b42
  *   property of Apple Inc. and are protected by Federal copyright
Tim Waugh c45b42
@@ -40,6 +41,14 @@
Tim Waugh ba9bc8
  *   cupsdValidateDest()        - Validate a printer/class destination.
Tim Waugh ba9bc8
  *   cupsdWritePrintcap()       - Write a pseudo-printcap file for older
Tim Waugh ba9bc8
  *                                applications that need it...
Tim Waugh ba9bc8
+ *   apple_init_profile()       - Initialize a color profile.
Tim Waugh ba9bc8
+ *   dbus_create_profile()      - Initialise a color profile.
Tim Waugh ba9bc8
+ *   dbus_create_device()       - Initialise a color device.
Tim Waugh ba9bc8
+ *   cupsdRegisterColorProfiles()
Tim Waugh ba9bc8
+ *                              - Register color profiles for a printer.
Tim Waugh ba9bc8
+ *   cupsdUnregisterColorProfiles()
Tim Waugh ba9bc8
+ *                              - Remove color profiles for the specified
Tim Waugh ba9bc8
+ *                                printer.
Tim Waugh ba9bc8
  *   add_printer_defaults()     - Add name-default attributes to the printer
Tim Waugh ba9bc8
  *                                attributes.
Tim Waugh ba9bc8
  *   add_printer_filter()       - Add a MIME filter for a printer.
Tim Waugh c45b42
@@ -64,10 +73,14 @@
Tim Waugh ba9bc8
  */
Tim Waugh ba9bc8
 
Tim Waugh ba9bc8
 #include "cupsd.h"
Tim Waugh ba9bc8
+#include <cups/ppd-private.h>
Tim Waugh ba9bc8
 #include <cups/dir.h>
Tim Waugh ba9bc8
 #ifdef HAVE_APPLICATIONSERVICES_H
Tim Waugh ba9bc8
 #  include <ApplicationServices/ApplicationServices.h>
Tim Waugh ba9bc8
 #endif /* HAVE_APPLICATIONSERVICES_H */
Tim Waugh ba9bc8
+#ifdef __APPLE__
Tim Waugh ba9bc8
+#  include <CoreFoundation/CoreFoundation.h>
Tim Waugh ba9bc8
+#endif /* __APPLE__ */
Tim Waugh ba9bc8
 #ifdef HAVE_SYS_MOUNT_H
Tim Waugh ba9bc8
 #  include <sys/mount.h>
Tim Waugh ba9bc8
 #endif /* HAVE_SYS_MOUNT_H */
Tim Waugh c45b42
@@ -81,6 +94,16 @@
Tim Waugh ba9bc8
 #  include <sys/vfs.h>
Tim Waugh ba9bc8
 #endif /* HAVE_SYS_VFS_H */
Tim Waugh ba9bc8
 
Tim Waugh ba9bc8
+#ifdef HAVE_DBUS
Tim Waugh ba9bc8
+#  include <dbus/dbus.h>
Tim Waugh ba9bc8
+#  ifdef HAVE_DBUS_MESSAGE_ITER_INIT_APPEND
Tim Waugh ba9bc8
+#    define dbus_message_append_iter_init dbus_message_iter_init_append
Tim Waugh ba9bc8
+#    define dbus_message_iter_append_string(i,v) dbus_message_iter_append_basic(i, DBUS_TYPE_STRING, &(v))
Tim Waugh ba9bc8
+#    define dbus_message_iter_append_object_path(i,v) dbus_message_iter_append_basic(i, DBUS_TYPE_OBJECT_PATH, &(v))
Tim Waugh ba9bc8
+#    define dbus_message_iter_append_uint32(i,v) dbus_message_iter_append_basic(i, DBUS_TYPE_UINT32, &(v))
Tim Waugh ba9bc8
+#  endif /* HAVE_DBUS_MESSAGE_ITER_INIT_APPEND */
Tim Waugh ba9bc8
+#endif /* HAVE_DBUS */
Tim Waugh ba9bc8
+
Tim Waugh ba9bc8
 
Tim Waugh ba9bc8
 /*
Tim Waugh ba9bc8
  * Local functions...
Tim Waugh c45b42
@@ -103,6 +126,12 @@ static void	write_irix_state(cupsd_print
Tim Waugh ba9bc8
 #endif /* __sgi */
Tim Waugh ba9bc8
 static void	write_xml_string(cups_file_t *fp, const char *s);
Tim Waugh c45b42
 
Tim Waugh ba9bc8
+#ifdef __APPLE__
Tim Waugh ba9bc8
+static void	apple_init_profile(ppd_file_t *ppd, cups_array_t *languages,
Tim Waugh ba9bc8
+		                   CMDeviceProfileInfo *profile, unsigned id,
Tim Waugh ba9bc8
+		                   const char *name, const char *text,
Tim Waugh ba9bc8
+				   const char *iccfile);
Tim Waugh ba9bc8
+#endif /* __APPLE__ */
Tim Waugh ba9bc8
 
Tim Waugh ba9bc8
 /*
Tim Waugh c45b42
  * 'cupsdAddPrinter()' - Add a printer to the system.
Tim Waugh c45b42
@@ -786,6 +815,14 @@ cupsdDeletePrinter(
Tim Waugh ba9bc8
                      update ? "Job stopped due to printer being deleted." :
Tim Waugh ba9bc8
 		              "Job stopped.");
Tim Waugh ba9bc8
 
Tim Waugh ba9bc8
+#ifdef HAVE_DBUS
Tim Waugh ba9bc8
+ /*
Tim Waugh ba9bc8
+  * Unregister the color profiles
Tim Waugh ba9bc8
+  */
Tim Waugh ba9bc8
+
Tim Waugh ba9bc8
+  cupsdUnregisterColorProfiles(p);
Tim Waugh ba9bc8
+#endif /* HAVE_DBUS */
Tim Waugh ba9bc8
+
Tim Waugh ba9bc8
  /*
Tim Waugh ba9bc8
   * If this printer is the next for browsing, point to the next one...
Tim Waugh ba9bc8
   */
Tim Waugh c45b42
@@ -1533,6 +1570,14 @@ cupsdRenamePrinter(
Tim Waugh ba9bc8
   mimeDeleteType(MimeDatabase, p->prefiltertype);
Tim Waugh ba9bc8
   p->prefiltertype = mimeAddType(MimeDatabase, "prefilter", name);
Tim Waugh ba9bc8
 
Tim Waugh ba9bc8
+#ifdef HAVE_DBUS
Tim Waugh ba9bc8
+ /*
Tim Waugh ba9bc8
+  * Unregister the color profiles
Tim Waugh ba9bc8
+  */
Tim Waugh ba9bc8
+
Tim Waugh ba9bc8
+  cupsdUnregisterColorProfiles(p);
Tim Waugh ba9bc8
+#endif /* HAVE_DBUS */
Tim Waugh ba9bc8
+
Tim Waugh ba9bc8
  /*
Tim Waugh ba9bc8
   * Rename the printer...
Tim Waugh ba9bc8
   */
Tim Waugh c45b42
@@ -2722,6 +2767,14 @@ cupsdSetPrinterAttrs(cupsd_printer_t *p)
Tim Waugh ba9bc8
   write_irix_state(p);
Tim Waugh ba9bc8
 #endif /* __sgi */
Tim Waugh ba9bc8
 
Tim Waugh ba9bc8
+#ifdef HAVE_DBUS
Tim Waugh ba9bc8
+ /*
Tim Waugh ba9bc8
+  * (Re-)register the color profiles
Tim Waugh ba9bc8
+  */
Tim Waugh ba9bc8
+  cupsdUnregisterColorProfiles(p);
Tim Waugh ba9bc8
+  cupsdRegisterColorProfiles(p);
Tim Waugh ba9bc8
+#endif /* HAVE_DBUS */
Tim Waugh ba9bc8
+
Tim Waugh ba9bc8
  /*
Tim Waugh ba9bc8
   * Let the browse protocols reflect the change
Tim Waugh ba9bc8
   */
Tim Waugh c45b42
@@ -5576,6 +5629,1031 @@ write_xml_string(cups_file_t *fp,	/* I -
Tim Waugh ba9bc8
 }
Tim Waugh ba9bc8
 
Tim Waugh ba9bc8
 
Tim Waugh ba9bc8
+#ifdef __APPLE__
Tim Waugh ba9bc8
+/*
Tim Waugh ba9bc8
+ * 'apple_init_profile()' - Initialize a color profile.
Tim Waugh ba9bc8
+ */
Tim Waugh ba9bc8
+
Tim Waugh ba9bc8
+static void
Tim Waugh ba9bc8
+apple_init_profile(
Tim Waugh ba9bc8
+    ppd_file_t          *ppd,		/* I - PPD file */
Tim Waugh ba9bc8
+    cups_array_t	*languages,	/* I - Languages in the PPD file */
Tim Waugh ba9bc8
+    CMDeviceProfileInfo *profile,	/* I - Profile record */
Tim Waugh ba9bc8
+    unsigned            id,		/* I - Profile ID */
Tim Waugh ba9bc8
+    const char          *name,		/* I - Profile name */
Tim Waugh ba9bc8
+    const char          *text,		/* I - Profile UI text */
Tim Waugh ba9bc8
+    const char          *iccfile)	/* I - ICC filename */
Tim Waugh ba9bc8
+{
Tim Waugh ba9bc8
+  char			url[1024];	/* URL for profile filename */
Tim Waugh ba9bc8
+  CFMutableDictionaryRef dict;		/* Dictionary for name */
Tim Waugh ba9bc8
+  char			*language;	/* Current language */
Tim Waugh ba9bc8
+  ppd_attr_t		*attr;		/* Profile attribute */
Tim Waugh ba9bc8
+  CFStringRef		cflang,		/* Language string */
Tim Waugh ba9bc8
+			cftext;		/* Localized text */
Tim Waugh ba9bc8
+
Tim Waugh ba9bc8
+
Tim Waugh ba9bc8
+ /*
Tim Waugh ba9bc8
+  * Build the profile name dictionary...
Tim Waugh ba9bc8
+  */
Tim Waugh ba9bc8
+
Tim Waugh ba9bc8
+  dict = CFDictionaryCreateMutable(kCFAllocatorDefault, 0,
Tim Waugh ba9bc8
+				   &kCFTypeDictionaryKeyCallBacks,
Tim Waugh ba9bc8
+				   &kCFTypeDictionaryValueCallBacks);
Tim Waugh ba9bc8
+
Tim Waugh ba9bc8
+  cftext = CFStringCreateWithCString(kCFAllocatorDefault, text,
Tim Waugh ba9bc8
+				     kCFStringEncodingUTF8);
Tim Waugh ba9bc8
+
Tim Waugh ba9bc8
+  if (cftext)
Tim Waugh ba9bc8
+  {
Tim Waugh ba9bc8
+    CFDictionarySetValue(dict, CFSTR("en"), cftext);
Tim Waugh ba9bc8
+    CFRelease(cftext);
Tim Waugh ba9bc8
+  }
Tim Waugh ba9bc8
+
Tim Waugh ba9bc8
+  if (languages)
Tim Waugh ba9bc8
+  {
Tim Waugh ba9bc8
+   /*
Tim Waugh ba9bc8
+    * Find localized names for the color profiles...
Tim Waugh ba9bc8
+    */
Tim Waugh ba9bc8
+
Tim Waugh ba9bc8
+    cupsArraySave(ppd->sorted_attrs);
Tim Waugh ba9bc8
+
Tim Waugh ba9bc8
+    for (language = (char *)cupsArrayFirst(languages);
Tim Waugh ba9bc8
+	 language;
Tim Waugh ba9bc8
+	 language = (char *)cupsArrayNext(languages))
Tim Waugh ba9bc8
+    {
Tim Waugh ba9bc8
+      if (iccfile)
Tim Waugh ba9bc8
+      {
Tim Waugh ba9bc8
+        if ((attr = _ppdLocalizedAttr(ppd, "cupsICCProfile", name,
Tim Waugh ba9bc8
+	                              language)) == NULL)
Tim Waugh ba9bc8
+	  attr = _ppdLocalizedAttr(ppd, "APTiogaProfile", name, language);
Tim Waugh ba9bc8
+      }
Tim Waugh ba9bc8
+      else
Tim Waugh ba9bc8
+        attr = _ppdLocalizedAttr(ppd, "ColorModel", name, language);
Tim Waugh ba9bc8
+
Tim Waugh ba9bc8
+      if (attr && attr->text[0])
Tim Waugh ba9bc8
+      {
Tim Waugh ba9bc8
+	cflang = CFStringCreateWithCString(kCFAllocatorDefault, language,
Tim Waugh ba9bc8
+					   kCFStringEncodingUTF8);
Tim Waugh ba9bc8
+	cftext = CFStringCreateWithCString(kCFAllocatorDefault, attr->text,
Tim Waugh ba9bc8
+					   kCFStringEncodingUTF8);
Tim Waugh ba9bc8
+
Tim Waugh ba9bc8
+        if (cflang && cftext)
Tim Waugh ba9bc8
+	  CFDictionarySetValue(dict, cflang, cftext);
Tim Waugh ba9bc8
+
Tim Waugh ba9bc8
+        if (cflang)
Tim Waugh ba9bc8
+	  CFRelease(cflang);
Tim Waugh ba9bc8
+
Tim Waugh ba9bc8
+        if (cftext)
Tim Waugh ba9bc8
+	  CFRelease(cftext);
Tim Waugh ba9bc8
+      }
Tim Waugh ba9bc8
+    }
Tim Waugh ba9bc8
+
Tim Waugh ba9bc8
+    cupsArrayRestore(ppd->sorted_attrs);
Tim Waugh ba9bc8
+  }
Tim Waugh ba9bc8
+
Tim Waugh ba9bc8
+ /*
Tim Waugh ba9bc8
+  * Fill in the profile data...
Tim Waugh ba9bc8
+  */
Tim Waugh ba9bc8
+
Tim Waugh ba9bc8
+  if (iccfile)
Tim Waugh ba9bc8
+    httpAssembleURI(HTTP_URI_CODING_ALL, url, sizeof(url), "file", NULL, "", 0,
Tim Waugh ba9bc8
+		    iccfile);
Tim Waugh ba9bc8
+
Tim Waugh ba9bc8
+  profile->dataVersion        = cmDeviceProfileInfoVersion1;
Tim Waugh ba9bc8
+  profile->profileID          = id;
Tim Waugh ba9bc8
+  profile->profileLoc.locType = iccfile ? cmPathBasedProfile : cmNoProfileBase;
Tim Waugh ba9bc8
+  profile->profileName        = dict;
Tim Waugh ba9bc8
+
Tim Waugh ba9bc8
+  if (iccfile)
Tim Waugh ba9bc8
+    strlcpy(profile->profileLoc.u.pathLoc.path, iccfile,
Tim Waugh ba9bc8
+	    sizeof(profile->profileLoc.u.pathLoc.path));
Tim Waugh ba9bc8
+}
Tim Waugh ba9bc8
+#endif /* __APPLE__ */
Tim Waugh ba9bc8
+
Tim Waugh ba9bc8
+
Tim Waugh ba9bc8
+#if !defined(__APPLE__) && defined(HAVE_DBUS)
Tim Waugh ba9bc8
+/*
Tim Waugh c45b42
+ * 'dbus_profile_profile_set_property()' - Set a property on a profile
Tim Waugh c45b42
+ */
Tim Waugh c45b42
+static void
Tim Waugh c45b42
+dbus_profile_profile_set_property (DBusConnection *con,		/* I - D-Bus connection */
Tim Waugh c45b42
+				   const char *object_path,	/* I - DBus path */
Tim Waugh c45b42
+				   const char *property_name,	/* I - Property name */
Tim Waugh c45b42
+				   const char *property_value)	/* I - Property value */
Tim Waugh c45b42
+{
Tim Waugh c45b42
+  DBusMessage		*message;		/* D-Bus message */
Tim Waugh c45b42
+  DBusPendingCall	*pending = NULL;	/* D-Bus method call */
Tim Waugh c45b42
+  DBusMessageIter	args;			/* D-Bus method arguments */
Tim Waugh c45b42
+
Tim Waugh c45b42
+  message = dbus_message_new_method_call("org.freedesktop.ColorManager",
Tim Waugh c45b42
+					 object_path,
Tim Waugh c45b42
+					 "org.freedesktop.ColorManager.Profile",
Tim Waugh c45b42
+					 "SetProperty");
Tim Waugh c45b42
+  dbus_message_append_iter_init(message, &args);
Tim Waugh c45b42
+  dbus_message_iter_append_string(&args, property_name);
Tim Waugh c45b42
+  dbus_message_iter_append_string(&args, property_value);
Tim Waugh c45b42
+  cupsdLogMessage(CUPSD_LOG_DEBUG, "Calling Profile %s SetProperty(%s=%s)",
Tim Waugh c45b42
+		  object_path, property_name, property_value);
Tim Waugh c45b42
+  if (!dbus_connection_send_with_reply(con, message, &pending, -1))
Tim Waugh c45b42
+    goto out;
Tim Waugh c45b42
+
Tim Waugh c45b42
+  dbus_connection_flush(con);
Tim Waugh c45b42
+  dbus_pending_call_block(pending);
Tim Waugh c45b42
+out:
Tim Waugh c45b42
+  dbus_pending_call_unref(pending);
Tim Waugh c45b42
+  dbus_message_unref(message);
Tim Waugh c45b42
+}
Tim Waugh c45b42
+
Tim Waugh c45b42
+/*
Tim Waugh c45b42
+ * 'dbus_profile_device_set_property()' - Set a property on a device
Tim Waugh ba9bc8
+ */
Tim Waugh c45b42
+static void
Tim Waugh c45b42
+dbus_profile_device_set_property (DBusConnection *con,		/* I - D-Bus connection */
Tim Waugh c45b42
+				  const char *object_path,	/* I - DBus path */
Tim Waugh c45b42
+				  const char *property_name,	/* I - Property name */
Tim Waugh c45b42
+				  const char *property_value)	/* I - Property value */
Tim Waugh c45b42
+{
Tim Waugh c45b42
+  DBusMessage		*message;		/* D-Bus message */
Tim Waugh c45b42
+  DBusPendingCall	*pending = NULL;	/* D-Bus method call */
Tim Waugh c45b42
+  DBusMessageIter	args;			/* D-Bus method arguments */
Tim Waugh c45b42
+
Tim Waugh c45b42
+  message = dbus_message_new_method_call("org.freedesktop.ColorManager",
Tim Waugh c45b42
+					 object_path,
Tim Waugh c45b42
+					 "org.freedesktop.ColorManager.Device",
Tim Waugh c45b42
+					 "SetProperty");
Tim Waugh c45b42
+  dbus_message_append_iter_init(message, &args);
Tim Waugh c45b42
+  dbus_message_iter_append_string(&args, property_name);
Tim Waugh c45b42
+  dbus_message_iter_append_string(&args, property_value);
Tim Waugh c45b42
+  cupsdLogMessage(CUPSD_LOG_DEBUG, "Calling Device %s SetProperty(%s=%s)",
Tim Waugh c45b42
+		  object_path, property_name, property_value);
Tim Waugh c45b42
+  if (!dbus_connection_send_with_reply(con, message, &pending, -1))
Tim Waugh c45b42
+    goto out;
Tim Waugh ba9bc8
+
Tim Waugh c45b42
+  dbus_connection_flush(con);
Tim Waugh c45b42
+  dbus_pending_call_block(pending);
Tim Waugh c45b42
+out:
Tim Waugh c45b42
+  dbus_pending_call_unref(pending);
Tim Waugh c45b42
+  dbus_message_unref(message);
Tim Waugh c45b42
+}
Tim Waugh c45b42
+
Tim Waugh c45b42
+/*
Tim Waugh c45b42
+ * 'dbus_create_profile()' - Create a color profile for a printer.
Tim Waugh c45b42
+ */
Tim Waugh ba9bc8
+static void
Tim Waugh ba9bc8
+dbus_create_profile (cups_array_t *profiles,	/* I - Profiles array */
Tim Waugh ba9bc8
+		     DBusConnection *con,	/* I - D-Bus connection */
Tim Waugh ba9bc8
+		     const char *printer_name,	/* I - Printer name */
Tim Waugh ba9bc8
+		     const char *qualifier,	/* I - Profile qualifier */
Tim Waugh ba9bc8
+		     const char *iccfile)	/* I - ICC filename */
Tim Waugh ba9bc8
+{
Tim Waugh ba9bc8
+  DBusMessage		*message;	/* D-Bus message */
Tim Waugh ba9bc8
+  DBusMessageIter	args;		/* D-Bus method arguments */
Tim Waugh ba9bc8
+  DBusPendingCall	*pending;	/* D-Bus method call */
Tim Waugh ba9bc8
+  char			*path = NULL;	/* Profile path */
Tim Waugh ba9bc8
+  char			*idstr;		/* Profile ID string */
Tim Waugh ba9bc8
+  size_t		idstrlen;	/* Profile ID allocated length */
Tim Waugh ba9bc8
+  int			options = 1;	/* Options for CreateProfile */
Tim Waugh ba9bc8
+
Tim Waugh ba9bc8
+ /*
Tim Waugh ba9bc8
+  * Create the profile...
Tim Waugh ba9bc8
+  */
Tim Waugh ba9bc8
+
Tim Waugh ba9bc8
+  message = dbus_message_new_method_call("org.freedesktop.ColorManager",
Tim Waugh ba9bc8
+					 "/org/freedesktop/ColorManager",
Tim Waugh ba9bc8
+					 "org.freedesktop.ColorManager",
Tim Waugh ba9bc8
+					 "CreateProfile");
Tim Waugh ba9bc8
+
Tim Waugh ba9bc8
+  dbus_message_append_iter_init(message, &args);
Tim Waugh ba9bc8
+  idstrlen = strlen (printer_name) + 1 + strlen (qualifier) + 1;
Tim Waugh ba9bc8
+  idstr = malloc (idstrlen);
Tim Waugh ba9bc8
+  if (!idstr)
Tim Waugh ba9bc8
+      goto out;
Tim Waugh ba9bc8
+
Tim Waugh ba9bc8
+  snprintf (idstr, idstrlen, "%s-%s", printer_name, qualifier);
Tim Waugh ba9bc8
+  dbus_message_iter_append_string(&args, idstr);
Tim Waugh ba9bc8
+  dbus_message_iter_append_uint32(&args, options);
Tim Waugh ba9bc8
+  cupsdLogMessage(CUPSD_LOG_DEBUG, "Calling CreateProfile(%s,%d)",
Tim Waugh ba9bc8
+		  idstr, options);
Tim Waugh ba9bc8
+  if (!dbus_connection_send_with_reply(con, message, &pending, -1))
Tim Waugh ba9bc8
+    goto out;
Tim Waugh ba9bc8
+
Tim Waugh ba9bc8
+  dbus_connection_flush(con);
Tim Waugh ba9bc8
+  dbus_message_unref(message);
Tim Waugh ba9bc8
+  dbus_pending_call_block(pending);
Tim Waugh ba9bc8
+  message = dbus_pending_call_steal_reply(pending);
Tim Waugh ba9bc8
+//  dbus_pending_call_unref(pending); <-fixme
Tim Waugh ba9bc8
+
Tim Waugh ba9bc8
+  if (!message ||
Tim Waugh ba9bc8
+      !dbus_message_iter_init(message, &args) ||
Tim Waugh ba9bc8
+      dbus_message_iter_get_arg_type(&args) != DBUS_TYPE_OBJECT_PATH)
Tim Waugh ba9bc8
+    goto out;
Tim Waugh ba9bc8
+
Tim Waugh ba9bc8
+  dbus_message_iter_get_basic(&args, &path);
Tim Waugh ba9bc8
+  path = strdup(path);
Tim Waugh ba9bc8
+  cupsArrayAdd(profiles, strdup(path));
Tim Waugh c45b42
+  dbus_message_unref(message);
Tim Waugh ba9bc8
+
Tim Waugh ba9bc8
+ /*
Tim Waugh ba9bc8
+  * Set the qualifier...
Tim Waugh ba9bc8
+  */
Tim Waugh c45b42
+  dbus_profile_profile_set_property (con, path, "Qualifier", qualifier);
Tim Waugh ba9bc8
+
Tim Waugh ba9bc8
+ /*
Tim Waugh ba9bc8
+  * If we know the ICC file for it, set that now...
Tim Waugh ba9bc8
+  */
Tim Waugh c45b42
+  if (iccfile)
Tim Waugh c45b42
+    dbus_profile_profile_set_property (con, path, "Filename", iccfile);
Tim Waugh ba9bc8
+out:
Tim Waugh ba9bc8
+  free (path);
Tim Waugh ba9bc8
+  free (idstr);
Tim Waugh ba9bc8
+}
Tim Waugh ba9bc8
+
Tim Waugh ba9bc8
+
Tim Waugh ba9bc8
+/*
Tim Waugh ba9bc8
+ * 'dbus_create_device()' - Create a device and register profiles.
Tim Waugh ba9bc8
+ */
Tim Waugh ba9bc8
+
Tim Waugh ba9bc8
+static void
Tim Waugh ba9bc8
+dbus_create_device (DBusConnection *con,	/* I - D-Bus connection */
Tim Waugh c45b42
+		    cupsd_printer_t *p,		/* I - Printer */
Tim Waugh ba9bc8
+		    cups_array_t *profiles,	/* I - Profiles array */
Tim Waugh ba9bc8
+		    const char *default_profile_id) /* I - Default profile */
Tim Waugh ba9bc8
+{
Tim Waugh ba9bc8
+  DBusMessage		*message;	/* D-Bus message */
Tim Waugh ba9bc8
+  DBusMessageIter	args;		/* D-Bus method arguments */
Tim Waugh ba9bc8
+  DBusPendingCall	*pending;	/* D-Bus method call */
Tim Waugh ba9bc8
+  const char		*device_path_tmp;	/* Device path data */
Tim Waugh ba9bc8
+  char			*device_path = NULL;	/* Device path */
Tim Waugh ba9bc8
+  const char		*profile_path;	/* Profile path */
Tim Waugh ba9bc8
+  char			*default_profile_path = NULL;
Tim Waugh ba9bc8
+					/* Default profile path */
Tim Waugh ba9bc8
+  size_t		default_path_len;
Tim Waugh ba9bc8
+					/* Length of profile path */
Tim Waugh ba9bc8
+  int			options = 1;	/* Options for CreateDevice */
Tim Waugh ba9bc8
+
Tim Waugh ba9bc8
+ /*
Tim Waugh ba9bc8
+  * Create the device...
Tim Waugh ba9bc8
+  */
Tim Waugh ba9bc8
+  message = dbus_message_new_method_call("org.freedesktop.ColorManager",
Tim Waugh ba9bc8
+					 "/org/freedesktop/ColorManager",
Tim Waugh ba9bc8
+					 "org.freedesktop.ColorManager",
Tim Waugh ba9bc8
+					 "CreateDevice");
Tim Waugh ba9bc8
+
Tim Waugh ba9bc8
+  dbus_message_append_iter_init(message, &args);
Tim Waugh c45b42
+  dbus_message_iter_append_string(&args, p->name);
Tim Waugh ba9bc8
+  dbus_message_iter_append_uint32(&args, options);
Tim Waugh ba9bc8
+  cupsdLogMessage(CUPSD_LOG_DEBUG, "Calling CreateDevice(%s,%d)",
Tim Waugh c45b42
+		  p->name, options);
Tim Waugh ba9bc8
+  if (!dbus_connection_send_with_reply (con, message, &pending, -1))
Tim Waugh ba9bc8
+    goto out;
Tim Waugh ba9bc8
+
Tim Waugh ba9bc8
+  dbus_connection_flush(con);
Tim Waugh ba9bc8
+  dbus_message_unref(message);
Tim Waugh ba9bc8
+  dbus_pending_call_block(pending);
Tim Waugh ba9bc8
+  message = dbus_pending_call_steal_reply(pending);
Tim Waugh ba9bc8
+  dbus_pending_call_unref(pending);
Tim Waugh ba9bc8
+
Tim Waugh ba9bc8
+  if (!message ||
Tim Waugh ba9bc8
+      !dbus_message_iter_init(message, &args) ||
Tim Waugh ba9bc8
+      dbus_message_iter_get_arg_type(&args) != DBUS_TYPE_OBJECT_PATH)
Tim Waugh ba9bc8
+    goto out;
Tim Waugh ba9bc8
+
Tim Waugh ba9bc8
+  /* get device path, and duplicate so we can free the method */
Tim Waugh ba9bc8
+  dbus_message_iter_get_basic(&args, &device_path_tmp);
Tim Waugh ba9bc8
+  device_path = strdup (device_path_tmp);
Tim Waugh ba9bc8
+  dbus_message_unref(message);
Tim Waugh ba9bc8
+  for (profile_path = cupsArrayFirst(profiles);
Tim Waugh ba9bc8
+       profile_path;
Tim Waugh ba9bc8
+       profile_path = cupsArrayNext(profiles))
Tim Waugh ba9bc8
+  {
Tim Waugh ba9bc8
+    message = dbus_message_new_method_call("org.freedesktop.ColorManager",
Tim Waugh ba9bc8
+					   device_path,
Tim Waugh ba9bc8
+					   "org.freedesktop.ColorManager.Device",
Tim Waugh ba9bc8
+					   "AddProfile");
Tim Waugh ba9bc8
+
Tim Waugh ba9bc8
+    dbus_message_append_iter_init(message, &args);
Tim Waugh ba9bc8
+    dbus_message_iter_append_object_path(&args, profile_path);
Tim Waugh ba9bc8
+    cupsdLogMessage(CUPSD_LOG_DEBUG, "Calling AddProfile(%s)", profile_path);
Tim Waugh ba9bc8
+    pending = NULL;
Tim Waugh ba9bc8
+    if (!dbus_connection_send_with_reply (con, message, &pending, -1))
Tim Waugh ba9bc8
+      goto out;
Tim Waugh ba9bc8
+
Tim Waugh ba9bc8
+    dbus_connection_flush(con);
Tim Waugh ba9bc8
+    dbus_message_unref(message);
Tim Waugh ba9bc8
+    dbus_pending_call_block(pending);
Tim Waugh ba9bc8
+//    message = dbus_pending_call_steal_reply(pending);
Tim Waugh ba9bc8
+    dbus_pending_call_unref(pending);
Tim Waugh ba9bc8
+  }
Tim Waugh ba9bc8
+
Tim Waugh ba9bc8
+ /*
Tim Waugh ba9bc8
+  * Set the default profile
Tim Waugh ba9bc8
+  */
Tim Waugh c45b42
+  default_path_len = strlen (p->name) + 1 + strlen (default_profile_id) + 1;
Tim Waugh ba9bc8
+  default_profile_path = malloc (default_path_len);
Tim Waugh ba9bc8
+  if (!default_profile_path)
Tim Waugh ba9bc8
+    goto out;
Tim Waugh ba9bc8
+
Tim Waugh c45b42
+  snprintf(default_profile_path, default_path_len, "%s-%s", p->name,
Tim Waugh ba9bc8
+	   default_profile_id);
Tim Waugh ba9bc8
+  message = dbus_message_new_method_call("org.freedesktop.ColorManager",
Tim Waugh ba9bc8
+					 device_path,
Tim Waugh ba9bc8
+					 "org.freedesktop.ColorManager.Device",
Tim Waugh ba9bc8
+					 "MakeProfileDefault");
Tim Waugh ba9bc8
+
Tim Waugh ba9bc8
+  dbus_message_append_iter_init(message, &args);
Tim Waugh ba9bc8
+  dbus_message_iter_append_string(&args, default_profile_path);
Tim Waugh ba9bc8
+  cupsdLogMessage(CUPSD_LOG_DEBUG, "Calling MakeProfileDefault(%s)",
Tim Waugh ba9bc8
+		  default_profile_path);
Tim Waugh ba9bc8
+  if (!dbus_connection_send_with_reply (con, message, &pending, -1))
Tim Waugh ba9bc8
+    goto out;
Tim Waugh ba9bc8
+
Tim Waugh ba9bc8
+  dbus_connection_flush(con);
Tim Waugh ba9bc8
+  dbus_message_unref(message);
Tim Waugh ba9bc8
+  dbus_pending_call_block(pending);
Tim Waugh ba9bc8
+//  message = dbus_pending_call_steal_reply(pending);
Tim Waugh ba9bc8
+  dbus_pending_call_unref(pending);
Tim Waugh ba9bc8
+
Tim Waugh c45b42
+
Tim Waugh c45b42
+ /*
Tim Waugh c45b42
+  * Set other useful device attributes
Tim Waugh c45b42
+  */
Tim Waugh c45b42
+  dbus_profile_device_set_property (con, device_path, "Kind", "printer");
Tim Waugh c45b42
+  dbus_profile_device_set_property (con, device_path, "Model", p->make_model);
Tim Waugh c45b42
+
Tim Waugh ba9bc8
+out:
Tim Waugh ba9bc8
+  free(default_profile_path);
Tim Waugh ba9bc8
+  free(device_path);
Tim Waugh ba9bc8
+//  dbus_message_unref(message);
Tim Waugh ba9bc8
+}
Tim Waugh ba9bc8
+
Tim Waugh ba9bc8
+
Tim Waugh ba9bc8
+/*
Tim Waugh ba9bc8
+ * 'dbus_delete_device_and_profiles()' - Delete previously registered
Tim Waugh ba9bc8
+ *                                       color device and profiles
Tim Waugh ba9bc8
+ */
Tim Waugh ba9bc8
+
Tim Waugh ba9bc8
+static void
Tim Waugh ba9bc8
+dbus_delete_device_and_profiles(cupsd_printer_t *p)	/* I - Printer */
Tim Waugh ba9bc8
+{
Tim Waugh ba9bc8
+  DBusConnection	*con;		/* System D-Bus connection */
Tim Waugh ba9bc8
+  DBusMessage		*message;	/* D-Bus message */
Tim Waugh ba9bc8
+  DBusMessageIter	args, array_args; /* D-Bus method arguments */
Tim Waugh ba9bc8
+  DBusPendingCall	*pending;	/* D-Bus method call */
Tim Waugh ba9bc8
+  const char		*device_path;	/* Device path */
Tim Waugh ba9bc8
+  const char		*options = "";	/* Options for GetProfilesForDevice */
Tim Waugh ba9bc8
+  cups_array_t		*profile_paths;	/* Profile paths array */
Tim Waugh ba9bc8
+  char			*profile_path;	/* Profile path */
Tim Waugh ba9bc8
+
Tim Waugh ba9bc8
+  con = dbus_bus_get (DBUS_BUS_SYSTEM, NULL);
Tim Waugh ba9bc8
+  if (!con)
Tim Waugh ba9bc8
+    return;
Tim Waugh ba9bc8
+
Tim Waugh ba9bc8
+ /*
Tim Waugh ba9bc8
+  * Get the device path
Tim Waugh ba9bc8
+  */
Tim Waugh ba9bc8
+
Tim Waugh ba9bc8
+  profile_paths = cupsArrayNew(NULL, NULL);
Tim Waugh ba9bc8
+  message = dbus_message_new_method_call("org.freedesktop.ColorManager",
Tim Waugh ba9bc8
+					 "/org/freedesktop/ColorManager",
Tim Waugh ba9bc8
+					 "org.freedesktop.ColorManager",
Tim Waugh ba9bc8
+					 "FindDeviceById");
Tim Waugh ba9bc8
+
Tim Waugh ba9bc8
+  dbus_message_append_iter_init(message, &args);
Tim Waugh ba9bc8
+  dbus_message_iter_append_string(&args, p->name);
Tim Waugh ba9bc8
+  cupsdLogMessage(CUPSD_LOG_DEBUG, "Calling FindDeviceById");
Tim Waugh ba9bc8
+  if (!dbus_connection_send_with_reply(con, message, &pending, -1))
Tim Waugh ba9bc8
+      goto out;
Tim Waugh ba9bc8
+
Tim Waugh ba9bc8
+  dbus_connection_flush(con);
Tim Waugh ba9bc8
+  dbus_message_unref(message);
Tim Waugh ba9bc8
+  dbus_pending_call_block(pending);
Tim Waugh ba9bc8
+  message = dbus_pending_call_steal_reply(pending);
Tim Waugh ba9bc8
+  dbus_pending_call_unref(pending);
Tim Waugh ba9bc8
+
Tim Waugh ba9bc8
+  if (!message ||
Tim Waugh ba9bc8
+      !dbus_message_iter_init(message, &args) ||
Tim Waugh ba9bc8
+      dbus_message_iter_get_arg_type(&args) != DBUS_TYPE_OBJECT_PATH)
Tim Waugh ba9bc8
+      goto out;
Tim Waugh ba9bc8
+
Tim Waugh ba9bc8
+  dbus_message_iter_get_basic(&args, &device_path);
Tim Waugh ba9bc8
+  device_path = strdup(device_path);
Tim Waugh ba9bc8
+
Tim Waugh ba9bc8
+ /*
Tim Waugh ba9bc8
+  * Get the profiles
Tim Waugh ba9bc8
+  */
Tim Waugh ba9bc8
+
Tim Waugh ba9bc8
+  dbus_message_unref(message);
Tim Waugh ba9bc8
+  message = dbus_message_new_method_call("org.freedesktop.ColorManager",
Tim Waugh ba9bc8
+					 "/org/freedesktop/ColorManager",
Tim Waugh ba9bc8
+					 "org.freedesktop.ColorManager",
Tim Waugh ba9bc8
+					 "GetProfilesForDevice");
Tim Waugh ba9bc8
+
Tim Waugh ba9bc8
+  dbus_message_append_iter_init(message, &args);
Tim Waugh ba9bc8
+  dbus_message_iter_append_object_path(&args, device_path);
Tim Waugh ba9bc8
+  dbus_message_iter_append_string(&args, options);
Tim Waugh ba9bc8
+  cupsdLogMessage(CUPSD_LOG_DEBUG, "Calling GetProfilesForDevice(%s,\"\")",
Tim Waugh ba9bc8
+		  device_path);
Tim Waugh ba9bc8
+  if (!dbus_connection_send_with_reply(con, message, &pending, -1))
Tim Waugh ba9bc8
+    goto out;
Tim Waugh ba9bc8
+
Tim Waugh ba9bc8
+  dbus_connection_flush(con);
Tim Waugh ba9bc8
+  dbus_message_unref(message);
Tim Waugh ba9bc8
+  dbus_pending_call_block(pending);
Tim Waugh ba9bc8
+  message = dbus_pending_call_steal_reply(pending);
Tim Waugh ba9bc8
+  dbus_pending_call_unref(pending);
Tim Waugh ba9bc8
+
Tim Waugh ba9bc8
+  if (!message ||
Tim Waugh ba9bc8
+      !dbus_message_iter_init(message, &args) ||
Tim Waugh ba9bc8
+      dbus_message_iter_get_arg_type(&args) != DBUS_TYPE_ARRAY)
Tim Waugh ba9bc8
+      goto out;
Tim Waugh ba9bc8
+
Tim Waugh ba9bc8
+  dbus_message_iter_recurse(&args, &array_args);
Tim Waugh ba9bc8
+  do
Tim Waugh ba9bc8
+  {
Tim Waugh ba9bc8
+    if (dbus_message_iter_get_arg_type(&array_args) == DBUS_TYPE_OBJECT_PATH)
Tim Waugh ba9bc8
+    {
Tim Waugh ba9bc8
+      dbus_message_iter_get_basic(&array_args, &profile_path);
Tim Waugh ba9bc8
+      cupsArrayAdd(profile_paths, strdup (profile_path));
Tim Waugh ba9bc8
+    }
Tim Waugh ba9bc8
+  } while (dbus_message_iter_next(&array_args));
Tim Waugh ba9bc8
+
Tim Waugh ba9bc8
+ /*
Tim Waugh ba9bc8
+  * Delete each profile.
Tim Waugh ba9bc8
+  */
Tim Waugh ba9bc8
+
Tim Waugh ba9bc8
+
Tim Waugh ba9bc8
+out:
Tim Waugh ba9bc8
+  for (profile_path = cupsArrayFirst(profile_paths);
Tim Waugh ba9bc8
+       profile_path;
Tim Waugh ba9bc8
+       profile_path = cupsArrayNext(profile_paths))
Tim Waugh ba9bc8
+    free (profile_path);
Tim Waugh ba9bc8
+
Tim Waugh ba9bc8
+  cupsArrayDelete(profile_paths);
Tim Waugh ba9bc8
+  dbus_message_unref(message);
Tim Waugh ba9bc8
+  dbus_connection_unref(con);
Tim Waugh ba9bc8
+}
Tim Waugh ba9bc8
+#endif /* !defined(__APPLE__) && defined(HAVE_DBUS) */
Tim Waugh ba9bc8
+
Tim Waugh ba9bc8
+
Tim Waugh ba9bc8
+/*
Tim Waugh ba9bc8
+ * 'cupsdRegisterColorProfiles()' - Register color profiles for a printer.
Tim Waugh ba9bc8
+ */
Tim Waugh ba9bc8
+
Tim Waugh ba9bc8
+void
Tim Waugh ba9bc8
+cupsdRegisterColorProfiles(
Tim Waugh ba9bc8
+    cupsd_printer_t *p)			/* I - Printer */
Tim Waugh ba9bc8
+{
Tim Waugh ba9bc8
+  int			i;		/* Looping var */
Tim Waugh ba9bc8
+  char			ppdfile[1024],	/* PPD filename */
Tim Waugh ba9bc8
+			iccfile[1024],	/* ICC filename */
Tim Waugh ba9bc8
+			selector[PPD_MAX_NAME];
Tim Waugh ba9bc8
+					/* Profile selection string */
Tim Waugh ba9bc8
+  ppd_file_t		*ppd;		/* PPD file */
Tim Waugh ba9bc8
+  ppd_attr_t		*attr,		/* Profile attributes */
Tim Waugh ba9bc8
+			*q1_attr,	/* ColorModel (or other) qualifier */
Tim Waugh ba9bc8
+			*q2_attr,	/* MediaType (or other) qualifier */
Tim Waugh ba9bc8
+			*q3_attr;	/* Resolution (or other) qualifier */
Tim Waugh ba9bc8
+  char			q_keyword[PPD_MAX_NAME];
Tim Waugh ba9bc8
+					/* Qualifier keyword */
Tim Waugh ba9bc8
+  const char		*q1_choice,	/* ColorModel (or other) choice */
Tim Waugh ba9bc8
+			*q2_choice,	/* MediaType (or other) choice */
Tim Waugh ba9bc8
+			*q3_choice;	/* Resolution (or other) choice */
Tim Waugh ba9bc8
+  const char		*profile_key;	/* Profile keyword */
Tim Waugh ba9bc8
+  ppd_option_t		*cm_option;	/* Color model option */
Tim Waugh ba9bc8
+  ppd_choice_t		*cm_choice;	/* Color model choice */
Tim Waugh ba9bc8
+  int			num_profiles;	/* Number of profiles */
Tim Waugh ba9bc8
+#ifdef __APPLE__
Tim Waugh ba9bc8
+  ppd_attr_t		*profileid_attr;/* cupsProfileID attribute */
Tim Waugh ba9bc8
+  unsigned		profile_id,	/* Profile ID */
Tim Waugh ba9bc8
+			default_profile_id = 0;
Tim Waugh ba9bc8
+					/* Default profile ID */
Tim Waugh ba9bc8
+  CMError		error;		/* Last error */
Tim Waugh ba9bc8
+  CFMutableDictionaryRef device_name;	/* Printer device name dictionary */
Tim Waugh ba9bc8
+  unsigned		device_id;	/* Printer device ID */
Tim Waugh ba9bc8
+  CFStringRef		printer_name;	/* Printer name string */
Tim Waugh ba9bc8
+  CMDeviceScope		scope =		/* Scope of the registration */
Tim Waugh ba9bc8
+			{
Tim Waugh ba9bc8
+			  kCFPreferencesAnyUser,
Tim Waugh ba9bc8
+			  kCFPreferencesCurrentHost
Tim Waugh ba9bc8
+			};
Tim Waugh ba9bc8
+  CMDeviceProfileArrayPtr profiles;	/* Profiles */
Tim Waugh ba9bc8
+  CMDeviceProfileInfo	*profile;	/* Current profile */
Tim Waugh ba9bc8
+  cups_array_t		*languages;	/* Languages array */
Tim Waugh ba9bc8
+#elif HAVE_DBUS
Tim Waugh ba9bc8
+  const char		*profile_id = NULL,
Tim Waugh ba9bc8
+					/* Profile ID */
Tim Waugh ba9bc8
+                        *default_profile_id = NULL;
Tim Waugh ba9bc8
+					/* Default profile ID */
Tim Waugh ba9bc8
+  DBusError		error;		/* Error, if any */
Tim Waugh ba9bc8
+  static DBusConnection	*con;		/* System D-Bus connection */
Tim Waugh ba9bc8
+  cups_array_t		*profiles;	/* Profile paths array */
Tim Waugh ba9bc8
+  char			*profile_path;	/* Profile path */
Tim Waugh ba9bc8
+#endif /* HAVE_DBUS */
Tim Waugh ba9bc8
+
Tim Waugh ba9bc8
+
Tim Waugh ba9bc8
+#ifdef __APPLE__
Tim Waugh ba9bc8
+ /*
Tim Waugh ba9bc8
+  * Make sure ColorSync is available...
Tim Waugh ba9bc8
+  */
Tim Waugh ba9bc8
+
Tim Waugh ba9bc8
+  if (CMRegisterColorDevice == NULL)
Tim Waugh ba9bc8
+    return;
Tim Waugh ba9bc8
+#elif defined(HAVE_DBUS)
Tim Waugh ba9bc8
+  if (con && !dbus_connection_get_is_connected(con))
Tim Waugh ba9bc8
+  {
Tim Waugh ba9bc8
+    dbus_connection_unref(con);
Tim Waugh ba9bc8
+    con = NULL;
Tim Waugh ba9bc8
+  }
Tim Waugh ba9bc8
+
Tim Waugh ba9bc8
+  if (!con)
Tim Waugh ba9bc8
+  {
Tim Waugh ba9bc8
+    dbus_error_init(&error);
Tim Waugh ba9bc8
+
Tim Waugh ba9bc8
+    con = dbus_bus_get (DBUS_BUS_SYSTEM, &error);
Tim Waugh ba9bc8
+    if (!con)
Tim Waugh ba9bc8
+    {
Tim Waugh ba9bc8
+      if (dbus_error_is_set(&error))
Tim Waugh ba9bc8
+	cupsdLogMessage(CUPSD_LOG_DEBUG,
Tim Waugh ba9bc8
+			"D-Bus connection error: %s", error.message);
Tim Waugh ba9bc8
+
Tim Waugh ba9bc8
+      dbus_error_free(&error);
Tim Waugh ba9bc8
+      return;
Tim Waugh ba9bc8
+    }
Tim Waugh ba9bc8
+  }
Tim Waugh ba9bc8
+
Tim Waugh ba9bc8
+  profiles = cupsArrayNew (NULL, NULL);
Tim Waugh ba9bc8
+#else /* defined(__APPLE__) || defined(HAVE_DBUS) */
Tim Waugh ba9bc8
+  return;
Tim Waugh ba9bc8
+#endif /* defined(__APPLE__) || defined(HAVE_DBUS) */
Tim Waugh ba9bc8
+
Tim Waugh ba9bc8
+ /*
Tim Waugh ba9bc8
+  * Try opening the PPD file for this printer...
Tim Waugh ba9bc8
+  */
Tim Waugh ba9bc8
+
Tim Waugh ba9bc8
+  snprintf(ppdfile, sizeof(ppdfile), "%s/ppd/%s.ppd", ServerRoot, p->name);
Tim Waugh ba9bc8
+  if ((ppd = ppdOpenFile(ppdfile)) == NULL)
Tim Waugh ba9bc8
+    return;
Tim Waugh ba9bc8
+
Tim Waugh ba9bc8
+ /*
Tim Waugh ba9bc8
+  * See if we have any profiles...
Tim Waugh ba9bc8
+  */
Tim Waugh ba9bc8
+
Tim Waugh ba9bc8
+  if ((attr = ppdFindAttr(ppd, "APTiogaProfile", NULL)) != NULL)
Tim Waugh ba9bc8
+    profile_key = "APTiogaProfile";
Tim Waugh ba9bc8
+  else
Tim Waugh ba9bc8
+  {
Tim Waugh ba9bc8
+    attr = ppdFindAttr(ppd, "cupsICCProfile", NULL);
Tim Waugh ba9bc8
+    profile_key = "cupsICCProfile";
Tim Waugh ba9bc8
+  }
Tim Waugh ba9bc8
+
Tim Waugh ba9bc8
+  for (num_profiles = 0; attr; attr = ppdFindNextAttr(ppd, profile_key, NULL))
Tim Waugh ba9bc8
+    if (attr->spec[0] && attr->value && attr->value[0])
Tim Waugh ba9bc8
+    {
Tim Waugh ba9bc8
+      if (attr->value[0] != '/')
Tim Waugh ba9bc8
+	snprintf(iccfile, sizeof(iccfile), "%s/profiles/%s", DataDir,
Tim Waugh ba9bc8
+		 attr->value);
Tim Waugh ba9bc8
+      else
Tim Waugh ba9bc8
+	strlcpy(iccfile, attr->value, sizeof(iccfile));
Tim Waugh ba9bc8
+
Tim Waugh ba9bc8
+      if (access(iccfile, 0))
Tim Waugh ba9bc8
+	continue;
Tim Waugh ba9bc8
+
Tim Waugh ba9bc8
+      num_profiles ++;
Tim Waugh ba9bc8
+    }
Tim Waugh ba9bc8
+
Tim Waugh ba9bc8
+
Tim Waugh ba9bc8
+ /*
Tim Waugh ba9bc8
+  * If we have profiles, add them...
Tim Waugh ba9bc8
+  */
Tim Waugh ba9bc8
+
Tim Waugh ba9bc8
+  if (num_profiles > 0)
Tim Waugh ba9bc8
+  {
Tim Waugh ba9bc8
+    if (profile_key[0] == 'A')
Tim Waugh ba9bc8
+    {
Tim Waugh ba9bc8
+     /*
Tim Waugh ba9bc8
+      * For Tioga PPDs, get the default profile using the DefaultAPTiogaProfile
Tim Waugh ba9bc8
+      * attribute...
Tim Waugh ba9bc8
+      */
Tim Waugh ba9bc8
+
Tim Waugh ba9bc8
+      if ((attr = ppdFindAttr(ppd, "DefaultAPTiogaProfile", NULL)) != NULL &&
Tim Waugh ba9bc8
+	  attr->value)
Tim Waugh ba9bc8
+      {
Tim Waugh ba9bc8
+#ifdef __APPLE__
Tim Waugh ba9bc8
+        default_profile_id = atoi(attr->value);
Tim Waugh ba9bc8
+#elif HAVE_DBUS
Tim Waugh ba9bc8
+	default_profile_id = attr->value;
Tim Waugh ba9bc8
+#endif /* defined(__APPLE__) || defined(HAVE_DBUS) */
Tim Waugh ba9bc8
+      }
Tim Waugh ba9bc8
+
Tim Waugh ba9bc8
+      q1_choice = q2_choice = q3_choice = NULL;
Tim Waugh ba9bc8
+    }
Tim Waugh ba9bc8
+    else
Tim Waugh ba9bc8
+    {
Tim Waugh ba9bc8
+     /*
Tim Waugh ba9bc8
+      * For CUPS PPDs, figure out the default profile selector values...
Tim Waugh ba9bc8
+      */
Tim Waugh ba9bc8
+
Tim Waugh ba9bc8
+      if ((attr = ppdFindAttr(ppd, "cupsICCQualifier1", NULL)) != NULL &&
Tim Waugh ba9bc8
+	  attr->value && attr->value[0])
Tim Waugh ba9bc8
+      {
Tim Waugh ba9bc8
+	snprintf(q_keyword, sizeof(q_keyword), "Default%s", attr->value);
Tim Waugh ba9bc8
+	q1_attr = ppdFindAttr(ppd, q_keyword, NULL);
Tim Waugh ba9bc8
+      }
Tim Waugh ba9bc8
+      else if ((q1_attr = ppdFindAttr(ppd, "DefaultColorModel", NULL)) == NULL)
Tim Waugh ba9bc8
+	q1_attr = ppdFindAttr(ppd, "DefaultColorSpace", NULL);
Tim Waugh ba9bc8
+
Tim Waugh ba9bc8
+      if (q1_attr && q1_attr->value && q1_attr->value[0])
Tim Waugh ba9bc8
+	q1_choice = q1_attr->value;
Tim Waugh ba9bc8
+      else
Tim Waugh ba9bc8
+	q1_choice = "";
Tim Waugh ba9bc8
+
Tim Waugh ba9bc8
+      if ((attr = ppdFindAttr(ppd, "cupsICCQualifier2", NULL)) != NULL &&
Tim Waugh ba9bc8
+	  attr->value && attr->value[0])
Tim Waugh ba9bc8
+      {
Tim Waugh ba9bc8
+	snprintf(q_keyword, sizeof(q_keyword), "Default%s", attr->value);
Tim Waugh ba9bc8
+	q2_attr = ppdFindAttr(ppd, q_keyword, NULL);
Tim Waugh ba9bc8
+      }
Tim Waugh ba9bc8
+      else
Tim Waugh ba9bc8
+	q2_attr = ppdFindAttr(ppd, "DefaultMediaType", NULL);
Tim Waugh ba9bc8
+
Tim Waugh ba9bc8
+      if (q2_attr && q2_attr->value && q2_attr->value[0])
Tim Waugh ba9bc8
+	q2_choice = q2_attr->value;
Tim Waugh ba9bc8
+      else
Tim Waugh ba9bc8
+	q2_choice = NULL;
Tim Waugh ba9bc8
+
Tim Waugh ba9bc8
+      if ((attr = ppdFindAttr(ppd, "cupsICCQualifier3", NULL)) != NULL &&
Tim Waugh ba9bc8
+	  attr->value && attr->value[0])
Tim Waugh ba9bc8
+      {
Tim Waugh ba9bc8
+	snprintf(q_keyword, sizeof(q_keyword), "Default%s", attr->value);
Tim Waugh ba9bc8
+	q3_attr = ppdFindAttr(ppd, q_keyword, NULL);
Tim Waugh ba9bc8
+      }
Tim Waugh ba9bc8
+      else
Tim Waugh ba9bc8
+	q3_attr = ppdFindAttr(ppd, "DefaultResolution", NULL);
Tim Waugh ba9bc8
+
Tim Waugh ba9bc8
+      if (q3_attr && q3_attr->value && q3_attr->value[0])
Tim Waugh ba9bc8
+	q3_choice = q3_attr->value;
Tim Waugh ba9bc8
+      else
Tim Waugh ba9bc8
+	q3_choice = NULL;
Tim Waugh ba9bc8
+    }
Tim Waugh ba9bc8
+
Tim Waugh ba9bc8
+#ifdef __APPLE__
Tim Waugh ba9bc8
+   /*
Tim Waugh ba9bc8
+    * Build the array of profiles...
Tim Waugh ba9bc8
+    *
Tim Waugh ba9bc8
+    * Note: This calloc actually requests slightly more memory than needed.
Tim Waugh ba9bc8
+    */
Tim Waugh ba9bc8
+
Tim Waugh ba9bc8
+    if ((profiles = calloc(num_profiles, sizeof(CMDeviceProfileArray))) == NULL)
Tim Waugh ba9bc8
+    {
Tim Waugh ba9bc8
+      cupsdLogMessage(CUPSD_LOG_ERROR,
Tim Waugh ba9bc8
+                      "Unable to allocate memory for %d profiles!",
Tim Waugh ba9bc8
+		      num_profiles);
Tim Waugh ba9bc8
+      ppdClose(ppd);
Tim Waugh ba9bc8
+      return;
Tim Waugh ba9bc8
+    }
Tim Waugh ba9bc8
+
Tim Waugh ba9bc8
+    profiles->profileCount = num_profiles;
Tim Waugh ba9bc8
+    languages              = _ppdGetLanguages(ppd);
Tim Waugh ba9bc8
+    profile                = profiles->profiles;
Tim Waugh ba9bc8
+#endif /* __APPLE__ */
Tim Waugh ba9bc8
+
Tim Waugh ba9bc8
+    for (attr = ppdFindAttr(ppd, profile_key, NULL);
Tim Waugh ba9bc8
+	 attr;
Tim Waugh ba9bc8
+	 attr = ppdFindNextAttr(ppd, profile_key, NULL))
Tim Waugh ba9bc8
+      if (attr->spec[0] && attr->value && attr->value[0])
Tim Waugh ba9bc8
+      {
Tim Waugh ba9bc8
+       /*
Tim Waugh ba9bc8
+        * Add this profile...
Tim Waugh ba9bc8
+	*/
Tim Waugh ba9bc8
+
Tim Waugh ba9bc8
+        if (attr->value[0] != '/')
Tim Waugh ba9bc8
+	  snprintf(iccfile, sizeof(iccfile), "%s/profiles/%s", DataDir,
Tim Waugh ba9bc8
+	           attr->value);
Tim Waugh ba9bc8
+        else
Tim Waugh ba9bc8
+	  strlcpy(iccfile, attr->value, sizeof(iccfile));
Tim Waugh ba9bc8
+
Tim Waugh ba9bc8
+        if (access(iccfile, 0))
Tim Waugh ba9bc8
+	  continue;
Tim Waugh ba9bc8
+
Tim Waugh ba9bc8
+#ifdef __APPLE__
Tim Waugh ba9bc8
+        if (profile_key[0] == 'c')
Tim Waugh ba9bc8
+	{
Tim Waugh ba9bc8
+	  cupsArraySave(ppd->sorted_attrs);
Tim Waugh ba9bc8
+
Tim Waugh ba9bc8
+	  if ((profileid_attr = ppdFindAttr(ppd, "cupsProfileID",
Tim Waugh ba9bc8
+					    attr->spec)) != NULL &&
Tim Waugh ba9bc8
+	      profileid_attr->value && isdigit(profileid_attr->value[0] & 255))
Tim Waugh ba9bc8
+	    profile_id = (unsigned)strtoul(profileid_attr->value, NULL, 10);
Tim Waugh ba9bc8
+	  else
Tim Waugh ba9bc8
+	    profile_id = _ppdHashName(attr->spec);
Tim Waugh ba9bc8
+
Tim Waugh ba9bc8
+	  cupsArrayRestore(ppd->sorted_attrs);
Tim Waugh ba9bc8
+        }
Tim Waugh ba9bc8
+	else
Tim Waugh ba9bc8
+	  profile_id = atoi(attr->spec);
Tim Waugh ba9bc8
+
Tim Waugh ba9bc8
+        apple_init_profile(ppd, languages, profile, profile_id, attr->spec,
Tim Waugh ba9bc8
+	                   attr->text[0] ? attr->text : attr->spec, iccfile);
Tim Waugh ba9bc8
+	profile ++;
Tim Waugh ba9bc8
+#elif defined(HAVE_DBUS)
Tim Waugh ba9bc8
+	profile_id = attr->spec;
Tim Waugh ba9bc8
+	dbus_create_profile(profiles, con, p->name, attr->spec, iccfile);
Tim Waugh ba9bc8
+#endif /* defined(__APPLE__) || defined(HAVE_DBUS) */
Tim Waugh ba9bc8
+
Tim Waugh ba9bc8
+       /*
Tim Waugh ba9bc8
+        * See if this is the default profile...
Tim Waugh ba9bc8
+	*/
Tim Waugh ba9bc8
+
Tim Waugh ba9bc8
+        if (!default_profile_id)
Tim Waugh ba9bc8
+	{
Tim Waugh ba9bc8
+	  if (q2_choice)
Tim Waugh ba9bc8
+	  {
Tim Waugh ba9bc8
+	    if (q3_choice)
Tim Waugh ba9bc8
+	    {
Tim Waugh ba9bc8
+	      snprintf(selector, sizeof(selector), "%s.%s.%s",
Tim Waugh ba9bc8
+	               q1_choice, q2_choice, q3_choice);
Tim Waugh ba9bc8
+              if (!strcmp(selector, attr->spec))
Tim Waugh ba9bc8
+	        default_profile_id = profile_id;
Tim Waugh ba9bc8
+            }
Tim Waugh ba9bc8
+
Tim Waugh ba9bc8
+            if (!default_profile_id)
Tim Waugh ba9bc8
+	    {
Tim Waugh ba9bc8
+	      snprintf(selector, sizeof(selector), "%s.%s.", q1_choice,
Tim Waugh ba9bc8
+	               q2_choice);
Tim Waugh ba9bc8
+              if (!strcmp(selector, attr->spec))
Tim Waugh ba9bc8
+	        default_profile_id = profile_id;
Tim Waugh ba9bc8
+	    }
Tim Waugh ba9bc8
+          }
Tim Waugh ba9bc8
+
Tim Waugh ba9bc8
+          if (!default_profile_id && q3_choice)
Tim Waugh ba9bc8
+	  {
Tim Waugh ba9bc8
+	    snprintf(selector, sizeof(selector), "%s..%s", q1_choice,
Tim Waugh ba9bc8
+	             q3_choice);
Tim Waugh ba9bc8
+	    if (!strcmp(selector, attr->spec))
Tim Waugh ba9bc8
+	      default_profile_id = profile_id;
Tim Waugh ba9bc8
+	  }
Tim Waugh ba9bc8
+
Tim Waugh ba9bc8
+          if (!default_profile_id)
Tim Waugh ba9bc8
+	  {
Tim Waugh ba9bc8
+	    snprintf(selector, sizeof(selector), "%s..", q1_choice);
Tim Waugh ba9bc8
+	    if (!strcmp(selector, attr->spec))
Tim Waugh ba9bc8
+	      default_profile_id = profile_id;
Tim Waugh ba9bc8
+	  }
Tim Waugh ba9bc8
+	}
Tim Waugh ba9bc8
+      }
Tim Waugh ba9bc8
+
Tim Waugh ba9bc8
+#ifdef __APPLE__
Tim Waugh ba9bc8
+    _ppdFreeLanguages(languages);
Tim Waugh ba9bc8
+#endif /* __APPLE__ */
Tim Waugh ba9bc8
+  }
Tim Waugh ba9bc8
+  else if ((cm_option = ppdFindOption(ppd, "ColorModel")) != NULL)
Tim Waugh ba9bc8
+  {
Tim Waugh ba9bc8
+   /*
Tim Waugh ba9bc8
+    * Extract profiles from ColorModel option...
Tim Waugh ba9bc8
+    */
Tim Waugh ba9bc8
+
Tim Waugh ba9bc8
+    const char *profile_name;		/* Name of generic profile */
Tim Waugh ba9bc8
+
Tim Waugh ba9bc8
+
Tim Waugh ba9bc8
+    num_profiles = cm_option->num_choices;
Tim Waugh ba9bc8
+
Tim Waugh ba9bc8
+#ifdef __APPLE__
Tim Waugh ba9bc8
+    if ((profiles = calloc(num_profiles, sizeof(CMDeviceProfileArray))) == NULL)
Tim Waugh ba9bc8
+    {
Tim Waugh ba9bc8
+      cupsdLogMessage(CUPSD_LOG_ERROR,
Tim Waugh ba9bc8
+                      "Unable to allocate memory for %d profiles!",
Tim Waugh ba9bc8
+		      num_profiles);
Tim Waugh ba9bc8
+      ppdClose(ppd);
Tim Waugh ba9bc8
+      return;
Tim Waugh ba9bc8
+    }
Tim Waugh ba9bc8
+
Tim Waugh ba9bc8
+    profiles->profileCount = num_profiles;
Tim Waugh ba9bc8
+    profile                = profiles->profiles;
Tim Waugh ba9bc8
+#endif /* __APPLE__ */
Tim Waugh ba9bc8
+
Tim Waugh ba9bc8
+    for (i = cm_option->num_choices, cm_choice = cm_option->choices;
Tim Waugh ba9bc8
+         i > 0;
Tim Waugh ba9bc8
+	 i --, cm_choice ++)
Tim Waugh ba9bc8
+    {
Tim Waugh ba9bc8
+      if (!strcmp(cm_choice->choice, "Gray") ||
Tim Waugh ba9bc8
+          !strcmp(cm_choice->choice, "Black"))
Tim Waugh ba9bc8
+        profile_name = "Gray";
Tim Waugh ba9bc8
+      else if (!strcmp(cm_choice->choice, "RGB") ||
Tim Waugh ba9bc8
+               !strcmp(cm_choice->choice, "CMY"))
Tim Waugh ba9bc8
+        profile_name = "RGB";
Tim Waugh ba9bc8
+      else if (!strcmp(cm_choice->choice, "CMYK") ||
Tim Waugh ba9bc8
+               !strcmp(cm_choice->choice, "KCMY"))
Tim Waugh ba9bc8
+        profile_name = "CMYK";
Tim Waugh ba9bc8
+      else
Tim Waugh ba9bc8
+        profile_name = "DeviceN";
Tim Waugh ba9bc8
+
Tim Waugh ba9bc8
+      snprintf(selector, sizeof(selector), "%s..", profile_name);
Tim Waugh ba9bc8
+
Tim Waugh ba9bc8
+#ifdef __APPLE__
Tim Waugh ba9bc8
+      profile_id = _ppdHashName(selector);
Tim Waugh ba9bc8
+      apple_init_profile(ppd, NULL, profile, profile_id, cm_choice->choice,
Tim Waugh ba9bc8
+                         cm_choice->text, NULL);
Tim Waugh ba9bc8
+      profile ++;
Tim Waugh ba9bc8
+#elif defined(HAVE_DBUS)
Tim Waugh ba9bc8
+      profile_id = selector;
Tim Waugh ba9bc8
+      dbus_create_profile(profiles, con, p->name, selector, NULL);
Tim Waugh ba9bc8
+#endif /* defined(__APPLE__) || defined(HAVE_DBUS) */
Tim Waugh ba9bc8
+
Tim Waugh ba9bc8
+      if (cm_choice->marked)
Tim Waugh ba9bc8
+        default_profile_id = profile_id;
Tim Waugh ba9bc8
+    }
Tim Waugh ba9bc8
+  }
Tim Waugh ba9bc8
+  else
Tim Waugh ba9bc8
+  {
Tim Waugh ba9bc8
+   /*
Tim Waugh ba9bc8
+    * Use the default colorspace...
Tim Waugh ba9bc8
+    */
Tim Waugh ba9bc8
+
Tim Waugh ba9bc8
+    attr = ppdFindAttr(ppd, "DefaultColorSpace", NULL);
Tim Waugh ba9bc8
+
Tim Waugh ba9bc8
+    num_profiles = (attr && ppd->colorspace == PPD_CS_GRAY) ? 1 : 2;
Tim Waugh ba9bc8
+
Tim Waugh ba9bc8
+#ifdef __APPLE__
Tim Waugh ba9bc8
+    if ((profiles = calloc(num_profiles, sizeof(CMDeviceProfileArray))) == NULL)
Tim Waugh ba9bc8
+    {
Tim Waugh ba9bc8
+      cupsdLogMessage(CUPSD_LOG_ERROR,
Tim Waugh ba9bc8
+                      "Unable to allocate memory for %d profiles!",
Tim Waugh ba9bc8
+		      num_profiles);
Tim Waugh ba9bc8
+      ppdClose(ppd);
Tim Waugh ba9bc8
+      return;
Tim Waugh ba9bc8
+    }
Tim Waugh ba9bc8
+
Tim Waugh ba9bc8
+    profiles->profileCount = num_profiles;
Tim Waugh ba9bc8
+
Tim Waugh ba9bc8
+    apple_init_profile(ppd, NULL, profiles->profiles, _ppdHashName("Gray.."),
Tim Waugh ba9bc8
+                       "Gray", "Gray", NULL);
Tim Waugh ba9bc8
+#elif defined(HAVE_DBUS)
Tim Waugh ba9bc8
+    profile_id = "Gray..";
Tim Waugh ba9bc8
+    dbus_create_profile(profiles, con, p->name, profile_id, NULL);
Tim Waugh ba9bc8
+#endif /* defined(__APPLE__) || defined(HAVE_DBUS) */
Tim Waugh ba9bc8
+
Tim Waugh ba9bc8
+    switch (ppd->colorspace)
Tim Waugh ba9bc8
+    {
Tim Waugh ba9bc8
+      case PPD_CS_RGB :
Tim Waugh ba9bc8
+      case PPD_CS_CMY :
Tim Waugh ba9bc8
+#ifdef __APPLE__
Tim Waugh ba9bc8
+          apple_init_profile(ppd, NULL, profiles->profiles + 1,
Tim Waugh ba9bc8
+	                     _ppdHashName("RGB.."), "RGB", "RGB", NULL);
Tim Waugh ba9bc8
+#elif defined(HAVE_DBUS)
Tim Waugh ba9bc8
+	  profile_id = "RGB..";
Tim Waugh ba9bc8
+	  dbus_create_profile(profiles, con, p->name, profile_id, NULL);
Tim Waugh ba9bc8
+#endif /* HAVE_DBUS */
Tim Waugh ba9bc8
+          break;
Tim Waugh ba9bc8
+      case PPD_CS_RGBK :
Tim Waugh ba9bc8
+      case PPD_CS_CMYK :
Tim Waugh ba9bc8
+#ifdef __APPLE__
Tim Waugh ba9bc8
+          apple_init_profile(ppd, NULL, profiles->profiles + 1,
Tim Waugh ba9bc8
+	                     _ppdHashName("CMYK.."), "CMYK", "CMYK", NULL);
Tim Waugh ba9bc8
+#elif defined(HAVE_DBUS)
Tim Waugh ba9bc8
+	  profile_id = "CMYK..";
Tim Waugh ba9bc8
+	  dbus_create_profile(profiles, con, p->name, profile_id, NULL);
Tim Waugh ba9bc8
+#endif /* defined(__APPLE__) || defined(HAVE_DBUS) */
Tim Waugh ba9bc8
+          break;
Tim Waugh ba9bc8
+
Tim Waugh ba9bc8
+      case PPD_CS_GRAY :
Tim Waugh ba9bc8
+          if (attr)
Tim Waugh ba9bc8
+	    break;
Tim Waugh ba9bc8
+
Tim Waugh ba9bc8
+      case PPD_CS_N :
Tim Waugh ba9bc8
+#ifdef __APPLE__
Tim Waugh ba9bc8
+          apple_init_profile(ppd, NULL, profiles->profiles + 1,
Tim Waugh ba9bc8
+	                     _ppdHashName("DeviceN.."), "DeviceN", "DeviceN",
Tim Waugh ba9bc8
+			     NULL);
Tim Waugh ba9bc8
+#elif defined(HAVE_DBUS)
Tim Waugh ba9bc8
+	  profile_id = "DeviceN..";
Tim Waugh ba9bc8
+	  dbus_create_profile(profiles, con, p->name, profile_id, NULL);
Tim Waugh ba9bc8
+#endif /* defined(__APPLE__) || defined(HAVE_DBUS) */
Tim Waugh ba9bc8
+
Tim Waugh ba9bc8
+          break;
Tim Waugh ba9bc8
+    }
Tim Waugh ba9bc8
+  }
Tim Waugh ba9bc8
+
Tim Waugh ba9bc8
+  if (num_profiles > 0)
Tim Waugh ba9bc8
+  {
Tim Waugh ba9bc8
+   /*
Tim Waugh ba9bc8
+    * Make sure we have a default profile ID...
Tim Waugh ba9bc8
+    */
Tim Waugh ba9bc8
+
Tim Waugh ba9bc8
+    if (!default_profile_id)
Tim Waugh ba9bc8
+    {
Tim Waugh ba9bc8
+#ifdef __APPLE__
Tim Waugh ba9bc8
+      default_profile_id = profiles->profiles[num_profiles - 1].profileID;
Tim Waugh ba9bc8
+#elif HAVE_DBUS
Tim Waugh ba9bc8
+      default_profile_id = profile_id;
Tim Waugh ba9bc8
+#endif /* __APPLE__ */
Tim Waugh ba9bc8
+    }
Tim Waugh ba9bc8
+
Tim Waugh ba9bc8
+   /*
Tim Waugh ba9bc8
+    * Get the device ID hash and pathelogical name dictionary.
Tim Waugh ba9bc8
+    */
Tim Waugh ba9bc8
+
Tim Waugh ba9bc8
+    cupsdLogMessage(CUPSD_LOG_INFO, "Registering ICC color profiles for \"%s\"",
Tim Waugh ba9bc8
+		    p->name);
Tim Waugh ba9bc8
+
Tim Waugh ba9bc8
+#ifdef __APPLE__
Tim Waugh ba9bc8
+    device_id    = _ppdHashName(p->name);
Tim Waugh ba9bc8
+
Tim Waugh ba9bc8
+    device_name  = CFDictionaryCreateMutable(kCFAllocatorDefault, 0,
Tim Waugh ba9bc8
+					     &kCFTypeDictionaryKeyCallBacks,
Tim Waugh ba9bc8
+					     &kCFTypeDictionaryValueCallBacks);
Tim Waugh ba9bc8
+    printer_name = CFStringCreateWithCString(kCFAllocatorDefault,
Tim Waugh ba9bc8
+                                             p->name, kCFStringEncodingUTF8);
Tim Waugh ba9bc8
+
Tim Waugh ba9bc8
+    if (device_name && printer_name)
Tim Waugh ba9bc8
+    {
Tim Waugh ba9bc8
+      CFDictionarySetValue(device_name, CFSTR("en"), printer_name);
Tim Waugh ba9bc8
+
Tim Waugh ba9bc8
+     /*
Tim Waugh ba9bc8
+      * Register the device with ColorSync...
Tim Waugh ba9bc8
+      */
Tim Waugh ba9bc8
+
Tim Waugh ba9bc8
+      error = CMRegisterColorDevice(cmPrinterDeviceClass, device_id,
Tim Waugh ba9bc8
+                                    device_name, &scope);
Tim Waugh ba9bc8
+
Tim Waugh ba9bc8
+     /*
Tim Waugh ba9bc8
+      * Register the profiles...
Tim Waugh ba9bc8
+      */
Tim Waugh ba9bc8
+
Tim Waugh ba9bc8
+      if (error == noErr)
Tim Waugh ba9bc8
+	error = CMSetDeviceFactoryProfiles(cmPrinterDeviceClass, device_id,
Tim Waugh ba9bc8
+					   default_profile_id, profiles);
Tim Waugh ba9bc8
+    }
Tim Waugh ba9bc8
+    else
Tim Waugh ba9bc8
+      error = 1000;
Tim Waugh ba9bc8
+#elif defined(HAVE_DBUS)
Tim Waugh c45b42
+    dbus_create_device (con, p, profiles, default_profile_id);
Tim Waugh ba9bc8
+#endif /* defined(__APPLE__) || defined(HAVE_DBUS) */
Tim Waugh ba9bc8
+
Tim Waugh ba9bc8
+   /*
Tim Waugh ba9bc8
+    * Clean up...
Tim Waugh ba9bc8
+    */
Tim Waugh ba9bc8
+
Tim Waugh ba9bc8
+#ifdef __APPLE__
Tim Waugh ba9bc8
+    if (error != noErr)
Tim Waugh ba9bc8
+      cupsdLogMessage(CUPSD_LOG_ERROR,
Tim Waugh ba9bc8
+		      "Unable to register ICC color profiles for \"%s\" - %d",
Tim Waugh ba9bc8
+		      p->name, (int)error);
Tim Waugh ba9bc8
+
Tim Waugh ba9bc8
+    for (profile = profiles->profiles;
Tim Waugh ba9bc8
+	 num_profiles > 0;
Tim Waugh ba9bc8
+	 profile ++, num_profiles --)
Tim Waugh ba9bc8
+      CFRelease(profile->profileName);
Tim Waugh ba9bc8
+
Tim Waugh ba9bc8
+    free(profiles);
Tim Waugh ba9bc8
+
Tim Waugh ba9bc8
+    if (printer_name)
Tim Waugh ba9bc8
+      CFRelease(printer_name);
Tim Waugh ba9bc8
+
Tim Waugh ba9bc8
+    if (device_name)
Tim Waugh ba9bc8
+      CFRelease(device_name);
Tim Waugh ba9bc8
+#elif defined(HAVE_DBUS)
Tim Waugh ba9bc8
+    for (profile_path = cupsArrayFirst(profiles);
Tim Waugh ba9bc8
+	 profile_path;
Tim Waugh ba9bc8
+	 profile_path = cupsArrayNext(profiles))
Tim Waugh ba9bc8
+      free (profile_path);
Tim Waugh ba9bc8
+
Tim Waugh ba9bc8
+    cupsArrayDelete(profiles);
Tim Waugh ba9bc8
+    dbus_connection_flush(con);
Tim Waugh ba9bc8
+
Tim Waugh ba9bc8
+   /*
Tim Waugh ba9bc8
+    * Don't unref the connection but instead keep it around for future
Tim Waugh ba9bc8
+    * calls (it is a local static variable).  Once we disconnect from
Tim Waugh ba9bc8
+    * the bus all our devices and profiles will be gone.
Tim Waugh ba9bc8
+    */
Tim Waugh ba9bc8
+#endif /* defined(__APPLE__) || defined(HAVE_DBUS) */
Tim Waugh ba9bc8
+  }
Tim Waugh ba9bc8
+
Tim Waugh ba9bc8
+  ppdClose(ppd);
Tim Waugh ba9bc8
+}
Tim Waugh ba9bc8
+
Tim Waugh ba9bc8
+
Tim Waugh ba9bc8
+/*
Tim Waugh ba9bc8
+ * 'cupsdUnregisterColorProfiles()' - Remove color profiles for the specified
Tim Waugh ba9bc8
+ *                                    printer.
Tim Waugh ba9bc8
+ */
Tim Waugh ba9bc8
+
Tim Waugh ba9bc8
+void
Tim Waugh ba9bc8
+cupsdUnregisterColorProfiles(
Tim Waugh ba9bc8
+    cupsd_printer_t *p)			/* I - Printer */
Tim Waugh ba9bc8
+{
Tim Waugh ba9bc8
+#ifdef __APPLE__
Tim Waugh ba9bc8
+ /*
Tim Waugh ba9bc8
+  * Make sure ColorSync is available...
Tim Waugh ba9bc8
+  */
Tim Waugh ba9bc8
+
Tim Waugh ba9bc8
+  if (CMUnregisterColorDevice != NULL)
Tim Waugh ba9bc8
+    CMUnregisterColorDevice(cmPrinterDeviceClass, _ppdHashName(p->name));
Tim Waugh ba9bc8
+#elif defined(HAVE_DBUS)
Tim Waugh ba9bc8
+  dbus_delete_device_and_profiles (p);
Tim Waugh ba9bc8
+#endif /* defined(__APPLE__) || defined(HAVE_DBUS) */
Tim Waugh ba9bc8
+}
Tim Waugh ba9bc8
+
Tim Waugh ba9bc8
+
Tim Waugh ba9bc8
 /*
Tim Waugh ba9bc8
  * End of "$Id: printers.c 9313 2010-09-22 18:35:07Z mike $".
Tim Waugh ba9bc8
  */
Tim Waugh ba9bc8
diff -up cups-1.4.6/scheduler/printers.h.icc cups-1.4.6/scheduler/printers.h
Tim Waugh c45b42
--- cups-1.4.6/scheduler/printers.h.icc	2011-01-12 16:12:56.348369195 +0000
Tim Waugh c45b42
+++ cups-1.4.6/scheduler/printers.h	2011-01-12 16:13:02.536065801 +0000
Tim Waugh ba9bc8
@@ -189,6 +189,8 @@ extern const char	*cupsdValidateDest(con
Tim Waugh ba9bc8
 			        	   cups_ptype_t *dtype,
Tim Waugh ba9bc8
 					   cupsd_printer_t **printer);
Tim Waugh ba9bc8
 extern void		cupsdWritePrintcap(void);
Tim Waugh ba9bc8
+extern void		cupsdRegisterColorProfiles(cupsd_printer_t *printer);
Tim Waugh ba9bc8
+extern void		cupsdUnregisterColorProfiles(cupsd_printer_t *printer);
Tim Waugh ba9bc8
 
Tim Waugh ba9bc8
 
Tim Waugh ba9bc8
 /*