Package flumotion :: Package component :: Package base :: Module statewatcher
[hide private]

Source Code for Module flumotion.component.base.statewatcher

 1  # -*- Mode: Python; test-case-name: flumotion.test.test_feedcomponent010 -*- 
 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 Fluendo, S.L. (www.fluendo.com). 
 6  # All rights reserved. 
 7   
 8  # This file may be distributed and/or modified under the terms of 
 9  # the GNU General Public License version 2 as published by 
10  # the Free Software Foundation. 
11  # This file is distributed without any warranty; without even the implied 
12  # warranty of merchantability or fitness for a particular purpose. 
13  # See "LICENSE.GPL" in the source distribution for more information. 
14   
15  # Licensees having purchased or holding a valid Flumotion Advanced 
16  # Streaming Server license may use this file in accordance with the 
17  # Flumotion Advanced Streaming Server Commercial License Agreement. 
18  # See "LICENSE.Flumotion" in the source distribution for more information. 
19   
20  # Headers in this file shall remain intact. 
21   
22  # this class is a bit of an experiment 
23  # editor's note: "experiment" is an excuse for undocumented and uncommented 
24 -class StateWatcher(object):
25 - def __init__(self, state, setters, appenders, removers, 26 setitemers=None, delitemers=None):
27 self.state = state 28 self.setters = setters 29 self.appenders = appenders 30 self.removers = removers 31 self.setitemers = setitemers 32 self.delitemers = delitemers 33 self.shown = False 34 35 state.addListener(self, set_=self.onSet, append=self.onAppend, 36 remove=self.onRemove, setitem=self.onSetItem, 37 delitem=self.onDelItem) 38 39 for k in appenders: 40 for v in state.get(k): 41 self.onAppend(state, k, v)
42
43 - def hide(self):
44 if self.shown: 45 for k in self.setters: 46 self.onSet(self.state, k, None) 47 self.shown = False
48
49 - def show(self):
50 # "show" the watcher by triggering all the registered setters 51 if not self.shown: 52 self.shown = True 53 for k in self.setters: 54 self.onSet(self.state, k, self.state.get(k))
55
56 - def onSet(self, obj, k, v):
57 if self.shown and k in self.setters: 58 self.setters[k](self.state, v)
59
60 - def onAppend(self, obj, k, v):
61 if k in self.appenders: 62 self.appenders[k](self.state, v)
63
64 - def onRemove(self, obj, k, v):
65 if k in self.removers: 66 self.removers[k](self.state, v)
67
68 - def onSetItem(self, obj, k, sk, v):
69 if self.shown and k in self.setitemers: 70 self.setitemers[k](self.state, sk, v)
71
72 - def onDelItem(self, obj, k, sk, v):
73 if self.shown and k in self.setitemers: 74 self.setitemers[k](self.state, sk, v)
75
76 - def unwatch(self):
77 if self.state: 78 self.hide() 79 for k in self.removers: 80 for v in self.state.get(k): 81 self.onRemove(self.state, k, v) 82 self.state.removeListener(self) 83 self.state = None
84