Changeset 6

Show
Ignore:
Timestamp:
02/08/02 23:23:06 (7 years ago)
Author:
sholloway
Message:

New jabber code & related bugfixes

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/RBPrivate/Prototypes/Shane/SubjectObserver.py

    r3 r6  
    7070 
    7171    def __getattribute__(self, name): 
    72         if '_' != name[0:1]: 
     72        if '_' != name[0]: 
    7373            result = self._attributes.get(name, None) 
    7474            if result != None: 
     
    7777 
    7878    def __setattr__(self, name, value): 
    79         if '_' != name[0:1]: 
     79        if '_' != name[0]: 
    8080            self._attributes[name] = value 
    8181            apply(self.UpdateObservers, tuple(), {name: value}) 
     
    106106class AssociativeObserver: 
    107107    def __init__(self): 
    108         apply(Observer.__init__, (self,)) 
    109108        self._associations = {} 
    110109 
     
    121120        for each in UpdateDict: 
    122121            for callback in self._associations.get(each, []): 
    123                 apply(callback, UpdateDict[each]) 
     122                callback(subject, each, UpdateDict[each]) 
    124123 
    125124#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
  • trunk/RBPrivate/Prototypes/Shane/XMLBuilder.py

    r5 r6  
    99#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    1010 
    11 class XMLBuilderMixin:  
     11class XMLBuilderObjectBase(object): 
     12    def _addElement(self, namespace, node, object): 
     13        pass 
     14 
     15    def _addData(self, data): 
     16        pass 
     17 
     18    def _xmlInitStarted(self): 
     19        pass 
     20 
     21    def _xmlInitComplete(self): 
     22        pass 
     23 
     24#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     25 
     26class XMLBuilderMixin(object):  
    1227    _seperator = '.' 
    1328    e_no_class_registered = "No Class Registered" 
  • trunk/RBPrivate/Prototypes/Shane/XMLObjectify.py

    r5 r6  
    1818 
    1919    def __getattribute__(self, name): 
    20         if '_' != name[0:1]: 
     20        if '_' != name[0]: 
    2121            xmlName = name.replace('_', '-') 
     22            if '-' == xmlName[-1]: xmlName = xmlName[:-1] 
    2223            _attributes = self._attributes 
    2324            if xmlName in _attributes: 
     
    3132        if '_' != name[0:1]: 
    3233            xmlName = name.replace('_', '-') 
     34            if '-' == xmlName[-1]: xmlName = xmlName[:-1] 
    3335            self._attributes[xmlName] = value 
    3436        else: 
     
    3840        if '_' != name[0:1]: 
    3941            xmlName = name.replace('_', '-') 
     42            if '-' == xmlName[-1]: xmlName = xmlName[:-1] 
    4043            if xmlName in self._attributes: 
    4144                del self._attributes[xmlName] 
     
    5154     
    5255    def __repr__(self): 
    53         return '%s %s %s>' % (object.__repr__(self)[:-1], self.__namespace__, self.__node__) 
     56        return '%s %r %r>' % (object.__repr__(self)[:-1], self.__namespace__, self.__node__) 
    5457 
    5558    def _addElement(self, namespace, node, object): 
  • trunk/RBPrivate/Prototypes/Shane/jabber.py

    r5 r6  
    11#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    2 #~ Imports                                            
     2#~ Imports  
    33#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    44 
    5 from XMLBuilder import XMLBuilderMixin, ParserCreate 
    6 from XMLObjectify import _Objectified 
    7 import socket 
    8 import re 
     5import jabber_base 
     6import XMLObjectify 
     7import SubjectObserver 
    98 
    109#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    11 #~ Constants / Variables / Etc.  
     10#~ Jabber Node Classes 
    1211#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    1312 
    14 _xmlJabberHeader = '''<?xml version="1.0" encoding="UTF-8" ?><stream:stream to="%s" xmlns="jabber:client" xmlns:stream="http://etherx.jabber.org/streams">''' 
    15 _xmlJabberFooter = '''</stream:stream>''' 
     13class jabber_stream(jabber_base.jabber_node): 
     14    def __init__(self, client, namespace, node, attributes): 
     15        jabber_base.jabber_node.__init__(self, client, namespace, node, attributes) 
     16        self.__namespace__ = namespace 
     17        self.__node__ = node 
     18        self.__dict__.update(attributes) 
     19        client.stream.settings = self 
    1620 
    17 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    18 #~ Classes 
     21class jabber_stream_error(XMLObjectify._Objectified): 
     22    e_jabber_stream_error = 'jabber_stream_error' 
     23 
     24    def __init__(self, client, namespace, node, attributes): 
     25        self._client = client 
     26        XMLObjectify._Objectified.__init__(self, namespace, node, attributes) 
     27 
     28    def _xmlInitComplete(self): 
     29        self._client.Shutdown() 
     30        raise self.e_jabber_stream_error, ''.join(self._toXML()) 
     31          
    1932#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    2033 
    21 class jabber_node(_Objectified): 
    22     def _xmlInitComplete(self): 
    23         print  
    24         print '~~~~~~~~~~~~~~~~~~~~' 
    25         print 
    26         print '\n'.join(self._toXML()) 
    27  
    28 class jabber_iq_node(_Objectified): 
    29     def _xmlInitComplete(self): 
    30         print  
    31         print '~~~ IQ ~~~~~~~~~~~~~' 
    32         print 
    33         print '\n'.join(self._toXML()) 
    34  
    35  
    36 class client(XMLBuilderMixin): 
    37     _reJabberURL = re.compile('''(?:jabber://)?(\w+(?:\w|\.)*\w+)(?::(\d+))?''') 
    38     dictJabberNodes = { 
    39         ('jabber:client', 'iq'): jabber_iq_node, 
    40         } 
    41     ServerJID = None 
    42  
    43     def __init__(self, JabberServerURL): 
    44         XMLBuilderMixin.__init__(self) 
    45         self._socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
    46         params = client._reJabberURL.split(JabberServerURL)[1:3] 
    47         self._socket.connect((params[0], params[1] or 5222)) 
    48         self.ServerJID = params[0] 
    49  
    50         self._parser = ParserCreate('ASCII', self._seperator) 
    51         self._parser.returns_unicode = 0 
    52         self._parser.StartElementHandler = self._start_element 
    53         self._parser.EndElementHandler = self._end_element 
    54         self._parser.CharacterDataHandler = self._char_data 
    55  
    56         self.Send(_xmlJabberHeader % self.ServerJID) 
    57  
    58     def __del__(self): 
    59         self.Send(_xmlJabberFooter) 
    60         print 'Disconnecting %r from %s' % (self, self.ServerJID) 
    61  
    62     def _GetElementFactory(self, namespace, node, attributes): 
    63         if len(self._elements) > 1: 
    64             return _Objectified 
    65         else: 
    66             return self.dictJabberNodes.get((namespace, node), jabber_node) 
    67  
    68     def __call__(self, *args, **kw): 
    69         return apply(self.Process, args, kw) 
    70  
    71     def Process(self): 
    72         data = self._socket.recv(8192) 
    73         self._parser.Parse(data) 
    74           
    75     def Send(self, xmlData): 
    76         return self.SendImmediate(xmlData) 
    77  
    78     def SendImmediate(self, xmlData): 
    79         data = xmlData[:] 
    80         while data: 
    81             nSent = self._socket.send(data) 
    82             data = data[nSent:] 
     34class jabber_node(XMLObjectify._Objectified): 
     35    def __init__(self, client, namespace, node, attributes): 
     36        self._client = client 
     37        XMLObjectify._Objectified.__init__(self, namespace, node, attributes) 
    8338 
    8439#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    8540 
    86 def _test(): 
    87     import sys 
    88     strEval = ('{"%s"}'%'","'.join(sys.argv[1:])).replace('=','":"') 
    89     dictLogin = eval(strEval, {}, {}) 
     41class jabber_client_iq(jabber_node): 
     42    def _xmlInitComplete(self): 
     43        self._client.stream.iq = self 
    9044 
    91     jc = client(dictLogin['server']) 
    92     jc.Process() 
    93     jc.Send('''<iq type="set" to="%(server)s"><query xmlns="jabber:iq:auth"> 
    94     <username>%(login)s</username> 
    95     <password>%(password)s</password> 
    96     <resource>Python-Test</resource> 
    97 </query></iq>''' % dictLogin) 
    98     jc.Send('''<presence type="available" />''') 
    99     jc.Send(''' 
    100 <iq type="get" to="%s"><query xmlns="jabber:iq:roster"> 
    101 </query></iq>''' % jc.ServerJID) 
    102     jc.Process() 
    103     return jc 
     45class jabber_client_presence(jabber_node): 
     46    def _xmlInitComplete(self): 
     47        subject, resource = self._client.GetPresence(self.from_) 
     48        setattr(subject, resource, self) 
     49        self._client.stream.presence = self 
    10450 
    105 if __name__ == '__main__': 
    106     jc = _test() 
    107     while 1:  
    108         print 
    109         print ':', 
    110         input() 
     51class jabber_client_message(jabber_node): 
     52    def _xmlInitComplete(self): 
     53        self._client.stream.message = self 
    11154 
     55#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     56#~ Jabber Client Class 
     57#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     58 
     59class client(jabber_base.client): 
     60    DefaultJabberNode = jabber_node 
     61    JabberNodeMap = { 
     62        ('http://etherx.jabber.org/streams', 'stream'): jabber_stream, 
     63        ('http://etherx.jabber.org/streams', 'error'): jabber_stream_error, 
     64 
     65        ('jabber:client', 'iq'): jabber_client_iq, 
     66        ('jabber:client', 'message'): jabber_client_message, 
     67        ('jabber:client', 'presence'): jabber_client_presence, 
     68        } 
     69 
     70    def __init__(self, *args, **kw): 
     71        self._PresenceMap = {} 
     72        self.stream = SubjectObserver.AttributedSubject() 
     73        apply(jabber_base.client.__init__, (self,) + args, kw) 
     74 
     75    def GetPresence(self, JID): 
     76        lstJID = jabber_base.reJabberJID.split(JID)[1:-1] 
     77        tupleJID = tuple(lstJID[:-1]) 
     78        resource = lstJID[-1] 
     79        return self._PresenceMap.setdefault(tupleJID, SubjectObserver.AttributedSubject()), resource or '__default__' 
     80 
     81#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     82#~ Testing  
     83#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     84 
     85if __name__=='__main__': 
     86    import jabber_test 
     87