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
 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 osrf.log
-import os, time, threading
 
 THREAD_SESSIONS = {}
 
 
 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.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')
             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')
 
             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 '''
 
     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)
             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))
     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)
     
         msg = message.make_xmpp_msg()
         self.stream.send(msg)
     
@@ -153,12 +163,18 @@ class Network(JabberClient):
         returned.
         """
 
         returned.
         """
 
+        forever = False
+        if timeout < 0:
+            forever = True
+            timeout = None
+
         if len(self.queue) == 0:
         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
                 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:
                 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):
         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."""
         
             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
         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)
             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
             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")
     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)
 
 
     ses.set_remote_id(net_msg.sender)