def SvcDoRun(self):
        # Write an event log record - in debug mode we will also
        # see this message printed.
        servicemanager.LogMsg(
                servicemanager.EVENTLOG_INFORMATION_TYPE,
                servicemanager.PYS_SERVICE_STARTED,
                (self._svc_name_, '')
                )

        # attempt to retrieve comnfig file name
        self._svc_configFile_ = win32serviceutil.GetServiceCustomOption(
                TaskRunnerService._svc_name_,
                "TaskConfigurationFile",
                self._svc_configFile_ )

        # Create the active object.
        self.taskRunner = TaskRunner()
        self.taskRunner.configure( parseXmlFile( self._svc_configFile_ ) )
        self.taskRunner.start()
        self.running = True

        while self.running:
            # it is all on deamon threads
            time.sleep(1)   

        # Write another event log record.
        servicemanager.LogMsg(
                servicemanager.EVENTLOG_INFORMATION_TYPE,
                servicemanager.PYS_SERVICE_STOPPED,
                (self._svc_name_, "")
                )
class TaskRunnerService(win32serviceutil.ServiceFramework):
    _svc_name_ = "TaskRunner"
    _svc_display_name_ = "Webbrick Gateway TaskRunner"
    _svc_description_ = "Acts as a host for python tasks."

    def __init__(self, args):
        self._svc_configFile_ = "TaskRunner.xml"
        win32serviceutil.ServiceFramework.__init__(self, args)
        self.running = False
        
    def SvcStop(self):
        self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING)
        self.running = False
        self.taskRunner.stop()

    def SvcDoRun(self):
        # Write an event log record - in debug mode we will also
        # see this message printed.
        servicemanager.LogMsg(
                servicemanager.EVENTLOG_INFORMATION_TYPE,
                servicemanager.PYS_SERVICE_STARTED,
                (self._svc_name_, '')
                )

        # attempt to retrieve comnfig file name
        self._svc_configFile_ = win32serviceutil.GetServiceCustomOption(
                TaskRunnerService._svc_name_,
                "TaskConfigurationFile",
                self._svc_configFile_ )

        # Create the active object.
        self.taskRunner = TaskRunner()
        self.taskRunner.configure( parseXmlFile( self._svc_configFile_ ) )
        self.taskRunner.start()
        self.running = True

        while self.running:
            # it is all on deamon threads
            time.sleep(1)   

        # Write another event log record.
        servicemanager.LogMsg(
                servicemanager.EVENTLOG_INFORMATION_TYPE,
                servicemanager.PYS_SERVICE_STOPPED,
                (self._svc_name_, "")
                )
    def testTaskRunner(self):
        runner = TaskRunner()
        runner.configure( parseXmlString(self._configure) )
        runner.start()  # all tasks

        task = runner._tasks['testTask'] # hack.

        time.sleep(1)

        self.assertEqual( task._running, True )
        assert( task._runtime > 0, 'task did not run' )
        self.assertEqual( task._value, 'value' )
        runner.stop()

        time.sleep(1)

        self.assertEqual( task._running, False )