Changeset 27

Show
Ignore:
Timestamp:
02/17/02 18:13:05 (7 years ago)
Author:
sholloway
Message:

*** empty log message ***

Files:

Legend:

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

    r8 r27  
     1#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     2#~ Imports  
     3#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     4 
     5import weakref 
     6 
    17#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    28#~ Tuple / Dictionary Join Functions for Smart Apply  
     
    6874ContextApply = ContextApply_p_s 
    6975 
     76class WeakInstanceApply: 
     77    def __init__(self, instance, method): 
     78        self.instance = weakref.ref(instance) 
     79        self.method = method 
     80    def __call__(self, *args, **kw): 
     81        return apply(self.method, (self.instance(), ) + args, kw) 
     82     
    7083#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    7184#~ Test Section                                       
  • trunk/RBFoundation/RBFoundation/SubjectObserver.py

    r25 r27  
    2121    def AddObserver(self, observer, bUpdate=0, bCallAddSubject=1): 
    2222        self._observers.append(weakref.ref(observer)) 
    23         if not bCallAddSubject: 
     23        if bCallAddSubject: 
    2424            observer.AddSubject(self, bCallAddObserver=0) 
    2525        if bUpdate: 
     
    4646    def UpdateObserversEx(self, kw): 
    4747        self._cachedUpdates.update(kw) 
    48         if not self._locked: 
     48        if self._cachedUpdates and not self._locked: 
     49            _cachedUpdates, self._cachedUpdates = self._cachedUpdates, {} 
     50            lock = self.Lock() 
    4951            for each in self._ObserverList(): 
    50                 self.UpdateObserver(each(), self._cachedUpdates) 
    51             self._cachedUpdates = {} 
     52                self.UpdateObserver(each(), _cachedUpdates) 
    5253 
    5354    def UpdateObserver(self, observer, UpdateDict): 
  • trunk/RBFoundation/RBFoundation/XMLObjectify.py

    r9 r27  
    6464        self._elements.append(((self.__namespace__, ''), data)) 
    6565 
     66    def _toPrettyXML(self, strSplit='', nsOuter=''): 
     67        return ''.join(self._toXML(strSplit, nsOuter)) 
     68 
    6669    def _toXML(self, strSplit='', nsOuter=''): 
    6770        result = ['<%s ' % self.__node__] 
     
    7780                    result.append(strSplit.join(each._toXML(strSplit, self.__namespace__))) 
    7881            result.append('</%s>' % self.__node__) 
    79         else: result[-1] += '>' 
     82        else: result[-1] += '/>' 
    8083        return result 
    8184     
  • trunk/RBJabber/RBJabber/Client.py

    r25 r27  
    1717        XMLObjectify._Objectified.__init__(self, client, parent, namespace, node, attributes) 
    1818         
     19    def _xmlInitComplete(self): 
     20        if self.__namespace__ == 'jabber:client': 
     21            self._client.stream.UpdateObserversEx({self.__node__: self}) 
     22 
    1923#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    2024 
     
    2428 
    2529    def _addElement(self, namespace, node, element): 
    26         if namespace == 'jabber:client': 
    27             self._client.stream.UpdateObserversEx({node: element}) 
     30        pass 
    2831 
    2932    def _addData(self, data): 
     
    5053        } 
    5154 
     55    stream = None 
     56    ClientMonitors = None 
     57 
    5258    def __init__(self, *args, **kw): 
    5359        self.stream = SubjectObserver.Subject() 
    5460        apply(Base.Client.__init__, (self,) + args, kw) 
     61         
     62        self.ClientMonitors = [] 
     63        self.__NextID = 0 
     64 
     65    def _GetNextID(self): 
     66        self.__NextID += 1 
     67        return str(self.__NextID) 
    5568 
    5669#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
  • trunk/RBJabber/RBJabber/JabberConnection.py

    r9 r27  
    55from Foundation.XMLBuilder import XMLBuilderMixin, XMLBuilderObjectBase, ParserCreate 
    66from Foundation import SmartSelect 
     7from Foundation.ContextApply import WeakInstanceApply 
    78import socket 
    89import re 
     
    2526#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    2627 
    27 class JabberNode(XMLBuilderObjectBase): 
    28     pass 
    29  
    30 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    31  
    3228class Client(XMLBuilderMixin, SmartSelect.ClientBase): 
    3329    #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     
    3632 
    3733    ServerJID = None 
    38     DefaultJabberNode = JabberNod
     34    DefaultJabberNode = XMLBuilderObjectBas
    3935    JabberNodeMap = {} 
    4036 
     
    5854        self._parser = ParserCreate('ASCII', self._seperator) 
    5955        self._parser.returns_unicode = 0 
    60         self._parser.StartElementHandler = self._start_element 
    61         self._parser.EndElementHandler = self._end_element 
    62         self._parser.CharacterDataHandler = self._char_data 
     56        self._parser.StartElementHandler = WeakInstanceApply(self, Client._start_element) 
     57        self._parser.EndElementHandler = WeakInstanceApply(self, Client._end_element) 
     58        self._parser.CharacterDataHandler = WeakInstanceApply(self, Client._char_data) 
    6359 
    6460        # Send the initial header 
     
    8682 
    8783    def _GetElementFactory(self, owner, parent, namespace, node, attributes): 
    88         if len(self._elements) <= 1: 
    89             result = self.JabberNodeMap.get((namespace, node), self.DefaultJabberNode) 
    90         else: result = self.DefaultJabberNode 
     84        result = self.JabberNodeMap.get((namespace, node), self.DefaultJabberNode) 
    9185        return result 
    9286 
  • trunk/RBJabber/RBJabber/PresenceMap.py

    r8 r27  
    3030        lstJID = reJabberJID.split(JID)[1:-1] 
    3131        JIDNoResource = '%s@%s' % tuple(lstJID[:2]) 
    32         resource = '/'.join(lstJID[2:]) or None 
     32        resource = '/'.join([x for x in lstJID[2:] if x]) or None 
    3333        return self.setdefault(JIDNoResource, self.PresenceSubject()), resource 
    3434 
  • trunk/RBJabber/RBJabber/Test.py

    r25 r27  
    22from PresenceMap import * 
    33from Foundation.SmartSelect import SmartSelect 
     4from iqQuery import iqQuery 
     5from iqResponse import iqResponse  
    46 
    57#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    6  
    7 def _test(resource='Python-Test'): 
    8     import sys 
    9     strEval = ('{"%s"}'%'","'.join(sys.argv[1:])).replace('=','":"') 
    10     dictLogin = eval(strEval, {}, {}) 
    11     dictLogin['resource'] = resource 
    12     jc = Client(dictLogin['server']) 
    13     jc.SendXML('''<iq type="set" to="%(server)s"><query xmlns="jabber:iq:auth"> 
    14             <username>%(login)s</username> 
    15             <password>%(password)s</password> 
    16             <resource>%(resource)s</resource> 
    17         </query></iq>''' % dictLogin) 
    18     return jc 
    19  
    20 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    21  
    22 def _printIQ(subject, name, value): 
    23     print 
    24     print "IQ!" 
    25     print '\n'.join(value._toXML()) 
    26     print 
    278 
    289def _printMessage(subject, name, value): 
    2910    print 
    3011    print "Message from %r" % value.from_ 
    31     for each in value._elements: 
    32         print '%s: %s' % (each[0], each[-1]) 
     12    print value._toPrettyXML() 
     13    print 
     14 
     15def _printIQ(subject, name, value): 
     16    print 
     17    print "IQ from %r" % getattr(value, 'from', '') 
     18    print value._toPrettyXML() 
    3319    print 
    3420 
     
    3622    print 
    3723    print "Presence from %r" % value.from_ 
    38     for each in value._elements: 
    39         print '%s: %s' % (each[0], each[-1]) 
     24    print value._toPrettyXML() 
     25    print 
     26 
     27def _printBrowse(subject, name, value): 
     28    print 
     29    print "Browse" 
     30    print value._toPrettyXML() 
     31    print 
     32 
     33def _printRoster(subject, name, roster): 
     34    print  
     35    print "Roster Received!" 
     36    for each in roster.query[0].item: 
     37        print each._toPrettyXML() 
     38    print 
     39 
     40def _printTime(subject, name, value): 
     41    print  
     42    print "Time Received!" 
     43    print value._toPrettyXML() 
     44    print 
     45 
     46def _answerTime(subject, name, value): 
     47    print  
     48    print "Time Requested!" 
     49    print value._toPrettyXML() 
    4050    print 
    4151 
    4252#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    4353 
    44 try: 
    45     process = SmartSelect() 
    46     jc = _test('Python') 
    47     #pm = PresenceMap().AddClient(jc) 
    48     obs = SubjectObserver.AssociativeObserver() 
    49     obs.AddSubject(jc.stream) 
    50     obs.AddAssociation('iq', _printIQ) 
    51     obs.AddAssociation('message', _printMessage) 
    52     obs.AddAssociation('presence', _printPresence) 
    53     process.append(jc) 
    54     for x in xrange(2): 
    55         process(1) 
    56     jc.SendXML('''<presence />''') 
    57     jc.SendXML('''<iq type="get" to="%s"><query xmlns="jabber:iq:roster"/></iq>''' % jc.ServerJID) 
    58     while 1: 
    59         process(1) 
    60 except KeyboardInterrupt: 
    61     jc.SendXML('''<presence type="unavailable" />''') 
     54def _test(resource='Python-Test'): 
     55    try: 
     56        import sys 
     57        strEval = ('{"%s"}'%'","'.join(sys.argv[1:])).replace('=','":"') 
     58        dictLogin = eval(strEval, {}, {}) 
     59        dictLogin.setdefault('resource', resource) 
     60        jc = Client(dictLogin['server']) 
     61        del dictLogin['server'] 
    6262 
    63 #print "Presence Map" 
    64 #for jid, subject in pm.iteritems(): 
    65 #    print jid 
    66 #    for resource, presence in pm[jid].iteritems(): 
    67 #        print '    %s: %s' % (resource, getattr(presence, 'status', [''])[0]) 
     63        strXML = ''.join([('<%s>%s</%s>' % (s[0], s[1], s[0])) for s in dictLogin.iteritems()]) 
     64        iqQuery(jc, _printRoster).SendQuery("jabber:iq:auth", jc.ServerJID, 'set', strXML) 
     65         
     66        process = SmartSelect() 
     67        obs = SubjectObserver.AssociativeObserver() 
     68        obs.AddSubject(jc.stream) 
     69        obs.AddAssociation('iq', _printIQ) 
     70        obs.AddAssociation('message', _printMessage) 
     71        obs.AddAssociation('presence', _printPresence) 
     72        process.append(jc) 
     73        for x in xrange(2): process(1) 
     74        jc.SendXML('''<presence type='available' />''') 
     75        for x in xrange(2): process(1) 
    6876 
     77        iqQuery(jc, _printRoster).SendQuery("jabber:iq:roster") 
     78        iqQuery(jc, _printBrowse).SendQuery("jabber:iq:browse") 
     79        iqQuery(jc, _printBrowse).SendQuery("jabber:iq:browse", 'shane.holloway@www.runeblade.com/Laptop') 
     80        iqQuery(jc, _printTime).SendQuery("jabber:iq:time", 'shane.holloway@www.runeblade.com/Laptop') 
     81        iqResponse(jc, _answerTime).AnswerQuery("jabber:iq:time") 
     82        while 1: process(1) 
     83    except KeyboardInterrupt: 
     84        jc.SendXML('''<presence type="unavailable" />''') 
     85 
     86_test('Python') 
     87