Changeset 65

Show
Ignore:
Timestamp:
03/17/02 19:34:00 (6 years ago)
Author:
sholloway
Message:

Subject Observer Updates

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/RBFoundation/RBFoundation/ContextApply.py

    r64 r65  
    44 
    55import weakref 
    6 import types 
     6from WeakBind import BindCallable 
    77 
    88#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     
    1919#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    2020 
    21 class BindMethod: 
    22     def __init__(self, callback): 
    23         if isinstance(callback, (types.MethodType, types.UnboundMethodType)): 
    24             self.im_self = weakref.ref(callback.im_self) 
    25             self.im_func = callback.im_func 
    26         else: 
    27             self.im_self = None 
    28             self.im_func = callback 
    29   
    30     def __nonzero__(self): 
    31         return self.im_func and (not self.im_self or self.im_self()) and 1 or 0 
    32  
    33     def __call__(self, *args, **kw): 
    34         return self._DoCall(args, kw) 
    35  
    36     def _DoCall(self, args, kw): 
    37         if self.im_self: 
    38             return apply(self.im_func, (self.im_self(),) + args, kw) 
    39         else: return apply(self.im_func, args, kw) 
    40  
    41 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    42  
    43 class _ContextApply(BindMethod): 
     21class _ContextApply(BindCallable): 
    4422    def __init__(self, callback, *args, **kw): 
    45         BindMethod.__init__(self, callback) 
     23        BindCallable.__init__(self, callback) 
    4624        self.args = args 
    4725        self.kw = kw 
  • trunk/RBJabber/RBJabber/Client.py

    r61 r65  
    9191    def __init__(self, *args, **kw): 
    9292        self.stream = SubjectObserver.BidableCategorySubject() 
    93         self.information = SubjectObserver.AttributedSubject() 
     93        self.information = SubjectObserver.AttributedSubject.AttributedSubject() 
    9494        apply(Base.Client.__init__, (self,) + args, kw) 
    9595         
  • trunk/RBJabber/RBJabber/JabberConnection.py

    r64 r65  
    55from Foundation.XMLBuilder import XMLBuilderMixin, XMLBuilderObjectBase, ParserCreate 
    66from Foundation import SmartSelect 
    7 from Foundation.ContextApply import BindMethod 
     7from Foundation.ContextApply import BindCallable 
    88from JID import * 
    99import socket 
     
    5050        self._parser = ParserCreate('ASCII', self._seperator) 
    5151        self._parser.returns_unicode = 0 
    52         self._parser.StartElementHandler = BindMethod(self._start_element) 
    53         self._parser.EndElementHandler = BindMethod(self._end_element) 
    54         self._parser.CharacterDataHandler = BindMethod(self._char_data) 
     52        self._parser.StartElementHandler = BindCallable(self._start_element) 
     53        self._parser.EndElementHandler = BindCallable(self._end_element) 
     54        self._parser.CharacterDataHandler = BindCallable(self._char_data) 
    5555 
    5656        # Send the initial header 
  • trunk/RBJabber/RBJabber/MessageRouter.py

    r53 r65  
    44 
    55from Foundation.SubjectObserver.Subject import Subject 
    6 from Foundation.SubjectObserver.BidableSubject import BiddableLogicMixin 
     6from Foundation.SubjectObserver.Observer import Observer 
     7from Foundation.SubjectObserver.BidableSubject import BidableSubjectMixin  
    78from JID import * 
    89 
     
    1112#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    1213 
    13 class MessageRouterBase(BiddableLogicMixin): 
     14class MessageRouterBase(BidableSubjectMixin): 
    1415    def __init__(self, JC, MessageMapEntryClass=None): 
    15         JC.stream.AddObserver('message', self) 
     16        self._observer = Observer(self.Update, self.Bid) 
     17        JC.stream.AddObserver('message', self._observer) 
    1618        self._UpdateMap = {} 
    1719        if not MessageMapEntryClass: 
     
    1921        self.MessageMapEntryClass = MessageMapEntryClass 
    2022 
    21     def Bid(self, subject, UpdateDict): 
     23    def Update(self, subject, **UpdateDict): 
     24        pass 
     25 
     26    def Bid(self, subject, **UpdateDict): 
    2227        message = UpdateDict.get('message', None) 
    2328        for index in self._UpdateMapXForm(message): 
     
    2530            if UpdateSubject: 
    2631                for obs in UpdateSubject.Observers: 
    27                     subject._GetBid(obs(), UpdateDict) 
     32                    subject._GetBid(obs, UpdateDict) 
    2833 
    2934    def Get(self, index, bCreateSubject=1): 
  • trunk/RBJabber/RBJabber/PresenceMap.py

    r58 r65  
    44 
    55from Foundation.SubjectObserver.Subject import Subject 
    6 from Foundation.SubjectObserver.BidableSubject import BiddableLogicMixin 
     6from Foundation.SubjectObserver.Observer import Observer 
     7from Foundation.SubjectObserver.BidableSubject import BidableSubjectMixin 
    78from JID import * 
    89 
     
    1415    def __init__(self, JC): 
    1516        Subject.__init__(self) 
    16         JC.stream.AddObserver('presence', self
     17        JC.stream.AddObserver('presence', Observer(self.Update)
    1718        self.ByJID = {} 
    1819        self.ByResource = {} 
    1920 
    20     def Update(self, subject, UpdateDict): 
     21    def Update(self, subject, **UpdateDict): 
    2122        presence = UpdateDict.get('presence', None) 
    2223        FromJID = JIDsplit(presence.from_) 
     
    3738#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    3839 
    39 class PresenceUpdateMap(BiddableLogicMixin): 
     40class PresenceUpdateMap(BidableSubjectMixin): 
    4041    def __init__(self, JC, PresenceMapEntryClass=None): 
    41         JC.stream.AddObserver('presence', self
     42        JC.stream.AddObserver('presence', Observer(self.Update, self.Bid)
    4243        self._UpdateMap = {} 
    4344        if not PresenceMapEntryClass: 
     
    5253        return self._UpdateIndexXForm(node.from_) 
    5354 
    54     def Bid(self, subject, UpdateDict): 
     55    def Bid(self, subject, **UpdateDict): 
    5556        presence = UpdateDict.get('presence', None) 
    5657        lstXForms = self._UpdateMapXForm(presence) 
     
    6061                for obs in UpdateSubject.Observers: 
    6162                    subject._GetBid(obs(), UpdateDict) 
     63 
     64    def Update(self, subject, **UpdateDict): 
     65        pass # Weird condition... no bids on it, but we really dont care here 
    6266 
    6367    def Get(self, index, bCreateSubject=1): 
  • trunk/RBJabber/RBJabber/SubjectObserver/AssociativeObserver.py

    r30 r65  
     1#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     2#~ Imports  
     3#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     4 
     5from Foundation.WeakBind import BindCallable as _BindCallable 
     6 
    17#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    28#~ Definitions  
     
    814 
    915    def AddAssociation(self, Association, Callback): 
    10         self._associations.setdefault(Association, []).append(Callback
     16        self._associations.setdefault(Association, []).append(_BindCallable(Callback)
    1117        return self 
    1218 
    13     def Update(self, subject, UpdateDict): 
    14         for each in UpdateDict
     19    def __call__(self, subject, **UpdateDict): 
     20        for each, value in UpdateDict.iteritems()
    1521            for callback in self._associations.get(each, []): 
    16                 callback(subject, each, UpdateDict[each]
     22                callback(subject, each, valuse
    1723                 
  • trunk/RBJabber/RBJabber/SubjectObserver/AttributedSubject.py

    r29 r65  
    44 
    55from Subject import Subject 
    6 from CategorySubject import CategorySubject 
    76 
    87#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     
    109#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    1110 
    12 def t_AttributedSubject(BaseSubject): 
    13     class AttributedSubjectMixin(BaseSubject): 
    14         def __init__(self): 
    15             BaseSubject.__init__(self) 
    16             self._attributes = {} 
     11class AttributedSubjectMixin(object): 
     12    def __init__(self, *args, **kw): 
     13        apply(super(AttributedSubjectMixin, self).__init__, args, kw) 
     14        self._attributes = {} 
    1715 
    18         def __getattribute__(self, name): 
    19             if '_' != name[0]: 
    20                 result = self._attributes.get(name, None) 
    21                 if result != None: 
    22                     return result 
    23             return BaseSubject.__getattribute__(self, name) 
     16    def __getattribute__(self, name): 
     17        if '_' != name[0]: 
     18            result = self._attributes.get(name, None) 
     19            if result != None: 
     20                return result 
     21        return super(AttributedSubjectMixin, self).__getattribute__(name) 
    2422 
    25         def __setattr__(self, name, value): 
    26             if '_' != name[0]: 
    27                 self._attributes[name] = value 
    28                 apply(self.UpdateObservers, tuple(), {name: value}) 
    29             else: 
    30                 return BaseSubject.__setattr__(self, name, value) 
    31     return AttributedSubjectMixin 
     23    def __setattr__(self, name, value): 
     24        if '_' != name[0]: 
     25            self._attributes[name] = value 
     26            apply(self.UpdateObservers, tuple(), {name: value}) 
     27        else: 
     28            return super(AttributedSubjectMixin, self).__setattr__(name, value) 
    3229 
    33 AttributedSubject = t_AttributedSubject(Subject) 
    34 AttributedCategorySubject = t_AttributedSubject(CategorySubject) 
     30#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     31 
     32class AttributedSubject(AttributedSubjectMixin, Subject):  
     33    pass 
     34 
  • trunk/RBJabber/RBJabber/SubjectObserver/BidableSubject.py

    r52 r65  
    44 
    55from Subject import Subject 
    6 from CategorySubject import CategorySubject 
    76 
    87#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     
    109#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    1110 
    12 class BiddableLogicMixin
     11class BidableSubjectMixin(object)
    1312    def _GetBid(self, observer, UpdateDict): 
    1413        bid = getattr(observer, 'Bid', None) 
    1514        if bid is None: 
    1615            # This client does not payattention to bids...  
    17             observer.Update(self, UpdateDict) 
     16            apply(observer, (self,), UpdateDict) 
    1817        else: 
    1918            if callable(bid): 
    20                 bid = bid(self, UpdateDict) 
     19                bid = apply(bid, (self,), UpdateDict) 
    2120            if bid: 
    2221                if bid > self._bids[0]: 
     
    2524                    self._bids[-1].append(observer) 
    2625 
    27 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     26    def UpdateObserversEx(self, UpdateDict): 
     27        self._bids = 0, [] 
     28        result = self.__super.UpdateObserversEx(UpdateDict) 
     29        if result and self._bids: 
     30            for observer in self._bids[-1]: 
     31                apply(observer, (self,), UpdateDict) 
     32        return result 
     33     
     34    def UpdateObserver(self, observer, UpdateDict): 
     35        if observer: self._GetBid(observer, UpdateDict) 
    2836 
    29 def t_BidableSubject(BaseSubject): 
    30     class BidableSubjectMixin(BaseSubject, BiddableLogicMixin): 
    31         def UpdateObserversEx(self, kw): 
    32             self._bids = 0, [] 
    33             result = BaseSubject.UpdateObserversEx(self, kw) 
    34             if result and self._bids: 
    35                 for each in self._bids[-1]: 
    36                     each.Update(self, kw) 
    37             return result 
    38          
    39         def UpdateObserver(self, observer, UpdateDict): 
    40             if observer: 
    41                 self._GetBid(observer, UpdateDict) 
    42     return BidableSubjectMixin 
     37BidableSubjectMixin._BidableSubjectMixin__super = super(BidableSubjectMixin) 
    4338 
    4439#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    4540 
    46 BidableSubject = t_BidableSubject(Subject) 
    47 BidableCategorySubject = t_BidableSubject(CategorySubject) 
     41class BidableSubject(BidableSubjectMixin, Subject): 
     42    pass 
    4843 
  • trunk/RBJabber/RBJabber/SubjectObserver/CategorySubject.py

    r30 r65  
    33#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    44 
     5from Subject import Subject 
    56import weakref 
    67 
    78#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    8 #~ Title  
     9#~ Definitions  
    910#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    1011 
    11 class CategorySubject(object): 
     12class CategorySubject(Subject): 
    1213    def __init__(self): 
     14        super(CategorySubject, self).__init__() 
    1315        self._observers = {} 
    14         self._cachedUpdates = {} 
    15         self._locked = [] 
    1616 
    1717    #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     
    2020     
    2121    def AddObserver(self, category, observer, bUpdate=0): 
    22         self._observers.setdefault(category,[]).append(weakref.ref(observer)
    23         if bUpdate: 
    24             self.UpdateObserver(observer, self._cachedUpdates) 
     22        result = self._WrapObserver(observer
     23        self._observers.setdefault(category,[]).append(result) 
     24        if bUpdate: self.UpdateObserver(result, self._cachedUpdates) 
    2525        return self 
    2626 
    2727    def RemoveObserver(self, observer): 
    28         wrobserver = weakref.ref(observer) 
     28        result = self._WrapObserver(observer) 
    2929        for observers in self._observers.itervalues(): 
    30             while wrobserver in observers: 
    31                 observers.remove(wrobserver) 
     30            try: 
     31                while 1: observers.remove(result) 
     32            except ValueError: pass # result no longer in the list 
    3233        return self 
    3334 
     
    3738    
    3839    def _ObserverList(self, category): 
    39         lst = self._observers.get(category, []) 
    40         if lst:  
    41             lst = self._observers[category] = [obs for obs in lst if obs()] 
     40        lst = self._observers.setdefault(category, []) 
     41        lst[:] = filter(None, lst) 
    4242        return lst 
    43  
    44     def UpdateObservers(self, **kw): 
    45         return self.UpdateObserversEx(kw
     43    def _AllObserversList(self): 
     44        return [x for y in self._observers.values() for x in y] 
     45    Observers = property(_AllObserversList
    4646 
    4747    def UpdateObserversEx(self, kw): 
     
    5252            for category, value in _cachedUpdates.iteritems(): 
    5353                for each in self._ObserverList(category): 
    54                     self.UpdateObserver(each(), {category: value}) 
     54                    self.UpdateObserver(each, {category: value}) 
    5555            return 1 
    5656        else: return 0 
    5757 
    58     def UpdateObserver(self, observer, UpdateDict): 
    59         if observer: 
    60             observer.Update(self, UpdateDict) 
    61  
    62     def Lock(self): 
    63         class lock: 
    64             def __init__(self, lockedsubject): 
    65                 self.subject = lockedsubject 
    66                 self.subject._locked.append(id(self)) 
    67             def __del__(self): 
    68                 self.subject._locked.remove(id(self)) 
    69                 if self.subject._cachedUpdates: 
    70                     self.subject.UpdateObservers() 
    71         return lock(self) 
    72  
  • trunk/RBJabber/RBJabber/SubjectObserver/Observer.py

    r30 r65  
     1#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     2#~ Imports  
     3#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     4 
     5from Foundation.WeakBind import BindCallable as _BindCallable 
     6 
    17#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    28#~ Definitions  
    39#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    410 
    5 class Observer(object): 
    6     def __init__(self, callback=None): 
    7         if callback: 
    8             self.SetUpdateCallback(callback
     11class Observer(_BindCallable): 
     12    def __init__(self, callback=None, Bid=None): 
     13        super(Observer, self).__init__(callback or self.Update) 
     14        self.SetBid(Bid
    915 
    10     def SetUpdateCallback(self, callback): 
    11         self.Update = callback 
    12         return self 
     16    def SetBid(self, Bid=None): 
     17        if callable(Bid):  
     18            self.Bid = _BindCallable(Bid) 
     19        elif Bid:  
     20            self.Bid = Bid 
     21        elif hasattr(self, 'Bid'):  
     22            del self.Bid 
    1323 
    14     def Update(self, subject, UpdateDict): 
    15         print "On Update:", UpdateDict 
    16  
     24    def Update(self, subject, **UpdateDict): 
     25        print "On Update:", subject.__class__.__name__, UpdateDict 
  • trunk/RBJabber/RBJabber/SubjectObserver/Subject.py

    r52 r65  
    33#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    44 
     5from Foundation import WeakBind 
    56import weakref 
    67 
     
    2021     
    2122    def AddObserver(self, observer, bUpdate=0): 
    22         self._observers.append(weakref.ref(observer)
    23         if bUpdate: 
    24             self.UpdateObserver(observer, self._cachedUpdates) 
     23        result = self._WrapObserver(observer
     24        self._observers.append(observer) 
     25        if bUpdate: self.UpdateObserver(result, self._cachedUpdates) 
    2526        return self 
    2627 
    2728    def RemoveObserver(self, observer): 
    28         wrobserver = weakref.ref(observer) 
    29         while wrobserver in self._observers: 
    30             self._observers.remove(wrobserver) 
     29        result = self._WrapObserver(observer) 
     30        try: 
     31            while 1: self._observers.remove(result) 
     32        except ValueError: pass # result no longer in the list 
    3133        return self 
    3234 
     
    3537    #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    3638    
     39    def _WrapObserver(self, observer): 
     40        if not isinstance(observer, WeakBind.BindCallable): 
     41            observer = WeakBind.BindCallable(observer) 
     42        return observer 
     43  
    3744    def _ObserverList(self): 
    38         self._observers = [obs for obs in self._observers if obs()] 
     45        self._observers = filter(None, self._observers) 
    3946        return self._observers 
    4047    Observers = property(_ObserverList) 
     
    4956            lock = self.Lock() 
    5057            for each in self.Observers: 
    51                 self.UpdateObserver(each(), _cachedUpdates) 
     58                self.UpdateObserver(each, _cachedUpdates) 
    5259            return 1 
    5360        else: return 0 
    5461 
    5562    def UpdateObserver(self, observer, UpdateDict): 
    56         if observer: 
    57             observer.Update(self, UpdateDict) 
     63        if observer: apply(observer, (self,), UpdateDict) 
    5864 
    5965    def Lock(self): 
  • trunk/RBJabber/RBJabber/SubjectObserver/__init__.py

    r31 r65  
    33#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    44 
    5 from Observer import Observer 
    6 from AssociativeObserver import AssociativeObserver 
     5import Observer 
     6import AssociativeObserver 
    77 
    8 from Subject import Subject 
    9 from CategorySubject import CategorySubject 
    10 from AttributedSubject import AttributedSubject, AttributedCategorySubject, t_AttributedSubject 
    11 from BidableSubject import BidableSubject, BidableCategorySubject, t_BidableSubject 
     8import Subject 
     9import CategorySubject 
     10import AttributedSubject 
     11import BidableSubject 
    1212 
    13 AttributedBidableSubject = t_AttributedSubject(t_BidableSubject(Subject)) 
    14 AttributedBidableCategorySubject = t_AttributedSubject(t_BidableSubject(CategorySubject)) 
     13class AttributedCategorySubject(AttributedSubject.AttributedSubjectMixin, CategorySubject.CategorySubject):  
     14    pass 
     15class AttributedBidableSubject(AttributedSubject.AttributedSubjectMixin, BidableSubject.BidableSubjectMixin, Subject.Subject): 
     16    pass 
     17class AttributedBidableCategorySubject(AttributedSubject.AttributedSubjectMixin, BidableSubject.BidableSubjectMixin, CategorySubject.CategorySubject): 
     18    pass 
    1519 
    16 BidableAttributedSubject = t_BidableSubject(t_AttributedSubject(Subject)) 
    17 BidableAttributedCategorySubject = t_BidableSubject(t_AttributedSubject(CategorySubject)) 
     20class BidableCategorySubject(BidableSubject.BidableSubjectMixin, CategorySubject.CategorySubject): 
     21    pass 
     22class BidableAttributedSubject(AttributedSubject.AttributedSubjectMixin, BidableSubject.BidableSubjectMixin, Subject.Subject): 
     23    pass 
     24class BidableAttributedCategorySubject(AttributedSubject.AttributedSubjectMixin, BidableSubject.BidableSubjectMixin, CategorySubject.CategorySubject): 
     25    pass 
    1826 
    1927#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     
    2230 
    2331def _Test_SubjectObservers(): 
    24     def printo1(subject, UpdateDict): 
     32    def printo1(subject, **UpdateDict): 
    2533        print "O1: ", UpdateDict 
    26     def printo2(subject, UpdateDict): 
     34    def printo2(subject, **UpdateDict): 
    2735        print "O2: ", UpdateDict 
    28     def printo3(subject, UpdateDict): 
     36    def printo3(subject, **UpdateDict): 
    2937        print "O3: ", UpdateDict 
    30     s1 = Subject() 
    31     s2 = AttributedSubject() 
     38    s1 = Subject.Subject() 
     39    s2 = AttributedSubject.AttributedSubject() 
    3240    s3 = AttributedCategorySubject() 
    3341 
    34     o1 = Observer(printo1) 
     42    o1 = Observer.Observer(printo1) 
    3543    s1.AddObserver(o1) 
    36     o2 = Observer(printo2) 
     44    o2 = Observer.Observer(printo2) 
    3745    s1.AddObserver(o2) 
    3846    s2.AddObserver(o2) 
     
    5058    print "Unlocked" 
    5159 
    52     o3 = Observer(printo3) 
     60    o3 = Observer.Observer(printo3) 
    5361    s3.AddObserver('CategoryA', o1) 
    5462    s3.AddObserver('CategoryB', o2) 
  • trunk/RBJabber/RBJabber/Test.py

    r56 r65  
    2020    print 
    2121 
    22 def _printTypedMessage(subject, UpdateDict): 
     22def _printTypedMessage(subject,**UpdateDict): 
    2323    value = UpdateDict['message'] 
    2424    print 
     
    3939    print 
    4040 
    41 def _printAuth(subject, UpdateDict): 
     41def _printAuth(subject,**UpdateDict): 
    4242    print 
    4343    print "Authenticated" 
     
    9090        apply(jc.Authenticate, tuple(), dictLogin) 
    9191         
    92         obs = SubjectObserver.AssociativeObserver() 
     92        obs = SubjectObserver.AssociativeObserver.AssociativeObserver() 
    9393        jc.stream.AddObserver('message', obs) 
    9494        jc.stream.AddObserver('presence', obs) 
     
    9898        pm = PresenceMap(jc) 
    9999        router = MessageRouterByType(jc) 
    100         obs = SubjectObserver.Observer(_printTypedMessage) 
     100        obs = SubjectObserver.Observer.Observer(_printTypedMessage) 
    101101        obs.Bid = 10 
    102102        router.Get('message').AddObserver(obs) 
  • trunk/RBJabber/RBJabber/iqAuthQuery.py

    r55 r65  
    66import select 
    77import sha 
     8from Foundation.SubjectObserver.Observer import Observer 
     9from Foundation.WeakBind import BindCallable 
    810from xml.sax.saxutils import escape, quoteattr 
    911from iqQuery import iqQueryBase, Subject 
     
    1618    def __init__(self, JabberClient, username, password, resource): 
    1719        self.JC = weakref.ref(JabberClient) 
    18         self.JC().stream.AddObserver('iq', self) 
     20        self._observer = Observer(self.Update, self.Bid) 
     21        self.JC().stream.AddObserver('iq', self._observer) 
    1922 
    2023        if not self.JC()._elements: 
     
    3841        self._SetLink(1) 
    3942 
    40     def Bid(self, subject, UpdateDict): 
     43    def Bid(self, subject, **UpdateDict): 
    4144        iq = UpdateDict.get('iq', None) 
    4245        if iq: 
     
    4649        return -1 
    4750     
    48     def Update(self, subject, UpdateDict): 
     51    def Update(self, subject, **UpdateDict): 
    4952        iq = UpdateDict['iq'] 
    5053        if iq.type == 'result': 
     
    5962        Subject.__init__(self) 
    6063 
    61     def Update(self, subject, UpdateDict): 
     64    def Update(self, subject, **UpdateDict): 
    6265        # Notify our callback 
    63         iqAuthQueryBase.Update(self, subject, UpdateDict) 
     66        apply(iqAuthQueryBase.Update, (self, subject,), UpdateDict) 
    6467        self.UpdateObserversEx(UpdateDict) 
    6568     
     
    6972    def __init__(self, JabberClient, ReplyCallback, *args, **kw): 
    7073        apply(iqAuthQueryBase.__init__, (self, JabberClient) + args, kw) 
    71         self.ReplyCallback = ReplyCallback  
     74        self.ReplyCallback = BindCallable(ReplyCallback) 
    7275 
    73     def Update(self, subject, UpdateDict): 
     76    def Update(self, subject, **UpdateDict): 
    7477        # Notify our callback 
    75         iqAuthQueryBase.Update(self, subject, UpdateDict) 
    76         self.ReplyCallback(subject, UpdateDict) 
     78        apply(iqAuthQueryBase.Update, (self, subject,), UpdateDict) 
     79        apply(self.ReplyCallback, (subject,), UpdateDict) 
    7780 
  • trunk/RBJabber/RBJabber/iqBrowseResponse.py

    r55 r65  
    1313 
    1414class iqBrowseResponse(iqResponseBase): 
    15     def __init__(self, JC): 
     15    def __init__(self, JC, Bid=1): 
    1616        iqResponseBase.__init__(self, JC) 
    1717        self.AnswerQuery("jabber:iq:browse") 
     18        self.Bid = 1 
    1819 
    19     def Update(self, subject, UpdateDict): 
     20    def __call__(self, subject, **UpdateDict): 
    2021        iq = UpdateDict['iq'] 
    2122        iq.to = iq.from_ 
  • trunk/RBJabber/RBJabber/iqQuery.py

    r55 r65  
    44 
    55import weakref 
    6 from Foundation.SubjectObserver import Subject 
     6from Foundation.SubjectObserver.Subject import Subject 
     7from Foundation.SubjectObserver.Observer import Observer 
    78from xml.sax.saxutils import escape, quoteattr 
    89  
     
    1415    def __init__(self, JabberClient): 
    1516        self.JC = weakref.ref(JabberClient) 
     17        self._observer = Observer(self.Update, self.Bid) 
    1618 
    17     def Bid(self, subject, UpdateDict): 
     19    def Bid(self, subject, **UpdateDict): 
    1820        iq = UpdateDict.get('iq', None) 
    1921        if iq: 
     
    3032        return 0 
    3133     
    32     def Update(self, subject, UpdateDict): 
     34    def Update(self, subject, **UpdateDict): 
    3335        # Unhook ourselves 
    34         self.JC().stream.RemoveObserver(self
     36        self.JC().stream.RemoveObserver(self._observer
    3537        # Unlink our self reference since we are done 
    3638        self._SetLink(0) 
     
    4749        self._SetLink(1) 
    4850        # Lets observer the jabber stream 
    49         self.JC().stream.AddObserver('iq', self
     51        self.JC().stream.AddObserver('iq', self._observer
    5052        # Setup our match attributes 
    5153        self.nsQuery = nsQuery 
     
    6870        Subject.__init__(self) 
    6971 
    70     def Update(self, subject, UpdateDict): 
     72    def Update(self, subject, **UpdateDict): 
    7173        # Notify our callback 
    72         iqQueryBase.Update(self, subject, UpdateDict) 
     74        apply(iqQueryBase.Update, (self, subject,), UpdateDict) 
    7375        self.UpdateObserversEx(UpdateDict) 
    7476     
     
    7880    def __init__(self, JabberClient, ReplyCallback): 
    7981        iqQueryBase.__init__(self, JabberClient) 
    80         self.ReplyCallback = ReplyCallback  
     82        self.ReplyCallback = BindCallable(ReplyCallback) 
    8183 
    82     def Update(self, subject, UpdateDict): 
     84    def Update(self, subject, **UpdateDict): 
    8385        # Notify our callback 
    84         iqQueryBase.Update(self, subject, UpdateDict) 
    85         self.ReplyCallback(subject, UpdateDict) 
     86        apply(iqQueryBase.Update, (self, subject,), UpdateDict) 
     87        apply(self.ReplyCallback, (subject,), UpdateDict) 
    8688 
  • trunk/RBJabber/RBJabber/iqResponse.py

    r53 r65  
    44 
    55import weakref 
     6from Foundation.SubjectObserver.Observer import Observer 
     7from Foundation.WeakBind import BindCallable 
    68from xml.sax.saxutils import escape, quoteattr 
    79  
     
    1315    def __init__(self, JabberClient): 
    1416        self.JC = weakref.ref(JabberClient) 
     17        self._observer = Observer(self.Update, self.Bid) 
    1518 
    16     def Bid(self, subject, UpdateDict): 
     19    def Bid(self, subject, **UpdateDict): 
    1720        iq = UpdateDict.get('iq', None) 
    1821        if iq: 
     
    2528        return 0 
    2629 
    27     def Update(self, subject, UpdateDict): 
     30    def Update(self, subject, **UpdateDict): 
    2831        pass 
    2932 
     
    3942        self._SelfLink(1) 
    4043        # Lets observer the jabber stream 
    41         self.JC().stream.AddObserver('iq', self
     44        self.JC().stream.AddObserver('iq', self._observer
    4245        self.JC().SupportedNS.append(nsQuery) 
    4346        # Setup our match attributes 
     
    5154    def __init__(self, JabberClient, ReplyCallback): 
    5255        iqResponseBase.__init__(self, JabberClient) 
    53         self.ReplyCallback = ReplyCallback  
     56        self.ReplyCallback = BindCallable(ReplyCallback) 
    5457 
    55     def Update(self, subject, UpdateDict): 
     58    def Update(self, subject, **UpdateDict): 
    5659        # Notify our callback 
    57         self.ReplyCallback(subject, 'iq', UpdateDict['iq']
     60        apply(self.ReplyCallback, (subject,), UpdateDict
    5861 
    5962 
  • trunk/RBJabber/RBJabber/iqRosterQuery.py

    r59 r65  
    55import weakref 
    66from xml.sax.saxutils import escape, quoteattr 
     7from Foundation.SubjectObserver.Observer import Observer 
    78from iqQuery import iqQueryBase, Subject 
    89from JID import *  
     
    1617        iqQueryBase.__init__(self, JabberClient) 
    1718        Subject.__init__(self) 
    18         self.JC().stream.AddObserver('iq', self) 
     19        self._observer = Observer(self.Update, self.Bid) 
     20        self.JC().stream.AddObserver('iq', self._observer) 
    1921        self.JC().SendXML('''<iq type='get'><query xmlns='jabber:iq:roster'/></iq>''') 
    2022        self.ByJID = {} 
    2123 
    22     def Bid(self, subject, UpdateDict): 
     24    def Bid(self, subject, **UpdateDict): 
    2325        iq = UpdateDict.get('iq', None) 
    2426        if iq: 
     
    2830        return -1 
    2931     
    30     def Update(self, subject, UpdateDict): 
     32    def Update(self, subject, **UpdateDict): 
    3133        iq = UpdateDict['iq'] 
    3234        for each in iq.query[0].item: 
  • trunk/RBJabber/RBJabber/iqTimeResponse.py

    r45 r65  
    1515        self.AnswerQuery("jabber:iq:time") 
    1616 
    17     def Update(self, subject, UpdateDict): 
     17    def Update(self, subject, **UpdateDict): 
    1818        iq = UpdateDict['iq'] 
    1919        iq.to = iq.from_ 
  • trunk/RBJabber/RBJabber/iqVersionResponse.py

    r45 r65  
    1212 
    1313class iqVersionResponse(iqResponseBase): 
    14     def __init__(self, JC, Name, Version): 
     14    def __init__(self, JC, Name, Version, Bid=1): 
    1515        iqResponseBase.__init__(self, JC) 
    1616        self.AnswerQuery("jabber:iq:version") 
    1717        self.Name = Name 
    1818        self.Version = Version 
     19        self.Bid=1 
    1920 
    20     def Update(self, subject, UpdateDict): 
     21    def __call__(self, subject, **UpdateDict): 
    2122        iq = UpdateDict['iq'] 
    2223        iq.to = iq.from_ 
  • trunk/RBPrivate/Prototypes/ChatClient/ChatMediator.py

    r62 r65  
    88import sha 
    99from wxPython import wx 
     10from Foundation.SubjectObserver.Observer import Observer 
    1011 
    1112#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     
    1920        self.context = node.context 
    2021 
    21     def Update(self, subject, UpdateDict): 
    22         if 'message' in UpdateDict: 
    23             message = UpdateDict['message'] 
    24             if message.type == self._ChatType: 
    25                 strFrom = self.JC().Roster.Get(message.from_) 
    26                 if strFrom: strFrom = getattr(strFrom, 'name', None) 
    27                 if not strFrom: strFrom = message.from_ 
    28                 strBodyText = ''.join([str(x) for x in getattr(message, 'body', [])]) 
    29                 self._AddOutputText(strFrom, strBodyText, 0) 
    30                 self._AddOutputXML(''.join(message._toXML()), 0) 
     22    def Update(self, subject, message=None, **UpdateDict): 
     23        if message and message.type == self._ChatType: 
     24            strFrom = self.JC().Roster.Get(message.from_) 
     25            if strFrom: strFrom = getattr(strFrom, 'name', None) 
    &nb