home *** CD-ROM | disk | FTP | other *** search
/ Maximum CD 2011 February / maximum-cd-2011-02.iso / DiscContents / digsby_setup85.exe / lib / jabber / threadstream.pyo (.txt) < prev    next >
Encoding:
Python Compiled Bytecode  |  2010-11-24  |  21.2 KB  |  730 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyo (Python 2.6)
  3.  
  4. from __future__ import with_statement
  5. import pyxmpp.error as pyxmpp
  6. from pyxmpp.exceptions import ClientStreamError
  7. from util.threads.threadpool2 import threaded
  8. from util.callbacks import callsback
  9. from util import GetSocketType
  10. from util.primitives.funcs import Delegate
  11. from pyxmpp.exceptions import LegacyAuthenticationError, TLSNegotiationFailed
  12. from pyxmpp.streambase import STREAM_NS
  13. import pyxmpp.xmlextra as xmlextra
  14. from util.diagnostic import Diagnostic
  15. import libxml2
  16. import time
  17. import Queue
  18. import logging
  19. import socket
  20. from jabber.threadstreamsocket import ThreadStreamSocket
  21. from pyxmpp.jabber.clientstream import LegacyClientStream
  22. from pyxmpp.exceptions import StreamError, StreamEncryptionRequired, HostMismatch, ProtocolError, TLSError
  23. from pyxmpp.exceptions import FatalStreamError, StreamParseError, StreamAuthenticationError, SASLAuthenticationFailed
  24. from pyxmpp.jid import JID
  25. from pyxmpp import resolver
  26. from common import netcall
  27. from threading import currentThread
  28. import traceback
  29. import sys
  30. log = logging.getLogger('ThreadStream')
  31. outdebug = logging.getLogger('ThreadStream.out').debug
  32. outdebug_s = getattr(logging.getLogger('ThreadStream.out'), 'debug_s', outdebug)
  33. indebug = logging.getLogger('ThreadStream.in').debug
  34. indebug_s = getattr(logging.getLogger('ThreadStream.in'), 'debug_s', outdebug)
  35.  
  36. try:
  37.     import M2Crypto
  38.     if M2Crypto.version_info < (0, 16):
  39.         tls_available = 0
  40.     else:
  41.         from M2Crypto import SSL
  42.         from M2Crypto.SSL import SSLError
  43.         import M2Crypto.SSL.cb as M2Crypto
  44.         tls_available = 1
  45. except ImportError:
  46.     tls_available = 0
  47.  
  48.  
  49. def ignore_xml_error(descr):
  50.     if descr == 'Parser error #201.':
  51.         return True
  52.  
  53.  
  54. class ThreadStream(LegacyClientStream):
  55.     killonce = False
  56.     
  57.     def __init__(self, *a, **k):
  58.         LegacyClientStream.__init__(self, *a, **k)
  59.         self._ThreadStream__logger = logging.getLogger('ThreadStream')
  60.         self._ThreadStream__shutdown = False
  61.         self.on_incoming_node = Delegate()
  62.         self.on_outgoing_node = Delegate()
  63.  
  64.     
  65.     def stanza(self, _unused, node):
  66.         self.on_incoming_node(node)
  67.         LegacyClientStream.stanza(self, _unused, node)
  68.  
  69.     
  70.     def _write_node(self, xmlnode):
  71.         self.on_outgoing_node(xmlnode)
  72.         if self.eof and not (self.socket) or not (self.doc_out):
  73.             self._ThreadStream__logger.debug('Dropping stanza: %r' % (xmlnode,))
  74.             return None
  75.         xmlnode = xmlnode.docCopyNode(self.doc_out, 1)
  76.         self.doc_out.addChild(xmlnode)
  77.         
  78.         try:
  79.             ns = xmlnode.ns()
  80.         except libxml2.treeError:
  81.             not (self.doc_out)
  82.             not (self.doc_out)
  83.             ns = None
  84.         except:
  85.             not (self.doc_out)
  86.  
  87.         if ns and ns.content == xmlextra.COMMON_NS:
  88.             xmlextra.replace_ns(xmlnode, ns, self.default_ns)
  89.         
  90.         s = xmlextra.safe_serialize(xmlnode)
  91.         self._write_raw(s)
  92.         self.freeOutNode(xmlnode)
  93.  
  94.     
  95.     def freeOutNode(self, xmlnode):
  96.         self.lock.__enter__()
  97.         
  98.         try:
  99.             if self.doc_out is not None:
  100.                 xmlnode.unlinkNode()
  101.                 xmlnode.freeNode()
  102.         finally:
  103.             pass
  104.  
  105.  
  106.     
  107.     def write_raw(self, data):
  108.         (None, netcall)((lambda : LegacyClientStream.write_raw(self, data)))
  109.  
  110.     
  111.     def idle(self):
  112.         (netcall,)((lambda : LegacyClientStream.idle(self)))
  113.  
  114.     
  115.     def send(self, stanza):
  116.         (None, netcall)((lambda : LegacyClientStream.send(self, stanza)))
  117.  
  118.     
  119.     def _write_raw(self, data):
  120.         if sys.DEV and currentThread().getName() != 'AsyncoreThread':
  121.             
  122.             try:
  123.                 raise AssertionError, 'bad thread for _write_raw: %r' % currentThread().getName()
  124.             except AssertionError:
  125.                 traceback.print_exc()
  126.                 traceback.print_stack()
  127.                 import wx
  128.                 
  129.                 def do_submit():
  130.                     d = Diagnostic(description = 'Automated: Woah, bad thread')
  131.                     d.prepare_data()
  132.                     d.do_post()
  133.                     profile = profile
  134.                     import common
  135.                     uname = profile.username
  136.                     del profile
  137.                     wx.MessageBox('Hey %s! Something crazy just happened!\nI submitted a bug report for you. - Chris' % uname)
  138.  
  139.                 wx.CallLater(3000, do_submit)
  140.                 raise 
  141.             except:
  142.                 None<EXCEPTION MATCH>AssertionError
  143.             
  144.  
  145.         None<EXCEPTION MATCH>AssertionError
  146.         outdebug_s('OUT: %r', data)
  147.         self.socket.push(data)
  148.         outdebug('OUT: done')
  149.  
  150.     
  151.     def fileno(self):
  152.         self.lock.__enter__()
  153.         
  154.         try:
  155.             return self.socket._fileno
  156.         finally:
  157.             pass
  158.  
  159.  
  160.     
  161.     def connect(self, server = None, port = None):
  162.         outdebug('connect')
  163.         self.lock.__enter__()
  164.         
  165.         try:
  166.             self._connect1(server, port)
  167.         finally:
  168.             pass
  169.  
  170.  
  171.     
  172.     def _connect1(self, server = None, port = None):
  173.         outdebug('_connect1')
  174.         if not (self.my_jid.node) or not (self.my_jid.resource):
  175.             raise ClientStreamError, 'Client JID must have username and resource'
  176.         not (self.my_jid.resource)
  177.         if not server:
  178.             server = self.server
  179.         
  180.         if not port:
  181.             port = self.port
  182.         
  183.         if server:
  184.             self._ThreadStream__logger.debug('server: %r', (server, port))
  185.             service = None
  186.         else:
  187.             service = 'xmpp-client'
  188.         if port is None:
  189.             port = 5222
  190.         
  191.         if server is None:
  192.             self._ThreadStream__logger.debug('server: %r', (server, port))
  193.             server = self.my_jid.domain
  194.         
  195.         self.me = self.my_jid
  196.         
  197.         def connect_failed():
  198.             self.owner.set_offline(self.owner.Reasons.CONN_FAIL)
  199.  
  200.         self._connect2(server, port, service, self.my_jid.domain, sck_cls = GetSocketType())
  201.  
  202.     
  203.     def _connect2(self, addr1, port1, service = None, to = None, sck_cls = socket.SocketType):
  204.         outdebug('_connect2')
  205.         self._ThreadStream__logger.debug('server: %r', (addr1, port1))
  206.         if to is None:
  207.             to = str(addr1)
  208.         
  209.         if service is not None:
  210.             self.state_change('resolving srv', (addr1, service))
  211.             
  212.             try:
  213.                 addrs = resolver.resolve_srv(addr1, service)
  214.             except Exception:
  215.                 traceback.print_exc()
  216.                 addrs = []
  217.  
  218.             if not addrs:
  219.                 addrs = [
  220.                     (addr1, port1)]
  221.             else:
  222.                 addrs.append((addr1, port1))
  223.         else:
  224.             addrs = [
  225.                 (addr1, port1)]
  226.         msg = None
  227.         self._ThreadStream__logger.debug('addrs: %r', addrs)
  228.         for addr, port in addrs:
  229.             if type(addr) in (str, unicode):
  230.                 self.state_change('resolving', addr)
  231.             
  232.             s = None
  233.             
  234.             try:
  235.                 resolved = resolver.getaddrinfo(addr, port, 0, socket.SOCK_STREAM)
  236.             except Exception:
  237.                 self._ThreadStream__logger.debug('an attempt to resolve %r failed', (addr, port))
  238.                 resolved = []
  239.  
  240.             self._ThreadStream__logger.debug('an attempt to resolve %r succeeded', (addr, port))
  241.             resolved.append((2, 1, 0, '_unused', (addr, port)))
  242.             for res in resolved:
  243.                 (family, socktype, proto, _unused, sockaddr) = res
  244.                 self._ThreadStream__logger.debug('res: %r', res)
  245.                 
  246.                 try:
  247.                     s = sck_cls(family, socktype, proto)
  248.                     s.settimeout(10)
  249.                     self.state_change('connecting', sockaddr)
  250.                     s.connect(sockaddr)
  251.                     if ThreadStream.killonce:
  252.                         ThreadStream.killonce = False
  253.                         raise socket.error
  254.                     ThreadStream.killonce
  255.                     if self.owner.do_ssl:
  256.                         ctx = SSL.Context()
  257.                         ctx.set_verify(SSL.verify_none, 10)
  258.                         s.setblocking(True)
  259.                         ssl = SSL.Connection(ctx, s)
  260.                         ssl.setup_ssl()
  261.                         ssl.set_connect_state()
  262.                         ssl.connect_ssl()
  263.                         s.setblocking(False)
  264.                         s = ssl
  265.                         s.setblocking(False)
  266.                     
  267.                     self.state_change('connected', sockaddr)
  268.                 except (socket.error, SSLError):
  269.                     msg = None
  270.                     self._ThreadStream__logger.debug('Connect to %r failed: %r', sockaddr, msg)
  271.                     traceback.print_exc()
  272.                     if s:
  273.                         s.close()
  274.                         s = None
  275.                         continue
  276.                     continue
  277.  
  278.             
  279.             if s:
  280.                 self._ThreadStream__logger.debug('connected to: %r', (addr, port))
  281.                 break
  282.                 continue
  283.         
  284.         if not s:
  285.             if msg:
  286.                 self._ThreadStream__logger.debug('failed to connect to %r: %r', (addr, port), msg)
  287.                 raise socket.error, msg
  288.             msg
  289.             self._ThreadStream__logger.debug('failed to connect to %r: unknown reason', (addr, port))
  290.             raise FatalStreamError, 'Cannot connect'
  291.         s
  292.         self.addr = addr
  293.         self.port = port
  294.         self.owner.lock.__enter__()
  295.         
  296.         try:
  297.             if self.owner.connect_killed == True:
  298.                 raise FatalStreamError, 'Connect Killed'
  299.             self.owner.connect_killed == True
  300.         finally:
  301.             pass
  302.  
  303.         self._connect_socket(s, to)
  304.         self.last_keepalive = time.time()
  305.  
  306.     
  307.     def closed(self):
  308.         logging.getLogger('ThreadStream').debug('closed')
  309.         self._do_closed()
  310.  
  311.     
  312.     def closed_dead(self):
  313.         logging.getLogger('ThreadStream').debug('closed_dead')
  314.         self._do_closed()
  315.  
  316.     
  317.     def _do_closed(self):
  318.         want_try_again = self.owner.fatal_error()
  319.         self.owner.stream = None
  320.         self.close(False)
  321.         self.owner.disconnected(want_try_again)
  322.  
  323.     
  324.     def __connect_error(self):
  325.         pass
  326.  
  327.     
  328.     def _connect_socket(self, sock, to = None):
  329.         logging.getLogger('ThreadStream').debug('connecting')
  330.         
  331.         def asyncore_stuff():
  332.             logging.getLogger('ThreadStream').debug('creating ThreadStreamSocket')
  333.             new_sock = ThreadStreamSocket(sock, self._feed_reader, 0, self.closed, self.closed_dead, ssl = self.owner.do_ssl)
  334.             LegacyClientStream._connect_socket(self, new_sock, to)
  335.  
  336.         netcall(asyncore_stuff)
  337.  
  338.     
  339.     def _loop_iter(self, timeout):
  340.         pass
  341.  
  342.     
  343.     def _process(self):
  344.         pass
  345.  
  346.     
  347.     def _read(self):
  348.         pass
  349.  
  350.     
  351.     def _process_tls_node(self, xmlnode):
  352.         if not (self.tls_settings) or not tls_available:
  353.             self._ThreadStream__logger.debug('Unexpected TLS node: %r' % xmlnode.serialize())
  354.             return False
  355.         return True
  356.  
  357.     
  358.     def fail_process(self):
  359.         self.owner.fatal_error()
  360.         self.close()
  361.  
  362.     
  363.     def finish_process(self):
  364.         self.socket = self.tls
  365.         self._ThreadStream__logger.debug('Restarting XMPP stream')
  366.         self._restart_stream()
  367.         return True
  368.  
  369.     
  370.     def _make_tls_connection(self, callback = None):
  371.         ctx = None
  372.         
  373.         try:
  374.             if not tls_available or not (self.tls_settings):
  375.                 raise TLSError, 'TLS is not available'
  376.             not (self.tls_settings)
  377.             tlssettings = self.tls_settings
  378.             self.state_change('tls connecting', self.peer)
  379.             self._ThreadStream__logger.debug('Creating TLS context')
  380.             ctx = None if tlssettings.ctx else SSL.Context('tlsv1')
  381.             verify_callback = tlssettings.verify_callback
  382.             if not verify_callback:
  383.                 verify_callback = self.tls_default_verify_callback
  384.             
  385.             if tlssettings.verify_peer:
  386.                 self._ThreadStream__logger.debug('verify_peer, verify_callback: %r', verify_callback)
  387.                 ctx.set_verify(SSL.verify_peer, 10, verify_callback)
  388.             else:
  389.                 ctx.set_verify(SSL.verify_none, 10)
  390.             if tlssettings.cert_file:
  391.                 ctx.use_certificate_chain_file(tlssettings.cert_file)
  392.                 if tlssettings.key_file:
  393.                     ctx.use_PrivateKey_file(tlssettings.key_file)
  394.                 else:
  395.                     ctx.use_PrivateKey_file(tlssettings.cert_file)
  396.                 ctx.check_private_key()
  397.             
  398.             if tlssettings.cacert_file:
  399.                 
  400.                 try:
  401.                     ctx.load_verify_location(tlssettings.cacert_file)
  402.                 except AttributeError:
  403.                     ctx.load_verify_locations(tlssettings.cacert_file)
  404.                 except:
  405.                     None<EXCEPTION MATCH>AttributeError
  406.                 
  407.  
  408.             None<EXCEPTION MATCH>AttributeError
  409.         except:
  410.             callback.error()
  411.             return None
  412.  
  413.         self.callback = callback
  414.         self.socket.make_tls(ctx, success = self.tls_done, error = self.tls_fail)
  415.  
  416.     _make_tls_connection = callsback(_make_tls_connection)
  417.     tls_fail = fail_process
  418.     
  419.     def tls_done(self):
  420.         self.tls = self.socket
  421.         self.state_change('tls connected', self.peer)
  422.         
  423.         try:
  424.             raise Exception
  425.         except:
  426.             pass
  427.  
  428.         self.callback.success()
  429.  
  430.     
  431.     def _got_features(self):
  432.         
  433.         try:
  434.             return LegacyClientStream._got_features(self)
  435.         except FatalStreamError:
  436.             e = None
  437.             if e.__class__ == FatalStreamError:
  438.                 self.owner.auth_failed(e.message)
  439.             else:
  440.                 raise 
  441.             e.__class__ == FatalStreamError
  442.  
  443.  
  444.     
  445.     def registration_error(self, stanza):
  446.         self.lock.__enter__()
  447.         
  448.         try:
  449.             ae = None
  450.             err = stanza.get_error()
  451.             ae = err.xpath_eval('e:*', {
  452.                 'e': 'jabber:iq:auth:error' })
  453.             if ae:
  454.                 ae = ae[0].name
  455.             else:
  456.                 ae = err.get_condition().name
  457.         finally:
  458.             pass
  459.  
  460.         self.registration_error_callback = None
  461.         self.registration_success_callback = None
  462.  
  463.     
  464.     def registration_success(self, stanza):
  465.         if self.registration_success_callback is not None:
  466.             self.registration_success_callback()
  467.         
  468.         self.registration_success_callback = None
  469.         self.registration_error_callback = None
  470.         _unused = stanza
  471.         self.lock.__enter__()
  472.         
  473.         try:
  474.             self.state_change('registered', self.registration_form)
  475.             if 'FORM_TYPE' in self.registration_form and self.registration_form['FORM_TYPE'].value == 'jabber:iq:register':
  476.                 if 'password' in self.registration_form:
  477.                     self.password = self.registration_form['password']
  478.                 
  479.             
  480.             self.registration_callback = None
  481.         finally:
  482.             pass
  483.  
  484.  
  485.     
  486.     def disconnect(self):
  487.         LegacyClientStream.disconnect(self)
  488.         self.state_change('disconnected', self.peer)
  489.  
  490.     
  491.     def stream_end(self, _unused):
  492.         LegacyClientStream.stream_end(self, _unused)
  493.         self.shutdown()
  494.  
  495.     
  496.     def _send_stream_end(self):
  497.         LegacyClientStream._send_stream_end(self)
  498.         self.shutdown()
  499.  
  500.     
  501.     def shutdown(self):
  502.         if not self._ThreadStream__shutdown:
  503.             outdebug('non-Force shutdown')
  504.             self._ThreadStream__shutdown = True
  505.             if self.socket:
  506.                 outdebug('non-Force close_when_done')
  507.                 self.socket.close_when_done()
  508.             
  509.         else:
  510.             outdebug('Force shutdown')
  511.             self.close(False)
  512.  
  513.     
  514.     def close(self, do_disconnect = True):
  515.         self.lock.__enter__()
  516.         
  517.         try:
  518.             return self._close(do_disconnect)
  519.         finally:
  520.             pass
  521.  
  522.  
  523.     
  524.     def _close(self, do_disconnect = True):
  525.         if do_disconnect:
  526.             self._disconnect()
  527.         
  528.         if self.doc_in:
  529.             self.doc_in = None
  530.         
  531.         if self.features:
  532.             self.features = None
  533.         
  534.         self._reader = None
  535.         self.stream_id = None
  536.         if self.socket:
  537.             self.socket.close()
  538.         
  539.         self._reset()
  540.  
  541.     
  542.     def _process_node(self, stanza):
  543.         
  544.         try:
  545.             LegacyClientStream._process_node(self, stanza)
  546.         except SASLAuthenticationFailed:
  547.             e = None
  548.             self.owner.auth_failed(reason = getattr(e, 'reason', e.message))
  549.             self._ThreadStream__logger.critical('SASLAuthenticationFailed: %r, %r', e.message, getattr(e, 'reason', 'unknown-reason'))
  550.         except LegacyAuthenticationError:
  551.             e = None
  552.             self.owner.auth_failed(reason = e.message)
  553.             self._ThreadStream__logger.critical('LegacyAuthenticationError')
  554.         except FatalStreamError:
  555.             e = None
  556.             import hub
  557.             hub.get_instance().on_error(e)
  558.             self._ThreadStream__logger.critical('Stream blew up')
  559.             self.owner.fatal_error()
  560.             self.close()
  561.  
  562.  
  563.     
  564.     def _process_sasl_failure(self, xmlnode):
  565.         
  566.         try:
  567.             LegacyClientStream._process_sasl_failure(self, xmlnode)
  568.         except SASLAuthenticationFailed:
  569.             e = None
  570.             e.reason = getattr(xmlnode.get_children(), 'name', 'unknown-reason')
  571.             raise e
  572.  
  573.  
  574.     
  575.     def error(self, descr):
  576.         if ignore_xml_error(descr):
  577.             return None
  578.         self._ThreadStream__logger.critical('XML parse error: ' + descr)
  579.         self.owner.fatal_error()
  580.         self.close()
  581.  
  582.     
  583.     def fix_in_stanza(self, stanza):
  584.         LegacyClientStream.fix_in_stanza(self, stanza)
  585.         if self.initiator:
  586.             to = stanza.get_to()
  587.             if to is not None:
  588.                 p = self.peer
  589.                 pb = None if p else None
  590.                 tob = None if to else None
  591.                 if tob == pb and to == p and to == pb or tob == p:
  592.                     stanza.set_to(False)
  593.                 
  594.             
  595.         
  596.  
  597.     
  598.     def _feed_reader(self, data):
  599.         self.lock.__enter__()
  600.         
  601.         try:
  602.             if self._reader is not None:
  603.                 self._super_feed_reader(data)
  604.             else:
  605.                 self.close(False)
  606.         finally:
  607.             pass
  608.  
  609.  
  610.     
  611.     def _super_feed_reader(self, data):
  612.         indebug_s('IN: %r', data)
  613.         if data:
  614.             
  615.             try:
  616.                 r = self._reader.feed(data)
  617.                 while r:
  618.                     r = self._reader.feed('')
  619.                 if r is None:
  620.                     indebug('r was None, setting eof + disconnect')
  621.                     self.eof = 1
  622.                     self.disconnect()
  623.             except StreamParseError:
  624.                 self._send_stream_error('xml-not-well-formed')
  625.                 raise 
  626.             except:
  627.                 None<EXCEPTION MATCH>StreamParseError
  628.             
  629.  
  630.         None<EXCEPTION MATCH>StreamParseError
  631.         indebug('no data, setting eof + disconnect')
  632.         self.eof = 1
  633.         self.disconnect()
  634.         if self.eof:
  635.             indebug('eof calling stream_end')
  636.             self.stream_end(None)
  637.         
  638.  
  639.     
  640.     def stream_start(self, doc):
  641.         self.doc_in = doc
  642.         log.debug('input document: %r' % (self.doc_in.serialize(),))
  643.         
  644.         try:
  645.             r = self.doc_in.getRootElement()
  646.             if r.ns().getContent() != STREAM_NS:
  647.                 self._send_stream_error('invalid-namespace')
  648.                 raise FatalStreamError, 'Invalid namespace.'
  649.             r.ns().getContent() != STREAM_NS
  650.         except libxml2.treeError:
  651.             self._send_stream_error('invalid-namespace')
  652.             raise FatalStreamError, "Couldn't get the namespace."
  653.  
  654.         self.version = r.prop('version')
  655.         if self.version and self.version != '1.0':
  656.             self._send_stream_error('unsupported-version')
  657.             raise FatalStreamError, 'Unsupported protocol version.'
  658.         self.version != '1.0'
  659.         to_from_mismatch = 0
  660.         old_peer = None
  661.         if self.initiator:
  662.             self.stream_id = r.prop('id')
  663.             peer = r.prop('from')
  664.             if peer:
  665.                 peer = JID(peer)
  666.             
  667.             if self.peer:
  668.                 if peer and peer != self.peer:
  669.                     self._ThreadStream__logger.debug('peer hostname mismatch: %r != %r' % (peer, self.peer))
  670.                     to_from_mismatch = 1
  671.                     old_peer = self.peer
  672.                     self.peer = peer
  673.                 elif peer:
  674.                     self.peer = peer
  675.                 
  676.             else:
  677.                 self.peer = peer
  678.         else:
  679.             to = r.prop('to')
  680.             if to:
  681.                 to = self.check_to(to)
  682.                 if not to:
  683.                     self._send_stream_error('host-unknown')
  684.                     raise FatalStreamError, 'Bad "to"'
  685.                 to
  686.                 self.me = JID(to)
  687.             
  688.             self._send_stream_start(self.generate_id())
  689.             self._send_stream_features()
  690.             self.state_change('fully connected', self.peer)
  691.             self._post_connect()
  692.         if to_from_mismatch:
  693.             handler = getattr(self, 'on_host_mismatch', None)
  694.             if handler is not None:
  695.                 handler(old_peer, peer)
  696.             
  697.         
  698.         if not self.version:
  699.             self.state_change('fully connected', self.peer)
  700.             self._post_connect()
  701.         
  702.  
  703.     
  704.     def on_host_mismatch(self, mine, theirs):
  705.         self._had_host_mismatch = True
  706.         self._host_mismatch_info = (mine, theirs)
  707.  
  708.     
  709.     def _make_reader(self):
  710.         self._reader = IgnoreNSErrorReader(self)
  711.  
  712.  
  713.  
  714. class IgnoreNSErrorReader(xmlextra.StreamReader):
  715.     
  716.     def feed(self, s):
  717.         
  718.         try:
  719.             return xmlextra.StreamReader.feed(self, s)
  720.         except Exception:
  721.             e = None
  722.             if ignore_xml_error(e.message):
  723.                 return 0
  724.             raise 
  725.         except:
  726.             ignore_xml_error(e.message)
  727.  
  728.  
  729.  
  730.