Ticket #435: rule.py

File rule.py, 4.4 KB (added by khiraly, 3 years ago)

/usr/lib/python2.6/site-packages/framework/subsystems/oeventsd/rule.py

Line 
1# -*- coding: UTF-8 -*-
2"""
3The freesmartphone Events Module - Python Implementation
4
5(C) 2008 Michael 'Mickey' Lauer <mlauer@vanille-media.de>
6(C) 2008 Jan 'Shoragan' LÃŒbbe <jluebbe@lasnet.de>
7(C) 2008 Guillaume 'Charlie' Chereau
8(C) 2008 Openmoko, Inc.
9GPLv2 or later
10"""
11
12__version__ = "0.2.0"
13MODULE_NAME = "oeventsd.rule"
14
15import logging
16logger = logging.getLogger( MODULE_NAME )
17
18from filter import Filter, AndFilter
19from action import Action, ListAction
20from trigger import Trigger
21
22#============================================================================#
23class Rule( Trigger, Action ):
24#============================================================================#
25    """A Rule is a link betwen a trigger and an action, that can check for conditions
26
27    Using rule we can refine the behavior of a trigger by giving a filter.
28    When the rule is triggered it will trigger the action only if its filter
29    allow it.
30    """
31    def __init__( self, trigger, filter = Filter(), action = Action(), name = "" ):
32        """Create a new rule given a trigger, a filter and an action
33
34        We can give a list of action or a list of filter instead of a single
35        action or filter, in that case the actions will be turned into a ListAction
36        and the filters into an AndFilter.
37        """
38        Trigger.__init__( self )
39        Action.__init__( self )
40
41        # We accept list OR single value as argument
42        if isinstance( filter, list ):
43            filter = AndFilter( *filter )
44        if isinstance( action, list ):
45            action = ListAction( action )
46
47        assert isinstance(trigger, Trigger)
48        assert isinstance(action, Action)
49        assert isinstance(filter, Filter)
50
51        self.__trigger = trigger
52        # The trigger will call this rule when triggered
53        trigger.connect( self )
54
55        self.__filter = filter
56        self.__action = action
57        self.connect( action )
58
59        self.name = name
60
61    def __repr__( self ):
62        if self.name:
63            return "'%s'" % self.name
64        return "on %s if %s then %s" % ( self.__trigger, self.__filter, self.__action )
65
66    def trigger( self, **kargs ):
67        # First we check that ALL the filters match the signal
68        if not self.__filter.filter( **kargs ):
69            return False
70        self._trigger( **kargs )
71        return True
72
73    def enable( self ):
74        # It should be enough to enable the trigger and the filter
75        logger.info( "enable rule : %s", self )
76        self.__trigger.enable()
77        self.__filter.enable()
78
79    def disable( self ):
80        # It should be enough to disable the trigger and the filter
81        logger.info( "disable rule : %s", self )
82        self.__trigger.disable()
83        self.__filter.disable()
84
85#============================================================================#
86class WhileRule( Rule, Filter ):
87#============================================================================#
88    """Special Rule that will also untrigger its action
89
90    We can also use a WhileRule as a filter, the condition is then true if the
91    rule is currently triggered.
92    """
93    def __init__( self, *args ):
94        Rule.__init__( self, *args )
95        Filter.__init__( self, *args )
96        self.triggered = False
97
98    def trigger( self, **kargs ):
99        logger.debug("WhileRule.trigger(%s)", kargs)
100        if self.triggered:
101            logger.debug("WhileRule.trigger:self.triggered =TRUE")
102            if not self._Rule__filter.filter( **kargs ):
103                self.untrigger( **kargs )
104        else:
105            #logger.debug("WhileRule.trigger:self.triggered=FALSE, self.triggered = Rule.trigger( self, **kargs): %s", Rule.trigger(self, **kargs))
106            self.triggered = Rule.trigger( self, **kargs )
107
108    def untrigger( self, **kargs ):
109        if not self.triggered:
110            logger.warning( "Untrigger for '%s' called, but not yet triggered. Not untriggering", self )
111            return
112        self._untrigger( **kargs )
113        self.triggered = False
114
115    def enable( self ):
116        Rule.enable( self )
117
118    def disable( self ):
119        Rule.disable( self )
120
121    def filter( self, **kargs ):
122        """The filter is True if the rule is triggered"""
123        return self.triggered
124
125    def __repr__( self ):
126        if self.name:
127            return "'%s'" % self.name
128        return "While %s if %s then %s" % ( self._Rule__trigger, self._Rule__filter, self._Rule__action )
129