Audio/AudioControl: Lots of fixes
[audiocontrol.git] / Process.py
1 import Events, Logger
2 import popen2, fcntl, os
3
4 class Process(Events.EventSource):
5
6     def __init__(self, command, context):
7         self._proc = popen2.Popen4(command)
8         fcntl.fcntl(self._proc.fromchild, fcntl.F_SETFL, os.O_NDELAY)
9         Events.EventSource.__init__(self, self._proc.fromchild, context)
10         self._buffer = ""
11         Logger.log(self.context(),"launched %s" % command)
12
13     def readEvents(self):
14         data = (self._buffer + self._proc.fromchild.read()).split('\n')
15         self._buffer = data.pop(-1)
16         for line in data:
17             Logger.log(self.context(), line)
18         rv = self.poll()
19         if rv != -1 : self._term(rv)
20         return []
21
22     def terminate(self):
23         os.kill(self._proc.pid,signal.SIGTERM)
24         self._term(self._proc.wait())
25
26     def _term(self, rv):
27         if self._buffer : Logger.log(self.context(),self._buffer)
28         self._buffer = ""
29         Logger.log(self.context(), 'Terminated with exit code %s' % rv)
30         self.owner().unregisterSource(self)