added the ability to wait forever by passing <0 to recv. explicitly setting sender...
authorerickson <erickson@9efc2488-bf62-4759-914b-345cdb29e865>
Sun, 20 Jan 2008 00:00:15 +0000 (00:00 +0000)
committererickson <erickson@9efc2488-bf62-4759-914b-345cdb29e865>
Sun, 20 Jan 2008 00:00:15 +0000 (00:00 +0000)
git-svn-id: svn://svn.open-ils.org/OpenSRF/trunk@1223 9efc2488-bf62-4759-914b-345cdb29e865

src/python/osrf/net.py
src/python/osrf/ses.py
src/python/osrf/stack.py

index e79b43b..0fd1f95 100644 (file)
 # -----------------------------------------------------------------------
 
 
+import os, time, threading
 from pyxmpp.jabber.client import JabberClient
 from pyxmpp.message import Message
 from pyxmpp.jid import JID
 from socket import gethostname
+import libxml2
 import osrf.log
-import os, time, threading
 
 THREAD_SESSIONS = {}
 
@@ -62,6 +63,7 @@ class NetworkMessage(object):
             self.body = message.get_body()
             self.thread = message.get_thread()
             self.recipient = message.get_to()
+            self.router_command = None
             if message.xmlnode.hasProp('router_from') and \
                 message.xmlnode.prop('router_from') != '':
                 self.sender = message.xmlnode.prop('router_from')
@@ -74,10 +76,17 @@ class NetworkMessage(object):
             self.thread = args.get('thread')
             self.router_command = args.get('router_command')
 
+    @staticmethod
+    def from_xml(xml):
+        doc=libxml2.parseDoc(xml)
+        msg = Message(doc.getRootElement())
+        return NetworkMessage(msg)
+        
+
     def make_xmpp_msg(self):
         ''' Creates a pyxmpp.message.Message and adds custom attributes '''
 
-        msg = Message(None, None, self.recipient, None, None, None, \
+        msg = Message(None, self.sender, self.recipient, None, None, None, \
             self.body, self.thread)
         if self.router_command:
             msg.xmlnode.newProp('router_command', self.router_command)
@@ -131,6 +140,7 @@ class Network(JabberClient):
     def send(self, message):
         """Sends the provided network message."""
         osrf.log.log_internal("jabber sending to %s: %s" % (message.recipient, message.body))
+        message.sender = self.jid.as_utf8()
         msg = message.make_xmpp_msg()
         self.stream.send(msg)
     
@@ -153,12 +163,18 @@ class Network(JabberClient):
         returned.
         """
 
+        forever = False
+        if timeout < 0:
+            forever = True
+            timeout = None
+
         if len(self.queue) == 0:
-            while timeout >= 0 and len(self.queue) == 0:
+            while (forever or timeout >= 0) and len(self.queue) == 0:
                 starttime = time.time()
                 act = self.get_stream().loop_iter(timeout)
                 endtime = time.time() - starttime
-                timeout -= endtime
+                if not forever:
+                    timeout -= endtime
                 osrf.log.log_internal("exiting stream loop after %s seconds. "
                     "act=%s, queue size=%d" % (str(endtime), act, len(self.queue)))
                 if not act:
index 4e66f24..92b271b 100644 (file)
@@ -257,7 +257,7 @@ class Request(object):
         self.session.send(message)
 
     def recv(self, timeout=120):
-        """Waits up to <timeout> seconds for a response to this request.
+        """ Waits up to <timeout> seconds for a response to this request.
         
             If a message is received in time, the response message is returned.
             Returns None otherwise."""
@@ -265,10 +265,11 @@ class Request(object):
         self.session.wait(0)
 
         orig_timeout = timeout
-        while not self.complete and timeout >= 0 and len(self.queue) == 0:
+        while not self.complete and (timeout >= 0 or orig_timeout < 0) and len(self.queue) == 0:
             s = time.time()
             self.session.wait(timeout)
-            timeout -= time.time() - s
+            if orig_timeout >= 0:
+                timeout -= time.time() - s
             if self.reset_timeout:
                 self.reset_timeout = False
                 timeout = orig_timeout
index e3da3d9..1c217cc 100644 (file)
@@ -30,6 +30,7 @@ def push(net_msg):
     if not ses:
         # This is an incoming request from a client, create a new server session
         osrf.log.log_error("server-side sessions don't exist yet")
+        return
 
     ses.set_remote_id(net_msg.sender)