Package flumotion :: Package common :: Module signals
[hide private]

Source Code for Module flumotion.common.signals

 1  # -*- Mode: Python; test-case-name: flumotion.test.test_common_signals -*- 
 2  # vi:si:et:sw=4:sts=4:ts=4 
 3   
 4  # Flumotion - a streaming media server 
 5  # Copyright (C) 2004,2005,2006,2007,2008,2009 Fluendo, S.L. 
 6  # Copyright (C) 2010,2011 Flumotion Services, S.A. 
 7  # All rights reserved. 
 8  # 
 9  # This file may be distributed and/or modified under the terms of 
10  # the GNU Lesser General Public License version 2.1 as published by 
11  # the Free Software Foundation. 
12  # This file is distributed without any warranty; without even the implied 
13  # warranty of merchantability or fitness for a particular purpose. 
14  # See "LICENSE.LGPL" in the source distribution for more information. 
15  # 
16  # Headers in this file shall remain intact. 
17   
18  """synchronous message passing between python objects 
19  """ 
20   
21  from flumotion.common import log 
22   
23  __version__ = "$Rev$" 
24   
25   
26 -class SignalMixin(object):
27 __signals__ = () 28 29 __signalConnections = None 30 __signalId = 0 31
32 - def __ensureSignals(self):
33 if self.__signalConnections is None: 34 self.__signalConnections = {}
35
36 - def connect(self, signalName, proc, *args, **kwargs):
37 self.__ensureSignals() 38 39 if signalName not in self.__signals__: 40 raise ValueError('Unknown signal for object of type %r: %s' 41 % (type(self), signalName)) 42 43 sid = self.__signalId 44 self.__signalConnections[sid] = (signalName, proc, args, kwargs) 45 self.__signalId += 1 46 return sid
47
48 - def disconnect(self, signalId):
49 self.__ensureSignals() 50 51 if signalId not in self.__signalConnections: 52 raise ValueError('Unknown signal ID: %s' % (signalId, )) 53 54 del self.__signalConnections[signalId]
55
56 - def disconnectByFunction(self, function):
57 self.__ensureSignals() 58 59 for signalId, conn in self.__signalConnections.items(): 60 name, proc, args, kwargs = conn 61 if proc == function: 62 break 63 else: 64 raise ValueError( 65 'No signal connected to function: %r' % (function, )) 66 67 del self.__signalConnections[signalId]
68
69 - def emit(self, signalName, *args):
70 self.__ensureSignals() 71 if signalName not in self.__signals__: 72 raise ValueError('Emitting unknown signal %s' % signalName) 73 74 connections = self.__signalConnections 75 for name, proc, pargs, pkwargs in connections.values(): 76 if name == signalName: 77 try: 78 proc(self, *(args + pargs), **pkwargs) 79 except Exception, e: 80 log.warning("signalmixin", "Exception calling " 81 "signal handler %r: %s", proc, 82 log.getExceptionMessage(e))
83