home *** CD-ROM | disk | FTP | other *** search
/ Maximum CD 2010 November / maximum-cd-2010-11.iso / DiscContents / calibre-0.7.13.msi / file_1474 (.txt) < prev    next >
Encoding:
Python Compiled Bytecode  |  2010-08-06  |  6.0 KB  |  161 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyc (Python 2.6)
  3.  
  4. import os
  5. import thread
  6. import win32api
  7. import win32con
  8. import win32event
  9. import win32service
  10. import win32serviceutil
  11. from cherrypy.process import wspbus, plugins
  12.  
  13. class ConsoleCtrlHandler(plugins.SimplePlugin):
  14.     
  15.     def __init__(self, bus):
  16.         self.is_set = False
  17.         plugins.SimplePlugin.__init__(self, bus)
  18.  
  19.     
  20.     def start(self):
  21.         if self.is_set:
  22.             self.bus.log('Handler for console events already set.', level = 40)
  23.             return None
  24.         result = win32api.SetConsoleCtrlHandler(self.handle, 1)
  25.         if result == 0:
  26.             self.bus.log('Could not SetConsoleCtrlHandler (error %r)' % win32api.GetLastError(), level = 40)
  27.         else:
  28.             self.bus.log('Set handler for console events.', level = 40)
  29.             self.is_set = True
  30.  
  31.     
  32.     def stop(self):
  33.         if not self.is_set:
  34.             self.bus.log('Handler for console events already off.', level = 40)
  35.             return None
  36.         
  37.         try:
  38.             result = win32api.SetConsoleCtrlHandler(self.handle, 0)
  39.         except ValueError:
  40.             self.is_set
  41.             self.is_set
  42.             result = 1
  43.         except:
  44.             self.is_set
  45.  
  46.         if result == 0:
  47.             self.bus.log('Could not remove SetConsoleCtrlHandler (error %r)' % win32api.GetLastError(), level = 40)
  48.         else:
  49.             self.bus.log('Removed handler for console events.', level = 40)
  50.             self.is_set = False
  51.  
  52.     
  53.     def handle(self, event):
  54.         if event in (win32con.CTRL_C_EVENT, win32con.CTRL_LOGOFF_EVENT, win32con.CTRL_BREAK_EVENT, win32con.CTRL_SHUTDOWN_EVENT, win32con.CTRL_CLOSE_EVENT):
  55.             self.bus.log('Console event %s: shutting down bus' % event)
  56.             
  57.             try:
  58.                 self.stop()
  59.             except ValueError:
  60.                 pass
  61.  
  62.             self.bus.exit()
  63.             return 1
  64.         return 0
  65.  
  66.  
  67.  
  68. class Win32Bus(wspbus.Bus):
  69.     
  70.     def __init__(self):
  71.         self.events = { }
  72.         wspbus.Bus.__init__(self)
  73.  
  74.     
  75.     def _get_state_event(self, state):
  76.         
  77.         try:
  78.             return self.events[state]
  79.         except KeyError:
  80.             event = win32event.CreateEvent(None, 0, 0, u'WSPBus %s Event (pid=%r)' % (state.name, os.getpid()))
  81.             self.events[state] = event
  82.             return event
  83.  
  84.  
  85.     
  86.     def _get_state(self):
  87.         return self._state
  88.  
  89.     
  90.     def _set_state(self, value):
  91.         self._state = value
  92.         event = self._get_state_event(value)
  93.         win32event.PulseEvent(event)
  94.  
  95.     state = property(_get_state, _set_state)
  96.     
  97.     def wait(self, state, interval = 0.1):
  98.         if isinstance(state, (tuple, list)):
  99.             if self.state not in state:
  100.                 events = []([ self._get_state_event(s) for s in state ])
  101.                 win32event.WaitForMultipleObjects(events, 0, win32event.INFINITE)
  102.             
  103.         elif self.state != state:
  104.             event = self._get_state_event(state)
  105.             win32event.WaitForSingleObject(event, win32event.INFINITE)
  106.         
  107.  
  108.  
  109.  
  110. class _ControlCodes(dict):
  111.     
  112.     def key_for(self, obj):
  113.         for key, val in self.iteritems():
  114.             if val is obj:
  115.                 return key
  116.         
  117.         raise ValueError('The given object could not be found: %r' % obj)
  118.  
  119.  
  120. control_codes = _ControlCodes({
  121.     'graceful': 138 })
  122.  
  123. def signal_child(service, command):
  124.     if command == 'stop':
  125.         win32serviceutil.StopService(service)
  126.     elif command == 'restart':
  127.         win32serviceutil.RestartService(service)
  128.     else:
  129.         win32serviceutil.ControlService(service, control_codes[command])
  130.  
  131.  
  132. class PyWebService(win32serviceutil.ServiceFramework):
  133.     _svc_name_ = 'Python Web Service'
  134.     _svc_display_name_ = 'Python Web Service'
  135.     _svc_deps_ = None
  136.     _exe_name_ = 'pywebsvc'
  137.     _exe_args_ = None
  138.     _svc_description_ = 'Python Web Service'
  139.     
  140.     def SvcDoRun(self):
  141.         process = process
  142.         import cherrypy
  143.         process.bus.start()
  144.         process.bus.block()
  145.  
  146.     
  147.     def SvcStop(self):
  148.         process = process
  149.         import cherrypy
  150.         self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING)
  151.         process.bus.exit()
  152.  
  153.     
  154.     def SvcOther(self, control):
  155.         process.bus.publish(control_codes.key_for(control))
  156.  
  157.  
  158. if __name__ == '__main__':
  159.     win32serviceutil.HandleCommandLine(PyWebService)
  160.  
  161.