Author: rhs
Date: Wed Mar 13 19:21:06 2013
New Revision: 1456100

URL: http://svn.apache.org/r1456100
Log:
PROTON-269: fixed redirect accessors to do proper lookups

Modified:
    qpid/proton/trunk/proton-c/bindings/python/proton.py
    qpid/proton/trunk/proton-c/include/proton/codec.h
    qpid/proton/trunk/proton-c/src/codec/codec.c
    qpid/proton/trunk/proton-c/src/engine/engine.c
    qpid/proton/trunk/tests/python/proton_tests/codec.py

Modified: qpid/proton/trunk/proton-c/bindings/python/proton.py
URL: 
http://svn.apache.org/viewvc/qpid/proton/trunk/proton-c/bindings/python/proton.py?rev=1456100&r1=1456099&r2=1456100&view=diff
==============================================================================
--- qpid/proton/trunk/proton-c/bindings/python/proton.py (original)
+++ qpid/proton/trunk/proton-c/bindings/python/proton.py Wed Mar 13 19:21:06 
2013
@@ -1094,6 +1094,15 @@ class Data:
     """
     return pn_data_exit(self._data)
 
+  def lookup(self, name):
+    return pn_data_lookup(self._data, name)
+
+  def narrow(self):
+    pn_data_narrow(self._data)
+
+  def widen(self):
+    pn_data_widen(self._data)
+
   def type(self):
     """
     Returns the type of the current node.

Modified: qpid/proton/trunk/proton-c/include/proton/codec.h
URL: 
http://svn.apache.org/viewvc/qpid/proton/trunk/proton-c/include/proton/codec.h?rev=1456100&r1=1456099&r2=1456100&view=diff
==============================================================================
--- qpid/proton/trunk/proton-c/include/proton/codec.h (original)
+++ qpid/proton/trunk/proton-c/include/proton/codec.h Wed Mar 13 19:21:06 2013
@@ -111,6 +111,7 @@ PN_EXTERN bool pn_data_next(pn_data_t *d
 PN_EXTERN bool pn_data_prev(pn_data_t *data);
 PN_EXTERN bool pn_data_enter(pn_data_t *data);
 PN_EXTERN bool pn_data_exit(pn_data_t *data);
+PN_EXTERN bool pn_data_lookup(pn_data_t *data, const char *name);
 
 PN_EXTERN pn_type_t pn_data_type(pn_data_t *data);
 

Modified: qpid/proton/trunk/proton-c/src/codec/codec.c
URL: 
http://svn.apache.org/viewvc/qpid/proton/trunk/proton-c/src/codec/codec.c?rev=1456100&r1=1456099&r2=1456100&view=diff
==============================================================================
--- qpid/proton/trunk/proton-c/src/codec/codec.c (original)
+++ qpid/proton/trunk/proton-c/src/codec/codec.c Wed Mar 13 19:21:06 2013
@@ -1919,6 +1919,32 @@ bool pn_data_exit(pn_data_t *data)
   }
 }
 
+bool pn_data_lookup(pn_data_t *data, const char *name)
+{
+  while (pn_data_next(data)) {
+    pn_type_t type = pn_data_type(data);
+
+    switch (type) {
+    case PN_STRING:
+    case PN_SYMBOL:
+      {
+        pn_bytes_t bytes = pn_data_get_bytes(data);
+        if (!strncmp(name, bytes.start, bytes.size)) {
+          return pn_data_next(data);
+        }
+      }
+      break;
+    default:
+      break;
+    }
+
+    // skip the value
+    pn_data_next(data);
+  }
+
+  return false;
+}
+
 void pn_data_dump(pn_data_t *data)
 {
   char buf[1024];

Modified: qpid/proton/trunk/proton-c/src/engine/engine.c
URL: 
http://svn.apache.org/viewvc/qpid/proton/trunk/proton-c/src/engine/engine.c?rev=1456100&r1=1456099&r2=1456100&view=diff
==============================================================================
--- qpid/proton/trunk/proton-c/src/engine/engine.c (original)
+++ qpid/proton/trunk/proton-c/src/engine/engine.c Wed Mar 13 19:21:06 2013
@@ -2944,10 +2944,7 @@ const char *pn_condition_redirect_host(p
   pn_data_rewind(data);
   pn_data_next(data);
   pn_data_enter(data);
-  pn_data_next(data);
-  pn_data_next(data);
-  pn_data_next(data);
-  pn_data_next(data);
+  pn_data_lookup(data, "network-host");
   pn_bytes_t host = pn_data_get_bytes(data);
   pn_data_rewind(data);
   return host.start;
@@ -2959,12 +2956,7 @@ int pn_condition_redirect_port(pn_condit
   pn_data_rewind(data);
   pn_data_next(data);
   pn_data_enter(data);
-  pn_data_next(data);
-  pn_data_next(data);
-  pn_data_next(data);
-  pn_data_next(data);
-  pn_data_next(data);
-  pn_data_next(data);
+  pn_data_lookup(data, "port");
   int port = pn_data_get_int(data);
   pn_data_rewind(data);
   return port;

Modified: qpid/proton/trunk/tests/python/proton_tests/codec.py
URL: 
http://svn.apache.org/viewvc/qpid/proton/trunk/tests/python/proton_tests/codec.py?rev=1456100&r1=1456099&r2=1456100&view=diff
==============================================================================
--- qpid/proton/trunk/tests/python/proton_tests/codec.py (original)
+++ qpid/proton/trunk/tests/python/proton_tests/codec.py Wed Mar 13 19:21:06 
2013
@@ -297,3 +297,24 @@ class DataTest(Test):
     assert data.next()
     copy = data.get_object()
     assert copy == obj, (copy, obj)
+
+  def testLookup(self):
+    obj = {symbol("key"): u"value",
+           symbol("pi"): 3.14159,
+           symbol("list"): [1, 2, 3, 4]}
+    self.data.put_object(obj)
+    self.data.rewind()
+    self.data.next()
+    self.data.enter()
+    self.data.narrow()
+    assert self.data.lookup("pi")
+    assert self.data.get_object() == 3.14159
+    self.data.rewind()
+    assert self.data.lookup("key")
+    assert self.data.get_object() == u"value"
+    self.data.rewind()
+    assert self.data.lookup("list")
+    assert self.data.get_object() == [1, 2, 3, 4]
+    self.data.widen()
+    self.data.rewind()
+    assert not self.data.lookup("pi")



---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscr...@qpid.apache.org
For additional commands, e-mail: commits-h...@qpid.apache.org

Reply via email to