Package elisa :: Package core :: Package observers :: Module dict
[hide private]
[frames] | no frames]

Source Code for Module elisa.core.observers.dict

  1  # -*- coding: utf-8 -*- 
  2  # Elisa - Home multimedia server 
  3  # Copyright (C) 2006-2008 Fluendo Embedded S.L. (www.fluendo.com). 
  4  # All rights reserved. 
  5  # 
  6  # This file is available under one of two license agreements. 
  7  # 
  8  # This file is licensed under the GPL version 3. 
  9  # See "LICENSE.GPL" in the root of this distribution including a special 
 10  # exception to use Elisa with Fluendo's plugins. 
 11  # 
 12  # The GPL part of Elisa is also available under a commercial licensing 
 13  # agreement from Fluendo. 
 14  # See "LICENSE.Elisa" in the root directory of this distribution package 
 15  # for details on that license. 
 16   
 17   
 18  __maintainer__ = 'Lionel Martin <lionel@fluendo.com>' 
 19  __maintainer2__ = 'Florian Boucault <florian@fluendo.com>' 
 20   
 21  import weakref 
 22   
 23  from elisa.core import log 
 24   
25 -class DictObservable(log.Loggable, dict):
26 27 # FIXME: should be made thread-safe. 28 # FIXME: not complete. 29
30 - def __init__(self, *args, **kw):
31 log.Loggable.__init__(self) 32 dict.__init__(self, *args, **kw) 33 self._observers = []
34
35 - def __hash__(self):
36 return Observable.__hash__(self)
37
38 - def __repr__(self):
39 return "<DictObservable %r>" % dict.__repr__(self)
40
41 - def __eq__(self, other):
42 return id(self) == id(other)
43
44 - def __setitem__(self, key, value):
45 dict.__setitem__(self, key, value) 46 self._send_message_to_observers("modified", key, value)
47
48 - def add_observer(self, observer):
49 """Attach an observer which will then be notified of all the changes 50 applied to the observable. 51 52 @param observer: observer to attach 53 @type observer: L{elisa.core.observers.observer.Observer} 54 """ 55 self.debug("Adding observer %r" % observer) 56 real_observers = [weak_observer() for weak_observer in self._observers] 57 if observer not in real_observers: 58 self._observers.append(weakref.ref(observer)) 59 else: 60 self.debug("Observer %r was already observing" % observer)
61
62 - def remove_observer(self, observer):
63 """Detach an observer which will not be notified anymore of changes 64 applied to the observable. 65 66 @param observer: observer to detach 67 @type observer: L{elisa.core.observers.observer.Observer} 68 """ 69 self.debug("Removing observer %r", observer) 70 refs = weakref.getweakrefs(observer) 71 for ref in refs: 72 try: 73 self._observers.remove(ref) 74 except ValueError: 75 pass 76 """ 77 # ignore the call if the observer was not known 78 self.debug("Observer %r was not observing", observer) 79 """
80
81 - def _send_message_to_observers(self, message, *args):
82 for weak_observer in self._observers: 83 observer = weak_observer() 84 if observer == None: 85 continue 86 else: 87 getattr(observer, message)(*args)
88 89
90 -class DictObserver(object):
91 92 # FIXME: should pass the old value as well
93 - def modified(self, key, value):
94 """ 95 Message sent by a L{DictObservable} when one of its elements is 96 modified. 97 98 @param key: key of the dictionary for which the value was modified 99 @type key: object 100 @param value: new value associated to L{key} 101 @type value: object 102 """ 103 pass
104 105 106 107 108 #if __name__ == "__main__": 109 # 110 # l = DictObservable() 111 # o = DictObserver() 112 # 113 # l.add_observer(o) 114 # 115 # print l 116 # l['key']= 'value' 117 # l['key']= 'value2' 118