]> git.ipfire.org Git - thirdparty/cups.git/blobdiff - scheduler/sysman.c
Import CUPS v1.7.1
[thirdparty/cups.git] / scheduler / sysman.c
index 9c323439fb6eab76b360afa58178427c65062230..d3fd5f6029fb989ff7f0cfc5f93615bcb11fe9c9 100644 (file)
@@ -1,9 +1,9 @@
 /*
- * "$Id: sysman.c 7928 2008-09-10 22:14:22Z mike $"
+ * "$Id: sysman.c 11106 2013-07-08 12:29:10Z msweet $"
  *
  *   System management functions for the CUPS scheduler.
  *
- *   Copyright 2007-2011 by Apple Inc.
+ *   Copyright 2007-2013 by Apple Inc.
  *   Copyright 2006 by Easy Software Products.
  *
  *   These coded instructions, statements, and computer programs are the
@@ -44,6 +44,8 @@
 #  include <IOKit/pwr_mgt/IOPMLib.h>
 #  ifdef HAVE_IOKIT_PWR_MGT_IOPMLIBPRIVATE_H
 #    include <IOKit/pwr_mgt/IOPMLibPrivate.h>
+#  else
+#    define kIOPMAssertionTypeDenySystemSleep CFSTR("DenySystemSleep")
 #  endif /* HAVE_IOKIT_PWR_MGT_IOPMLIBPRIVATE_H */
 #endif /* __APPLE__ */
 
@@ -69,9 +71,9 @@
  * Local globals...
  */
 
-#ifdef kIOPMAssertionTypeDenySystemSleep
-static IOPMAssertionID dark_wake = 0;  /* "Dark wake" assertion for sharing */
-#endif /* kIOPMAssertionTypeDenySystemSleep */
+#if defined(kIOPMAssertionTypeDenySystemSleep) || defined(kIOPMAssertNetworkClientActive)
+static IOPMAssertionID keep_awake = 0; /* Keep the system awake while printing */
+#endif /* kIOPMAssertionTypeDenySystemSleep || kIOPMAssertNetworkClientActive */
 
 
 /*
@@ -87,9 +89,6 @@ cupsdCleanDirty(void)
   if (DirtyFiles & CUPSD_DIRTY_CLASSES)
     cupsdSaveAllClasses();
 
-  if (DirtyFiles & CUPSD_DIRTY_REMOTE)
-    cupsdSaveRemoteCache();
-
   if (DirtyFiles & CUPSD_DIRTY_PRINTCAP)
     cupsdWritePrintcap();
 
@@ -123,10 +122,9 @@ cupsdCleanDirty(void)
 void
 cupsdMarkDirty(int what)               /* I - What file(s) are dirty? */
 {
-  cupsdLogMessage(CUPSD_LOG_DEBUG, "cupsdMarkDirty(%c%c%c%c%c%c)",
+  cupsdLogMessage(CUPSD_LOG_DEBUG, "cupsdMarkDirty(%c%c%c%c%c)",
                  (what & CUPSD_DIRTY_PRINTERS) ? 'P' : '-',
                  (what & CUPSD_DIRTY_CLASSES) ? 'C' : '-',
-                 (what & CUPSD_DIRTY_REMOTE) ? 'R' : '-',
                  (what & CUPSD_DIRTY_PRINTCAP) ? 'p' : '-',
                  (what & CUPSD_DIRTY_JOBS) ? 'J' : '-',
                  (what & CUPSD_DIRTY_SUBSCRIPTIONS) ? 'S' : '-');
@@ -196,6 +194,10 @@ cupsdSetBusyState(void)
   if (job)
     newbusy |= 2;
 
+  cupsdLogMessage(CUPSD_LOG_DEBUG,
+                  "cupsdSetBusyState: newbusy=\"%s\", busy=\"%s\"",
+                  busy_text[newbusy], busy_text[busy]);
+
  /*
   * Manage state changes...
   */
@@ -213,21 +215,34 @@ cupsdSetBusyState(void)
       vtran = 0;
     }
 #endif /* HAVE_VPROC_TRANSACTION_BEGIN */
+  }
 
-#ifdef kIOPMAssertionTypeDenySystemSleep
-    if ((busy & 2) && !dark_wake)
-      IOPMAssertionCreateWithName(kIOPMAssertionTypeDenySystemSleep,
-                                 kIOPMAssertionLevelOn,
-                                 CFSTR("org.cups.cupsd"), &dark_wake);
-    else if (!(busy & 2) && dark_wake)
-    {
-      IOPMAssertionRelease(dark_wake);
-      dark_wake = 0;
-    }
-#endif /* kIOPMAssertionTypeDenySystemSleep */
+#if defined(kIOPMAssertionTypeDenySystemSleep) || defined(kIOPMAssertNetworkClientActive)
+  if (cupsArrayCount(PrintingJobs) > 0 && !keep_awake)
+  {
+#  ifdef kIOPMAssertNetworkClientActive
+    cupsdLogMessage(CUPSD_LOG_DEBUG, "Asserting NetworkClientActive.");
+
+    IOPMAssertionCreateWithName(kIOPMAssertNetworkClientActive,
+                               kIOPMAssertionLevelOn,
+                               CFSTR("org.cups.cupsd"), &keep_awake);
 
-    cupsdLogMessage(CUPSD_LOG_DEBUG, "cupsdSetBusyState: %s", busy_text[busy]);
+#  else
+    cupsdLogMessage(CUPSD_LOG_DEBUG, "Asserting DenySystemSleep.");
+
+    IOPMAssertionCreateWithName(kIOPMAssertionTypeDenySystemSleep,
+                               kIOPMAssertionLevelOn,
+                               CFSTR("org.cups.cupsd"), &keep_awake);
+
+#  endif /* kIOPMAssertNetworkClientActive */
   }
+  else if (cupsArrayCount(PrintingJobs) == 0 && keep_awake)
+  {
+    cupsdLogMessage(CUPSD_LOG_DEBUG, "Releasing power assertion.");
+    IOPMAssertionRelease(keep_awake);
+    keep_awake = 0;
+  }
+#endif /* kIOPMAssertionTypeDenySystemSleep || kIOPMAssertNetworkClientActive */
 }
 
 
@@ -260,8 +275,8 @@ cupsdSetBusyState(void)
 #  define SYSEVENT_NAMECHANGED 0x10    /* Computer name changed */
 
 
-/* 
- * Structures... 
+/*
+ * Structures...
  */
 
 typedef struct cupsd_sysevent_s                /*** System event data ****/
@@ -280,14 +295,14 @@ typedef struct cupsd_thread_data_s        /*** Thread context data  ****/
 } cupsd_thread_data_t;
 
 
-/* 
- * Local globals... 
+/*
+ * Local globals...
  */
 
 static pthread_t       SysEventThread = NULL;
                                        /* Thread to host a runloop */
 static pthread_mutex_t SysEventThreadMutex = { 0 };
-                                       /* Coordinates access to shared gloabals */ 
+                                       /* Coordinates access to shared gloabals */
 static pthread_cond_t  SysEventThreadCond = { 0 };
                                        /* Thread initialization complete condition */
 static CFRunLoopRef    SysEventRunloop = NULL;
@@ -310,8 +325,8 @@ static CFStringRef  ComputerNameKey = NULL,
 static cupsd_sysevent_t        LastSysEvent;   /* Last system event (for delayed sleep) */
 
 
-/* 
- * Local functions... 
+/*
+ * Local functions...
  */
 
 static void    *sysEventThreadEntry(void);
@@ -493,8 +508,8 @@ sysEventThreadEntry(void)
                                                   kSCEntNetIPv6);
 
   if (!NetworkGlobalKeyDNS)
-    NetworkGlobalKeyDNS = 
-       SCDynamicStoreKeyCreateNetworkGlobalEntity(kCFAllocatorDefault, 
+    NetworkGlobalKeyDNS =
+       SCDynamicStoreKeyCreateNetworkGlobalEntity(kCFAllocatorDefault,
                                                   kSCDynamicStoreDomainState,
                                                   kSCEntNetDNS);
 
@@ -576,7 +591,7 @@ sysEventThreadEntry(void)
 
   threadData.timerRef =
       CFRunLoopTimerCreate(kCFAllocatorDefault,
-                           CFAbsoluteTimeGetCurrent() + (86400L * 365L * 10L), 
+                           CFAbsoluteTimeGetCurrent() + (86400L * 365L * 10L),
                           86400L * 365L * 10L, 0, 0, sysEventTimerNotifier,
                           &timerContext);
   CFRunLoopAddTimer(CFRunLoopGetCurrent(), threadData.timerRef,
@@ -668,7 +683,7 @@ sysEventPowerNotifier(
        break;
 
     case kIOMessageSystemHasPoweredOn:
-       /* 
+       /*
        * Because powered on is followed by a net-changed event, delay
        * before sending it.
        */
@@ -696,7 +711,7 @@ sysEventPowerNotifier(
 
     if (sendit == 1)
     {
-     /* 
+     /*
       * Send the event to the main thread now.
       */
 
@@ -706,7 +721,7 @@ sysEventPowerNotifier(
     }
     else
     {
-     /* 
+     /*
       * Send the event to the main thread after 1 to 2 seconds.
       */
 
@@ -732,7 +747,7 @@ sysEventConfigurationNotifier(
 
 
   threadData = (cupsd_thread_data_t *)context;
-  
+
   (void)store;                         /* anti-compiler-warning-code */
 
   CFRange range = CFRangeMake(0, CFArrayGetCount(changedKeys));
@@ -752,12 +767,12 @@ sysEventConfigurationNotifier(
   }
 
  /*
-  * Because we registered for several different kinds of change notifications 
-  * this callback usually gets called several times in a row. We use a timer to 
+  * Because we registered for several different kinds of change notifications
+  * this callback usually gets called several times in a row. We use a timer to
   * de-bounce these so we only end up generating one event for the main thread.
   */
 
-  CFRunLoopTimerSetNextFireDate(threadData->timerRef, 
+  CFRunLoopTimerSetNextFireDate(threadData->timerRef,
                                CFAbsoluteTimeGetCurrent() + 5);
 }
 
@@ -859,24 +874,27 @@ sysUpdate(void)
            p;
           p = (cupsd_printer_t *)cupsArrayNext(Printers))
       {
-       if (p->type & CUPS_PRINTER_DISCOVERED)
-       {
-         cupsdLogMessage(CUPSD_LOG_DEBUG,
-                         "Deleting remote destination \"%s\"", p->name);
-         cupsArraySave(Printers);
-         cupsdDeletePrinter(p, 0);
-         cupsArrayRestore(Printers);
-       }
-       else
-       {
-         cupsdLogMessage(CUPSD_LOG_DEBUG,
-                         "Deregistering local printer \"%s\"", p->name);
-         cupsdDeregisterPrinter(p, 0);
-       }
+       cupsdLogMessage(CUPSD_LOG_DEBUG,
+                       "Deregistering local printer \"%s\"", p->name);
+       cupsdDeregisterPrinter(p, 0);
       }
 
       cupsdCleanDirty();
 
+#ifdef kIOPMAssertionTypeDenySystemSleep
+     /*
+      * Remove our assertion as needed since the user wants the system to
+      * sleep (different than idle sleep)...
+      */
+
+      if (keep_awake)
+      {
+       cupsdLogMessage(CUPSD_LOG_DEBUG, "Releasing dark wake assertion.");
+       IOPMAssertionRelease(keep_awake);
+       keep_awake = 0;
+      }
+#endif /* kIOPMAssertionTypeDenySystemSleep */
+
      /*
       * If we have no printing jobs, allow the power change immediately.
       * Otherwise set the SleepJobs time to 15 seconds in the future when
@@ -928,29 +946,25 @@ sysUpdate(void)
       IOAllowPowerChange(sysevent.powerKernelPort,
                          sysevent.powerNotificationID);
       Sleeping = 0;
+
+#ifdef kIOPMAssertionTypeDenySystemSleep
+      if (cupsArrayCount(PrintingJobs) > 0 && !keep_awake)
+      {
+       cupsdLogMessage(CUPSD_LOG_DEBUG, "Asserting dark wake.");
+       IOPMAssertionCreateWithName(kIOPMAssertionTypeDenySystemSleep,
+                                   kIOPMAssertionLevelOn,
+                                   CFSTR("org.cups.cupsd"), &keep_awake);
+      }
+#endif /* kIOPMAssertionTypeDenySystemSleep */
+
       cupsdCheckJobs();
     }
 
     if (sysevent.event & SYSEVENT_NETCHANGED)
     {
       if (!Sleeping)
-      {
         cupsdLogMessage(CUPSD_LOG_DEBUG,
                        "System network configuration changed");
-
-       /*
-        * Resetting browse_time before calling cupsdSendBrowseList causes
-       * browse packets to be sent for local shared printers.
-        */
-
-       for (p = (cupsd_printer_t *)cupsArrayFirst(Printers);
-            p;
-            p = (cupsd_printer_t *)cupsArrayNext(Printers))
-         p->browse_time = 0;
-
-        cupsdSendBrowseList();
-       cupsdRestartPolling();
-      }
       else
         cupsdLogMessage(CUPSD_LOG_DEBUG,
                        "System network configuration changed; "
@@ -973,11 +987,13 @@ sysUpdate(void)
             p = (cupsd_printer_t *)cupsArrayNext(Printers))
          cupsdDeregisterPrinter(p, 1);
 
+#  if defined(HAVE_DNSSD) || defined(HAVE_AVAHI)
        /*
         * Update the computer name and BTMM domain list...
        */
 
        cupsdUpdateDNSSDName();
+#  endif /* HAVE_DNSSD || HAVE_AVAHI */
 
        /*
        * Now re-register them...
@@ -986,10 +1002,7 @@ sysUpdate(void)
        for (p = (cupsd_printer_t *)cupsArrayFirst(Printers);
             p;
             p = (cupsd_printer_t *)cupsArrayNext(Printers))
-       {
-         p->browse_time = 0;
          cupsdRegisterPrinter(p);
-       }
       }
       else
         cupsdLogMessage(CUPSD_LOG_DEBUG,
@@ -1002,5 +1015,5 @@ sysUpdate(void)
 
 
 /*
- * End of "$Id: sysman.c 7928 2008-09-10 22:14:22Z mike $".
+ * End of "$Id: sysman.c 11106 2013-07-08 12:29:10Z msweet $".
  */