Changeset 94

Show
Ignore:
Timestamp:
04/11/02 09:35:25 (6 years ago)
Author:
sholloway
Message:

*** empty log message ***

Files:

Legend:

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

    r84 r94  
    4343 
    4444class XMLBuilderObjectBase(object): 
     45    def __init__(self, owner, parent, namespace, node, attributes): 
     46        pass 
     47         
    4548    def _addElement(self, namespace, node, object): 
    4649        pass 
  • trunk/RBJabber/RBJabber/JID.py

    r90 r94  
    5353#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    5454 
     55def splitnorm(strJID, start=1, end=4): 
     56    result = reJabberJID.split(strJID)[start:end] 
     57    return [x.lower() for x in result[1-start:3-start]] + result[3-start:] 
     58 
    5559def split(strJID, start=1, end=4): 
    5660    return reJabberJID.split(strJID)[start:end] 
    5761 
    58 def splitnorm(strJID, start=1, end=4): 
    59     result = reJabberJID.split(strJID)[start:end] 
    60     return [x.lower() for x in result[1-start:3-start]] + result[3-start:] 
     62def splitex(strJID, start=1, end=4, normalize=0): 
     63    if normalize: return splitnorm(strJID, start, end) 
     64    else: return split(strJID, start, end) 
    6165 
    6266def cmp_(strJIDa, strJIDb, resource=1): 
     
    7377    args = filter(None, args) 
    7478    if len(args) > 2: 
    75         return '%s@%s/%s' % args 
    76     elif args: return '%s@%s' % args 
     79        return JID('%s@%s/%s' % args) 
     80    elif args: return JID('%s@%s' % args) 
    7781    else: return '' 
    7882 
    79 def normalize(strJID): 
    80     return join(splitnorm(strJID)) 
    81  
    82 def nominal(strJID): 
    83     return join(splitnorm(strJID, 1, 3)) 
     83def username(strJID, normalize=0): return splitex(strJID, 1, 2, normalize)[0] 
     84def server(strJID, normalize=0): return splitex(strJID, 2, 3, normalize)[0] 
     85def resource(strJID, normalize=0): return splitex(strJID, 3, 4, normalize)[0] 
     86def noresource(strJID, normalize=0): return join(splitex(strJID, 1, 3, normalize)) 
     87def nominal(strJID): return join(splitnorm(strJID, 1, 3)) 
     88def normalize(strJID): return join(splitnorm(strJID)) 
    8489 
    8590#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     
    9196    split = split 
    9297    splitnorm = splitnorm 
     98    splitex = splitex 
     99     
    93100    normalize = normalize 
    94101    nominal = nominal 
    95102    compare = compare 
    96103 
     104    noresource = noresource 
     105    username = username 
     106    server = server 
     107    resource = resource 
     108  
    97109    def join(Class, *args): 
    98110        return Class(apply(join, args)) 
     
    114126 
    115127    def __hash__(self): 
    116         return hash(self.normalize()) 
     128        return hash(tuple(self.splitnorm())) 
    117129 
    118130#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
  • trunk/RBJabber/RBJabber/JabberObserver.py

    r92 r94  
    5353        else: return 0 
    5454     
    55 class MatchAttribute(object): 
    56     def __init__(self, name, value): 
     55class MatchAttributesEx(object): 
     56    def __init__(self, attributes): 
    5757        import re 
    58         self._MatchName = name 
    59         self._MatchRE = re.compile(value).match 
    60          
     58        self._MatchInfo = {} 
     59        for key, value in attributes.iteritems(): 
     60            self._MatchInfo[key] = re.compile(value).match 
     61 
    6162    def __call__(self, value): 
    62         if self._MatchName in value._attributes: 
    63             return self._MatchRE(value._attributes[self._MatchName]) 
    64         return 0 
     63        for key, match in self._MatchInfo.iteritems(): 
     64            value = getattr(value, key, None) 
     65            if value is None:  
     66                return 0 
     67            elif not match(value): 
     68                return 0 
     69        else: return 1 
     70 
     71class MatchAttributes(MatchAttributesEx): 
     72    def __init__(self, **attributes): 
     73        super(MatchAttributes, self).__init__(attributes) 
    6574 
    6675class MatchHasAttribute(object): 
     
    6978         
    7079    def __call__(self, value): 
    71         return self._MatchInfo in value._attributes 
     80        return hasattr(self._MatchInfo, value) 
    7281 
    7382class MatchHasNode(object): 
     
    127136    observer = JabberObserver(TestFalse, MatchHasNode('testing', 'tango')) 
    128137    subject.AddObserver(observer) 
    129     observer = JabberObserver(TestTrue, MatchAttribute('myattr', '.*haps.*')) 
     138    observer = JabberObserver(TestTrue, MatchAttributes(myattr = '.*haps.*')) 
    130139    subject.AddObserver(observer) 
    131140    observer = JabberObserver(TestTrue) 
    132141    observer.Match.append(MatchHasNode('testing', 'tag')) 
    133     observer.Match.append(MatchAttribute('myattr', '.*haps.*')) 
     142    observer.Match.append(MatchAttributes(myattr='.*haps.*')) 
    134143    subject.AddObserver(observer) 
    135144 
  • trunk/RBJabber/RBJabber/PresenceMap.py

    r87 r94  
    3737from Foundation.SubjectObserver.Subject import Subject 
    3838from Foundation.SubjectObserver.Observer import Observer 
    39 from Foundation.SubjectObserver.BidableSubject import BidableSubjectMixin 
     39from Foundation.SubjectObserver.BidableSubject import BidableSubject 
     40from JabberSubject import FromJIDSubject 
    4041import JID 
    4142 
     
    4445#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    4546 
    46 class PresenceMap(Subject): 
     47class PresenceMapMixin(object): 
    4748    def __init__(self, JC): 
    48         Subject.__init__(self) 
    49         JC.stream.AddObserver('presence', Observer(self.Update)) 
     49        JC.stream.AddObserver('presence', self.OnPresence) 
    5050        self.ByJID = {} 
    5151        self.ByResource = {} 
    5252 
    53     def Update(self, subject, **UpdateDict): 
    54         presence = UpdateDict.get('presence', None) 
    55         FromJID = JID.split(presence.from_) 
    56         if FromJID: 
    57             self.ByJID[JID.join(FromJID)] = presence 
    58             self.ByResource.setdefault(JID.join(FromJID[:2]),{})[FromJID[-1]] = presence 
    59             self.UpdateObservers(PresenceFrom=FromJID) 
     53    def OnPresence(self, subject, presence): 
     54        self.ByJID[presence.from_] = presence 
     55        self.ByResource.setdefault(presence.from_.nominal(), {})[presence.from_.resource()] = presence 
    6056 
    61     def __getitem__(self, *args, **kw): 
    62         return apply(self.Map.__getitem__, args, kw
    63  
    64     def __setitem__(self, *args, **kw): 
    65         return apply(self.Map.__setitem__, args, kw) 
    66  
    67     def __contains__(self, *args, **kw): 
    68         return apply(self.Map.__contains__, args, kw) 
     57    def __getitem__(self, name):  
     58        return self.ByJID.get(JID.JID(name)
     59    def __setitem__(self, name, value):  
     60        self.ByJID[JID.JID(name)] = value 
     61    def __delitem__(self, name):  
     62        del self.ByJID[JID.JID(name)] 
     63    def __contains__(self, name):  
     64        return JID.JID(name) in self.ByJID 
    6965 
    7066#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    7167 
    72 class PresenceUpdateMap(BidableSubjectMixin): 
     68class PresenceMap(PresenceMapMixin, BidableSubject): 
     69    def __init__(self, JC): 
     70        PresenceMapMixin.__init__(self, JC) 
     71        BidableSubject.__init__(self) 
     72 
     73    def OnPresence(self, subject, presence): 
     74        self.__super.OnPresence(subject, presence) 
     75        self.UpdateObservers(PresenceFrom=presence.from_) 
     76 
     77PresenceMap._PresenceMap__super = super(PresenceMap) 
     78 
     79#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     80 
     81class PresenceUpdate(FromJIDSubject): 
     82    def __init__(self, JC): 
     83        FromJIDSubject.__init__(self) 
     84        JC.stream.AddObserver('presence', self) 
     85 
     86#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     87 
     88class PresenceUpdateMap(PresenceUpdate, PresenceMap): 
    7389    def __init__(self, JC, PresenceMapEntryClass=None): 
    74         JC.stream.AddObserver('presence', Observer(self.Update, self.Bid)) 
    75         self._UpdateMap = {} 
    76         if not PresenceMapEntryClass: 
    77             PresenceMapEntryClass = Subject 
    78         self.PresenceMapEntryClass = PresenceMapEntryClass 
     90        PresenceUpdate.__init__(self, JC) 
     91        PresenceMap.__init__(self, JC) 
    7992 
    80     def _UpdateIndexXForm(self, FromJID): 
    81         FromJID = JID.splitnorm(FromJID) 
    82         return (JID.join(FromJID), JID.join(FromJID)[:-1]) 
    83  
    84     def _UpdateMapXForm(self, node): 
    85         return self._UpdateIndexXForm(node.from_) 
    86  
    87     def Bid(self, subject, **UpdateDict): 
    88         presence = UpdateDict.get('presence', None) 
    89         lstXForms = self._UpdateMapXForm(presence) 
    90         for index in lstXForms: 
    91             UpdateSubject = self._UpdateMap.get(index, None) 
    92             if UpdateSubject: 
    93                 for obs in UpdateSubject.Observers: 
    94                     subject._GetBid(obs(), UpdateDict) 
    95  
    96     def Update(self, subject, **UpdateDict): 
    97         pass # Weird condition... no bids on it, but we really dont care here 
    98  
    99     def Get(self, index, bCreateSubject=1): 
    100         index = self._UpdateIndexXForm(index)[0] 
    101         result = self._UpdateMap.get(index, None) 
    102         if result is None and bCreateSubject: 
    103             result = self.PresenceMapEntryClass() 
    104             self._UpdateMap[index] = result 
    105         return result 
    106