Changeset 94
- Timestamp:
- 04/11/02 09:35:25 (6 years ago)
- Files:
-
- trunk/RBFoundation/RBFoundation/XMLBuilder.py (modified) (1 diff)
- trunk/RBJabber/RBJabber/JID.py (modified) (4 diffs)
- trunk/RBJabber/RBJabber/JabberObserver.py (modified) (3 diffs)
- trunk/RBJabber/RBJabber/JabberSubject.py (added)
- trunk/RBJabber/RBJabber/PresenceMap.py (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
trunk/RBFoundation/RBFoundation/XMLBuilder.py
r84 r94 43 43 44 44 class XMLBuilderObjectBase(object): 45 def __init__(self, owner, parent, namespace, node, attributes): 46 pass 47 45 48 def _addElement(self, namespace, node, object): 46 49 pass trunk/RBJabber/RBJabber/JID.py
r90 r94 53 53 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 54 54 55 def 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 55 59 def split(strJID, start=1, end=4): 56 60 return reJabberJID.split(strJID)[start:end] 57 61 58 def split norm(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:]62 def splitex(strJID, start=1, end=4, normalize=0): 63 if normalize: return splitnorm(strJID, start, end) 64 else: return split(strJID, start, end) 61 65 62 66 def cmp_(strJIDa, strJIDb, resource=1): … … 73 77 args = filter(None, args) 74 78 if len(args) > 2: 75 return '%s@%s/%s' % args76 elif args: return '%s@%s' % args79 return JID('%s@%s/%s' % args) 80 elif args: return JID('%s@%s' % args) 77 81 else: return '' 78 82 79 def normalize(strJID): 80 return join(splitnorm(strJID)) 81 82 def nominal(strJID): 83 return join(splitnorm(strJID, 1, 3)) 83 def username(strJID, normalize=0): return splitex(strJID, 1, 2, normalize)[0] 84 def server(strJID, normalize=0): return splitex(strJID, 2, 3, normalize)[0] 85 def resource(strJID, normalize=0): return splitex(strJID, 3, 4, normalize)[0] 86 def noresource(strJID, normalize=0): return join(splitex(strJID, 1, 3, normalize)) 87 def nominal(strJID): return join(splitnorm(strJID, 1, 3)) 88 def normalize(strJID): return join(splitnorm(strJID)) 84 89 85 90 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ … … 91 96 split = split 92 97 splitnorm = splitnorm 98 splitex = splitex 99 93 100 normalize = normalize 94 101 nominal = nominal 95 102 compare = compare 96 103 104 noresource = noresource 105 username = username 106 server = server 107 resource = resource 108 97 109 def join(Class, *args): 98 110 return Class(apply(join, args)) … … 114 126 115 127 def __hash__(self): 116 return hash( self.normalize())128 return hash(tuple(self.splitnorm())) 117 129 118 130 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ trunk/RBJabber/RBJabber/JabberObserver.py
r92 r94 53 53 else: return 0 54 54 55 class MatchAttribute (object):56 def __init__(self, name, value):55 class MatchAttributesEx(object): 56 def __init__(self, attributes): 57 57 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 61 62 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 71 class MatchAttributes(MatchAttributesEx): 72 def __init__(self, **attributes): 73 super(MatchAttributes, self).__init__(attributes) 65 74 66 75 class MatchHasAttribute(object): … … 69 78 70 79 def __call__(self, value): 71 return self._MatchInfo in value._attributes80 return hasattr(self._MatchInfo, value) 72 81 73 82 class MatchHasNode(object): … … 127 136 observer = JabberObserver(TestFalse, MatchHasNode('testing', 'tango')) 128 137 subject.AddObserver(observer) 129 observer = JabberObserver(TestTrue, MatchAttribute ('myattr','.*haps.*'))138 observer = JabberObserver(TestTrue, MatchAttributes(myattr = '.*haps.*')) 130 139 subject.AddObserver(observer) 131 140 observer = JabberObserver(TestTrue) 132 141 observer.Match.append(MatchHasNode('testing', 'tag')) 133 observer.Match.append(MatchAttribute ('myattr','.*haps.*'))142 observer.Match.append(MatchAttributes(myattr='.*haps.*')) 134 143 subject.AddObserver(observer) 135 144 trunk/RBJabber/RBJabber/PresenceMap.py
r87 r94 37 37 from Foundation.SubjectObserver.Subject import Subject 38 38 from Foundation.SubjectObserver.Observer import Observer 39 from Foundation.SubjectObserver.BidableSubject import BidableSubjectMixin 39 from Foundation.SubjectObserver.BidableSubject import BidableSubject 40 from JabberSubject import FromJIDSubject 40 41 import JID 41 42 … … 44 45 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 45 46 46 class PresenceMap (Subject):47 class PresenceMapMixin(object): 47 48 def __init__(self, JC): 48 Subject.__init__(self) 49 JC.stream.AddObserver('presence', Observer(self.Update)) 49 JC.stream.AddObserver('presence', self.OnPresence) 50 50 self.ByJID = {} 51 51 self.ByResource = {} 52 52 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 60 56 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 69 65 70 66 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 71 67 72 class PresenceUpdateMap(BidableSubjectMixin): 68 class 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 77 PresenceMap._PresenceMap__super = super(PresenceMap) 78 79 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 80 81 class PresenceUpdate(FromJIDSubject): 82 def __init__(self, JC): 83 FromJIDSubject.__init__(self) 84 JC.stream.AddObserver('presence', self) 85 86 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 87 88 class PresenceUpdateMap(PresenceUpdate, PresenceMap): 73 89 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) 79 92 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 here98 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] = result105 return result106
