You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by gs...@apache.org on 2014/11/14 12:03:10 UTC

[01/50] [abbrv] qpid-proton git commit: NO-JIRA: If we didn't build the python bindings then we can't run python tests

Repository: qpid-proton
Updated Branches:
  refs/heads/examples a55a53d98 -> 51a757bc4


NO-JIRA: If we didn't build the python bindings then we can't run python tests

git-svn-id: https://svn.apache.org/repos/asf/qpid/proton/trunk@1628509 13f79535-47bb-0310-9956-ffa450edef68


Project: http://git-wip-us.apache.org/repos/asf/qpid-proton/repo
Commit: http://git-wip-us.apache.org/repos/asf/qpid-proton/commit/5d32449f
Tree: http://git-wip-us.apache.org/repos/asf/qpid-proton/tree/5d32449f
Diff: http://git-wip-us.apache.org/repos/asf/qpid-proton/diff/5d32449f

Branch: refs/heads/examples
Commit: 5d32449f69f8d19feafc74471cd1608fdb9c1d7b
Parents: b32cb18
Author: Andrew Stitcher <as...@apache.org>
Authored: Tue Sep 30 18:17:07 2014 +0000
Committer: Andrew Stitcher <as...@apache.org>
Committed: Tue Sep 30 18:17:07 2014 +0000

----------------------------------------------------------------------
 proton-c/CMakeLists.txt | 32 +++++++++++++++++---------------
 1 file changed, 17 insertions(+), 15 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/5d32449f/proton-c/CMakeLists.txt
----------------------------------------------------------------------
diff --git a/proton-c/CMakeLists.txt b/proton-c/CMakeLists.txt
index e5f02ad..6b6b730 100644
--- a/proton-c/CMakeLists.txt
+++ b/proton-c/CMakeLists.txt
@@ -484,21 +484,23 @@ mark_as_advanced (VALGRIND_EXE)
 add_subdirectory(src/tests)
 
 # python test: tests/python/proton-test
-set (py_root "${pn_test_root}/python")
-set (py_src "${CMAKE_CURRENT_SOURCE_DIR}/bindings/python")
-set (py_bin "${CMAKE_CURRENT_BINARY_DIR}/bindings/python")
-set (py_bld "${CMAKE_CURRENT_BINARY_DIR}${bld_suffix}") # For windows
-set (app_path "${pn_test_bin}/tools/apps/c${bld_suffix}")
-set (app_path "${app_path}:${pn_test_root}/tools/apps/python")
-set_path (py_path "${py_bin}:${py_bld}:${app_path}:$ENV{PATH}")
-set_path (py_pythonpath "${py_root}:${py_src}:${py_bin}:${py_bld}|$ENV{PYTHONPATH}")
-if (CMAKE_SYSTEM_NAME STREQUAL Windows)
-  set_path (py_pythonpath "${py_bin}${bld_suffix}:${py_pythonpath}")
-endif (CMAKE_SYSTEM_NAME STREQUAL Windows)
-add_test (python-test ${PYTHON_EXECUTABLE} ${env_py}
-         "PATH=${py_path}" "PYTHONPATH=${py_pythonpath}" ${VALGRIND_ENV}
-         ${PYTHON_EXECUTABLE} "${py_root}/proton-test")
-set_tests_properties(python-test PROPERTIES PASS_REGULAR_EXPRESSION "Totals: .* 0 failed")
+if (BUILD_PYTHON)
+  set (py_root "${pn_test_root}/python")
+  set (py_src "${CMAKE_CURRENT_SOURCE_DIR}/bindings/python")
+  set (py_bin "${CMAKE_CURRENT_BINARY_DIR}/bindings/python")
+  set (py_bld "${CMAKE_CURRENT_BINARY_DIR}${bld_suffix}") # For windows
+  set (app_path "${pn_test_bin}/tools/apps/c${bld_suffix}")
+  set (app_path "${app_path}:${pn_test_root}/tools/apps/python")
+  set_path (py_path "${py_bin}:${py_bld}:${app_path}:$ENV{PATH}")
+  set_path (py_pythonpath "${py_root}:${py_src}:${py_bin}:${py_bld}|$ENV{PYTHONPATH}")
+  if (CMAKE_SYSTEM_NAME STREQUAL Windows)
+    set_path (py_pythonpath "${py_bin}${bld_suffix}:${py_pythonpath}")
+  endif (CMAKE_SYSTEM_NAME STREQUAL Windows)
+  add_test (python-test ${PYTHON_EXECUTABLE} ${env_py}
+            "PATH=${py_path}" "PYTHONPATH=${py_pythonpath}" ${VALGRIND_ENV}
+            ${PYTHON_EXECUTABLE} "${py_root}/proton-test")
+  set_tests_properties(python-test PROPERTIES PASS_REGULAR_EXPRESSION "Totals: .* 0 failed")
+endif (BUILD_PYTHON)
 
 find_program(RUBY_EXE "ruby")
 if (RUBY_EXE)


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


[37/50] [abbrv] qpid-proton git commit: PROTON-736: Ruby Message does not return all content.

Posted by gs...@apache.org.
PROTON-736: Ruby Message does not return all content.

The content method was not expanding the return size of the data to
accomodate large payloads.


Project: http://git-wip-us.apache.org/repos/asf/qpid-proton/repo
Commit: http://git-wip-us.apache.org/repos/asf/qpid-proton/commit/24cda63f
Tree: http://git-wip-us.apache.org/repos/asf/qpid-proton/tree/24cda63f
Diff: http://git-wip-us.apache.org/repos/asf/qpid-proton/diff/24cda63f

Branch: refs/heads/examples
Commit: 24cda63f0399c0f8fc9b091d35226340a8fdd737
Parents: cce4247
Author: Darryl L. Pierce <mc...@gmail.com>
Authored: Tue Nov 4 10:24:26 2014 -0500
Committer: Darryl L. Pierce <mc...@apache.org>
Committed: Thu Nov 6 13:05:03 2014 -0500

----------------------------------------------------------------------
 .../bindings/ruby/lib/qpid_proton/message.rb     | 19 ++++++++++++++++++-
 1 file changed, 18 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/24cda63f/proton-c/bindings/ruby/lib/qpid_proton/message.rb
----------------------------------------------------------------------
diff --git a/proton-c/bindings/ruby/lib/qpid_proton/message.rb b/proton-c/bindings/ruby/lib/qpid_proton/message.rb
index 6cc7c24..d840299 100644
--- a/proton-c/bindings/ruby/lib/qpid_proton/message.rb
+++ b/proton-c/bindings/ruby/lib/qpid_proton/message.rb
@@ -405,6 +405,9 @@ module Qpid
 
       # Sets the message content.
       #
+      # *WARNING:* This method has been deprecated. Please use #body= instead to
+      # set the content of a message.
+      #
       # ==== Options
       #
       # * content - the content
@@ -415,8 +418,22 @@ module Qpid
 
       # Returns the message content.
       #
+      # *WARNING:* This method has been deprecated. Please use #body instead to
+      # retrieve the content of a message.
+      #
       def content
-        Cproton.pn_message_save(@impl, 1024)[1]
+        size = 16
+        loop do
+          result = Cproton.pn_message_save(@impl, size)
+          error = result[0]
+          data = result[1]
+          if error == Qpid::Proton::Error::OVERFLOW
+            size = size * 2
+          else
+            check(error)
+            return data
+          end
+        end
       end
 
       # Sets the content encoding type.


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


[30/50] [abbrv] qpid-proton git commit: properly convert NULL data objects

Posted by gs...@apache.org.
properly convert NULL data objects

git-svn-id: https://svn.apache.org/repos/asf/qpid/proton/trunk@1634966 13f79535-47bb-0310-9956-ffa450edef68


Project: http://git-wip-us.apache.org/repos/asf/qpid-proton/repo
Commit: http://git-wip-us.apache.org/repos/asf/qpid-proton/commit/ca38e6c4
Tree: http://git-wip-us.apache.org/repos/asf/qpid-proton/tree/ca38e6c4
Diff: http://git-wip-us.apache.org/repos/asf/qpid-proton/diff/ca38e6c4

Branch: refs/heads/examples
Commit: ca38e6c4e787f57b1c4d9fefce8af537adc9007f
Parents: f139ae6
Author: Rafael H. Schloming <rh...@apache.org>
Authored: Tue Oct 28 20:24:38 2014 +0000
Committer: Rafael H. Schloming <rh...@apache.org>
Committed: Tue Oct 28 20:24:38 2014 +0000

----------------------------------------------------------------------
 proton-c/bindings/python/proton.py | 14 ++++++++------
 1 file changed, 8 insertions(+), 6 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/ca38e6c4/proton-c/bindings/python/proton.py
----------------------------------------------------------------------
diff --git a/proton-c/bindings/python/proton.py b/proton-c/bindings/python/proton.py
index 8399952..0ac79d4 100644
--- a/proton-c/bindings/python/proton.py
+++ b/proton-c/bindings/python/proton.py
@@ -1435,6 +1435,7 @@ class Data:
     current node sets it _before_ the first node, calling next() will advance to
     the first node.
     """
+    assert self._data is not None
     pn_data_rewind(self._data)
 
   def next(self):
@@ -2242,12 +2243,13 @@ def cond2obj(cond):
     return None
 
 def dat2obj(dimpl):
-  d = Data(dimpl)
-  d.rewind()
-  d.next()
-  obj = d.get_object()
-  d.rewind()
-  return obj
+  if dimpl:
+    d = Data(dimpl)
+    d.rewind()
+    d.next()
+    obj = d.get_object()
+    d.rewind()
+    return obj
 
 def obj2dat(obj, dimpl):
   if obj is not None:


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


[07/50] [abbrv] qpid-proton git commit: Renamed PN_{CONNECTION, SESSION, LINK}_{OPEN, CLOSE} to PN_{CONNECTION, SESSION, LINK}_LOCAL_{OPEN, CLOSE}

Posted by gs...@apache.org.
Renamed PN_{CONNECTION,SESSION,LINK}_{OPEN,CLOSE} to PN_{CONNECTION,SESSION,LINK}_LOCAL_{OPEN,CLOSE}

git-svn-id: https://svn.apache.org/repos/asf/qpid/proton/trunk@1631542 13f79535-47bb-0310-9956-ffa450edef68


Project: http://git-wip-us.apache.org/repos/asf/qpid-proton/repo
Commit: http://git-wip-us.apache.org/repos/asf/qpid-proton/commit/4e7e432a
Tree: http://git-wip-us.apache.org/repos/asf/qpid-proton/tree/4e7e432a
Diff: http://git-wip-us.apache.org/repos/asf/qpid-proton/diff/4e7e432a

Branch: refs/heads/examples
Commit: 4e7e432a05e46a56ac7fc1f3e198a2f1d992cde2
Parents: a4ad521
Author: Rafael H. Schloming <rh...@apache.org>
Authored: Mon Oct 13 20:50:51 2014 +0000
Committer: Rafael H. Schloming <rh...@apache.org>
Committed: Mon Oct 13 20:50:51 2014 +0000

----------------------------------------------------------------------
 proton-c/bindings/python/proton.py              | 14 ++++-----
 proton-c/include/proton/event.h                 | 20 +++++++------
 proton-c/src/engine/engine.c                    |  8 +++---
 proton-c/src/events/event.c                     | 28 +++++++++---------
 proton-c/src/messenger/messenger.c              | 14 ++++-----
 .../org/apache/qpid/proton/engine/Event.java    | 16 +++++------
 .../qpid/proton/engine/impl/ConnectionImpl.java |  4 +--
 .../qpid/proton/engine/impl/LinkImpl.java       |  6 ++--
 .../qpid/proton/engine/impl/SessionImpl.java    |  4 +--
 proton-j/src/main/resources/cengine.py          | 14 ++++-----
 tests/python/proton_tests/engine.py             | 30 ++++++++++----------
 11 files changed, 80 insertions(+), 78 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/4e7e432a/proton-c/bindings/python/proton.py
----------------------------------------------------------------------
diff --git a/proton-c/bindings/python/proton.py b/proton-c/bindings/python/proton.py
index b5df542..4d2f3e4 100644
--- a/proton-c/bindings/python/proton.py
+++ b/proton-c/bindings/python/proton.py
@@ -3380,23 +3380,23 @@ class Event:
   CONNECTION_INIT = PN_CONNECTION_INIT
   CONNECTION_BOUND = PN_CONNECTION_BOUND
   CONNECTION_UNBOUND = PN_CONNECTION_UNBOUND
-  CONNECTION_OPEN = PN_CONNECTION_OPEN
-  CONNECTION_CLOSE = PN_CONNECTION_CLOSE
+  CONNECTION_LOCAL_OPEN = PN_CONNECTION_LOCAL_OPEN
+  CONNECTION_LOCAL_CLOSE = PN_CONNECTION_LOCAL_CLOSE
   CONNECTION_REMOTE_OPEN = PN_CONNECTION_REMOTE_OPEN
   CONNECTION_REMOTE_CLOSE = PN_CONNECTION_REMOTE_CLOSE
   CONNECTION_FINAL = PN_CONNECTION_FINAL
 
   SESSION_INIT = PN_SESSION_INIT
-  SESSION_OPEN = PN_SESSION_OPEN
-  SESSION_CLOSE = PN_SESSION_CLOSE
+  SESSION_LOCAL_OPEN = PN_SESSION_LOCAL_OPEN
+  SESSION_LOCAL_CLOSE = PN_SESSION_LOCAL_CLOSE
   SESSION_REMOTE_OPEN = PN_SESSION_REMOTE_OPEN
   SESSION_REMOTE_CLOSE = PN_SESSION_REMOTE_CLOSE
   SESSION_FINAL = PN_SESSION_FINAL
 
   LINK_INIT = PN_LINK_INIT
-  LINK_OPEN = PN_LINK_OPEN
-  LINK_CLOSE = PN_LINK_CLOSE
-  LINK_DETACH = PN_LINK_DETACH
+  LINK_LOCAL_OPEN = PN_LINK_LOCAL_OPEN
+  LINK_LOCAL_CLOSE = PN_LINK_LOCAL_CLOSE
+  LINK_LOCAL_DETACH = PN_LINK_LOCAL_DETACH
   LINK_REMOTE_OPEN = PN_LINK_REMOTE_OPEN
   LINK_REMOTE_CLOSE = PN_LINK_REMOTE_CLOSE
   LINK_REMOTE_DETACH = PN_LINK_REMOTE_DETACH

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/4e7e432a/proton-c/include/proton/event.h
----------------------------------------------------------------------
diff --git a/proton-c/include/proton/event.h b/proton-c/include/proton/event.h
index 97095c6..c843fee 100644
--- a/proton-c/include/proton/event.h
+++ b/proton-c/include/proton/event.h
@@ -94,12 +94,14 @@ typedef enum {
   PN_CONNECTION_INIT,
 
   /**
-   * The connection has been bound to a transport.
+   * The connection has been bound to a transport. This event is
+   * issued when the ::pn_transport_bind() operation is invoked.
    */
   PN_CONNECTION_BOUND,
 
   /**
-   * The connection has been unbound from its transport.
+   * The connection has been unbound from its transport. This event is
+   * issued when the ::pn_transport_unbind() operation is invoked.
    */
   PN_CONNECTION_UNBOUND,
 
@@ -107,7 +109,7 @@ typedef enum {
    * The local connection endpoint has been closed. Events of this
    * type point to the relevant connection.
    */
-  PN_CONNECTION_OPEN,
+  PN_CONNECTION_LOCAL_OPEN,
 
   /**
    * The remote endpoint has opened the connection. Events of this
@@ -119,7 +121,7 @@ typedef enum {
    * The local connection endpoint has been closed. Events of this
    * type point to the relevant connection.
    */
-  PN_CONNECTION_CLOSE,
+  PN_CONNECTION_LOCAL_CLOSE,
 
   /**
    *  The remote endpoint has closed the connection. Events of this
@@ -144,7 +146,7 @@ typedef enum {
    * The local session endpoint has been opened. Events of this type
    * point ot the relevant session.
    */
-  PN_SESSION_OPEN,
+  PN_SESSION_LOCAL_OPEN,
 
   /**
    * The remote endpoint has opened the session. Events of this type
@@ -156,7 +158,7 @@ typedef enum {
    * The local session endpoint has been closed. Events of this type
    * point ot the relevant session.
    */
-  PN_SESSION_CLOSE,
+  PN_SESSION_LOCAL_CLOSE,
 
   /**
    * The remote endpoint has closed the session. Events of this type
@@ -181,7 +183,7 @@ typedef enum {
    * The local link endpoint has been opened. Events of this type
    * point ot the relevant link.
    */
-  PN_LINK_OPEN,
+  PN_LINK_LOCAL_OPEN,
 
   /**
    * The remote endpoint has opened the link. Events of this type
@@ -193,7 +195,7 @@ typedef enum {
    * The local link endpoint has been closed. Events of this type
    * point ot the relevant link.
    */
-  PN_LINK_CLOSE,
+  PN_LINK_LOCAL_CLOSE,
 
   /**
    * The remote endpoint has closed the link. Events of this type
@@ -205,7 +207,7 @@ typedef enum {
    * The local link endpoint has been detached. Events of this type
    * point to the relevant link.
    */
-  PN_LINK_DETACH,
+  PN_LINK_LOCAL_DETACH,
 
   /**
    * The remote endpoint has detached the link. Events of this type

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/4e7e432a/proton-c/src/engine/engine.c
----------------------------------------------------------------------
diff --git a/proton-c/src/engine/engine.c b/proton-c/src/engine/engine.c
index 46bf462..494c2d9 100644
--- a/proton-c/src/engine/engine.c
+++ b/proton-c/src/engine/engine.c
@@ -52,12 +52,12 @@ pn_connection_t *pn_ep_get_connection(pn_endpoint_t *endpoint)
 static pn_event_type_t endpoint_event(pn_endpoint_type_t type, bool open) {
   switch (type) {
   case CONNECTION:
-    return open ? PN_CONNECTION_OPEN : PN_CONNECTION_CLOSE;
+    return open ? PN_CONNECTION_LOCAL_OPEN : PN_CONNECTION_LOCAL_CLOSE;
   case SESSION:
-    return open ? PN_SESSION_OPEN : PN_SESSION_CLOSE;
+    return open ? PN_SESSION_LOCAL_OPEN : PN_SESSION_LOCAL_CLOSE;
   case SENDER:
   case RECEIVER:
-    return open ? PN_LINK_OPEN : PN_LINK_CLOSE;
+    return open ? PN_LINK_LOCAL_OPEN : PN_LINK_LOCAL_CLOSE;
   default:
     assert(false);
     return PN_EVENT_NONE;
@@ -267,7 +267,7 @@ void pn_link_detach(pn_link_t *link)
 {
   assert(link);
   link->detached = true;
-  pn_collector_put(link->session->connection->collector, PN_OBJECT, link, PN_LINK_DETACH);
+  pn_collector_put(link->session->connection->collector, PN_OBJECT, link, PN_LINK_LOCAL_DETACH);
   pn_modified(link->session->connection, &link->endpoint, true);
 
 }

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/4e7e432a/proton-c/src/events/event.c
----------------------------------------------------------------------
diff --git a/proton-c/src/events/event.c b/proton-c/src/events/event.c
index 95aeb03..94c8edf 100644
--- a/proton-c/src/events/event.c
+++ b/proton-c/src/events/event.c
@@ -242,40 +242,40 @@ const char *pn_event_type_name(pn_event_type_t type)
     return "PN_CONNECTION_UNBOUND";
   case PN_CONNECTION_REMOTE_OPEN:
     return "PN_CONNECTION_REMOTE_OPEN";
-  case PN_CONNECTION_OPEN:
-    return "PN_CONNECTION_OPEN";
+  case PN_CONNECTION_LOCAL_OPEN:
+    return "PN_CONNECTION_LOCAL_OPEN";
   case PN_CONNECTION_REMOTE_CLOSE:
     return "PN_CONNECTION_REMOTE_CLOSE";
-  case PN_CONNECTION_CLOSE:
-    return "PN_CONNECTION_CLOSE";
+  case PN_CONNECTION_LOCAL_CLOSE:
+    return "PN_CONNECTION_LOCAL_CLOSE";
   case PN_CONNECTION_FINAL:
     return "PN_CONNECTION_FINAL";
   case PN_SESSION_INIT:
     return "PN_SESSION_INIT";
   case PN_SESSION_REMOTE_OPEN:
     return "PN_SESSION_REMOTE_OPEN";
-  case PN_SESSION_OPEN:
-    return "PN_SESSION_OPEN";
+  case PN_SESSION_LOCAL_OPEN:
+    return "PN_SESSION_LOCAL_OPEN";
   case PN_SESSION_REMOTE_CLOSE:
     return "PN_SESSION_REMOTE_CLOSE";
-  case PN_SESSION_CLOSE:
-    return "PN_SESSION_CLOSE";
+  case PN_SESSION_LOCAL_CLOSE:
+    return "PN_SESSION_LOCAL_CLOSE";
   case PN_SESSION_FINAL:
     return "PN_SESSION_FINAL";
   case PN_LINK_INIT:
     return "PN_LINK_INIT";
   case PN_LINK_REMOTE_OPEN:
     return "PN_LINK_REMOTE_OPEN";
-  case PN_LINK_OPEN:
-    return "PN_LINK_OPEN";
+  case PN_LINK_LOCAL_OPEN:
+    return "PN_LINK_LOCAL_OPEN";
   case PN_LINK_REMOTE_CLOSE:
     return "PN_LINK_REMOTE_CLOSE";
-  case PN_LINK_DETACH:
-    return "PN_LINK_DETACH";
+  case PN_LINK_LOCAL_DETACH:
+    return "PN_LINK_LOCAL_DETACH";
   case PN_LINK_REMOTE_DETACH:
     return "PN_LINK_REMOTE_DETACH";
-  case PN_LINK_CLOSE:
-    return "PN_LINK_CLOSE";
+  case PN_LINK_LOCAL_CLOSE:
+    return "PN_LINK_LOCAL_CLOSE";
   case PN_LINK_FLOW:
     return "PN_LINK_FLOW";
   case PN_LINK_FINAL:

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/4e7e432a/proton-c/src/messenger/messenger.c
----------------------------------------------------------------------
diff --git a/proton-c/src/messenger/messenger.c b/proton-c/src/messenger/messenger.c
index 7c098a3..f0df36a 100644
--- a/proton-c/src/messenger/messenger.c
+++ b/proton-c/src/messenger/messenger.c
@@ -1266,22 +1266,22 @@ int pn_messenger_process_events(pn_messenger_t *messenger)
       break;
     case PN_CONNECTION_REMOTE_OPEN:
     case PN_CONNECTION_REMOTE_CLOSE:
-    case PN_CONNECTION_OPEN:
-    case PN_CONNECTION_CLOSE:
+    case PN_CONNECTION_LOCAL_OPEN:
+    case PN_CONNECTION_LOCAL_CLOSE:
       pn_messenger_process_connection(messenger, event);
       break;
     case PN_SESSION_REMOTE_OPEN:
     case PN_SESSION_REMOTE_CLOSE:
-    case PN_SESSION_OPEN:
-    case PN_SESSION_CLOSE:
+    case PN_SESSION_LOCAL_OPEN:
+    case PN_SESSION_LOCAL_CLOSE:
       pn_messenger_process_session(messenger, event);
       break;
     case PN_LINK_REMOTE_OPEN:
     case PN_LINK_REMOTE_CLOSE:
     case PN_LINK_REMOTE_DETACH:
-    case PN_LINK_OPEN:
-    case PN_LINK_CLOSE:
-    case PN_LINK_DETACH:
+    case PN_LINK_LOCAL_OPEN:
+    case PN_LINK_LOCAL_CLOSE:
+    case PN_LINK_LOCAL_DETACH:
       pn_messenger_process_link(messenger, event);
       break;
     case PN_LINK_FLOW:

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/4e7e432a/proton-j/src/main/java/org/apache/qpid/proton/engine/Event.java
----------------------------------------------------------------------
diff --git a/proton-j/src/main/java/org/apache/qpid/proton/engine/Event.java b/proton-j/src/main/java/org/apache/qpid/proton/engine/Event.java
index a0a2e95..3ffd414 100644
--- a/proton-j/src/main/java/org/apache/qpid/proton/engine/Event.java
+++ b/proton-j/src/main/java/org/apache/qpid/proton/engine/Event.java
@@ -33,26 +33,26 @@ public interface Event
         CONNECTION_INIT,
         CONNECTION_BOUND,
         CONNECTION_UNBOUND,
-        CONNECTION_OPEN,
+        CONNECTION_LOCAL_OPEN,
         CONNECTION_REMOTE_OPEN,
-        CONNECTION_CLOSE,
+        CONNECTION_LOCAL_CLOSE,
         CONNECTION_REMOTE_CLOSE,
         CONNECTION_FINAL,
 
         SESSION_INIT,
-        SESSION_OPEN,
+        SESSION_LOCAL_OPEN,
         SESSION_REMOTE_OPEN,
-        SESSION_CLOSE,
+        SESSION_LOCAL_CLOSE,
         SESSION_REMOTE_CLOSE,
         SESSION_FINAL,
 
         LINK_INIT,
-        LINK_OPEN,
+        LINK_LOCAL_OPEN,
         LINK_REMOTE_OPEN,
-        LINK_CLOSE,
-        LINK_REMOTE_CLOSE,
-        LINK_DETACH,
+        LINK_LOCAL_DETACH,
         LINK_REMOTE_DETACH,
+        LINK_LOCAL_CLOSE,
+        LINK_REMOTE_CLOSE,
         LINK_FLOW,
         LINK_FINAL,
 

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/4e7e432a/proton-j/src/main/java/org/apache/qpid/proton/engine/impl/ConnectionImpl.java
----------------------------------------------------------------------
diff --git a/proton-j/src/main/java/org/apache/qpid/proton/engine/impl/ConnectionImpl.java b/proton-j/src/main/java/org/apache/qpid/proton/engine/impl/ConnectionImpl.java
index 736d93c..9a27c1a 100644
--- a/proton-j/src/main/java/org/apache/qpid/proton/engine/impl/ConnectionImpl.java
+++ b/proton-j/src/main/java/org/apache/qpid/proton/engine/impl/ConnectionImpl.java
@@ -617,12 +617,12 @@ public class ConnectionImpl extends EndpointImpl implements ProtonJConnection
     @Override
     void localOpen()
     {
-        put(Event.Type.CONNECTION_OPEN, this);
+        put(Event.Type.CONNECTION_LOCAL_OPEN, this);
     }
 
     @Override
     void localClose()
     {
-        put(Event.Type.CONNECTION_CLOSE, this);
+        put(Event.Type.CONNECTION_LOCAL_CLOSE, this);
     }
 }

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/4e7e432a/proton-j/src/main/java/org/apache/qpid/proton/engine/impl/LinkImpl.java
----------------------------------------------------------------------
diff --git a/proton-j/src/main/java/org/apache/qpid/proton/engine/impl/LinkImpl.java b/proton-j/src/main/java/org/apache/qpid/proton/engine/impl/LinkImpl.java
index 0da2a60..2190ced 100644
--- a/proton-j/src/main/java/org/apache/qpid/proton/engine/impl/LinkImpl.java
+++ b/proton-j/src/main/java/org/apache/qpid/proton/engine/impl/LinkImpl.java
@@ -391,19 +391,19 @@ public abstract class LinkImpl extends EndpointImpl implements Link
     @Override
     void localOpen()
     {
-        getConnectionImpl().put(Event.Type.LINK_OPEN, this);
+        getConnectionImpl().put(Event.Type.LINK_LOCAL_OPEN, this);
     }
 
     @Override
     void localClose()
     {
-        getConnectionImpl().put(Event.Type.LINK_CLOSE, this);
+        getConnectionImpl().put(Event.Type.LINK_LOCAL_CLOSE, this);
     }
 
     public void detach()
     {
         _detached = true;
-        getConnectionImpl().put(Event.Type.LINK_DETACH, this);
+        getConnectionImpl().put(Event.Type.LINK_LOCAL_DETACH, this);
         modified();
     }
 

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/4e7e432a/proton-j/src/main/java/org/apache/qpid/proton/engine/impl/SessionImpl.java
----------------------------------------------------------------------
diff --git a/proton-j/src/main/java/org/apache/qpid/proton/engine/impl/SessionImpl.java b/proton-j/src/main/java/org/apache/qpid/proton/engine/impl/SessionImpl.java
index 26ad9ca..5eb55f5 100644
--- a/proton-j/src/main/java/org/apache/qpid/proton/engine/impl/SessionImpl.java
+++ b/proton-j/src/main/java/org/apache/qpid/proton/engine/impl/SessionImpl.java
@@ -204,12 +204,12 @@ public class SessionImpl extends EndpointImpl implements ProtonJSession
     @Override
     void localOpen()
     {
-        getConnectionImpl().put(Event.Type.SESSION_OPEN, this);
+        getConnectionImpl().put(Event.Type.SESSION_LOCAL_OPEN, this);
     }
 
     @Override
     void localClose()
     {
-        getConnectionImpl().put(Event.Type.SESSION_CLOSE, this);
+        getConnectionImpl().put(Event.Type.SESSION_LOCAL_CLOSE, this);
     }
 }

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/4e7e432a/proton-j/src/main/resources/cengine.py
----------------------------------------------------------------------
diff --git a/proton-j/src/main/resources/cengine.py b/proton-j/src/main/resources/cengine.py
index 102ee77..63603bc 100644
--- a/proton-j/src/main/resources/cengine.py
+++ b/proton-j/src/main/resources/cengine.py
@@ -954,23 +954,23 @@ from org.apache.qpid.proton.engine import Event
 PN_CONNECTION_INIT = Event.Type.CONNECTION_INIT
 PN_CONNECTION_BOUND = Event.Type.CONNECTION_BOUND
 PN_CONNECTION_UNBOUND = Event.Type.CONNECTION_UNBOUND
-PN_CONNECTION_OPEN = Event.Type.CONNECTION_OPEN
+PN_CONNECTION_LOCAL_OPEN = Event.Type.CONNECTION_LOCAL_OPEN
 PN_CONNECTION_REMOTE_OPEN = Event.Type.CONNECTION_REMOTE_OPEN
-PN_CONNECTION_CLOSE = Event.Type.CONNECTION_CLOSE
+PN_CONNECTION_LOCAL_CLOSE = Event.Type.CONNECTION_LOCAL_CLOSE
 PN_CONNECTION_REMOTE_CLOSE = Event.Type.CONNECTION_REMOTE_CLOSE
 PN_CONNECTION_FINAL = Event.Type.CONNECTION_FINAL
 PN_SESSION_INIT = Event.Type.SESSION_INIT
-PN_SESSION_OPEN = Event.Type.SESSION_OPEN
+PN_SESSION_LOCAL_OPEN = Event.Type.SESSION_LOCAL_OPEN
 PN_SESSION_REMOTE_OPEN = Event.Type.SESSION_REMOTE_OPEN
-PN_SESSION_CLOSE = Event.Type.SESSION_CLOSE
+PN_SESSION_LOCAL_CLOSE = Event.Type.SESSION_LOCAL_CLOSE
 PN_SESSION_REMOTE_CLOSE = Event.Type.SESSION_REMOTE_CLOSE
 PN_SESSION_FINAL = Event.Type.SESSION_FINAL
 PN_LINK_INIT = Event.Type.LINK_INIT
-PN_LINK_OPEN = Event.Type.LINK_OPEN
+PN_LINK_LOCAL_OPEN = Event.Type.LINK_LOCAL_OPEN
 PN_LINK_REMOTE_OPEN = Event.Type.LINK_REMOTE_OPEN
-PN_LINK_CLOSE = Event.Type.LINK_CLOSE
+PN_LINK_LOCAL_CLOSE = Event.Type.LINK_LOCAL_CLOSE
 PN_LINK_REMOTE_CLOSE = Event.Type.LINK_REMOTE_CLOSE
-PN_LINK_DETACH = Event.Type.LINK_DETACH
+PN_LINK_LOCAL_DETACH = Event.Type.LINK_LOCAL_DETACH
 PN_LINK_REMOTE_DETACH = Event.Type.LINK_REMOTE_DETACH
 PN_LINK_FLOW = Event.Type.LINK_FLOW
 PN_LINK_FINAL = Event.Type.LINK_FINAL

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/4e7e432a/tests/python/proton_tests/engine.py
----------------------------------------------------------------------
diff --git a/tests/python/proton_tests/engine.py b/tests/python/proton_tests/engine.py
index c821107..d35f518 100644
--- a/tests/python/proton_tests/engine.py
+++ b/tests/python/proton_tests/engine.py
@@ -2139,13 +2139,13 @@ class EventTest(CollectorTest):
     rcv = ssn2.receiver("receiver")
     rcv.open()
     self.pump()
-    self.expect(Event.CONNECTION_OPEN, Event.TRANSPORT,
-                Event.SESSION_INIT, Event.SESSION_OPEN,
-                Event.TRANSPORT, Event.LINK_INIT, Event.LINK_OPEN,
+    self.expect(Event.CONNECTION_LOCAL_OPEN, Event.TRANSPORT,
+                Event.SESSION_INIT, Event.SESSION_LOCAL_OPEN,
+                Event.TRANSPORT, Event.LINK_INIT, Event.LINK_LOCAL_OPEN,
                 Event.TRANSPORT)
 
     rcv.close()
-    self.expect(Event.LINK_CLOSE, Event.TRANSPORT)
+    self.expect(Event.LINK_LOCAL_CLOSE, Event.TRANSPORT)
     self.pump()
     rcv.free()
     del rcv
@@ -2209,7 +2209,7 @@ class EventTest(CollectorTest):
     rcv.flow(10)
     self.pump()
     self.expect(Event.CONNECTION_INIT, Event.SESSION_INIT,
-                Event.LINK_INIT, Event.LINK_OPEN, Event.TRANSPORT)
+                Event.LINK_INIT, Event.LINK_LOCAL_OPEN, Event.TRANSPORT)
     snd.delivery("delivery")
     snd.send("Hello World!")
     snd.advance()
@@ -2229,7 +2229,7 @@ class EventTest(CollectorTest):
     dlv = snd.delivery("delivery")
     snd.send("Hello World!")
     assert snd.advance()
-    self.expect(Event.LINK_OPEN, Event.TRANSPORT)
+    self.expect(Event.LINK_LOCAL_OPEN, Event.TRANSPORT)
     self.pump()
     self.expect(Event.LINK_FLOW)
     rdlv = rcv.current
@@ -2276,7 +2276,7 @@ class EventTest(CollectorTest):
     t.bind(c)
     c.open()
 
-    self.expect(Event.CONNECTION_BOUND, Event.CONNECTION_OPEN, Event.TRANSPORT)
+    self.expect(Event.CONNECTION_BOUND, Event.CONNECTION_LOCAL_OPEN, Event.TRANSPORT)
 
     c2 = Connection()
     t2 = Transport()
@@ -2293,7 +2293,7 @@ class EventTest(CollectorTest):
 
     pump(t, t2)
 
-    self.expect(Event.CONNECTION_CLOSE, Event.TRANSPORT,
+    self.expect(Event.CONNECTION_LOCAL_CLOSE, Event.TRANSPORT,
                 Event.TRANSPORT_HEAD_CLOSED, Event.TRANSPORT_CLOSED)
 
   def testLinkDetach(self):
@@ -2307,7 +2307,7 @@ class EventTest(CollectorTest):
     l1 = s1.sender("asdf")
     l1.open()
     l1.detach()
-    self.expect_until(Event.LINK_DETACH, Event.TRANSPORT)
+    self.expect_until(Event.LINK_LOCAL_DETACH, Event.TRANSPORT)
 
     c2 = Connection()
     c2.collect(self.collector)
@@ -2339,15 +2339,15 @@ class TeardownLeakTest(PeerTest):
   def doLeak(self, local, remote):
     self.connection.open()
     self.expect(Event.CONNECTION_INIT, Event.CONNECTION_BOUND,
-                Event.CONNECTION_OPEN, Event.TRANSPORT)
+                Event.CONNECTION_LOCAL_OPEN, Event.TRANSPORT)
 
     ssn = self.connection.session()
     ssn.open()
-    self.expect(Event.SESSION_INIT, Event.SESSION_OPEN, Event.TRANSPORT)
+    self.expect(Event.SESSION_INIT, Event.SESSION_LOCAL_OPEN, Event.TRANSPORT)
 
     snd = ssn.sender("sender")
     snd.open()
-    self.expect(Event.LINK_INIT, Event.LINK_OPEN, Event.TRANSPORT)
+    self.expect(Event.LINK_INIT, Event.LINK_LOCAL_OPEN, Event.TRANSPORT)
 
 
     self.pump()
@@ -2364,11 +2364,11 @@ class TeardownLeakTest(PeerTest):
 
     if local:
       snd.close() # ha!!
-      self.expect(Event.LINK_CLOSE, Event.TRANSPORT)
+      self.expect(Event.LINK_LOCAL_CLOSE, Event.TRANSPORT)
     ssn.close()
-    self.expect(Event.SESSION_CLOSE, Event.TRANSPORT)
+    self.expect(Event.SESSION_LOCAL_CLOSE, Event.TRANSPORT)
     self.connection.close()
-    self.expect(Event.CONNECTION_CLOSE, Event.TRANSPORT)
+    self.expect(Event.CONNECTION_LOCAL_CLOSE, Event.TRANSPORT)
 
     if remote:
       self.peer.link_head(0).close() # ha!!


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


[25/50] [abbrv] qpid-proton git commit: added dispatch utility

Posted by gs...@apache.org.
added dispatch utility

git-svn-id: https://svn.apache.org/repos/asf/qpid/proton/trunk@1633464 13f79535-47bb-0310-9956-ffa450edef68


Project: http://git-wip-us.apache.org/repos/asf/qpid-proton/repo
Commit: http://git-wip-us.apache.org/repos/asf/qpid-proton/commit/dc44e837
Tree: http://git-wip-us.apache.org/repos/asf/qpid-proton/tree/dc44e837
Diff: http://git-wip-us.apache.org/repos/asf/qpid-proton/diff/dc44e837

Branch: refs/heads/examples
Commit: dc44e837da29a5863ec3685cf7f13506feb6050e
Parents: 719ee5b
Author: Rafael H. Schloming <rh...@apache.org>
Authored: Tue Oct 21 21:11:07 2014 +0000
Committer: Rafael H. Schloming <rh...@apache.org>
Committed: Tue Oct 21 21:11:07 2014 +0000

----------------------------------------------------------------------
 proton-c/bindings/python/proton.py | 12 ++++++++++--
 1 file changed, 10 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/dc44e837/proton-c/bindings/python/proton.py
----------------------------------------------------------------------
diff --git a/proton-c/bindings/python/proton.py b/proton-c/bindings/python/proton.py
index 84b6654..862b673 100644
--- a/proton-c/bindings/python/proton.py
+++ b/proton-c/bindings/python/proton.py
@@ -3392,6 +3392,13 @@ class EventType:
   def __repr__(self):
     return self.name
 
+def dispatch(handler, method, *args):
+  m = getattr(handler, method, None)
+  if m:
+    return m(*args)
+  elif hasattr(handler, "on_unhandled"):
+    return handler.on_unhandled(method, args)
+
 class Event:
 
   CONNECTION_INIT = EventType(PN_CONNECTION_INIT, "on_connection_init")
@@ -3440,7 +3447,7 @@ class Event:
       self.context._released()
 
   def dispatch(self, handler):
-    getattr(handler, self.type.method, handler.on_unhandled)(self)
+    return dispatch(handler, self.type.method, self)
 
   @property
   def connection(self):
@@ -3503,7 +3510,7 @@ class Event:
 
 class Handler(object):
 
-  def on_unhandled(self, event):
+  def on_unhandled(self, method, args):
     pass
 
 
@@ -3856,6 +3863,7 @@ __all__ = [
            "TransportException",
            "Url",
            "char",
+           "dispatch",
            "symbol",
            "timestamp",
            "ulong"


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


[26/50] [abbrv] qpid-proton git commit: PROTON-720: [Windows IO] fix format specifier to print string

Posted by gs...@apache.org.
PROTON-720: [Windows IO] fix format specifier to print string

git-svn-id: https://svn.apache.org/repos/asf/qpid/proton/trunk@1633619 13f79535-47bb-0310-9956-ffa450edef68


Project: http://git-wip-us.apache.org/repos/asf/qpid-proton/repo
Commit: http://git-wip-us.apache.org/repos/asf/qpid-proton/commit/2b674b2e
Tree: http://git-wip-us.apache.org/repos/asf/qpid-proton/tree/2b674b2e
Diff: http://git-wip-us.apache.org/repos/asf/qpid-proton/diff/2b674b2e

Branch: refs/heads/examples
Commit: 2b674b2e0922d8e201f97dd84981fda4d59405ae
Parents: dc44e83
Author: Charles E. Rolke <ch...@apache.org>
Authored: Wed Oct 22 13:58:55 2014 +0000
Committer: Charles E. Rolke <ch...@apache.org>
Committed: Wed Oct 22 13:58:55 2014 +0000

----------------------------------------------------------------------
 proton-c/src/windows/io.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/2b674b2e/proton-c/src/windows/io.c
----------------------------------------------------------------------
diff --git a/proton-c/src/windows/io.c b/proton-c/src/windows/io.c
index ff31b1d..873926c 100644
--- a/proton-c/src/windows/io.c
+++ b/proton-c/src/windows/io.c
@@ -83,7 +83,7 @@ void pn_io_initialize(void *obj)
   int err = WSAStartup(wsa_ver, &unused);
   if (err) {
     pni_win32_error(io->error, "WSAStartup", WSAGetLastError());
-    fprintf(stderr, "Can't load WinSock: %d\n", pn_error_text(io->error));
+    fprintf(stderr, "Can't load WinSock: %s\n", pn_error_text(io->error));
   }
   io->iocp = pni_iocp();
 }


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


[41/50] [abbrv] qpid-proton git commit: PROTON-739: Add TTL to Ruby Messenger subscribe method.

Posted by gs...@apache.org.
PROTON-739: Add TTL to Ruby Messenger subscribe method.

By default the TTL is 0, mimicking the behavior of the underlying C
code.

Patch by: Dominic Evanss <do...@uk.ibm.com>
          (Tweaked slightly by me)


Project: http://git-wip-us.apache.org/repos/asf/qpid-proton/repo
Commit: http://git-wip-us.apache.org/repos/asf/qpid-proton/commit/bdeaf347
Tree: http://git-wip-us.apache.org/repos/asf/qpid-proton/tree/bdeaf347
Diff: http://git-wip-us.apache.org/repos/asf/qpid-proton/diff/bdeaf347

Branch: refs/heads/examples
Commit: bdeaf34708408eb7cf15a437584462a61107aaf1
Parents: 89cbc9c
Author: Darryl L. Pierce <mc...@apache.org>
Authored: Mon Nov 10 07:34:26 2014 -0500
Committer: Darryl L. Pierce <mc...@apache.org>
Committed: Mon Nov 10 08:13:49 2014 -0500

----------------------------------------------------------------------
 proton-c/bindings/ruby/lib/qpid_proton/messenger.rb | 14 ++++++++++----
 1 file changed, 10 insertions(+), 4 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/bdeaf347/proton-c/bindings/ruby/lib/qpid_proton/messenger.rb
----------------------------------------------------------------------
diff --git a/proton-c/bindings/ruby/lib/qpid_proton/messenger.rb b/proton-c/bindings/ruby/lib/qpid_proton/messenger.rb
index dfc5717..3dca86c 100644
--- a/proton-c/bindings/ruby/lib/qpid_proton/messenger.rb
+++ b/proton-c/bindings/ruby/lib/qpid_proton/messenger.rb
@@ -207,13 +207,19 @@ module Qpid
       # domain portion of the address begins with the '~' character, the
       # Messenger will interpret the domain as host/port, bind to it,
       # and listen for incoming messages. For example "~0.0.0.0",
-      # "amqp://~0.0.0.0" will all bind to any local interface and 
-      # listen for incoming messages.  Ad address of # "amqps://~0.0.0.0" 
+      # "amqp://~0.0.0.0" will all bind to any local interface and
+      # listen for incoming messages.  An address of "amqps://~0.0.0.0"
       # will only permit incoming SSL connections.
       #
-      def subscribe(address)
+      # ==== Options
+      #
+      # * address - the source address to be subscribe
+      # * timeout - an optional time-to-live value, in seconds, for the
+      #             subscription
+      #
+      def subscribe(address, timeout=0)
         raise TypeError.new("invalid address: #{address}") if address.nil?
-        subscription = Cproton.pn_messenger_subscribe(@impl, address)
+        subscription = Cproton.pn_messenger_subscribe_ttl(@impl, address, timeout)
         raise Qpid::Proton::ProtonError.new("Subscribe failed") if subscription.nil?
         Qpid::Proton::Subscription.new(subscription)
       end


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


[22/50] [abbrv] qpid-proton git commit: PROTON-719 : prevent ssl3 connections in Windows with schannel

Posted by gs...@apache.org.
PROTON-719 : prevent ssl3 connections in Windows with schannel

git-svn-id: https://svn.apache.org/repos/asf/qpid/proton/trunk@1632702 13f79535-47bb-0310-9956-ffa450edef68


Project: http://git-wip-us.apache.org/repos/asf/qpid-proton/repo
Commit: http://git-wip-us.apache.org/repos/asf/qpid-proton/commit/7e8b6b6c
Tree: http://git-wip-us.apache.org/repos/asf/qpid-proton/tree/7e8b6b6c
Diff: http://git-wip-us.apache.org/repos/asf/qpid-proton/diff/7e8b6b6c

Branch: refs/heads/examples
Commit: 7e8b6b6c4cd422771fd3094c718745c094f5a735
Parents: ad5e094
Author: Clifford Jansen <cl...@apache.org>
Authored: Sat Oct 18 00:16:01 2014 +0000
Committer: Clifford Jansen <cl...@apache.org>
Committed: Sat Oct 18 00:16:01 2014 +0000

----------------------------------------------------------------------
 proton-c/src/windows/schannel.c | 16 +++++++++++++++-
 1 file changed, 15 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/7e8b6b6c/proton-c/src/windows/schannel.c
----------------------------------------------------------------------
diff --git a/proton-c/src/windows/schannel.c b/proton-c/src/windows/schannel.c
index 385267f..373dc51 100644
--- a/proton-c/src/windows/schannel.c
+++ b/proton-c/src/windows/schannel.c
@@ -209,7 +209,7 @@ static size_t _pni_min(size_t a, size_t b)
 }
 
 // unrecoverable SSL failure occured, notify transport and generate error code.
-static int ssl_failed(pn_ssl_t *ssl, char *reason)
+static int ssl_failed(pn_ssl_t *ssl, const char *reason)
 {
   char buf[512] = "Unknown error.";
   if (!reason) {
@@ -521,6 +521,16 @@ int pn_ssl_get_peer_hostname( pn_ssl_t *ssl, char *hostname, size_t *bufsize )
 
 /** SChannel specific: */
 
+const char *tls_version_check(pn_ssl_t *ssl)
+{
+  SecPkgContext_ConnectionInfo info;
+  QueryContextAttributes(&ssl->ctxt_handle, SECPKG_ATTR_CONNECTION_INFO, &info);
+  // Ascending bit patterns denote newer SSL/TLS protocol versions.
+  // SP_PROT_TLS1_0_SERVER is not defined until VS2010.
+  return (info.dwProtocol < SP_PROT_TLS1_SERVER) ?
+    "peer does not support TLS 1.0 security" : NULL;
+}
+
 static void ssl_encrypt(pn_ssl_t *ssl, char *app_data, size_t count)
 {
   // Get SChannel to encrypt exactly one Record.
@@ -732,6 +742,10 @@ static void client_handshake( pn_ssl_t* ssl) {
       ssl_failed(ssl, "unexpected final server token");
       break;
     }
+    if (const char *err = tls_version_check(ssl)) {
+      ssl_failed(ssl, err);
+      break;
+    }
     if (token_buffs[1].BufferType == SECBUFFER_EXTRA && token_buffs[1].cbBuffer > 0) {
       // This seems to work but not documented, plus logic differs from decrypt message
       // since the pvBuffer value is not set.  Grrr.


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


[44/50] [abbrv] qpid-proton git commit: fixed english in comment

Posted by gs...@apache.org.
fixed english in comment


Project: http://git-wip-us.apache.org/repos/asf/qpid-proton/repo
Commit: http://git-wip-us.apache.org/repos/asf/qpid-proton/commit/ebf80e24
Tree: http://git-wip-us.apache.org/repos/asf/qpid-proton/tree/ebf80e24
Diff: http://git-wip-us.apache.org/repos/asf/qpid-proton/diff/ebf80e24

Branch: refs/heads/examples
Commit: ebf80e24aa7d2f0d3dfa8d4a299d6061b5e3fb9c
Parents: 5521a7e
Author: Rafael Schloming <rh...@alum.mit.edu>
Authored: Tue Nov 11 13:49:43 2014 -0500
Committer: Rafael Schloming <rh...@alum.mit.edu>
Committed: Tue Nov 11 13:49:43 2014 -0500

----------------------------------------------------------------------
 proton-c/src/sasl/sasl.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/ebf80e24/proton-c/src/sasl/sasl.c
----------------------------------------------------------------------
diff --git a/proton-c/src/sasl/sasl.c b/proton-c/src/sasl/sasl.c
index 2cc77c2..a82ec02 100644
--- a/proton-c/src/sasl/sasl.c
+++ b/proton-c/src/sasl/sasl.c
@@ -467,7 +467,7 @@ static ssize_t pn_output_write_sasl_header(pn_io_layer_t *io_layer, char *bytes,
 static ssize_t pn_output_write_sasl(pn_io_layer_t *io_layer, char *bytes, size_t size)
 {
   pn_sasl_t *sasl = (pn_sasl_t *)io_layer->context;
-  // this accounts for pn_do_error is invoked, e.g. by idle timeout
+  // this accounts for when pn_do_error is invoked, e.g. by idle timeout
   ssize_t n;
   if (sasl->transport->close_sent) {
     n = PN_EOS;


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


[39/50] [abbrv] qpid-proton git commit: PROTON-740: fixed shutdown and event related issues with idle timeout during sasl

Posted by gs...@apache.org.
PROTON-740: fixed shutdown and event related issues with idle timeout during sasl


Project: http://git-wip-us.apache.org/repos/asf/qpid-proton/repo
Commit: http://git-wip-us.apache.org/repos/asf/qpid-proton/commit/a5d65452
Tree: http://git-wip-us.apache.org/repos/asf/qpid-proton/tree/a5d65452
Diff: http://git-wip-us.apache.org/repos/asf/qpid-proton/diff/a5d65452

Branch: refs/heads/examples
Commit: a5d654521d47498355089cf93281028876244b3e
Parents: 8a042a2
Author: Rafael Schloming <rh...@alum.mit.edu>
Authored: Sat Nov 8 08:22:39 2014 -0500
Committer: Rafael Schloming <rh...@alum.mit.edu>
Committed: Sat Nov 8 08:23:14 2014 -0500

----------------------------------------------------------------------
 proton-c/include/proton/transport.h   |  13 +++
 proton-c/src/engine/engine-internal.h |   6 +-
 proton-c/src/sasl/sasl.c              |   9 +-
 proton-c/src/ssl/openssl.c            | 133 ++++++++++++++---------------
 proton-c/src/transport/transport.c    |  94 +++++++++++---------
 proton-c/src/windows/schannel.c       |   1 -
 tests/python/proton_tests/engine.py   |  27 ++++++
 7 files changed, 170 insertions(+), 113 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/a5d65452/proton-c/include/proton/transport.h
----------------------------------------------------------------------
diff --git a/proton-c/include/proton/transport.h b/proton-c/include/proton/transport.h
index 33bb3a5..2262e7c 100644
--- a/proton-c/include/proton/transport.h
+++ b/proton-c/include/proton/transport.h
@@ -209,6 +209,19 @@ PN_EXTERN void pn_transport_log(pn_transport_t *transport, const char *message);
  *
  * @param[in] transport a transport object
  * @param[in] fmt the printf formatted message to be logged
+ * @param[in] ap a vector containing the format arguments
+ */
+PN_EXTERN void pn_transport_vlogf(pn_transport_t *transport, const char *fmt, va_list ap);
+
+/**
+ * Log a printf formatted message using a transport's logging
+ * mechanism.
+ *
+ * This can be useful in a debugging context as the log message will
+ * be prefixed with the transport's identifier.
+ *
+ * @param[in] transport a transport object
+ * @param[in] fmt the printf formatted message to be logged
  */
 PN_EXTERN void pn_transport_logf(pn_transport_t *transport, const char *fmt, ...);
 

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/a5d65452/proton-c/src/engine/engine-internal.h
----------------------------------------------------------------------
diff --git a/proton-c/src/engine/engine-internal.h b/proton-c/src/engine/engine-internal.h
index 97f7ead..dd4c44e 100644
--- a/proton-c/src/engine/engine-internal.h
+++ b/proton-c/src/engine/engine-internal.h
@@ -176,8 +176,7 @@ struct pn_transport_t {
   bool tail_closed;      // input stream closed by driver
   bool head_closed;
   bool done_processing; // if true, don't call pn_process again
-  bool posted_head_closed;
-  bool posted_tail_closed;
+  bool posted_idle_timeout;
 };
 
 struct pn_connection_t {
@@ -319,7 +318,4 @@ int pn_do_error(pn_transport_t *transport, const char *condition, const char *fm
 void pn_session_unbound(pn_session_t* ssn);
 void pn_link_unbound(pn_link_t* link);
 
-void pni_close_tail(pn_transport_t *transport);
-
-
 #endif /* engine-internal.h */

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/a5d65452/proton-c/src/sasl/sasl.c
----------------------------------------------------------------------
diff --git a/proton-c/src/sasl/sasl.c b/proton-c/src/sasl/sasl.c
index f926b1b..2cc77c2 100644
--- a/proton-c/src/sasl/sasl.c
+++ b/proton-c/src/sasl/sasl.c
@@ -467,7 +467,14 @@ static ssize_t pn_output_write_sasl_header(pn_io_layer_t *io_layer, char *bytes,
 static ssize_t pn_output_write_sasl(pn_io_layer_t *io_layer, char *bytes, size_t size)
 {
   pn_sasl_t *sasl = (pn_sasl_t *)io_layer->context;
-  ssize_t n = pn_sasl_output(sasl, bytes, size);
+  // this accounts for pn_do_error is invoked, e.g. by idle timeout
+  ssize_t n;
+  if (sasl->transport->close_sent) {
+    n = PN_EOS;
+  } else {
+    n = pn_sasl_output(sasl, bytes, size);
+  }
+
   if (n == PN_EOS) {
     sasl->io_layer->process_output = pn_io_layer_output_passthru;
     pn_io_layer_t *io_next = sasl->io_layer->next;

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/a5d65452/proton-c/src/ssl/openssl.c
----------------------------------------------------------------------
diff --git a/proton-c/src/ssl/openssl.c b/proton-c/src/ssl/openssl.c
index c9536e2..ea2bd5b 100644
--- a/proton-c/src/ssl/openssl.c
+++ b/proton-c/src/ssl/openssl.c
@@ -149,11 +149,11 @@ static size_t buffered_output( pn_io_layer_t *io_layer );
 static size_t buffered_input( pn_io_layer_t *io_layer );
 
 // @todo: used to avoid littering the code with calls to printf...
-static void _log_error(const char *fmt, ...)
+static void _log_error(pn_ssl_t *ssl, const char *fmt, ...)
 {
   va_list ap;
   va_start(ap, fmt);
-  vfprintf(stderr, fmt, ap);
+  pn_transport_vlogf(ssl ? ssl->transport : NULL, fmt, ap);
   va_end(ap);
 }
 
@@ -163,27 +163,27 @@ static void _log(pn_ssl_t *ssl, const char *fmt, ...)
   if (PN_TRACE_DRV & ssl->trace) {
     va_list ap;
     va_start(ap, fmt);
-    vfprintf(stderr, fmt, ap);
+    pn_transport_vlogf(ssl->transport, fmt, ap);
     va_end(ap);
   }
 }
 
 // log an error and dump the SSL error stack
-static void _log_ssl_error( const char *fmt, ...)
+static void _log_ssl_error(pn_ssl_t *ssl, const char *fmt, ...)
 {
   char buf[128];        // see "man ERR_error_string_n()"
   va_list ap;
 
   if (fmt) {
     va_start(ap, fmt);
-    vfprintf(stderr, fmt, ap);
+    pn_transport_vlogf(ssl ? ssl->transport : NULL, fmt, ap);
     va_end(ap);
   }
 
   unsigned long err = ERR_get_error();
   while (err) {
     ERR_error_string_n(err, buf, sizeof(buf));
-    _log_error("%s\n", buf);
+    _log_error(ssl, "%s", buf);
     err = ERR_get_error();
   }
 }
@@ -211,8 +211,7 @@ static int ssl_failed(pn_ssl_t *ssl)
   if (ssl_err) {
     ERR_error_string_n( ssl_err, buf, sizeof(buf) );
   }
-  _log_ssl_error(NULL);    // spit out any remaining errors to the log file
-  pni_close_tail(ssl->transport);
+  _log_ssl_error(ssl, NULL);    // spit out any remaining errors to the log file
   pn_do_error(ssl->transport, "amqp:connection:framing-error", "SSL Failure: %s", buf);
   return PN_EOS;
 }
@@ -284,23 +283,23 @@ static int verify_callback(int preverify_ok, X509_STORE_CTX *ctx)
   X509 *cert = X509_STORE_CTX_get_current_cert(ctx);
   SSL *ssn = (SSL *) X509_STORE_CTX_get_ex_data(ctx, SSL_get_ex_data_X509_STORE_CTX_idx());
   if (!ssn) {
-    _log_error("Error: unexpected error - SSL session info not available for peer verify!\n");
+    _log_error(NULL, "Error: unexpected error - SSL session info not available for peer verify!");
     return 0;  // fail connection
   }
 
   pn_ssl_t *ssl = (pn_ssl_t *)SSL_get_ex_data(ssn, ssl_ex_data_index);
   if (!ssl) {
-    _log_error("Error: unexpected error - SSL context info not available for peer verify!\n");
+    _log_error(NULL, "Error: unexpected error - SSL context info not available for peer verify!");
     return 0;  // fail connection
   }
 
   if (ssl->domain->verify_mode != PN_SSL_VERIFY_PEER_NAME) return preverify_ok;
   if (!ssl->peer_hostname) {
-    _log_error("Error: configuration error: PN_SSL_VERIFY_PEER_NAME configured, but no peer hostname set!\n");
+    _log_error(ssl, "Error: configuration error: PN_SSL_VERIFY_PEER_NAME configured, but no peer hostname set!");
     return 0;  // fail connection
   }
 
-  _log( ssl, "Checking identifying name in peer cert against '%s'\n", ssl->peer_hostname);
+  _log( ssl, "Checking identifying name in peer cert against '%s'", ssl->peer_hostname);
 
   bool matched = false;
 
@@ -317,7 +316,7 @@ static int verify_callback(int preverify_ok, X509_STORE_CTX *ctx)
           unsigned char *str;
           int len = ASN1_STRING_to_UTF8( &str, asn1 );
           if (len >= 0) {
-            _log( ssl, "SubjectAltName (dns) from peer cert = '%.*s'\n", len, str );
+            _log( ssl, "SubjectAltName (dns) from peer cert = '%.*s'", len, str );
             matched = match_dns_pattern( ssl->peer_hostname, (const char *)str, len );
             OPENSSL_free( str );
           }
@@ -337,7 +336,7 @@ static int verify_callback(int preverify_ok, X509_STORE_CTX *ctx)
       unsigned char *str;
       int len = ASN1_STRING_to_UTF8( &str, name_asn1);
       if (len >= 0) {
-        _log( ssl, "commonName from peer cert = '%.*s'\n", len, str );
+        _log( ssl, "commonName from peer cert = '%.*s'", len, str );
         matched = match_dns_pattern( ssl->peer_hostname, (const char *)str, len );
         OPENSSL_free(str);
       }
@@ -345,14 +344,14 @@ static int verify_callback(int preverify_ok, X509_STORE_CTX *ctx)
   }
 
   if (!matched) {
-    _log( ssl, "Error: no name matching %s found in peer cert - rejecting handshake.\n",
+    _log( ssl, "Error: no name matching %s found in peer cert - rejecting handshake.",
           ssl->peer_hostname);
     preverify_ok = 0;
 #ifdef X509_V_ERR_APPLICATION_VERIFICATION
     X509_STORE_CTX_set_error( ctx, X509_V_ERR_APPLICATION_VERIFICATION );
 #endif
   } else {
-    _log( ssl, "Name from peer cert matched - peer is valid.\n" );
+    _log( ssl, "Name from peer cert matched - peer is valid." );
   }
   return preverify_ok;
 }
@@ -459,7 +458,7 @@ pn_ssl_domain_t *pn_ssl_domain( pn_ssl_mode_t mode )
   case PN_SSL_MODE_CLIENT:
     domain->ctx = SSL_CTX_new(SSLv23_client_method()); // and TLSv1+
     if (!domain->ctx) {
-      _log_ssl_error( "Unable to initialize OpenSSL context.\n");
+      _log_ssl_error(NULL, "Unable to initialize OpenSSL context.");
       free(domain);
       return NULL;
     }
@@ -468,14 +467,14 @@ pn_ssl_domain_t *pn_ssl_domain( pn_ssl_mode_t mode )
   case PN_SSL_MODE_SERVER:
     domain->ctx = SSL_CTX_new(SSLv23_server_method()); // and TLSv1+
     if (!domain->ctx) {
-      _log_ssl_error("Unable to initialize OpenSSL context.\n");
+      _log_ssl_error(NULL, "Unable to initialize OpenSSL context.");
       free(domain);
       return NULL;
     }
     break;
 
   default:
-    _log_error("Invalid value for pn_ssl_mode_t: %d\n", mode);
+    _log_error(NULL, "Invalid value for pn_ssl_mode_t: %d", mode);
     free(domain);
     return NULL;
   }
@@ -488,7 +487,7 @@ pn_ssl_domain_t *pn_ssl_domain( pn_ssl_mode_t mode )
 
   // by default, allow anonymous ciphers so certificates are not required 'out of the box'
   if (!SSL_CTX_set_cipher_list( domain->ctx, CIPHERS_ANONYMOUS )) {
-    _log_ssl_error("Failed to set cipher list to %s\n", CIPHERS_ANONYMOUS);
+    _log_ssl_error(NULL, "Failed to set cipher list to %s", CIPHERS_ANONYMOUS);
     pn_ssl_domain_free(domain);
     return NULL;
   }
@@ -537,7 +536,7 @@ int pn_ssl_domain_set_credentials( pn_ssl_domain_t *domain,
   if (!domain || !domain->ctx) return -1;
 
   if (SSL_CTX_use_certificate_chain_file(domain->ctx, certificate_file) != 1) {
-    _log_ssl_error( "SSL_CTX_use_certificate_chain_file( %s ) failed\n", certificate_file);
+    _log_ssl_error(NULL, "SSL_CTX_use_certificate_chain_file( %s ) failed", certificate_file);
     return -3;
   }
 
@@ -548,12 +547,12 @@ int pn_ssl_domain_set_credentials( pn_ssl_domain_t *domain,
   }
 
   if (SSL_CTX_use_PrivateKey_file(domain->ctx, private_key_file, SSL_FILETYPE_PEM) != 1) {
-    _log_ssl_error( "SSL_CTX_use_PrivateKey_file( %s ) failed\n", private_key_file);
+    _log_ssl_error(NULL, "SSL_CTX_use_PrivateKey_file( %s ) failed", private_key_file);
     return -4;
   }
 
   if (SSL_CTX_check_private_key(domain->ctx) != 1) {
-    _log_ssl_error( "The key file %s is not consistent with the certificate %s\n",
+    _log_ssl_error(NULL, "The key file %s is not consistent with the certificate %s",
                    private_key_file, certificate_file);
     return -5;
   }
@@ -564,7 +563,7 @@ int pn_ssl_domain_set_credentials( pn_ssl_domain_t *domain,
   // cipher was negotiated.  TLSv1 will reject such a request.  Hack: once a cert is
   // configured, allow only authenticated ciphers.
   if (!SSL_CTX_set_cipher_list( domain->ctx, CIPHERS_AUTHENTICATE )) {
-      _log_ssl_error( "Failed to set cipher list to %s\n", CIPHERS_AUTHENTICATE);
+      _log_ssl_error(NULL, "Failed to set cipher list to %s", CIPHERS_AUTHENTICATE);
       return -6;
   }
 
@@ -581,7 +580,7 @@ int pn_ssl_domain_set_trusted_ca_db(pn_ssl_domain_t *domain,
   // to SSL_CTX_load_verify_locations()
   struct stat sbuf;
   if (stat( certificate_db, &sbuf ) != 0) {
-    _log_error("stat(%s) failed: %s\n", certificate_db, strerror(errno));
+    _log_error(NULL, "stat(%s) failed: %s", certificate_db, strerror(errno));
     return -1;
   }
 
@@ -596,7 +595,7 @@ int pn_ssl_domain_set_trusted_ca_db(pn_ssl_domain_t *domain,
   }
 
   if (SSL_CTX_load_verify_locations( domain->ctx, file, dir ) != 1) {
-    _log_ssl_error( "SSL_CTX_load_verify_locations( %s ) failed\n", certificate_db);
+    _log_ssl_error(NULL, "SSL_CTX_load_verify_locations( %s ) failed", certificate_db);
     return -1;
   }
 
@@ -617,8 +616,8 @@ int pn_ssl_domain_set_peer_authentication(pn_ssl_domain_t *domain,
   case PN_SSL_VERIFY_PEER_NAME:
 
     if (!domain->has_ca_db) {
-      _log_error("Error: cannot verify peer without a trusted CA configured.\n"
-                 "       Use pn_ssl_domain_set_trusted_ca_db()\n");
+      _log_error(NULL, "Error: cannot verify peer without a trusted CA configured.\n"
+                 "       Use pn_ssl_domain_set_trusted_ca_db()");
       return -1;
     }
 
@@ -626,12 +625,12 @@ int pn_ssl_domain_set_peer_authentication(pn_ssl_domain_t *domain,
       // openssl requires that server connections supply a list of trusted CAs which is
       // sent to the client
       if (!trusted_CAs) {
-        _log_error("Error: a list of trusted CAs must be provided.\n");
+        _log_error(NULL, "Error: a list of trusted CAs must be provided.");
         return -1;
       }
       if (!domain->has_certificate) {
-      _log_error("Error: Server cannot verify peer without configuring a certificate.\n"
-                 "       Use pn_ssl_domain_set_credentials()\n");
+        _log_error(NULL, "Error: Server cannot verify peer without configuring a certificate.\n"
+                   "       Use pn_ssl_domain_set_credentials()");
       }
 
       if (domain->trusted_CAs) free(domain->trusted_CAs);
@@ -641,7 +640,7 @@ int pn_ssl_domain_set_peer_authentication(pn_ssl_domain_t *domain,
       if (cert_names != NULL)
         SSL_CTX_set_client_CA_list(domain->ctx, cert_names);
       else {
-        _log_error("Error: Unable to process file of trusted CAs: %s\n", trusted_CAs);
+        _log_error(NULL, "Error: Unable to process file of trusted CAs: %s", trusted_CAs);
         return -1;
       }
     }
@@ -658,7 +657,7 @@ int pn_ssl_domain_set_peer_authentication(pn_ssl_domain_t *domain,
     break;
 
   default:
-    _log_error( "Invalid peer authentication mode given.\n" );
+    _log_error(NULL, "Invalid peer authentication mode given." );
     return -1;
   }
 
@@ -692,7 +691,7 @@ int pn_ssl_domain_allow_unsecured_client(pn_ssl_domain_t *domain)
 {
   if (!domain) return -1;
   if (domain->mode != PN_SSL_MODE_SERVER) {
-    _log_error("Cannot permit unsecured clients - not a server.\n");
+    _log_error(NULL, "Cannot permit unsecured clients - not a server.");
     return -1;
   }
   domain->allow_unsecured = true;
@@ -734,7 +733,7 @@ bool pn_ssl_get_protocol_name(pn_ssl_t *ssl, char *buffer, size_t size )
 void pn_ssl_free( pn_ssl_t *ssl)
 {
   if (!ssl) return;
-  _log( ssl, "SSL socket freed.\n" );
+  _log( ssl, "SSL socket freed." );
   release_ssl_socket( ssl );
   if (ssl->domain) pn_ssl_domain_free(ssl->domain);
   if (ssl->session_id) free((void *)ssl->session_id);
@@ -796,7 +795,7 @@ static int keyfile_pw_cb(char *buf, int size, int rwflag, void *userdata)
 static int start_ssl_shutdown( pn_ssl_t *ssl )
 {
   if (!ssl->ssl_shutdown) {
-    _log(ssl, "Shutting down SSL connection...\n");
+    _log(ssl, "Shutting down SSL connection...");
     if (ssl->session_id) {
       // save the negotiated credentials before we close the connection
       pn_ssl_session_t *ssn = (pn_ssl_session_t *)calloc( 1, sizeof(pn_ssl_session_t));
@@ -804,7 +803,7 @@ static int start_ssl_shutdown( pn_ssl_t *ssl )
         ssn->id = pn_strdup( ssl->session_id );
         ssn->session = SSL_get1_session( ssl->ssl );
         if (ssn->session) {
-          _log( ssl, "Saving SSL session as %s\n", ssl->session_id );
+          _log( ssl, "Saving SSL session as %s", ssl->session_id );
           LL_ADD( ssl->domain, ssn_cache, ssn );
         } else {
           ssl_session_free( ssn );
@@ -821,7 +820,7 @@ static int start_ssl_shutdown( pn_ssl_t *ssl )
 
 static int setup_ssl_connection( pn_ssl_t *ssl )
 {
-  _log( ssl, "SSL connection detected.\n");
+  _log( ssl, "SSL connection detected.");
   ssl->io_layer->process_input = process_input_ssl;
   ssl->io_layer->process_output = process_output_ssl;
   return 0;
@@ -837,7 +836,7 @@ static ssize_t process_input_ssl( pn_io_layer_t *io_layer, const char *input_dat
   pn_ssl_t *ssl = (pn_ssl_t *)io_layer->context;
   if (ssl->ssl == NULL && init_ssl_socket(ssl)) return PN_EOS;
 
-  _log( ssl, "process_input_ssl( data size=%d )\n",available );
+  _log( ssl, "process_input_ssl( data size=%d )",available );
 
   ssize_t consumed = 0;
   bool work_pending;
@@ -856,12 +855,12 @@ static ssize_t process_input_ssl( pn_io_layer_t *io_layer, const char *input_dat
         consumed += written;
         ssl->read_blocked = false;
         work_pending = (available > 0);
-        _log( ssl, "Wrote %d bytes to BIO Layer, %d left over\n", written, available );
+        _log( ssl, "Wrote %d bytes to BIO Layer, %d left over", written, available );
       }
     } else if (shutdown_input) {
       // lower layer (caller) has closed.  Close the WRITE side of the BIO.  This will cause
       // an EOF to be passed to SSL once all pending inbound data has been consumed.
-      _log( ssl, "Lower layer closed - shutting down BIO write side\n");
+      _log( ssl, "Lower layer closed - shutting down BIO write side");
       (void)BIO_shutdown_wr( ssl->bio_net_io );
       shutdown_input = false;
     }
@@ -871,7 +870,7 @@ static ssize_t process_input_ssl( pn_io_layer_t *io_layer, const char *input_dat
     if (!ssl->ssl_closed && ssl->in_count < ssl->in_size) {
       int read = BIO_read( ssl->bio_ssl, &ssl->inbuf[ssl->in_count], ssl->in_size - ssl->in_count );
       if (read > 0) {
-        _log( ssl, "Read %d bytes from SSL socket for app\n", read );
+        _log( ssl, "Read %d bytes from SSL socket for app", read );
         _log_clear_data( ssl, &ssl->inbuf[ssl->in_count], read );
         ssl->in_count += read;
         work_pending = true;
@@ -881,7 +880,7 @@ static ssize_t process_input_ssl( pn_io_layer_t *io_layer, const char *input_dat
           switch (reason) {
           case SSL_ERROR_ZERO_RETURN:
             // SSL closed cleanly
-            _log(ssl, "SSL connection has closed\n");
+            _log(ssl, "SSL connection has closed");
             start_ssl_shutdown(ssl);  // KAG: not sure - this may not be necessary
             ssl->ssl_closed = true;
             break;
@@ -892,11 +891,11 @@ static ssize_t process_input_ssl( pn_io_layer_t *io_layer, const char *input_dat
         } else {
           if (BIO_should_write( ssl->bio_ssl )) {
             ssl->write_blocked = true;
-            _log(ssl, "Detected write-blocked\n");
+            _log(ssl, "Detected write-blocked");
           }
           if (BIO_should_read( ssl->bio_ssl )) {
             ssl->read_blocked = true;
-            _log(ssl, "Detected read-blocked\n");
+            _log(ssl, "Detected read-blocked");
           }
         }
       }
@@ -913,9 +912,9 @@ static ssize_t process_input_ssl( pn_io_layer_t *io_layer, const char *input_dat
           if (ssl->in_count)
             memmove( ssl->inbuf, ssl->inbuf + consumed, ssl->in_count );
           work_pending = true;
-          _log( ssl, "Application consumed %d bytes from peer\n", (int) consumed );
+          _log( ssl, "Application consumed %d bytes from peer", (int) consumed );
         } else if (consumed < 0) {
-          _log(ssl, "Application layer closed its input, error=%d (discarding %d bytes)\n",
+          _log(ssl, "Application layer closed its input, error=%d (discarding %d bytes)",
                (int) consumed, (int)ssl->in_count);
           ssl->in_count = 0;    // discard any pending input
           ssl->app_input_closed = consumed;
@@ -945,7 +944,7 @@ static ssize_t process_input_ssl( pn_io_layer_t *io_layer, const char *input_dat
               // the application _must_ have enough data to process.  If
               // this is an oversized frame, the app _must_ handle it
               // by returning an error code to SSL.
-              _log_error("Error: application unable to consume input.\n");
+              _log_error(ssl, "Error: application unable to consume input.");
             }
           }
         }
@@ -954,7 +953,7 @@ static ssize_t process_input_ssl( pn_io_layer_t *io_layer, const char *input_dat
 
   } while (work_pending);
 
-  //_log(ssl, "ssl_closed=%d in_count=%d app_input_closed=%d app_output_closed=%d\n",
+  //_log(ssl, "ssl_closed=%d in_count=%d app_input_closed=%d app_output_closed=%d",
   //     ssl->ssl_closed, ssl->in_count, ssl->app_input_closed, ssl->app_output_closed );
 
   // PROTON-82: Instead, close the input side as soon as we've completed enough of the SSL
@@ -971,7 +970,7 @@ static ssize_t process_input_ssl( pn_io_layer_t *io_layer, const char *input_dat
     consumed = ssl->app_input_closed;
     ssl->io_layer->process_input = process_input_done;
   }
-  _log(ssl, "process_input_ssl() returning %d\n", (int) consumed);
+  _log(ssl, "process_input_ssl() returning %d", (int) consumed);
   return consumed;
 }
 
@@ -994,10 +993,10 @@ static ssize_t process_output_ssl( pn_io_layer_t *io_layer, char *buffer, size_t
       if (app_bytes > 0) {
         ssl->out_count += app_bytes;
         work_pending = true;
-        _log( ssl, "Gathered %d bytes from app to send to peer\n", app_bytes );
+        _log( ssl, "Gathered %d bytes from app to send to peer", app_bytes );
       } else {
         if (app_bytes < 0) {
-          _log(ssl, "Application layer closed its output, error=%d (%d bytes pending send)\n",
+          _log(ssl, "Application layer closed its output, error=%d (%d bytes pending send)",
                (int) app_bytes, (int) ssl->out_count);
           ssl->app_output_closed = app_bytes;
         }
@@ -1014,14 +1013,14 @@ static ssize_t process_output_ssl( pn_io_layer_t *io_layer, char *buffer, size_t
           data += wrote;
           ssl->out_count -= wrote;
           work_pending = true;
-          _log( ssl, "Wrote %d bytes from app to socket\n", wrote );
+          _log( ssl, "Wrote %d bytes from app to socket", wrote );
         } else {
           if (!BIO_should_retry(ssl->bio_ssl)) {
             int reason = SSL_get_error( ssl->ssl, wrote );
             switch (reason) {
             case SSL_ERROR_ZERO_RETURN:
               // SSL closed cleanly
-              _log(ssl, "SSL connection has closed\n");
+              _log(ssl, "SSL connection has closed");
               start_ssl_shutdown(ssl); // KAG: not sure - this may not be necessary
               ssl->out_count = 0;      // can no longer write to socket, so erase app output data
               ssl->ssl_closed = true;
@@ -1033,11 +1032,11 @@ static ssize_t process_output_ssl( pn_io_layer_t *io_layer, char *buffer, size_t
           } else {
             if (BIO_should_read( ssl->bio_ssl )) {
               ssl->read_blocked = true;
-              _log(ssl, "Detected read-blocked\n");
+              _log(ssl, "Detected read-blocked");
             }
             if (BIO_should_write( ssl->bio_ssl )) {
               ssl->write_blocked = true;
-              _log(ssl, "Detected write-blocked\n");
+              _log(ssl, "Detected write-blocked");
             }
           }
         }
@@ -1063,13 +1062,13 @@ static ssize_t process_output_ssl( pn_io_layer_t *io_layer, char *buffer, size_t
         written += available;
         ssl->write_blocked = false;
         work_pending = work_pending || max_len > 0;
-        _log( ssl, "Read %d bytes from BIO Layer\n", available );
+        _log( ssl, "Read %d bytes from BIO Layer", available );
       }
     }
 
   } while (work_pending);
 
-  //_log(ssl, "written=%d ssl_closed=%d in_count=%d app_input_closed=%d app_output_closed=%d bio_pend=%d\n",
+  //_log(ssl, "written=%d ssl_closed=%d in_count=%d app_input_closed=%d app_output_closed=%d bio_pend=%d",
   //     written, ssl->ssl_closed, ssl->in_count, ssl->app_input_closed, ssl->app_output_closed, BIO_pending(ssl->bio_net_io) );
 
   // PROTON-82: close the output side as soon as we've sent the SSL close_notify.
@@ -1084,7 +1083,7 @@ static ssize_t process_output_ssl( pn_io_layer_t *io_layer, char *buffer, size_t
     written = ssl->app_output_closed ? ssl->app_output_closed : PN_EOS;
     ssl->io_layer->process_output = process_output_done;
   }
-  _log(ssl, "process_output_ssl() returning %d\n", (int) written);
+  _log(ssl, "process_output_ssl() returning %d", (int) written);
   return written;
 }
 
@@ -1095,7 +1094,7 @@ static int init_ssl_socket( pn_ssl_t *ssl )
 
   ssl->ssl = SSL_new(ssl->domain->ctx);
   if (!ssl->ssl) {
-    _log_error( "SSL socket setup failure.\n" );
+    _log_error(ssl, "SSL socket setup failure." );
     return -1;
   }
 
@@ -1112,10 +1111,10 @@ static int init_ssl_socket( pn_ssl_t *ssl )
   if (ssl->session_id) {
     pn_ssl_session_t *ssn = ssn_cache_find( ssl->domain, ssl->session_id );
     if (ssn) {
-      _log( ssl, "Restoring previous session id=%s\n", ssn->id );
+      _log( ssl, "Restoring previous session id=%s", ssn->id );
       int rc = SSL_set_session( ssl->ssl, ssn->session );
       if (rc != 1) {
-        _log( ssl, "Session restore failed, id=%s\n", ssn->id );
+        _log( ssl, "Session restore failed, id=%s", ssn->id );
       }
       LL_REMOVE( ssl->domain, ssn_cache, ssn );
       ssl_session_free( ssn );
@@ -1125,14 +1124,14 @@ static int init_ssl_socket( pn_ssl_t *ssl )
   // now layer a BIO over the SSL socket
   ssl->bio_ssl = BIO_new(BIO_f_ssl());
   if (!ssl->bio_ssl) {
-    _log_error( "BIO setup failure.\n" );
+    _log_error(ssl, "BIO setup failure." );
     return -1;
   }
   (void)BIO_set_ssl(ssl->bio_ssl, ssl->ssl, BIO_NOCLOSE);
 
   // create the "lower" BIO "pipe", and attach it below the SSL layer
   if (!BIO_new_bio_pair(&ssl->bio_ssl_io, 0, &ssl->bio_net_io, 0)) {
-    _log_error( "BIO setup failure.\n" );
+    _log_error(ssl, "BIO setup failure." );
     return -1;
   }
   SSL_set_bio(ssl->ssl, ssl->bio_ssl_io, ssl->bio_ssl_io);
@@ -1140,11 +1139,11 @@ static int init_ssl_socket( pn_ssl_t *ssl )
   if (ssl->domain->mode == PN_SSL_MODE_SERVER) {
     SSL_set_accept_state(ssl->ssl);
     BIO_set_ssl_mode(ssl->bio_ssl, 0);  // server mode
-    _log( ssl, "Server SSL socket created.\n" );
+    _log( ssl, "Server SSL socket created." );
   } else {      // client mode
     SSL_set_connect_state(ssl->ssl);
     BIO_set_ssl_mode(ssl->bio_ssl, 1);  // client mode
-    _log( ssl, "Client SSL socket created.\n" );
+    _log( ssl, "Client SSL socket created." );
   }
   return 0;
 }
@@ -1167,7 +1166,7 @@ static void release_ssl_socket( pn_ssl_t *ssl )
 
 static int setup_cleartext_connection( pn_ssl_t *ssl )
 {
-  _log( ssl, "Cleartext connection detected.\n");
+  _log( ssl, "Cleartext connection detected.");
   ssl->io_layer->process_input = pn_io_layer_input_passthru;
   ssl->io_layer->process_output = pn_io_layer_output_passthru;
   return 0;

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/a5d65452/proton-c/src/transport/transport.c
----------------------------------------------------------------------
diff --git a/proton-c/src/transport/transport.c b/proton-c/src/transport/transport.c
index d91b55a..601d6a2 100644
--- a/proton-c/src/transport/transport.c
+++ b/proton-c/src/transport/transport.c
@@ -177,8 +177,7 @@ static void pn_transport_initialize(void *object)
 
   transport->done_processing = false;
 
-  transport->posted_head_closed = false;
-  transport->posted_tail_closed = false;
+  transport->posted_idle_timeout = false;
 }
 
 pn_session_t *pn_channel_state(pn_transport_t *transport, uint16_t channel)
@@ -457,6 +456,24 @@ static pn_collector_t *pni_transport_collector(pn_transport_t *transport)
   }
 }
 
+static void pni_maybe_post_closed(pn_transport_t *transport)
+{
+  pn_collector_t *collector = pni_transport_collector(transport);
+  if (transport->head_closed && transport->tail_closed) {
+    pn_collector_put(collector, PN_OBJECT, transport, PN_TRANSPORT_CLOSED);
+  }
+}
+
+static void pni_close_tail(pn_transport_t *transport)
+{
+  if (!transport->tail_closed) {
+    transport->tail_closed = true;
+    pn_collector_t *collector = pni_transport_collector(transport);
+    pn_collector_put(collector, PN_OBJECT, transport, PN_TRANSPORT_TAIL_CLOSED);
+    pni_maybe_post_closed(transport);
+  }
+}
+
 int pn_do_error(pn_transport_t *transport, const char *condition, const char *fmt, ...)
 {
   va_list ap;
@@ -479,6 +496,8 @@ int pn_do_error(pn_transport_t *transport, const char *condition, const char *fm
   pn_collector_t *collector = pni_transport_collector(transport);
   pn_collector_put(collector, PN_OBJECT, transport, PN_TRANSPORT_ERROR);
   pn_transport_logf(transport, "ERROR %s %s", condition, buf);
+  transport->done_processing = true;
+  pni_close_tail(transport);
   return PN_ERR;
 }
 
@@ -1050,14 +1069,6 @@ ssize_t pn_transport_input(pn_transport_t *transport, const char *bytes, size_t
   return original - available;
 }
 
-static void pni_maybe_post_closed(pn_transport_t *transport)
-{
-  pn_collector_t *collector = pni_transport_collector(transport);
-  if (transport->posted_head_closed && transport->posted_tail_closed) {
-    pn_collector_put(collector, PN_OBJECT, transport, PN_TRANSPORT_CLOSED);
-  }
-}
-
 // process pending input until none remaining or EOS
 static ssize_t transport_consume(pn_transport_t *transport)
 {
@@ -1079,12 +1090,6 @@ static ssize_t transport_consume(pn_transport_t *transport)
       if (transport->disp->trace & (PN_TRACE_RAW | PN_TRACE_FRM))
         pn_transport_log(transport, "  <- EOS");
       transport->input_pending = 0;  // XXX ???
-      if (!transport->posted_tail_closed) {
-        pn_collector_t *collector = pni_transport_collector(transport);
-        pn_collector_put(collector, PN_OBJECT, transport, PN_TRANSPORT_TAIL_CLOSED);
-        transport->posted_tail_closed = true;
-        pni_maybe_post_closed(transport);
-      }
       return n;
     }
   }
@@ -1171,8 +1176,11 @@ static pn_timestamp_t pn_tick_amqp(pn_io_layer_t *io_layer, pn_timestamp_t now)
       transport->last_bytes_input = transport->bytes_input;
     } else if (transport->dead_remote_deadline <= now) {
       transport->dead_remote_deadline = now + transport->local_idle_timeout;
-      // Note: AMQP-1.0 really should define a generic "timeout" error, but does not.
-      pn_do_error(transport, "amqp:resource-limit-exceeded", "local-idle-timeout expired");
+      if (!transport->posted_idle_timeout) {
+        transport->posted_idle_timeout = true;
+        // Note: AMQP-1.0 really should define a generic "timeout" error, but does not.
+        pn_do_error(transport, "amqp:resource-limit-exceeded", "local-idle-timeout expired");
+      }
     }
     timeout = transport->dead_remote_deadline;
   }
@@ -1861,9 +1869,21 @@ static ssize_t pn_output_write_amqp(pn_io_layer_t *io_layer, char *bytes, size_t
   return pn_dispatcher_output(transport->disp, bytes, size);
 }
 
+static void pni_close_head(pn_transport_t *transport)
+{
+  if (!transport->head_closed) {
+    transport->head_closed = true;
+    pn_collector_t *collector = pni_transport_collector(transport);
+    pn_collector_put(collector, PN_OBJECT, transport, PN_TRANSPORT_HEAD_CLOSED);
+    pni_maybe_post_closed(transport);
+  }
+}
+
 // generate outbound data, return amount of pending output else error
 static ssize_t transport_produce(pn_transport_t *transport)
 {
+  if (transport->head_closed) return PN_EOS;
+
   pn_io_layer_t *io_layer = transport->io_layers;
   ssize_t space = transport->output_size - transport->output_pending;
 
@@ -1900,13 +1920,12 @@ static ssize_t transport_produce(pn_transport_t *transport)
         if (n < 0) {
           pn_transport_log(transport, "  -> EOS");
         }
-        /*else
-          pn_transport_logf(transport, "  -> EOS (%" PN_ZI ") %s", n,
-          pn_error_text(transport->error));*/
       }
+      pni_close_head(transport);
       return n;
     }
   }
+
   return transport->output_pending;
 }
 
@@ -1963,15 +1982,24 @@ void pn_transport_log(pn_transport_t *transport, const char *message)
   transport->tracer(transport, message);
 }
 
+void pn_transport_vlogf(pn_transport_t *transport, const char *fmt, va_list ap)
+{
+  if (transport) {
+    pn_string_vformat(transport->scratch, fmt, ap);
+    pn_transport_log(transport, pn_string_get(transport->scratch));
+  } else {
+    vfprintf(stderr, fmt, ap);
+    fprintf(stderr, "\n");
+  }
+}
+
 void pn_transport_logf(pn_transport_t *transport, const char *fmt, ...)
 {
   va_list ap;
 
   va_start(ap, fmt);
-  pn_string_vformat(transport->scratch, fmt, ap);
+  pn_transport_vlogf(transport, fmt, ap);
   va_end(ap);
-
-  pn_transport_log(transport, pn_string_get(transport->scratch));
 }
 
 uint16_t pn_transport_get_channel_max(pn_transport_t *transport)
@@ -2132,13 +2160,6 @@ ssize_t pn_transport_push(pn_transport_t *transport, const char *src, size_t siz
   }
 }
 
-void pni_close_tail(pn_transport_t *transport)
-{
-  if (!transport->tail_closed) {
-    transport->tail_closed = true;
-  }
-}
-
 int pn_transport_process(pn_transport_t *transport, size_t size)
 {
   assert(transport);
@@ -2168,7 +2189,6 @@ int pn_transport_close_tail(pn_transport_t *transport)
 ssize_t pn_transport_pending(pn_transport_t *transport)      /* <0 == done */
 {
   assert(transport);
-  if (transport->head_closed) return PN_EOS;
   return transport_produce( transport );
 }
 
@@ -2211,12 +2231,8 @@ void pn_transport_pop(pn_transport_t *transport, size_t size)
                transport->output_pending );
     }
 
-    if (!transport->output_pending && pn_transport_pending(transport) < 0 &&
-        !transport->posted_head_closed) {
-      pn_collector_t *collector = pni_transport_collector(transport);
-      pn_collector_put(collector, PN_OBJECT, transport, PN_TRANSPORT_HEAD_CLOSED);
-      transport->posted_head_closed = true;
-      pni_maybe_post_closed(transport);
+    if (!transport->output_pending && pn_transport_pending(transport) < 0) {
+      pni_close_head(transport);
     }
   }
 }
@@ -2224,7 +2240,7 @@ void pn_transport_pop(pn_transport_t *transport, size_t size)
 int pn_transport_close_head(pn_transport_t *transport)
 {
   size_t pending = pn_transport_pending(transport);
-  transport->head_closed = true;
+  pni_close_head(transport);
   pn_transport_pop(transport, pending);
   return 0;
 }

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/a5d65452/proton-c/src/windows/schannel.c
----------------------------------------------------------------------
diff --git a/proton-c/src/windows/schannel.c b/proton-c/src/windows/schannel.c
index 373dc51..abf4b85 100644
--- a/proton-c/src/windows/schannel.c
+++ b/proton-c/src/windows/schannel.c
@@ -222,7 +222,6 @@ static int ssl_failed(pn_ssl_t *ssl, const char *reason)
   ssl->ssl_closed = true;
   ssl->app_input_closed = ssl->app_output_closed = PN_EOS;
   ssl->state = SSL_CLOSED;
-  pni_close_tail(ssl->transport);
   pn_do_error(ssl->transport, "amqp:connection:framing-error", "SSL Failure: %s", reason);
   return PN_EOS;
 }

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/a5d65452/tests/python/proton_tests/engine.py
----------------------------------------------------------------------
diff --git a/tests/python/proton_tests/engine.py b/tests/python/proton_tests/engine.py
index eec73d0..d17a57c 100644
--- a/tests/python/proton_tests/engine.py
+++ b/tests/python/proton_tests/engine.py
@@ -2413,3 +2413,30 @@ class TeardownLeakTest(PeerTest):
 
   def testLeak(self):
     self.doLeak(False, False)
+
+class IdleTimeoutEventTest(PeerTest):
+
+  def half_pump(self):
+    p = self.transport.pending()
+    self.transport.pop(p)
+
+  def testTimeoutWithZombieServer(self):
+    self.transport.idle_timeout = self.delay
+    self.connection.open()
+    self.half_pump()
+    self.transport.tick(time())
+    sleep(self.delay*2)
+    self.transport.tick(time())
+    self.expect(Event.CONNECTION_INIT, Event.CONNECTION_BOUND,
+                Event.CONNECTION_LOCAL_OPEN, Event.TRANSPORT,
+                Event.TRANSPORT_ERROR, Event.TRANSPORT_TAIL_CLOSED)
+    assert self.transport.capacity() < 0
+    assert self.transport.pending() > 0
+    self.half_pump()
+    self.expect(Event.TRANSPORT_HEAD_CLOSED, Event.TRANSPORT_CLOSED)
+    assert self.transport.pending() < 0
+
+  def testTimeoutWithZombieServerAndSASL(self):
+    sasl = self.transport.sasl()
+    sasl.client()
+    self.testTimeoutWithZombieServer()


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


[34/50] [abbrv] qpid-proton git commit: allow access to container hierarchy even when freed

Posted by gs...@apache.org.
allow access to container hierarchy even when freed

git-svn-id: https://svn.apache.org/repos/asf/qpid/proton/trunk@1636672 13f79535-47bb-0310-9956-ffa450edef68


Project: http://git-wip-us.apache.org/repos/asf/qpid-proton/repo
Commit: http://git-wip-us.apache.org/repos/asf/qpid-proton/commit/6e52724e
Tree: http://git-wip-us.apache.org/repos/asf/qpid-proton/tree/6e52724e
Diff: http://git-wip-us.apache.org/repos/asf/qpid-proton/diff/6e52724e

Branch: refs/heads/examples
Commit: 6e52724e32cf195378946b4ff631fb2a30194b50
Parents: 15c9e9e
Author: Rafael H. Schloming <rh...@apache.org>
Authored: Tue Nov 4 18:18:13 2014 +0000
Committer: Rafael H. Schloming <rh...@apache.org>
Committed: Tue Nov 4 18:18:13 2014 +0000

----------------------------------------------------------------------
 proton-c/src/engine/engine.c | 9 +++------
 1 file changed, 3 insertions(+), 6 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/6e52724e/proton-c/src/engine/engine.c
----------------------------------------------------------------------
diff --git a/proton-c/src/engine/engine.c b/proton-c/src/engine/engine.c
index 494c2d9..1855f55 100644
--- a/proton-c/src/engine/engine.c
+++ b/proton-c/src/engine/engine.c
@@ -198,8 +198,7 @@ void pn_remove_session(pn_connection_t *conn, pn_session_t *ssn)
 pn_connection_t *pn_session_connection(pn_session_t *session)
 {
   if (!session) return NULL;
-  return session->connection->endpoint.freed
-    ? NULL : session->connection;
+  return session->connection;
 }
 
 void pn_session_open(pn_session_t *session)
@@ -1078,8 +1077,7 @@ bool pn_link_is_receiver(pn_link_t *link)
 pn_session_t *pn_link_session(pn_link_t *link)
 {
   assert(link);
-  return link->session->endpoint.freed
-      ? NULL : link->session;
+  return link->session;
 }
 
 static void pn_disposition_finalize(pn_disposition_t *ds)
@@ -1572,8 +1570,7 @@ bool pn_link_draining(pn_link_t *receiver)
 pn_link_t *pn_delivery_link(pn_delivery_t *delivery)
 {
   assert(delivery);
-  return delivery->link->endpoint.freed
-    ? NULL : delivery->link;
+  return delivery->link;
 }
 
 pn_disposition_t *pn_delivery_local(pn_delivery_t *delivery)


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


[08/50] [abbrv] qpid-proton git commit: added dispatch code to event class

Posted by gs...@apache.org.
added dispatch code to event class

git-svn-id: https://svn.apache.org/repos/asf/qpid/proton/trunk@1631543 13f79535-47bb-0310-9956-ffa450edef68


Project: http://git-wip-us.apache.org/repos/asf/qpid-proton/repo
Commit: http://git-wip-us.apache.org/repos/asf/qpid-proton/commit/2c89949f
Tree: http://git-wip-us.apache.org/repos/asf/qpid-proton/tree/2c89949f
Diff: http://git-wip-us.apache.org/repos/asf/qpid-proton/diff/2c89949f

Branch: refs/heads/examples
Commit: 2c89949fe8b226900c1630f73b64d61bbd2100b9
Parents: 4e7e432
Author: Rafael H. Schloming <rh...@apache.org>
Authored: Mon Oct 13 20:50:58 2014 +0000
Committer: Rafael H. Schloming <rh...@apache.org>
Committed: Mon Oct 13 20:50:58 2014 +0000

----------------------------------------------------------------------
 proton-c/bindings/python/proton.py              | 263 ++++++++++++-------
 .../apache/qpid/proton/engine/BaseHandler.java  |  67 +++++
 .../org/apache/qpid/proton/engine/Event.java    |   2 +
 .../org/apache/qpid/proton/engine/Handler.java  |  67 +++++
 .../qpid/proton/engine/impl/EventImpl.java      |  97 +++++++
 5 files changed, 406 insertions(+), 90 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/2c89949f/proton-c/bindings/python/proton.py
----------------------------------------------------------------------
diff --git a/proton-c/bindings/python/proton.py b/proton-c/bindings/python/proton.py
index 4d2f3e4..5bca26c 100644
--- a/proton-c/bindings/python/proton.py
+++ b/proton-c/bindings/python/proton.py
@@ -2911,6 +2911,10 @@ class Delivery(object):
       self._dlv = None
 
   @property
+  def released(self):
+    return self._dlv is None
+
+  @property
   def tag(self):
     return pn_delivery_tag(self._dlv)
 
@@ -3364,7 +3368,7 @@ class Collector:
 
     clazz = pn_class_name(pn_event_class(event))
     context = wrappers[clazz](pn_event_context(event))
-    return Event(clazz, context, pn_event_type(event))
+    return Event(clazz, context, EventType.TYPES[pn_event_type(event)])
 
   def pop(self):
     ev = self.peek()
@@ -3375,41 +3379,54 @@ class Collector:
   def __del__(self):
     pn_collector_free(self._impl)
 
+class EventType:
+
+  TYPES = {}
+
+  def __init__(self, number, method):
+    self.number = number
+    self.name = pn_event_type_name(self.number)
+    self.method = method
+    self.TYPES[number] = self
+
+  def __repr__(self):
+    return self.name
+
 class Event:
 
-  CONNECTION_INIT = PN_CONNECTION_INIT
-  CONNECTION_BOUND = PN_CONNECTION_BOUND
-  CONNECTION_UNBOUND = PN_CONNECTION_UNBOUND
-  CONNECTION_LOCAL_OPEN = PN_CONNECTION_LOCAL_OPEN
-  CONNECTION_LOCAL_CLOSE = PN_CONNECTION_LOCAL_CLOSE
-  CONNECTION_REMOTE_OPEN = PN_CONNECTION_REMOTE_OPEN
-  CONNECTION_REMOTE_CLOSE = PN_CONNECTION_REMOTE_CLOSE
-  CONNECTION_FINAL = PN_CONNECTION_FINAL
-
-  SESSION_INIT = PN_SESSION_INIT
-  SESSION_LOCAL_OPEN = PN_SESSION_LOCAL_OPEN
-  SESSION_LOCAL_CLOSE = PN_SESSION_LOCAL_CLOSE
-  SESSION_REMOTE_OPEN = PN_SESSION_REMOTE_OPEN
-  SESSION_REMOTE_CLOSE = PN_SESSION_REMOTE_CLOSE
-  SESSION_FINAL = PN_SESSION_FINAL
-
-  LINK_INIT = PN_LINK_INIT
-  LINK_LOCAL_OPEN = PN_LINK_LOCAL_OPEN
-  LINK_LOCAL_CLOSE = PN_LINK_LOCAL_CLOSE
-  LINK_LOCAL_DETACH = PN_LINK_LOCAL_DETACH
-  LINK_REMOTE_OPEN = PN_LINK_REMOTE_OPEN
-  LINK_REMOTE_CLOSE = PN_LINK_REMOTE_CLOSE
-  LINK_REMOTE_DETACH = PN_LINK_REMOTE_DETACH
-  LINK_FLOW = PN_LINK_FLOW
-  LINK_FINAL = PN_LINK_FINAL
-
-  DELIVERY = PN_DELIVERY
-
-  TRANSPORT = PN_TRANSPORT
-  TRANSPORT_ERROR = PN_TRANSPORT_ERROR
-  TRANSPORT_HEAD_CLOSED = PN_TRANSPORT_HEAD_CLOSED
-  TRANSPORT_TAIL_CLOSED = PN_TRANSPORT_TAIL_CLOSED
-  TRANSPORT_CLOSED = PN_TRANSPORT_CLOSED
+  CONNECTION_INIT = EventType(PN_CONNECTION_INIT, "on_connection_init")
+  CONNECTION_BOUND = EventType(PN_CONNECTION_BOUND, "on_connection_bound")
+  CONNECTION_UNBOUND = EventType(PN_CONNECTION_UNBOUND, "on_connection_unbound")
+  CONNECTION_LOCAL_OPEN = EventType(PN_CONNECTION_LOCAL_OPEN, "on_connection_local_open")
+  CONNECTION_LOCAL_CLOSE = EventType(PN_CONNECTION_LOCAL_CLOSE, "on_connection_local_close")
+  CONNECTION_REMOTE_OPEN = EventType(PN_CONNECTION_REMOTE_OPEN, "on_connection_remote_open")
+  CONNECTION_REMOTE_CLOSE = EventType(PN_CONNECTION_REMOTE_CLOSE, "on_connection_remote_close")
+  CONNECTION_FINAL = EventType(PN_CONNECTION_FINAL, "on_connection_final")
+
+  SESSION_INIT = EventType(PN_SESSION_INIT, "on_session_init")
+  SESSION_LOCAL_OPEN = EventType(PN_SESSION_LOCAL_OPEN, "on_session_local_open")
+  SESSION_LOCAL_CLOSE = EventType(PN_SESSION_LOCAL_CLOSE, "on_session_local_close")
+  SESSION_REMOTE_OPEN = EventType(PN_SESSION_REMOTE_OPEN, "on_session_remote_open")
+  SESSION_REMOTE_CLOSE = EventType(PN_SESSION_REMOTE_CLOSE, "on_session_remote_close")
+  SESSION_FINAL = EventType(PN_SESSION_FINAL, "on_session_final")
+
+  LINK_INIT = EventType(PN_LINK_INIT, "on_link_init")
+  LINK_LOCAL_OPEN = EventType(PN_LINK_LOCAL_OPEN, "on_link_local_open")
+  LINK_LOCAL_CLOSE = EventType(PN_LINK_LOCAL_CLOSE, "on_link_local_close")
+  LINK_LOCAL_DETACH = EventType(PN_LINK_LOCAL_DETACH, "on_link_local_detach")
+  LINK_REMOTE_OPEN = EventType(PN_LINK_REMOTE_OPEN, "on_link_remote_open")
+  LINK_REMOTE_CLOSE = EventType(PN_LINK_REMOTE_CLOSE, "on_link_remote_close")
+  LINK_REMOTE_DETACH = EventType(PN_LINK_REMOTE_DETACH, "on_link_remote_detach")
+  LINK_FLOW = EventType(PN_LINK_FLOW, "on_link_flow")
+  LINK_FINAL = EventType(PN_LINK_FINAL, "on_link_final")
+
+  DELIVERY = EventType(PN_DELIVERY, "on_delivery")
+
+  TRANSPORT = EventType(PN_TRANSPORT, "on_transport")
+  TRANSPORT_ERROR = EventType(PN_TRANSPORT_ERROR, "on_transport_error")
+  TRANSPORT_HEAD_CLOSED = EventType(PN_TRANSPORT_HEAD_CLOSED, "on_transport_head_closed")
+  TRANSPORT_TAIL_CLOSED = EventType(PN_TRANSPORT_TAIL_CLOSED, "on_transport_tail_closed")
+  TRANSPORT_CLOSED = EventType(PN_TRANSPORT_CLOSED, "on_transport_closed")
 
   def __init__(self, clazz, context, type):
     self.clazz = clazz
@@ -3422,8 +3439,73 @@ class Event:
       collector._contexts.remove(self.context)
       self.context._released()
 
+  def dispatch(self, handler):
+    getattr(handler, self.type.method, handler.on_unhandled)(self)
+
+  @property
+  def connection(self):
+    if self.clazz == "pn_connection":
+      return self.context
+    elif self.clazz == "pn_session":
+      return self.context.connection
+    elif self.clazz == "pn_link":
+      return self.context.connection
+    elif self.clazz == "pn_delivery" and not self.context.released:
+      return self.context.link.connection
+    else:
+      return None
+
+  @property
+  def session(self):
+    if self.clazz == "pn_session":
+      return self.context
+    elif self.clazz == "pn_link":
+      return self.context.session
+    elif self.clazz == "pn_delivery" and not self.context.released:
+      return self.context.link.session
+    else:
+      return None
+
+  @property
+  def link(self):
+    if self.clazz == "pn_link":
+      return self.context
+    elif self.clazz == "pn_delivery" and not self.context.released:
+      return self.context.link
+    else:
+      return None
+
+  @property
+  def sender(self):
+    l = self.link
+    if l and l.is_sender:
+      return l
+    else:
+      return None
+
+  @property
+  def receiver(self):
+    l = self.link
+    if l and l.is_receiver:
+      return l
+    else:
+      return None
+
+  @property
+  def delivery(self):
+    if self.clazz == "pn_delivery":
+      return self.context
+    else:
+      return None
+
   def __repr__(self):
-    return "%s(%s)" % (pn_event_type_name(self.type), self.context)
+    return "%s(%s)" % (self.type, self.context)
+
+class Handler:
+
+  def on_unhandled(self, event):
+    pass
+
 
 ###
 # Driver
@@ -3617,61 +3699,6 @@ class Driver(object):
   def pending_connector(self):
     return Connector._wrap_connector(pn_driver_connector(self._driver))
 
-__all__ = [
-           "API_LANGUAGE",
-           "IMPLEMENTATION_LANGUAGE",
-           "ABORTED",
-           "ACCEPTED",
-           "AUTOMATIC",
-           "PENDING",
-           "MANUAL",
-           "REJECTED",
-           "RELEASED",
-           "SETTLED",
-           "UNDESCRIBED",
-           "Array",
-           "Collector",
-           "Condition",
-           "Connection",
-           "Connector",
-           "Data",
-           "Delivery",
-           "Disposition",
-           "Described",
-           "Driver",
-           "DriverException",
-           "Endpoint",
-           "Event",
-           "Link",
-           "Listener",
-           "Message",
-           "MessageException",
-           "Messenger",
-           "MessengerException",
-           "ProtonException",
-           "VERSION_MAJOR",
-           "VERSION_MINOR",
-           "Receiver",
-           "SASL",
-           "Sender",
-           "Session",
-           "SSL",
-           "SSLDomain",
-           "SSLSessionDetails",
-           "SSLUnavailable",
-           "SSLException",
-           "Terminus",
-           "Timeout",
-           "Interrupt",
-           "Transport",
-           "TransportException",
-           "char",
-           "symbol",
-           "timestamp",
-           "ulong"
-           ]
-
-
 class Url(object):
   """
   Simple URL parser/constructor, handles URLs of the form:
@@ -3777,3 +3804,59 @@ class Url(object):
     self.host = self.host or '0.0.0.0'
     self.port = self.port or self.Port(self.scheme)
     return self
+
+__all__ = [
+           "API_LANGUAGE",
+           "IMPLEMENTATION_LANGUAGE",
+           "ABORTED",
+           "ACCEPTED",
+           "AUTOMATIC",
+           "PENDING",
+           "MANUAL",
+           "REJECTED",
+           "RELEASED",
+           "SETTLED",
+           "UNDESCRIBED",
+           "Array",
+           "Collector",
+           "Condition",
+           "Connection",
+           "Connector",
+           "Data",
+           "Delivery",
+           "Disposition",
+           "Described",
+           "Driver",
+           "DriverException",
+           "Endpoint",
+           "Event",
+           "Handler",
+           "Link",
+           "Listener",
+           "Message",
+           "MessageException",
+           "Messenger",
+           "MessengerException",
+           "ProtonException",
+           "VERSION_MAJOR",
+           "VERSION_MINOR",
+           "Receiver",
+           "SASL",
+           "Sender",
+           "Session",
+           "SSL",
+           "SSLDomain",
+           "SSLSessionDetails",
+           "SSLUnavailable",
+           "SSLException",
+           "Terminus",
+           "Timeout",
+           "Interrupt",
+           "Transport",
+           "TransportException",
+           "Url",
+           "char",
+           "symbol",
+           "timestamp",
+           "ulong"
+           ]

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/2c89949f/proton-j/src/main/java/org/apache/qpid/proton/engine/BaseHandler.java
----------------------------------------------------------------------
diff --git a/proton-j/src/main/java/org/apache/qpid/proton/engine/BaseHandler.java b/proton-j/src/main/java/org/apache/qpid/proton/engine/BaseHandler.java
new file mode 100644
index 0000000..94f4d12
--- /dev/null
+++ b/proton-j/src/main/java/org/apache/qpid/proton/engine/BaseHandler.java
@@ -0,0 +1,67 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.proton.engine;
+
+
+/**
+ * BaseHandler
+ *
+ */
+
+public class BaseHandler implements Handler
+{
+
+    @Override public void onConnectionInit(Event e) { onUnhandled(e); }
+    @Override public void onConnectionLocalOpen(Event e) { onUnhandled(e); }
+    @Override public void onConnectionRemoteOpen(Event e) { onUnhandled(e); }
+    @Override public void onConnectionLocalClose(Event e) { onUnhandled(e); }
+    @Override public void onConnectionRemoteClose(Event e) { onUnhandled(e); }
+    @Override public void onConnectionBound(Event e) { onUnhandled(e); }
+    @Override public void onConnectionUnbound(Event e) { onUnhandled(e); }
+    @Override public void onConnectionFinal(Event e) { onUnhandled(e); }
+
+    @Override public void onSessionInit(Event e) { onUnhandled(e); }
+    @Override public void onSessionLocalOpen(Event e) { onUnhandled(e); }
+    @Override public void onSessionRemoteOpen(Event e) { onUnhandled(e); }
+    @Override public void onSessionLocalClose(Event e) { onUnhandled(e); }
+    @Override public void onSessionRemoteClose(Event e) { onUnhandled(e); }
+    @Override public void onSessionFinal(Event e) { onUnhandled(e); }
+
+    @Override public void onLinkInit(Event e) { onUnhandled(e); }
+    @Override public void onLinkLocalOpen(Event e) { onUnhandled(e); }
+    @Override public void onLinkRemoteOpen(Event e) { onUnhandled(e); }
+    @Override public void onLinkLocalDetach(Event e) { onUnhandled(e); }
+    @Override public void onLinkRemoteDetach(Event e) { onUnhandled(e); }
+    @Override public void onLinkLocalClose(Event e) { onUnhandled(e); }
+    @Override public void onLinkRemoteClose(Event e) { onUnhandled(e); }
+    @Override public void onLinkFlow(Event e) { onUnhandled(e); }
+    @Override public void onLinkFinal(Event e) { onUnhandled(e); }
+
+    @Override public void onDelivery(Event e) { onUnhandled(e); }
+    @Override public void onTransport(Event e) { onUnhandled(e); }
+    @Override public void onTransportError(Event e) { onUnhandled(e); }
+    @Override public void onTransportHeadClosed(Event e) { onUnhandled(e); }
+    @Override public void onTransportTailClosed(Event e) { onUnhandled(e); }
+    @Override public void onTransportClosed(Event e) { onUnhandled(e); }
+
+    @Override public void onUnhandled(Event event) {}
+
+}

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/2c89949f/proton-j/src/main/java/org/apache/qpid/proton/engine/Event.java
----------------------------------------------------------------------
diff --git a/proton-j/src/main/java/org/apache/qpid/proton/engine/Event.java b/proton-j/src/main/java/org/apache/qpid/proton/engine/Event.java
index 3ffd414..3b299a6 100644
--- a/proton-j/src/main/java/org/apache/qpid/proton/engine/Event.java
+++ b/proton-j/src/main/java/org/apache/qpid/proton/engine/Event.java
@@ -69,6 +69,8 @@ public interface Event
 
     Object getContext();
 
+    void dispatch(Handler handler);
+
     Connection getConnection();
 
     Session getSession();

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/2c89949f/proton-j/src/main/java/org/apache/qpid/proton/engine/Handler.java
----------------------------------------------------------------------
diff --git a/proton-j/src/main/java/org/apache/qpid/proton/engine/Handler.java b/proton-j/src/main/java/org/apache/qpid/proton/engine/Handler.java
new file mode 100644
index 0000000..5ff77e0
--- /dev/null
+++ b/proton-j/src/main/java/org/apache/qpid/proton/engine/Handler.java
@@ -0,0 +1,67 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.proton.engine;
+
+
+/**
+ * Handler
+ *
+ */
+
+public interface Handler
+{
+
+    void onConnectionInit(Event e);
+    void onConnectionLocalOpen(Event e);
+    void onConnectionRemoteOpen(Event e);
+    void onConnectionLocalClose(Event e);
+    void onConnectionRemoteClose(Event e);
+    void onConnectionBound(Event e);
+    void onConnectionUnbound(Event e);
+    void onConnectionFinal(Event e);
+
+    void onSessionInit(Event e);
+    void onSessionLocalOpen(Event e);
+    void onSessionRemoteOpen(Event e);
+    void onSessionLocalClose(Event e);
+    void onSessionRemoteClose(Event e);
+    void onSessionFinal(Event e);
+
+    void onLinkInit(Event e);
+    void onLinkLocalOpen(Event e);
+    void onLinkRemoteOpen(Event e);
+    void onLinkLocalDetach(Event e);
+    void onLinkRemoteDetach(Event e);
+    void onLinkLocalClose(Event e);
+    void onLinkRemoteClose(Event e);
+    void onLinkFlow(Event e);
+    void onLinkFinal(Event e);
+
+    void onDelivery(Event e);
+    void onTransport(Event e);
+    void onTransportError(Event e);
+    void onTransportHeadClosed(Event e);
+    void onTransportTailClosed(Event e);
+    void onTransportClosed(Event e);
+
+    void onUnhandled(Event e);
+
+}

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/2c89949f/proton-j/src/main/java/org/apache/qpid/proton/engine/impl/EventImpl.java
----------------------------------------------------------------------
diff --git a/proton-j/src/main/java/org/apache/qpid/proton/engine/impl/EventImpl.java b/proton-j/src/main/java/org/apache/qpid/proton/engine/impl/EventImpl.java
index 60d6dfe..3317bf9 100644
--- a/proton-j/src/main/java/org/apache/qpid/proton/engine/impl/EventImpl.java
+++ b/proton-j/src/main/java/org/apache/qpid/proton/engine/impl/EventImpl.java
@@ -21,6 +21,7 @@
 package org.apache.qpid.proton.engine.impl;
 
 import org.apache.qpid.proton.engine.Event;
+import org.apache.qpid.proton.engine.Handler;
 import org.apache.qpid.proton.engine.Connection;
 import org.apache.qpid.proton.engine.Session;
 import org.apache.qpid.proton.engine.Link;
@@ -66,6 +67,102 @@ class EventImpl implements Event
         return context;
     }
 
+    public void dispatch(Handler handler)
+    {
+        switch (type) {
+        case CONNECTION_INIT:
+            handler.onConnectionInit(this);
+            break;
+        case CONNECTION_LOCAL_OPEN:
+            handler.onConnectionLocalOpen(this);
+            break;
+        case CONNECTION_REMOTE_OPEN:
+            handler.onConnectionRemoteOpen(this);
+            break;
+        case CONNECTION_LOCAL_CLOSE:
+            handler.onConnectionLocalClose(this);
+            break;
+        case CONNECTION_REMOTE_CLOSE:
+            handler.onConnectionRemoteClose(this);
+            break;
+        case CONNECTION_BOUND:
+            handler.onConnectionBound(this);
+            break;
+        case CONNECTION_UNBOUND:
+            handler.onConnectionUnbound(this);
+            break;
+        case CONNECTION_FINAL:
+            handler.onConnectionFinal(this);
+            break;
+        case SESSION_INIT:
+            handler.onSessionInit(this);
+            break;
+        case SESSION_LOCAL_OPEN:
+            handler.onSessionLocalOpen(this);
+            break;
+        case SESSION_REMOTE_OPEN:
+            handler.onSessionRemoteOpen(this);
+            break;
+        case SESSION_LOCAL_CLOSE:
+            handler.onSessionLocalClose(this);
+            break;
+        case SESSION_REMOTE_CLOSE:
+            handler.onSessionRemoteClose(this);
+            break;
+        case SESSION_FINAL:
+            handler.onSessionFinal(this);
+            break;
+        case LINK_INIT:
+            handler.onLinkInit(this);
+            break;
+        case LINK_LOCAL_OPEN:
+            handler.onLinkLocalOpen(this);
+            break;
+        case LINK_REMOTE_OPEN:
+            handler.onLinkRemoteOpen(this);
+            break;
+        case LINK_LOCAL_DETACH:
+            handler.onLinkLocalDetach(this);
+            break;
+        case LINK_REMOTE_DETACH:
+            handler.onLinkRemoteDetach(this);
+            break;
+        case LINK_LOCAL_CLOSE:
+            handler.onLinkLocalClose(this);
+            break;
+        case LINK_REMOTE_CLOSE:
+            handler.onLinkRemoteClose(this);
+            break;
+        case LINK_FLOW:
+            handler.onLinkFlow(this);
+            break;
+        case LINK_FINAL:
+            handler.onLinkFinal(this);
+            break;
+        case DELIVERY:
+            handler.onDelivery(this);
+            break;
+        case TRANSPORT:
+            handler.onTransport(this);
+            break;
+        case TRANSPORT_ERROR:
+            handler.onTransportError(this);
+            break;
+        case TRANSPORT_HEAD_CLOSED:
+            handler.onTransportHeadClosed(this);
+            break;
+        case TRANSPORT_TAIL_CLOSED:
+            handler.onTransportTailClosed(this);
+            break;
+        case TRANSPORT_CLOSED:
+            handler.onTransportClosed(this);
+            break;
+        default:
+            handler.onUnhandled(this);
+            break;
+        }
+    }
+
     public Connection getConnection()
     {
         if (context instanceof Connection) {


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


[17/50] [abbrv] qpid-proton git commit: PROTON-712: check getprotobyname for NULL return value (patch from Sahir Hoda)

Posted by gs...@apache.org.
PROTON-712: check getprotobyname for NULL return value (patch from Sahir Hoda)

git-svn-id: https://svn.apache.org/repos/asf/qpid/proton/trunk@1632092 13f79535-47bb-0310-9956-ffa450edef68


Project: http://git-wip-us.apache.org/repos/asf/qpid-proton/repo
Commit: http://git-wip-us.apache.org/repos/asf/qpid-proton/commit/0329abfe
Tree: http://git-wip-us.apache.org/repos/asf/qpid-proton/tree/0329abfe
Diff: http://git-wip-us.apache.org/repos/asf/qpid-proton/diff/0329abfe

Branch: refs/heads/examples
Commit: 0329abfe5562cd435e42c5d78f08341bbc1d4c78
Parents: 07554b9
Author: Rafael H. Schloming <rh...@apache.org>
Authored: Wed Oct 15 15:31:20 2014 +0000
Committer: Rafael H. Schloming <rh...@apache.org>
Committed: Wed Oct 15 15:31:20 2014 +0000

----------------------------------------------------------------------
 proton-c/src/posix/io.c   | 14 ++++++++++++--
 proton-c/src/windows/io.c | 15 ++++++++++++---
 2 files changed, 24 insertions(+), 5 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/0329abfe/proton-c/src/posix/io.c
----------------------------------------------------------------------
diff --git a/proton-c/src/posix/io.c b/proton-c/src/posix/io.c
index 8fbbb0b..2284f90 100644
--- a/proton-c/src/posix/io.c
+++ b/proton-c/src/posix/io.c
@@ -228,7 +228,11 @@ ssize_t pn_send(pn_io_t *io, pn_socket_t socket, const void *buf, size_t len) {
 }
 
 static inline int pn_create_socket(int af) {
-  return socket(af, SOCK_STREAM, getprotobyname("tcp")->p_proto);
+  struct protoent * pe_tcp = getprotobyname("tcp");
+  if (pe_tcp == NULL) {
+    return -1;
+  }
+  return socket(af, SOCK_STREAM, pe_tcp->p_proto);
 }
 #elif defined(SO_NOSIGPIPE)
 ssize_t pn_send(pn_io_t *io, pn_socket_t socket, const void *buf, size_t size) {
@@ -238,7 +242,13 @@ ssize_t pn_send(pn_io_t *io, pn_socket_t socket, const void *buf, size_t size) {
 }
 
 static inline int pn_create_socket(int af) {
-  int sock = socket(af, SOCK_STREAM, getprotobyname("tcp")->p_proto);
+  struct protoent * pe_tcp;
+  int sock;
+  pe_tcp = getprotobyname("tcp");
+  if (pe_tcp == NULL) {
+    return -1;
+  }
+  sock = socket(af, SOCK_STREAM, pe_tcp->p_proto);
   if (sock == -1) return sock;
 
   int optval = 1;

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/0329abfe/proton-c/src/windows/io.c
----------------------------------------------------------------------
diff --git a/proton-c/src/windows/io.c b/proton-c/src/windows/io.c
index b2d528a..ff31b1d 100644
--- a/proton-c/src/windows/io.c
+++ b/proton-c/src/windows/io.c
@@ -302,7 +302,11 @@ pn_socket_t pn_accept(pn_io_t *io, pn_socket_t listen_sock, char *name, size_t s
 }
 
 static inline pn_socket_t pni_create_socket() {
-  return socket(AF_INET, SOCK_STREAM, getprotobyname("tcp")->p_proto);
+  struct protoent * pe_tcp = getprotobyname("tcp");
+  if (pe_tcp == NULL) {
+    return -1;
+  }
+  return socket(AF_INET, SOCK_STREAM, pe_tcp->p_proto);
 }
 
 ssize_t pn_send(pn_io_t *io, pn_socket_t sockfd, const void *buf, size_t len) {
@@ -375,8 +379,13 @@ static void configure_pipe_socket(pn_io_t *io, pn_socket_t sock)
 
 static int pni_socket_pair (pn_io_t *io, SOCKET sv[2]) {
   // no socketpair on windows.  provide pipe() semantics using sockets
+  struct protoent * pe_tcp = getprotobyname("tcp");
+  if (pe_tcp == NULL) {
+    perror("getprotobyname");
+    return -1;
+  }
 
-  SOCKET sock = socket(AF_INET, SOCK_STREAM, getprotobyname("tcp")->p_proto);
+  SOCKET sock = socket(AF_INET, SOCK_STREAM, pe_tcp->p_proto);
   if (sock == INVALID_SOCKET) {
     perror("socket");
     return -1;
@@ -407,7 +416,7 @@ static int pni_socket_pair (pn_io_t *io, SOCKET sv[2]) {
     return -1;
   }
 
-  if ((sv[1] = socket(AF_INET, SOCK_STREAM, getprotobyname("tcp")->p_proto)) == INVALID_SOCKET) {
+  if ((sv[1] = socket(AF_INET, SOCK_STREAM, pe_tcp->p_proto)) == INVALID_SOCKET) {
     perror("sock1");
     closesocket(sock);
     return -1;


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


[36/50] [abbrv] qpid-proton git commit: fixed up the examples README

Posted by gs...@apache.org.
fixed up the examples README


Project: http://git-wip-us.apache.org/repos/asf/qpid-proton/repo
Commit: http://git-wip-us.apache.org/repos/asf/qpid-proton/commit/cce42472
Tree: http://git-wip-us.apache.org/repos/asf/qpid-proton/tree/cce42472
Diff: http://git-wip-us.apache.org/repos/asf/qpid-proton/diff/cce42472

Branch: refs/heads/examples
Commit: cce424728af2bdc96553521b8684e03d6bf3ef5e
Parents: 1d28726
Author: Rafael Schloming <rh...@alum.mit.edu>
Authored: Thu Nov 6 06:11:42 2014 -0500
Committer: Rafael Schloming <rh...@alum.mit.edu>
Committed: Thu Nov 6 06:11:42 2014 -0500

----------------------------------------------------------------------
 examples/README.txt | 3 +++
 1 file changed, 3 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/cce42472/examples/README.txt
----------------------------------------------------------------------
diff --git a/examples/README.txt b/examples/README.txt
index e16415f..d95a37a 100644
--- a/examples/README.txt
+++ b/examples/README.txt
@@ -2,3 +2,6 @@ This directory contains example applications that use the Proton library.
 
   messenger/ - simple examples using the messenger API in a variety of
                languages (C, perl, php, python, ruby)
+
+  engine/    - examples using the engine API to build a messaging server and
+               clients


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


[10/50] [abbrv] qpid-proton git commit: made Handler extend object

Posted by gs...@apache.org.
made Handler extend object

git-svn-id: https://svn.apache.org/repos/asf/qpid/proton/trunk@1631733 13f79535-47bb-0310-9956-ffa450edef68


Project: http://git-wip-us.apache.org/repos/asf/qpid-proton/repo
Commit: http://git-wip-us.apache.org/repos/asf/qpid-proton/commit/12c6d301
Tree: http://git-wip-us.apache.org/repos/asf/qpid-proton/tree/12c6d301
Diff: http://git-wip-us.apache.org/repos/asf/qpid-proton/diff/12c6d301

Branch: refs/heads/examples
Commit: 12c6d301705087f082e95f779d648c3dff0b101d
Parents: 6ca98f5
Author: Rafael H. Schloming <rh...@apache.org>
Authored: Tue Oct 14 12:38:48 2014 +0000
Committer: Rafael H. Schloming <rh...@apache.org>
Committed: Tue Oct 14 12:38:48 2014 +0000

----------------------------------------------------------------------
 proton-c/bindings/python/proton.py | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/12c6d301/proton-c/bindings/python/proton.py
----------------------------------------------------------------------
diff --git a/proton-c/bindings/python/proton.py b/proton-c/bindings/python/proton.py
index 5bca26c..d9548ed 100644
--- a/proton-c/bindings/python/proton.py
+++ b/proton-c/bindings/python/proton.py
@@ -3501,7 +3501,7 @@ class Event:
   def __repr__(self):
     return "%s(%s)" % (self.type, self.context)
 
-class Handler:
+class Handler(object):
 
   def on_unhandled(self, event):
     pass


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


[14/50] [abbrv] qpid-proton git commit: PROTON-711: fix test compilation under Java6

Posted by gs...@apache.org.
PROTON-711: fix test compilation under Java6

git-svn-id: https://svn.apache.org/repos/asf/qpid/proton/trunk@1631911 13f79535-47bb-0310-9956-ffa450edef68


Project: http://git-wip-us.apache.org/repos/asf/qpid-proton/repo
Commit: http://git-wip-us.apache.org/repos/asf/qpid-proton/commit/7c9abd07
Tree: http://git-wip-us.apache.org/repos/asf/qpid-proton/tree/7c9abd07
Diff: http://git-wip-us.apache.org/repos/asf/qpid-proton/diff/7c9abd07

Branch: refs/heads/examples
Commit: 7c9abd071aa199c140cdcfd21f1d580e83045d10
Parents: 960eeff
Author: Robert Gemmell <ro...@apache.org>
Authored: Tue Oct 14 22:21:26 2014 +0000
Committer: Robert Gemmell <ro...@apache.org>
Committed: Tue Oct 14 22:21:26 2014 +0000

----------------------------------------------------------------------
 .../apache/qpid/proton/jms/JMSMappingOutboundTransformerTest.java  | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/7c9abd07/contrib/proton-jms/src/test/java/org/apache/qpid/proton/jms/JMSMappingOutboundTransformerTest.java
----------------------------------------------------------------------
diff --git a/contrib/proton-jms/src/test/java/org/apache/qpid/proton/jms/JMSMappingOutboundTransformerTest.java b/contrib/proton-jms/src/test/java/org/apache/qpid/proton/jms/JMSMappingOutboundTransformerTest.java
index 2bb5209..c9d472b 100644
--- a/contrib/proton-jms/src/test/java/org/apache/qpid/proton/jms/JMSMappingOutboundTransformerTest.java
+++ b/contrib/proton-jms/src/test/java/org/apache/qpid/proton/jms/JMSMappingOutboundTransformerTest.java
@@ -337,7 +337,7 @@ public class JMSMappingOutboundTransformerTest
     private TextMessage createMockTextMessage() throws Exception
     {
         TextMessage mockTextMessage = Mockito.mock(TextMessage.class);
-        Mockito.when(mockTextMessage.getPropertyNames()).thenReturn(Collections.emptyEnumeration());
+        Mockito.when(mockTextMessage.getPropertyNames()).thenReturn(Collections.enumeration(Collections.emptySet()));
 
         return mockTextMessage;
     }


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


[43/50] [abbrv] qpid-proton git commit: NO JIRA: Updated the documentation for the Ruby Message class.

Posted by gs...@apache.org.
NO JIRA: Updated the documentation for the Ruby Message class.


Project: http://git-wip-us.apache.org/repos/asf/qpid-proton/repo
Commit: http://git-wip-us.apache.org/repos/asf/qpid-proton/commit/5521a7ec
Tree: http://git-wip-us.apache.org/repos/asf/qpid-proton/tree/5521a7ec
Diff: http://git-wip-us.apache.org/repos/asf/qpid-proton/diff/5521a7ec

Branch: refs/heads/examples
Commit: 5521a7ec68622492cea687ab4df9903ac2f20ce2
Parents: 6371e9e
Author: Darryl L. Pierce <mc...@gmail.com>
Authored: Mon Nov 10 15:33:26 2014 -0500
Committer: Darryl L. Pierce <mc...@gmail.com>
Committed: Mon Nov 10 16:15:04 2014 -0500

----------------------------------------------------------------------
 .../bindings/ruby/lib/qpid_proton/message.rb    | 24 ++++++++++++++++++++
 1 file changed, 24 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/5521a7ec/proton-c/bindings/ruby/lib/qpid_proton/message.rb
----------------------------------------------------------------------
diff --git a/proton-c/bindings/ruby/lib/qpid_proton/message.rb b/proton-c/bindings/ruby/lib/qpid_proton/message.rb
index d840299..b7a4fd0 100644
--- a/proton-c/bindings/ruby/lib/qpid_proton/message.rb
+++ b/proton-c/bindings/ruby/lib/qpid_proton/message.rb
@@ -23,8 +23,24 @@ module Qpid
 
     # A Message represents an addressable quantity of data.
     #
+    # ==== Message Body
+    #
+    # The message body can be set using the #body= method. The message will
+    # then attempt to determine how exactly to encode the content.
+    #
     # ==== Examples
     #
+    # To create a message for sending:
+    #
+    #   # send a simple text message
+    #   msg = Qpid::Proton::Message.new
+    #   msg.body = "STATE: update"
+    #
+    #   # send a binary chunk of data
+    #   data = File.binread("/home/qpid/binfile.tar.gz")
+    #   msg = Qpid::Proton::Message.new
+    #   msg.body = Qpid::Proton::BinaryString.new(data)
+    #
     class Message
 
       # Decodes a message from supplied AMQP data and returns the number
@@ -372,6 +388,8 @@ module Qpid
       #
       # See MessageFormat for more details on formats.
       #
+      # *Warning:* This method has been deprecated.
+      #
       # ==== Options
       #
       # * format - the format
@@ -383,6 +401,12 @@ module Qpid
 
       # Returns the message format
       #
+      # *Warning:* This method has been deprecated.
+      #
+      # ==== Note
+      #
+      # This method is now deprecated.
+      #
       def format
         Qpid::Proton::MessageFormat.by_value(Cproton.pn_message_get_format(@impl))
       end


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


[46/50] [abbrv] qpid-proton git commit: PROTON-742: Windows SChannel buffer copy error: fix length

Posted by gs...@apache.org.
PROTON-742: Windows SChannel buffer copy error: fix length


Project: http://git-wip-us.apache.org/repos/asf/qpid-proton/repo
Commit: http://git-wip-us.apache.org/repos/asf/qpid-proton/commit/c5c1879f
Tree: http://git-wip-us.apache.org/repos/asf/qpid-proton/tree/c5c1879f
Diff: http://git-wip-us.apache.org/repos/asf/qpid-proton/diff/c5c1879f

Branch: refs/heads/examples
Commit: c5c1879fd7c1c762a929e25d8dc7e21ea89b63dc
Parents: cccd050
Author: Clifford Jansen <cl...@apache.org>
Authored: Thu Nov 13 15:45:17 2014 -0800
Committer: Clifford Jansen <cl...@apache.org>
Committed: Thu Nov 13 15:45:17 2014 -0800

----------------------------------------------------------------------
 proton-c/src/windows/schannel.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/c5c1879f/proton-c/src/windows/schannel.c
----------------------------------------------------------------------
diff --git a/proton-c/src/windows/schannel.c b/proton-c/src/windows/schannel.c
index abf4b85..9437582 100644
--- a/proton-c/src/windows/schannel.c
+++ b/proton-c/src/windows/schannel.c
@@ -917,7 +917,7 @@ static void app_inbytes_progress(pn_ssl_t *ssl, size_t minimum)
       assert(ssl->app_inbytes.size <= ib2.size);
       size_t consumed = ib2.size - ssl->app_inbytes.size;
       if (consumed > 0) {
-          memmove((void *)ib2.start, ib2.start + consumed, consumed);
+        memmove((void *)ib2.start, ib2.start + consumed, ssl->app_inbytes.size);
         pn_buffer_trim(ssl->inbuf2, 0, consumed);
       }
       if (!pn_buffer_available(ssl->inbuf2)) {


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


[24/50] [abbrv] qpid-proton git commit: fixed error message

Posted by gs...@apache.org.
fixed error message

git-svn-id: https://svn.apache.org/repos/asf/qpid/proton/trunk@1632784 13f79535-47bb-0310-9956-ffa450edef68


Project: http://git-wip-us.apache.org/repos/asf/qpid-proton/repo
Commit: http://git-wip-us.apache.org/repos/asf/qpid-proton/commit/719ee5bd
Tree: http://git-wip-us.apache.org/repos/asf/qpid-proton/tree/719ee5bd
Diff: http://git-wip-us.apache.org/repos/asf/qpid-proton/diff/719ee5bd

Branch: refs/heads/examples
Commit: 719ee5bd5848a34a4e10719bc9f6392ebf2a1af9
Parents: 8d6532d
Author: Rafael H. Schloming <rh...@apache.org>
Authored: Sat Oct 18 12:54:11 2014 +0000
Committer: Rafael H. Schloming <rh...@apache.org>
Committed: Sat Oct 18 12:54:11 2014 +0000

----------------------------------------------------------------------
 proton-c/bindings/python/proton.py | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/719ee5bd/proton-c/bindings/python/proton.py
----------------------------------------------------------------------
diff --git a/proton-c/bindings/python/proton.py b/proton-c/bindings/python/proton.py
index bf76af0..84b6654 100644
--- a/proton-c/bindings/python/proton.py
+++ b/proton-c/bindings/python/proton.py
@@ -806,7 +806,7 @@ class Message(object):
   def _check(self, err):
     if err < 0:
       exc = EXCEPTIONS.get(err, MessageException)
-      raise exc("[%s]: %s" % (err, pn_message_error(self._msg)))
+      raise exc("[%s]: %s" % (err, pn_error_text(pn_message_error(self._msg))))
     else:
       return err
 


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


[03/50] [abbrv] qpid-proton git commit: NO-JIRA: Really make BUILD_WITH_CXX worl properly (sigh)

Posted by gs...@apache.org.
NO-JIRA: Really make BUILD_WITH_CXX worl properly (sigh)

git-svn-id: https://svn.apache.org/repos/asf/qpid/proton/trunk@1628548 13f79535-47bb-0310-9956-ffa450edef68


Project: http://git-wip-us.apache.org/repos/asf/qpid-proton/repo
Commit: http://git-wip-us.apache.org/repos/asf/qpid-proton/commit/53b034c8
Tree: http://git-wip-us.apache.org/repos/asf/qpid-proton/tree/53b034c8
Diff: http://git-wip-us.apache.org/repos/asf/qpid-proton/diff/53b034c8

Branch: refs/heads/examples
Commit: 53b034c8392b3885157d683c4fdbe4f3f040a984
Parents: 8cc810a
Author: Andrew Stitcher <as...@apache.org>
Authored: Tue Sep 30 20:38:30 2014 +0000
Committer: Andrew Stitcher <as...@apache.org>
Committed: Tue Sep 30 20:38:30 2014 +0000

----------------------------------------------------------------------
 CMakeLists.txt | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/53b034c8/CMakeLists.txt
----------------------------------------------------------------------
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 7d1fba7..38c8f17 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -26,6 +26,7 @@ if (CMAKE_BUILD_TYPE MATCHES "Deb")
 endif (CMAKE_BUILD_TYPE MATCHES "Deb")
 message(STATUS "Build type is \"${CMAKE_BUILD_TYPE}\"${has_debug_symbols}")
 
+project (Proton C)
 
 if (MSVC)
   # No C99 capability, use C++
@@ -35,8 +36,6 @@ option(BUILD_WITH_CXX "Compile Proton using C++" ${DEFAULT_BUILD_WITH_CXX})
 
 if (BUILD_WITH_CXX)
   project (Proton C CXX)
-else (BUILD_WITH_CXX)
-  project (Proton C)
 endif (BUILD_WITH_CXX)
 
 file(READ version.txt PN_VERSION_FILE)


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


[31/50] [abbrv] qpid-proton git commit: PROTON-723: based on gordon's patch, added support for the coordinator target

Posted by gs...@apache.org.
PROTON-723: based on gordon's patch, added support for the coordinator target

git-svn-id: https://svn.apache.org/repos/asf/qpid/proton/trunk@1635266 13f79535-47bb-0310-9956-ffa450edef68


Project: http://git-wip-us.apache.org/repos/asf/qpid-proton/repo
Commit: http://git-wip-us.apache.org/repos/asf/qpid-proton/commit/4c6f2122
Tree: http://git-wip-us.apache.org/repos/asf/qpid-proton/tree/4c6f2122
Diff: http://git-wip-us.apache.org/repos/asf/qpid-proton/diff/4c6f2122

Branch: refs/heads/examples
Commit: 4c6f21223d44ed585c5f25bf4f706d2c751a485a
Parents: ca38e6c
Author: Rafael H. Schloming <rh...@apache.org>
Authored: Wed Oct 29 19:27:57 2014 +0000
Committer: Rafael H. Schloming <rh...@apache.org>
Committed: Wed Oct 29 19:27:57 2014 +0000

----------------------------------------------------------------------
 proton-c/src/protocol.py                |    2 +
 proton-c/src/transport/transport.c      |   90 +-
 proton-c/src/transport/transport.c.orig | 2229 ++++++++++++++++++++++++++
 proton-j/src/main/resources/cengine.py  |   25 +-
 tests/python/proton_tests/engine.py     |   10 +-
 5 files changed, 2313 insertions(+), 43 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/4c6f2122/proton-c/src/protocol.py
----------------------------------------------------------------------
diff --git a/proton-c/src/protocol.py b/proton-c/src/protocol.py
index df47b0a..685e63b 100644
--- a/proton-c/src/protocol.py
+++ b/proton-c/src/protocol.py
@@ -20,6 +20,7 @@ import mllib, os, sys
 
 doc = mllib.xml_parse(os.path.join(os.path.dirname(__file__), "transport.xml"))
 mdoc = mllib.xml_parse(os.path.join(os.path.dirname(__file__), "messaging.xml"))
+tdoc = mllib.xml_parse(os.path.join(os.path.dirname(__file__), "transactions.xml"))
 sdoc = mllib.xml_parse(os.path.join(os.path.dirname(__file__), "security.xml"))
 
 def eq(attr, value):
@@ -27,6 +28,7 @@ def eq(attr, value):
 
 TYPES = doc.query["amqp/section/type", eq("@class", "composite")] + \
     mdoc.query["amqp/section/type", eq("@class", "composite")] + \
+    tdoc.query["amqp/section/type", eq("@class", "composite")] + \
     sdoc.query["amqp/section/type", eq("@class", "composite")] + \
     mdoc.query["amqp/section/type", eq("@provides", "section")]
 RESTRICTIONS = {}

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/4c6f2122/proton-c/src/transport/transport.c
----------------------------------------------------------------------
diff --git a/proton-c/src/transport/transport.c b/proton-c/src/transport/transport.c
index f37e636..d91b55a 100644
--- a/proton-c/src/transport/transport.c
+++ b/proton-c/src/transport/transport.c
@@ -695,7 +695,15 @@ int pn_do_attach(pn_dispatcher_t *disp)
     pn_terminus_set_timeout(rtgt, tgt_timeout);
     pn_terminus_set_dynamic(rtgt, tgt_dynamic);
   } else {
-    pn_terminus_set_type(rtgt, PN_UNSPECIFIED);
+    uint64_t code = 0;
+    pn_data_clear(link->remote_target.capabilities);
+    err = pn_scan_args(disp, "D.[.....D..DL[C]...]", &code,
+                       link->remote_target.capabilities);
+    if (code == COORDINATOR) {
+      pn_terminus_set_type(rtgt, PN_COORDINATOR);
+    } else {
+      pn_terminus_set_type(rtgt, PN_UNSPECIFIED);
+    }
   }
 
   if (snd_settle)
@@ -1323,34 +1331,58 @@ int pn_process_link_setup(pn_transport_t *transport, pn_endpoint_t *endpoint)
     {
       pni_map_local_handle(link);
       const pn_distribution_mode_t dist_mode = link->source.distribution_mode;
-      int err = pn_post_frame(transport->disp, ssn_state->local_channel,
-                              "DL[SIoBB?DL[SIsIoC?sCnCC]?DL[SIsIoCC]nnI]", ATTACH,
-                              pn_string_get(link->name),
-                              state->local_handle,
-                              endpoint->type == RECEIVER,
-                              link->snd_settle_mode,
-                              link->rcv_settle_mode,
-                              (bool) link->source.type, SOURCE,
-                              pn_string_get(link->source.address),
-                              link->source.durability,
-                              expiry_symbol(link->source.expiry_policy),
-                              link->source.timeout,
-                              link->source.dynamic,
-                              link->source.properties,
-                              (dist_mode != PN_DIST_MODE_UNSPECIFIED), dist_mode2symbol(dist_mode),
-                              link->source.filter,
-                              link->source.outcomes,
-                              link->source.capabilities,
-                              (bool) link->target.type, TARGET,
-                              pn_string_get(link->target.address),
-                              link->target.durability,
-                              expiry_symbol(link->target.expiry_policy),
-                              link->target.timeout,
-                              link->target.dynamic,
-                              link->target.properties,
-                              link->target.capabilities,
-                              0);
-      if (err) return err;
+      if (link->target.type == PN_COORDINATOR) {
+        int err = pn_post_frame(transport->disp, ssn_state->local_channel,
+                                "DL[SIoBB?DL[SIsIoC?sCnCC]DL[C]nnI]", ATTACH,
+                                pn_string_get(link->name),
+                                state->local_handle,
+                                endpoint->type == RECEIVER,
+                                link->snd_settle_mode,
+                                link->rcv_settle_mode,
+                                (bool) link->source.type, SOURCE,
+                                pn_string_get(link->source.address),
+                                link->source.durability,
+                                expiry_symbol(link->source.expiry_policy),
+                                link->source.timeout,
+                                link->source.dynamic,
+                                link->source.properties,
+                                (dist_mode != PN_DIST_MODE_UNSPECIFIED), dist_mode2symbol(dist_mode),
+                                link->source.filter,
+                                link->source.outcomes,
+                                link->source.capabilities,
+                                COORDINATOR, link->target.capabilities,
+                                0);
+        if (err) return err;
+      } else {
+        int err = pn_post_frame(transport->disp, ssn_state->local_channel,
+                                "DL[SIoBB?DL[SIsIoC?sCnCC]?DL[SIsIoCC]nnI]", ATTACH,
+                                pn_string_get(link->name),
+                                state->local_handle,
+                                endpoint->type == RECEIVER,
+                                link->snd_settle_mode,
+                                link->rcv_settle_mode,
+                                (bool) link->source.type, SOURCE,
+                                pn_string_get(link->source.address),
+                                link->source.durability,
+                                expiry_symbol(link->source.expiry_policy),
+                                link->source.timeout,
+                                link->source.dynamic,
+                                link->source.properties,
+                                (dist_mode != PN_DIST_MODE_UNSPECIFIED), dist_mode2symbol(dist_mode),
+                                link->source.filter,
+                                link->source.outcomes,
+                                link->source.capabilities,
+                                (bool) link->target.type, TARGET,
+                                pn_string_get(link->target.address),
+                                link->target.durability,
+                                expiry_symbol(link->target.expiry_policy),
+                                link->target.timeout,
+                                link->target.dynamic,
+                                link->target.properties,
+                                link->target.capabilities,
+                                0);
+        if (err) return err;
+      }
     }
   }
 

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/4c6f2122/proton-c/src/transport/transport.c.orig
----------------------------------------------------------------------
diff --git a/proton-c/src/transport/transport.c.orig b/proton-c/src/transport/transport.c.orig
new file mode 100644
index 0000000..f37e636
--- /dev/null
+++ b/proton-c/src/transport/transport.c.orig
@@ -0,0 +1,2229 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+#include "engine/engine-internal.h"
+#include <stdlib.h>
+#include <string.h>
+#include <proton/framing.h>
+#include "protocol.h"
+#include "dispatch_actions.h"
+
+#include <assert.h>
+#include <stdarg.h>
+#include <stdio.h>
+
+#include "sasl/sasl-internal.h"
+#include "ssl/ssl-internal.h"
+#include "platform.h"
+#include "platform_fmt.h"
+
+static ssize_t transport_consume(pn_transport_t *transport);
+
+// delivery buffers
+
+void pn_delivery_map_init(pn_delivery_map_t *db, pn_sequence_t next)
+{
+  db->deliveries = pn_hash(PN_OBJECT, 0, 0.75);
+  db->next = next;
+}
+
+void pn_delivery_map_free(pn_delivery_map_t *db)
+{
+  pn_free(db->deliveries);
+}
+
+pn_delivery_t *pn_delivery_map_get(pn_delivery_map_t *db, pn_sequence_t id)
+{
+  return (pn_delivery_t *) pn_hash_get(db->deliveries, id);
+}
+
+static void pn_delivery_state_init(pn_delivery_state_t *ds, pn_delivery_t *delivery, pn_sequence_t id)
+{
+  ds->id = id;
+  ds->sent = false;
+  ds->init = true;
+}
+
+pn_delivery_state_t *pn_delivery_map_push(pn_delivery_map_t *db, pn_delivery_t *delivery)
+{
+  pn_delivery_state_t *ds = &delivery->state;
+  pn_delivery_state_init(ds, delivery, db->next++);
+  pn_hash_put(db->deliveries, ds->id, delivery);
+  return ds;
+}
+
+void pn_delivery_map_del(pn_delivery_map_t *db, pn_delivery_t *delivery)
+{
+  if (delivery->state.init) {
+    pn_hash_del(db->deliveries, delivery->state.id);
+  }
+  delivery->state.init = false;
+  delivery->state.sent = false;
+}
+
+void pn_delivery_map_clear(pn_delivery_map_t *dm)
+{
+  pn_hash_t *hash = dm->deliveries;
+  for (pn_handle_t entry = pn_hash_head(hash);
+       entry;
+       entry = pn_hash_next(hash, entry))
+  {
+    pn_delivery_t *dlv = (pn_delivery_t *) pn_hash_value(hash, entry);
+    pn_delivery_map_del(dm, dlv);
+  }
+  dm->next = 0;
+}
+
+static ssize_t pn_input_read_amqp_header(pn_io_layer_t *io_layer, const char *bytes, size_t available);
+static ssize_t pn_input_read_amqp(pn_io_layer_t *io_layer, const char *bytes, size_t available);
+static ssize_t pn_output_write_amqp_header(pn_io_layer_t *io_layer, char *bytes, size_t available);
+static ssize_t pn_output_write_amqp(pn_io_layer_t *io_layer, char *bytes, size_t available);
+static pn_timestamp_t pn_tick_amqp(pn_io_layer_t *io_layer, pn_timestamp_t now);
+
+static void pni_default_tracer(pn_transport_t *transport, const char *message)
+{
+  fprintf(stderr, "[%p]:%s\n", (void *) transport, message);
+}
+
+static void pn_transport_initialize(void *object)
+{
+  pn_transport_t *transport = (pn_transport_t *)object;
+  transport->freed = false;
+  transport->output_buf = NULL;
+  transport->output_size = PN_DEFAULT_MAX_FRAME_SIZE ? PN_DEFAULT_MAX_FRAME_SIZE : 16 * 1024;
+  transport->input_buf = NULL;
+  transport->input_size =  PN_DEFAULT_MAX_FRAME_SIZE ? PN_DEFAULT_MAX_FRAME_SIZE : 16 * 1024;
+  transport->tracer = pni_default_tracer;
+  transport->header_count = 0;
+  transport->sasl = NULL;
+  transport->ssl = NULL;
+  transport->scratch = pn_string(NULL);
+  transport->disp = pn_dispatcher(0, transport);
+  transport->connection = NULL;
+
+  pn_io_layer_t *io_layer = transport->io_layers;
+  while (io_layer != &transport->io_layers[PN_IO_AMQP]) {
+    io_layer->context = NULL;
+    io_layer->next = io_layer + 1;
+    io_layer->process_input = pn_io_layer_input_passthru;
+    io_layer->process_output = pn_io_layer_output_passthru;
+    io_layer->process_tick = pn_io_layer_tick_passthru;
+    io_layer->buffered_output = NULL;
+    io_layer->buffered_input = NULL;
+    ++io_layer;
+  }
+
+  pn_io_layer_t *amqp = &transport->io_layers[PN_IO_AMQP];
+  amqp->context = transport;
+  amqp->process_input = pn_input_read_amqp_header;
+  amqp->process_output = pn_output_write_amqp_header;
+  amqp->process_tick = pn_io_layer_tick_passthru;
+  amqp->buffered_output = NULL;
+  amqp->buffered_input = NULL;
+  amqp->next = NULL;
+
+  transport->open_sent = false;
+  transport->open_rcvd = false;
+  transport->close_sent = false;
+  transport->close_rcvd = false;
+  transport->tail_closed = false;
+  transport->head_closed = false;
+  transport->remote_container = NULL;
+  transport->remote_hostname = NULL;
+  transport->local_max_frame = PN_DEFAULT_MAX_FRAME_SIZE;
+  transport->remote_max_frame = 0;
+  transport->channel_max = 0;
+  transport->remote_channel_max = 0;
+  transport->local_idle_timeout = 0;
+  transport->dead_remote_deadline = 0;
+  transport->last_bytes_input = 0;
+  transport->remote_idle_timeout = 0;
+  transport->keepalive_deadline = 0;
+  transport->last_bytes_output = 0;
+  transport->remote_offered_capabilities = pn_data(0);
+  transport->remote_desired_capabilities = pn_data(0);
+  transport->remote_properties = pn_data(0);
+  transport->disp_data = pn_data(0);
+  pn_condition_init(&transport->remote_condition);
+  pn_condition_init(&transport->condition);
+  transport->error = pn_error();
+
+  transport->local_channels = pn_hash(PN_OBJECT, 0, 0.75);
+  transport->remote_channels = pn_hash(PN_OBJECT, 0, 0.75);
+
+  transport->bytes_input = 0;
+  transport->bytes_output = 0;
+
+  transport->input_pending = 0;
+  transport->output_pending = 0;
+
+  transport->done_processing = false;
+
+  transport->posted_head_closed = false;
+  transport->posted_tail_closed = false;
+}
+
+pn_session_t *pn_channel_state(pn_transport_t *transport, uint16_t channel)
+{
+  return (pn_session_t *) pn_hash_get(transport->remote_channels, channel);
+}
+
+static void pni_map_remote_channel(pn_session_t *session, uint16_t channel)
+{
+  pn_transport_t *transport = session->connection->transport;
+  pn_hash_put(transport->remote_channels, channel, session);
+  session->state.remote_channel = channel;
+}
+
+void pni_transport_unbind_handles(pn_hash_t *handles, bool reset_state);
+
+static void pni_unmap_remote_channel(pn_session_t *ssn)
+{
+  // XXX: should really update link state also
+  pni_transport_unbind_handles(ssn->state.remote_handles, false);
+  pn_transport_t *transport = ssn->connection->transport;
+  uint16_t channel = ssn->state.remote_channel;
+  ssn->state.remote_channel = -2;
+  // note: may free the session:
+  pn_hash_del(transport->remote_channels, channel);
+}
+
+
+static void pn_transport_finalize(void *object);
+#define pn_transport_hashcode NULL
+#define pn_transport_compare NULL
+#define pn_transport_inspect NULL
+
+pn_transport_t *pn_transport()
+{
+  static const pn_class_t clazz = PN_CLASS(pn_transport);
+  pn_transport_t *transport =
+    (pn_transport_t *) pn_class_new(&clazz, sizeof(pn_transport_t));
+  if (!transport) return NULL;
+
+  transport->output_buf = (char *) malloc(transport->output_size);
+  if (!transport->output_buf) {
+    pn_transport_free(transport);
+    return NULL;
+  }
+
+  transport->input_buf = (char *) malloc(transport->input_size);
+  if (!transport->input_buf) {
+    pn_transport_free(transport);
+    return NULL;
+  }
+  return transport;
+}
+
+void pn_transport_free(pn_transport_t *transport)
+{
+  if (!transport) return;
+  assert(!transport->freed);
+  transport->freed = true;
+  // once the application frees the transport, no further I/O
+  // processing can be done to the connection:
+  pn_transport_unbind(transport);
+  pn_decref(transport);
+}
+
+static void pn_transport_finalize(void *object)
+{
+  pn_transport_t *transport = (pn_transport_t *) object;
+
+  pn_ssl_free(transport->ssl);
+  pn_sasl_free(transport->sasl);
+  pn_dispatcher_free(transport->disp);
+  free(transport->remote_container);
+  free(transport->remote_hostname);
+  pn_free(transport->remote_offered_capabilities);
+  pn_free(transport->remote_desired_capabilities);
+  pn_free(transport->remote_properties);
+  pn_free(transport->disp_data);
+  pn_condition_tini(&transport->remote_condition);
+  pn_condition_tini(&transport->condition);
+  pn_error_free(transport->error);
+  pn_free(transport->local_channels);
+  pn_free(transport->remote_channels);
+  if (transport->input_buf) free(transport->input_buf);
+  if (transport->output_buf) free(transport->output_buf);
+  pn_free(transport->scratch);
+}
+
+int pn_transport_bind(pn_transport_t *transport, pn_connection_t *connection)
+{
+  assert(transport);
+  assert(connection);
+
+  if (transport->connection) return PN_STATE_ERR;
+  if (connection->transport) return PN_STATE_ERR;
+
+  transport->connection = connection;
+  connection->transport = transport;
+
+  pn_collector_put(connection->collector, PN_OBJECT, connection, PN_CONNECTION_BOUND);
+
+  pn_incref(connection);
+  if (transport->open_rcvd) {
+    PN_SET_REMOTE(connection->endpoint.state, PN_REMOTE_ACTIVE);
+    pn_collector_put(connection->collector, PN_OBJECT, connection, PN_CONNECTION_REMOTE_OPEN);
+    transport->disp->halt = false;
+    transport_consume(transport);        // blech - testBindAfterOpen
+  }
+
+  return 0;
+}
+
+void pni_transport_unbind_handles(pn_hash_t *handles, bool reset_state)
+{
+  for (pn_handle_t h = pn_hash_head(handles); h; h = pn_hash_next(handles, h)) {
+    uintptr_t key = pn_hash_key(handles, h);
+    if (reset_state) {
+      pn_link_t *link = (pn_link_t *) pn_hash_value(handles, h);
+      pn_link_unbound(link);
+    }
+    pn_hash_del(handles, key);
+  }
+}
+
+void pni_transport_unbind_channels(pn_hash_t *channels)
+{
+  for (pn_handle_t h = pn_hash_head(channels); h; h = pn_hash_next(channels, h)) {
+    uintptr_t key = pn_hash_key(channels, h);
+    pn_session_t *ssn = (pn_session_t *) pn_hash_value(channels, h);
+    pni_transport_unbind_handles(ssn->state.local_handles, true);
+    pni_transport_unbind_handles(ssn->state.remote_handles, true);
+    pn_session_unbound(ssn);
+    pn_hash_del(channels, key);
+  }
+}
+
+int pn_transport_unbind(pn_transport_t *transport)
+{
+  assert(transport);
+  if (!transport->connection) return 0;
+
+
+  pn_connection_t *conn = transport->connection;
+  transport->connection = NULL;
+
+  pn_collector_put(conn->collector, PN_OBJECT, conn, PN_CONNECTION_UNBOUND);
+
+  // XXX: what happens if the endpoints are freed before we get here?
+  pn_session_t *ssn = pn_session_head(conn, 0);
+  while (ssn) {
+    pn_delivery_map_clear(&ssn->state.incoming);
+    pn_delivery_map_clear(&ssn->state.outgoing);
+    ssn = pn_session_next(ssn, 0);
+  }
+
+  pn_endpoint_t *endpoint = conn->endpoint_head;
+  while (endpoint) {
+    pn_condition_clear(&endpoint->remote_condition);
+    pn_modified(conn, endpoint, true);
+    endpoint = endpoint->endpoint_next;
+  }
+
+  pni_transport_unbind_channels(transport->local_channels);
+  pni_transport_unbind_channels(transport->remote_channels);
+
+  pn_connection_unbound(conn);
+  pn_decref(conn);
+  return 0;
+}
+
+pn_error_t *pn_transport_error(pn_transport_t *transport)
+{
+  assert(transport);
+  if (pn_condition_is_set(&transport->condition)) {
+    pn_error_format(transport->error, PN_ERR, "%s: %s",
+                    pn_condition_get_name(&transport->condition),
+                    pn_condition_get_description(&transport->condition));
+  } else {
+    pn_error_clear(transport->error);
+  }
+  return transport->error;
+}
+
+pn_condition_t *pn_transport_condition(pn_transport_t *transport)
+{
+  assert(transport);
+  return &transport->condition;
+}
+
+static void pni_map_remote_handle(pn_link_t *link, uint32_t handle)
+{
+  link->state.remote_handle = handle;
+  pn_hash_put(link->session->state.remote_handles, handle, link);
+}
+
+static void pni_unmap_remote_handle(pn_link_t *link)
+{
+  uintptr_t handle = link->state.remote_handle;
+  link->state.remote_handle = -2;
+  // may delete link:
+  pn_hash_del(link->session->state.remote_handles, handle);
+}
+
+pn_link_t *pn_handle_state(pn_session_t *ssn, uint32_t handle)
+{
+  return (pn_link_t *) pn_hash_get(ssn->state.remote_handles, handle);
+}
+
+bool pni_disposition_batchable(pn_disposition_t *disposition)
+{
+  switch (disposition->type) {
+  case PN_ACCEPTED:
+    return true;
+  case PN_RELEASED:
+    return true;
+  default:
+    return false;
+  }
+}
+
+void pni_disposition_encode(pn_disposition_t *disposition, pn_data_t *data)
+{
+  pn_condition_t *cond = &disposition->condition;
+  switch (disposition->type) {
+  case PN_RECEIVED:
+    pn_data_put_list(data);
+    pn_data_enter(data);
+    pn_data_put_uint(data, disposition->section_number);
+    pn_data_put_ulong(data, disposition->section_offset);
+    pn_data_exit(data);
+    break;
+  case PN_ACCEPTED:
+  case PN_RELEASED:
+    return;
+  case PN_REJECTED:
+    pn_data_fill(data, "[?DL[sSC]]", pn_condition_is_set(cond), ERROR,
+                 pn_condition_get_name(cond),
+                 pn_condition_get_description(cond),
+                 pn_condition_info(cond));
+    break;
+  case PN_MODIFIED:
+    pn_data_fill(data, "[ooC]",
+                 disposition->failed,
+                 disposition->undeliverable,
+                 disposition->annotations);
+    break;
+  default:
+    pn_data_copy(data, disposition->data);
+    break;
+  }
+}
+
+int pn_post_close(pn_transport_t *transport, const char *condition, const char *description)
+{
+  pn_condition_t *cond = NULL;
+  if (transport->connection) {
+    cond = pn_connection_condition(transport->connection);
+  }
+  pn_data_t *info = NULL;
+  if (!condition && pn_condition_is_set(cond)) {
+    condition = pn_condition_get_name(cond);
+    description = pn_condition_get_description(cond);
+    info = pn_condition_info(cond);
+  }
+
+  return pn_post_frame(transport->disp, 0, "DL[?DL[sSC]]", CLOSE,
+                       (bool) condition, ERROR, condition, description, info);
+}
+
+static pn_collector_t *pni_transport_collector(pn_transport_t *transport)
+{
+  if (transport->connection && transport->connection->collector) {
+    return transport->connection->collector;
+  } else {
+    return NULL;
+  }
+}
+
+int pn_do_error(pn_transport_t *transport, const char *condition, const char *fmt, ...)
+{
+  va_list ap;
+  va_start(ap, fmt);
+  char buf[1024];
+  // XXX: result
+  vsnprintf(buf, 1024, fmt, ap);
+  va_end(ap);
+  if (!transport->close_sent) {
+    if (!transport->open_sent) {
+      pn_post_frame(transport->disp, 0, "DL[S]", OPEN, "");
+    }
+
+    pn_post_close(transport, condition, buf);
+    transport->close_sent = true;
+  }
+  transport->disp->halt = true;
+  pn_condition_set_name(&transport->condition, condition);
+  pn_condition_set_description(&transport->condition, buf);
+  pn_collector_t *collector = pni_transport_collector(transport);
+  pn_collector_put(collector, PN_OBJECT, transport, PN_TRANSPORT_ERROR);
+  pn_transport_logf(transport, "ERROR %s %s", condition, buf);
+  return PN_ERR;
+}
+
+static char *pn_bytes_strdup(pn_bytes_t str)
+{
+  return pn_strndup(str.start, str.size);
+}
+
+int pn_do_open(pn_dispatcher_t *disp)
+{
+  pn_transport_t *transport = disp->transport;
+  pn_connection_t *conn = transport->connection;
+  bool container_q, hostname_q;
+  pn_bytes_t remote_container, remote_hostname;
+  pn_data_clear(transport->remote_offered_capabilities);
+  pn_data_clear(transport->remote_desired_capabilities);
+  pn_data_clear(transport->remote_properties);
+  int err = pn_scan_args(disp, "D.[?S?SIHI..CCC]", &container_q,
+                         &remote_container, &hostname_q, &remote_hostname,
+                         &transport->remote_max_frame,
+                         &transport->remote_channel_max,
+                         &transport->remote_idle_timeout,
+                         transport->remote_offered_capabilities,
+                         transport->remote_desired_capabilities,
+                         transport->remote_properties);
+  if (err) return err;
+  if (transport->remote_max_frame > 0) {
+    if (transport->remote_max_frame < AMQP_MIN_MAX_FRAME_SIZE) {
+      pn_transport_logf(transport, "Peer advertised bad max-frame (%u), forcing to %u",
+                        transport->remote_max_frame, AMQP_MIN_MAX_FRAME_SIZE);
+      transport->remote_max_frame = AMQP_MIN_MAX_FRAME_SIZE;
+    }
+    disp->remote_max_frame = transport->remote_max_frame;
+    pn_buffer_clear( disp->frame );
+  }
+  if (container_q) {
+    transport->remote_container = pn_bytes_strdup(remote_container);
+  } else {
+    transport->remote_container = NULL;
+  }
+  if (hostname_q) {
+    transport->remote_hostname = pn_bytes_strdup(remote_hostname);
+  } else {
+    transport->remote_hostname = NULL;
+  }
+
+  if (conn) {
+    PN_SET_REMOTE(conn->endpoint.state, PN_REMOTE_ACTIVE);
+    pn_collector_put(conn->collector, PN_OBJECT, conn, PN_CONNECTION_REMOTE_OPEN);
+  } else {
+    transport->disp->halt = true;
+  }
+  if (transport->remote_idle_timeout)
+    transport->io_layers[PN_IO_AMQP].process_tick = pn_tick_amqp;  // enable timeouts
+  transport->open_rcvd = true;
+  return 0;
+}
+
+int pn_do_begin(pn_dispatcher_t *disp)
+{
+  pn_transport_t *transport = disp->transport;
+  bool reply;
+  uint16_t remote_channel;
+  pn_sequence_t next;
+  int err = pn_scan_args(disp, "D.[?HI]", &reply, &remote_channel, &next);
+  if (err) return err;
+
+  pn_session_t *ssn;
+  if (reply) {
+    // XXX: what if session is NULL?
+    ssn = (pn_session_t *) pn_hash_get(transport->local_channels, remote_channel);
+  } else {
+    ssn = pn_session(transport->connection);
+  }
+  ssn->state.incoming_transfer_count = next;
+  pni_map_remote_channel(ssn, disp->channel);
+  PN_SET_REMOTE(ssn->endpoint.state, PN_REMOTE_ACTIVE);
+  pn_collector_put(transport->connection->collector, PN_OBJECT, ssn, PN_SESSION_REMOTE_OPEN);
+  return 0;
+}
+
+pn_link_t *pn_find_link(pn_session_t *ssn, pn_bytes_t name, bool is_sender)
+{
+  pn_endpoint_type_t type = is_sender ? SENDER : RECEIVER;
+
+  for (size_t i = 0; i < pn_list_size(ssn->links); i++)
+  {
+    pn_link_t *link = (pn_link_t *) pn_list_get(ssn->links, i);
+    if (link->endpoint.type == type &&
+        !strncmp(name.start, pn_string_get(link->name), name.size))
+    {
+      return link;
+    }
+  }
+  return NULL;
+}
+
+static pn_expiry_policy_t symbol2policy(pn_bytes_t symbol)
+{
+  if (!symbol.start)
+    return PN_EXPIRE_WITH_SESSION;
+
+  if (!strncmp(symbol.start, "link-detach", symbol.size))
+    return PN_EXPIRE_WITH_LINK;
+  if (!strncmp(symbol.start, "session-end", symbol.size))
+    return PN_EXPIRE_WITH_SESSION;
+  if (!strncmp(symbol.start, "connection-close", symbol.size))
+    return PN_EXPIRE_WITH_CONNECTION;
+  if (!strncmp(symbol.start, "never", symbol.size))
+    return PN_EXPIRE_NEVER;
+
+  return PN_EXPIRE_WITH_SESSION;
+}
+
+static pn_distribution_mode_t symbol2dist_mode(const pn_bytes_t symbol)
+{
+  if (!symbol.start)
+    return PN_DIST_MODE_UNSPECIFIED;
+
+  if (!strncmp(symbol.start, "move", symbol.size))
+    return PN_DIST_MODE_MOVE;
+  if (!strncmp(symbol.start, "copy", symbol.size))
+    return PN_DIST_MODE_COPY;
+
+  return PN_DIST_MODE_UNSPECIFIED;
+}
+
+static const char *dist_mode2symbol(const pn_distribution_mode_t mode)
+{
+  switch (mode)
+  {
+  case PN_DIST_MODE_COPY:
+    return "copy";
+  case PN_DIST_MODE_MOVE:
+    return "move";
+  default:
+    return NULL;
+  }
+}
+
+int pn_terminus_set_address_bytes(pn_terminus_t *terminus, pn_bytes_t address)
+{
+  assert(terminus);
+  return pn_string_setn(terminus->address, address.start, address.size);
+}
+
+int pn_do_attach(pn_dispatcher_t *disp)
+{
+  pn_transport_t *transport = disp->transport;
+  pn_bytes_t name;
+  uint32_t handle;
+  bool is_sender;
+  pn_bytes_t source, target;
+  pn_durability_t src_dr, tgt_dr;
+  pn_bytes_t src_exp, tgt_exp;
+  pn_seconds_t src_timeout, tgt_timeout;
+  bool src_dynamic, tgt_dynamic;
+  pn_sequence_t idc;
+  pn_bytes_t dist_mode;
+  bool snd_settle, rcv_settle;
+  uint8_t snd_settle_mode, rcv_settle_mode;
+  int err = pn_scan_args(disp, "D.[SIo?B?BD.[SIsIo.s]D.[SIsIo]..I]", &name, &handle,
+                         &is_sender,
+                         &snd_settle, &snd_settle_mode,
+                         &rcv_settle, &rcv_settle_mode,
+                         &source, &src_dr, &src_exp, &src_timeout, &src_dynamic, &dist_mode,
+                         &target, &tgt_dr, &tgt_exp, &tgt_timeout, &tgt_dynamic,
+                         &idc);
+  if (err) return err;
+  char strbuf[128];      // avoid malloc for most link names
+  char *strheap = (name.size >= sizeof(strbuf)) ? (char *) malloc(name.size + 1) : NULL;
+  char *strname = strheap ? strheap : strbuf;
+  strncpy(strname, name.start, name.size);
+  strname[name.size] = '\0';
+
+  pn_session_t *ssn = pn_channel_state(transport, disp->channel);
+  if (!ssn) {
+      pn_do_error(transport, "amqp:connection:no-session", "attach without a session");
+      return PN_EOS;
+  }
+  pn_link_t *link = pn_find_link(ssn, name, is_sender);
+  if (!link) {
+    if (is_sender) {
+      link = (pn_link_t *) pn_sender(ssn, strname);
+    } else {
+      link = (pn_link_t *) pn_receiver(ssn, strname);
+    }
+  }
+
+  if (strheap) {
+    free(strheap);
+  }
+
+  pni_map_remote_handle(link, handle);
+  PN_SET_REMOTE(link->endpoint.state, PN_REMOTE_ACTIVE);
+  pn_terminus_t *rsrc = &link->remote_source;
+  if (source.start || src_dynamic) {
+    pn_terminus_set_type(rsrc, PN_SOURCE);
+    pn_terminus_set_address_bytes(rsrc, source);
+    pn_terminus_set_durability(rsrc, src_dr);
+    pn_terminus_set_expiry_policy(rsrc, symbol2policy(src_exp));
+    pn_terminus_set_timeout(rsrc, src_timeout);
+    pn_terminus_set_dynamic(rsrc, src_dynamic);
+    pn_terminus_set_distribution_mode(rsrc, symbol2dist_mode(dist_mode));
+  } else {
+    pn_terminus_set_type(rsrc, PN_UNSPECIFIED);
+  }
+  pn_terminus_t *rtgt = &link->remote_target;
+  if (target.start || tgt_dynamic) {
+    pn_terminus_set_type(rtgt, PN_TARGET);
+    pn_terminus_set_address_bytes(rtgt, target);
+    pn_terminus_set_durability(rtgt, tgt_dr);
+    pn_terminus_set_expiry_policy(rtgt, symbol2policy(tgt_exp));
+    pn_terminus_set_timeout(rtgt, tgt_timeout);
+    pn_terminus_set_dynamic(rtgt, tgt_dynamic);
+  } else {
+    pn_terminus_set_type(rtgt, PN_UNSPECIFIED);
+  }
+
+  if (snd_settle)
+    link->remote_snd_settle_mode = snd_settle_mode;
+  if (rcv_settle)
+    link->remote_rcv_settle_mode = rcv_settle_mode;
+
+  pn_data_clear(link->remote_source.properties);
+  pn_data_clear(link->remote_source.filter);
+  pn_data_clear(link->remote_source.outcomes);
+  pn_data_clear(link->remote_source.capabilities);
+  pn_data_clear(link->remote_target.properties);
+  pn_data_clear(link->remote_target.capabilities);
+
+  err = pn_scan_args(disp, "D.[.....D.[.....C.C.CC]D.[.....CC]",
+                     link->remote_source.properties,
+                     link->remote_source.filter,
+                     link->remote_source.outcomes,
+                     link->remote_source.capabilities,
+                     link->remote_target.properties,
+                     link->remote_target.capabilities);
+  if (err) return err;
+
+  pn_data_rewind(link->remote_source.properties);
+  pn_data_rewind(link->remote_source.filter);
+  pn_data_rewind(link->remote_source.outcomes);
+  pn_data_rewind(link->remote_source.capabilities);
+  pn_data_rewind(link->remote_target.properties);
+  pn_data_rewind(link->remote_target.capabilities);
+
+  if (!is_sender) {
+    link->state.delivery_count = idc;
+  }
+
+  pn_collector_put(transport->connection->collector, PN_OBJECT, link, PN_LINK_REMOTE_OPEN);
+  return 0;
+}
+
+int pn_post_flow(pn_transport_t *transport, pn_session_t *ssn, pn_link_t *link);
+
+// free the delivery
+static void pn_full_settle(pn_delivery_map_t *db, pn_delivery_t *delivery)
+{
+  assert(!delivery->work);
+  pn_clear_tpwork(delivery);
+  pn_real_settle(delivery);
+}
+
+int pn_do_transfer(pn_dispatcher_t *disp)
+{
+  // XXX: multi transfer
+  pn_transport_t *transport = disp->transport;
+  uint32_t handle;
+  pn_bytes_t tag;
+  bool id_present;
+  pn_sequence_t id;
+  bool settled;
+  bool more;
+  int err = pn_scan_args(disp, "D.[I?Iz.oo]", &handle, &id_present, &id, &tag,
+                         &settled, &more);
+  if (err) return err;
+  pn_session_t *ssn = pn_channel_state(transport, disp->channel);
+
+  if (!ssn->state.incoming_window) {
+    return pn_do_error(transport, "amqp:session:window-violation", "incoming session window exceeded");
+  }
+
+  pn_link_t *link = pn_handle_state(ssn, handle);
+  pn_delivery_t *delivery;
+  if (link->unsettled_tail && !link->unsettled_tail->done) {
+    delivery = link->unsettled_tail;
+  } else {
+    pn_delivery_map_t *incoming = &ssn->state.incoming;
+
+    if (!ssn->state.incoming_init) {
+      incoming->next = id;
+      ssn->state.incoming_init = true;
+      ssn->incoming_deliveries++;
+    }
+
+    delivery = pn_delivery(link, pn_dtag(tag.start, tag.size));
+    pn_delivery_state_t *state = pn_delivery_map_push(incoming, delivery);
+    if (id_present && id != state->id) {
+      return pn_do_error(transport, "amqp:session:invalid-field",
+                         "sequencing error, expected delivery-id %u, got %u",
+                         state->id, id);
+    }
+
+    link->state.delivery_count++;
+    link->state.link_credit--;
+    link->queued++;
+
+    // XXX: need to fill in remote state: delivery->remote.state = ...;
+    delivery->remote.settled = settled;
+    if (settled) {
+      delivery->updated = true;
+      pn_work_update(transport->connection, delivery);
+    }
+  }
+
+  pn_buffer_append(delivery->bytes, disp->payload, disp->size);
+  ssn->incoming_bytes += disp->size;
+  delivery->done = !more;
+
+  ssn->state.incoming_transfer_count++;
+  ssn->state.incoming_window--;
+
+  // XXX: need better policy for when to refresh window
+  if (!ssn->state.incoming_window && (int32_t) link->state.local_handle >= 0) {
+    pn_post_flow(transport, ssn, link);
+  }
+
+  pn_collector_put(transport->connection->collector, PN_OBJECT, delivery, PN_DELIVERY);
+  return 0;
+}
+
+int pn_do_flow(pn_dispatcher_t *disp)
+{
+  pn_transport_t *transport = disp->transport;
+  pn_sequence_t onext, inext, delivery_count;
+  uint32_t iwin, owin, link_credit;
+  uint32_t handle;
+  bool inext_init, handle_init, dcount_init, drain;
+  int err = pn_scan_args(disp, "D.[?IIII?I?II.o]", &inext_init, &inext, &iwin,
+                         &onext, &owin, &handle_init, &handle, &dcount_init,
+                         &delivery_count, &link_credit, &drain);
+  if (err) return err;
+
+  pn_session_t *ssn = pn_channel_state(transport, disp->channel);
+
+  if (inext_init) {
+    ssn->state.remote_incoming_window = inext + iwin - ssn->state.outgoing_transfer_count;
+  } else {
+    ssn->state.remote_incoming_window = iwin;
+  }
+
+  if (handle_init) {
+    pn_link_t *link = pn_handle_state(ssn, handle);
+    if (link->endpoint.type == SENDER) {
+      pn_sequence_t receiver_count;
+      if (dcount_init) {
+        receiver_count = delivery_count;
+      } else {
+        // our initial delivery count
+        receiver_count = 0;
+      }
+      pn_sequence_t old = link->state.link_credit;
+      link->state.link_credit = receiver_count + link_credit - link->state.delivery_count;
+      link->credit += link->state.link_credit - old;
+      link->drain = drain;
+      pn_delivery_t *delivery = pn_link_current(link);
+      if (delivery) pn_work_update(transport->connection, delivery);
+    } else {
+      pn_sequence_t delta = delivery_count - link->state.delivery_count;
+      if (delta > 0) {
+        link->state.delivery_count += delta;
+        link->state.link_credit -= delta;
+        link->credit -= delta;
+        link->drained += delta;
+      }
+    }
+
+    pn_collector_put(transport->connection->collector, PN_OBJECT, link, PN_LINK_FLOW);
+  }
+
+  return 0;
+}
+
+#define SCAN_ERROR_DEFAULT ("D.[D.[sSC]")
+#define SCAN_ERROR_DETACH ("D.[..D.[sSC]")
+#define SCAN_ERROR_DISP ("[D.[sSC]")
+
+static int pn_scan_error(pn_data_t *data, pn_condition_t *condition, const char *fmt)
+{
+  pn_bytes_t cond;
+  pn_bytes_t desc;
+  pn_condition_clear(condition);
+  int err = pn_data_scan(data, fmt, &cond, &desc, condition->info);
+  if (err) return err;
+  pn_string_setn(condition->name, cond.start, cond.size);
+  pn_string_setn(condition->description, desc.start, desc.size);
+  pn_data_rewind(condition->info);
+  return 0;
+}
+
+int pn_do_disposition(pn_dispatcher_t *disp)
+{
+  pn_transport_t *transport = disp->transport;
+  bool role;
+  pn_sequence_t first, last;
+  uint64_t type = 0;
+  bool last_init, settled, type_init;
+  pn_data_clear(transport->disp_data);
+  int err = pn_scan_args(disp, "D.[oI?IoD?LC]", &role, &first, &last_init,
+                         &last, &settled, &type_init, &type,
+                         transport->disp_data);
+  if (err) return err;
+  if (!last_init) last = first;
+
+  pn_session_t *ssn = pn_channel_state(transport, disp->channel);
+  pn_delivery_map_t *deliveries;
+  if (role) {
+    deliveries = &ssn->state.outgoing;
+  } else {
+    deliveries = &ssn->state.incoming;
+  }
+
+  pn_data_rewind(transport->disp_data);
+  bool remote_data = (pn_data_next(transport->disp_data) &&
+                      pn_data_get_list(transport->disp_data) > 0);
+
+  for (pn_sequence_t id = first; id <= last; id++) {
+    pn_delivery_t *delivery = pn_delivery_map_get(deliveries, id);
+    pn_disposition_t *remote = &delivery->remote;
+    if (delivery) {
+      if (type_init) remote->type = type;
+      if (remote_data) {
+        switch (type) {
+        case PN_RECEIVED:
+          pn_data_rewind(transport->disp_data);
+          pn_data_next(transport->disp_data);
+          pn_data_enter(transport->disp_data);
+          if (pn_data_next(transport->disp_data))
+            remote->section_number = pn_data_get_uint(transport->disp_data);
+          if (pn_data_next(transport->disp_data))
+            remote->section_offset = pn_data_get_ulong(transport->disp_data);
+          break;
+        case PN_ACCEPTED:
+          break;
+        case PN_REJECTED:
+          err = pn_scan_error(transport->disp_data, &remote->condition, SCAN_ERROR_DISP);
+          if (err) return err;
+          break;
+        case PN_RELEASED:
+          break;
+        case PN_MODIFIED:
+          pn_data_rewind(transport->disp_data);
+          pn_data_next(transport->disp_data);
+          pn_data_enter(transport->disp_data);
+          if (pn_data_next(transport->disp_data))
+            remote->failed = pn_data_get_bool(transport->disp_data);
+          if (pn_data_next(transport->disp_data))
+            remote->undeliverable = pn_data_get_bool(transport->disp_data);
+          pn_data_narrow(transport->disp_data);
+          pn_data_clear(remote->data);
+          pn_data_appendn(remote->annotations, transport->disp_data, 1);
+          pn_data_widen(transport->disp_data);
+          break;
+        default:
+          pn_data_copy(remote->data, transport->disp_data);
+          break;
+        }
+      }
+      remote->settled = settled;
+      delivery->updated = true;
+      pn_work_update(transport->connection, delivery);
+
+      pn_collector_put(transport->connection->collector, PN_OBJECT, delivery, PN_DELIVERY);
+    }
+  }
+
+  return 0;
+}
+
+int pn_do_detach(pn_dispatcher_t *disp)
+{
+  pn_transport_t *transport = disp->transport;
+  uint32_t handle;
+  bool closed;
+  int err = pn_scan_args(disp, "D.[Io]", &handle, &closed);
+  if (err) return err;
+
+  pn_session_t *ssn = pn_channel_state(transport, disp->channel);
+  if (!ssn) {
+    return pn_do_error(transport, "amqp:invalid-field", "no such channel: %u", disp->channel);
+  }
+  pn_link_t *link = pn_handle_state(ssn, handle);
+  if (!link) {
+    return pn_do_error(transport, "amqp:invalid-field", "no such handle: %u", handle);
+  }
+
+  err = pn_scan_error(disp->args, &link->endpoint.remote_condition, SCAN_ERROR_DETACH);
+  if (err) return err;
+
+  if (closed)
+  {
+    PN_SET_REMOTE(link->endpoint.state, PN_REMOTE_CLOSED);
+    pn_collector_put(transport->connection->collector, PN_OBJECT, link, PN_LINK_REMOTE_CLOSE);
+  } else {
+    pn_collector_put(transport->connection->collector, PN_OBJECT, link, PN_LINK_REMOTE_DETACH);
+  }
+
+  pni_unmap_remote_handle(link);
+  return 0;
+}
+
+int pn_do_end(pn_dispatcher_t *disp)
+{
+  pn_transport_t *transport = disp->transport;
+  pn_session_t *ssn = pn_channel_state(transport, disp->channel);
+  int err = pn_scan_error(disp->args, &ssn->endpoint.remote_condition, SCAN_ERROR_DEFAULT);
+  if (err) return err;
+  PN_SET_REMOTE(ssn->endpoint.state, PN_REMOTE_CLOSED);
+  pn_collector_put(transport->connection->collector, PN_OBJECT, ssn, PN_SESSION_REMOTE_CLOSE);
+  pni_unmap_remote_channel(ssn);
+  return 0;
+}
+
+int pn_do_close(pn_dispatcher_t *disp)
+{
+  pn_transport_t *transport = disp->transport;
+  pn_connection_t *conn = transport->connection;
+  int err = pn_scan_error(disp->args, &transport->remote_condition, SCAN_ERROR_DEFAULT);
+  if (err) return err;
+  transport->close_rcvd = true;
+  PN_SET_REMOTE(conn->endpoint.state, PN_REMOTE_CLOSED);
+  pn_collector_put(transport->connection->collector, PN_OBJECT, conn, PN_CONNECTION_REMOTE_CLOSE);
+  return 0;
+}
+
+// deprecated
+ssize_t pn_transport_input(pn_transport_t *transport, const char *bytes, size_t available)
+{
+  if (!transport) return PN_ARG_ERR;
+  if (available == 0) {
+    return pn_transport_close_tail(transport);
+  }
+  const size_t original = available;
+  ssize_t capacity = pn_transport_capacity(transport);
+  if (capacity < 0) return capacity;
+  while (available && capacity) {
+    char *dest = pn_transport_tail(transport);
+    assert(dest);
+    size_t count = pn_min( (size_t)capacity, available );
+    memmove( dest, bytes, count );
+    available -= count;
+    bytes += count;
+    int rc = pn_transport_process( transport, count );
+    if (rc < 0) return rc;
+    capacity = pn_transport_capacity(transport);
+    if (capacity < 0) return capacity;
+  }
+
+  return original - available;
+}
+
+static void pni_maybe_post_closed(pn_transport_t *transport)
+{
+  pn_collector_t *collector = pni_transport_collector(transport);
+  if (transport->posted_head_closed && transport->posted_tail_closed) {
+    pn_collector_put(collector, PN_OBJECT, transport, PN_TRANSPORT_CLOSED);
+  }
+}
+
+// process pending input until none remaining or EOS
+static ssize_t transport_consume(pn_transport_t *transport)
+{
+  pn_io_layer_t *io_layer = transport->io_layers;
+  size_t consumed = 0;
+
+  while (transport->input_pending || transport->tail_closed) {
+    ssize_t n;
+    n = io_layer->process_input( io_layer,
+                                 transport->input_buf + consumed,
+                                 transport->input_pending );
+    if (n > 0) {
+      consumed += n;
+      transport->input_pending -= n;
+    } else if (n == 0) {
+      break;
+    } else {
+      assert(n == PN_EOS);
+      if (transport->disp->trace & (PN_TRACE_RAW | PN_TRACE_FRM))
+        pn_transport_log(transport, "  <- EOS");
+      transport->input_pending = 0;  // XXX ???
+      if (!transport->posted_tail_closed) {
+        pn_collector_t *collector = pni_transport_collector(transport);
+        pn_collector_put(collector, PN_OBJECT, transport, PN_TRANSPORT_TAIL_CLOSED);
+        transport->posted_tail_closed = true;
+        pni_maybe_post_closed(transport);
+      }
+      return n;
+    }
+  }
+
+  if (transport->input_pending && consumed) {
+    memmove( transport->input_buf,  &transport->input_buf[consumed], transport->input_pending );
+  }
+
+  return consumed;
+}
+
+static ssize_t pn_input_read_header(pn_transport_t *transport, const char *bytes, size_t available,
+                                    const char *header, size_t size, const char *protocol,
+                                    ssize_t (*next)(pn_io_layer_t *, const char *, size_t))
+{
+  const char *point = header + transport->header_count;
+  int delta = pn_min(available, size - transport->header_count);
+  if (!available || memcmp(bytes, point, delta)) {
+    char quoted[1024];
+    pn_quote_data(quoted, 1024, bytes, available);
+    pn_do_error(transport, "amqp:connection:framing-error",
+                "%s header mismatch: '%s'%s", protocol, quoted,
+                available ? "" : " (connection aborted)");
+    return PN_EOS;
+  } else {
+    transport->header_count += delta;
+    if (transport->header_count == size) {
+      transport->header_count = 0;
+      transport->io_layers[PN_IO_AMQP].process_input = next;
+
+      if (transport->disp->trace & PN_TRACE_FRM)
+        pn_transport_logf(transport, "  <- %s", protocol);
+    }
+    return delta;
+  }
+}
+
+#define AMQP_HEADER ("AMQP\x00\x01\x00\x00")
+
+static ssize_t pn_input_read_amqp_header(pn_io_layer_t *io_layer, const char *bytes, size_t available)
+{
+  pn_transport_t *transport = (pn_transport_t *)io_layer->context;
+  return pn_input_read_header(transport, bytes, available, AMQP_HEADER, 8,
+                              "AMQP", pn_input_read_amqp);
+}
+
+static ssize_t pn_input_read_amqp(pn_io_layer_t *io_layer, const char *bytes, size_t available)
+{
+  pn_transport_t *transport = (pn_transport_t *)io_layer->context;
+  if (transport->close_rcvd) {
+    if (available > 0) {
+      pn_do_error(transport, "amqp:connection:framing-error", "data after close");
+      return PN_EOS;
+    }
+  }
+
+  if (!available) {
+    pn_do_error(transport, "amqp:connection:framing-error", "connection aborted");
+    return PN_EOS;
+  }
+
+
+  ssize_t n = pn_dispatcher_input(transport->disp, bytes, available);
+  if (n < 0) {
+    //return pn_error_set(transport->error, n, "dispatch error");
+    return PN_EOS;
+  } else if (transport->close_rcvd) {
+    return PN_EOS;
+  } else {
+    return n;
+  }
+}
+
+/* process AMQP related timer events */
+static pn_timestamp_t pn_tick_amqp(pn_io_layer_t *io_layer, pn_timestamp_t now)
+{
+  pn_timestamp_t timeout = 0;
+  pn_transport_t *transport = (pn_transport_t *)io_layer->context;
+
+  if (transport->local_idle_timeout) {
+    if (transport->dead_remote_deadline == 0 ||
+        transport->last_bytes_input != transport->bytes_input) {
+      transport->dead_remote_deadline = now + transport->local_idle_timeout;
+      transport->last_bytes_input = transport->bytes_input;
+    } else if (transport->dead_remote_deadline <= now) {
+      transport->dead_remote_deadline = now + transport->local_idle_timeout;
+      // Note: AMQP-1.0 really should define a generic "timeout" error, but does not.
+      pn_do_error(transport, "amqp:resource-limit-exceeded", "local-idle-timeout expired");
+    }
+    timeout = transport->dead_remote_deadline;
+  }
+
+  // Prevent remote idle timeout as describe by AMQP 1.0:
+  if (transport->remote_idle_timeout && !transport->close_sent) {
+    if (transport->keepalive_deadline == 0 ||
+        transport->last_bytes_output != transport->bytes_output) {
+      transport->keepalive_deadline = now + (pn_timestamp_t)(transport->remote_idle_timeout/2.0);
+      transport->last_bytes_output = transport->bytes_output;
+    } else if (transport->keepalive_deadline <= now) {
+      transport->keepalive_deadline = now + (pn_timestamp_t)(transport->remote_idle_timeout/2.0);
+      if (transport->disp->available == 0) {    // no outbound data pending
+        // so send empty frame (and account for it!)
+        pn_post_frame(transport->disp, 0, "");
+        transport->last_bytes_output += transport->disp->available;
+      }
+    }
+    timeout = pn_timestamp_min( timeout, transport->keepalive_deadline );
+  }
+
+  return timeout;
+}
+
+int pn_process_conn_setup(pn_transport_t *transport, pn_endpoint_t *endpoint)
+{
+  if (endpoint->type == CONNECTION)
+  {
+    if (!(endpoint->state & PN_LOCAL_UNINIT) && !transport->open_sent)
+    {
+      // as per the recommendation in the spec, advertise half our
+      // actual timeout to the remote
+      const pn_millis_t idle_timeout = transport->local_idle_timeout
+          ? (transport->local_idle_timeout/2)
+          : 0;
+      pn_connection_t *connection = (pn_connection_t *) endpoint;
+      const char *cid = pn_string_get(connection->container);
+      int err = pn_post_frame(transport->disp, 0, "DL[SS?I?H?InnCCC]", OPEN,
+                              cid ? cid : "",
+                              pn_string_get(connection->hostname),
+                              // if not zero, advertise our max frame size and idle timeout
+                              (bool)transport->local_max_frame, transport->local_max_frame,
+                              (bool)transport->channel_max, transport->channel_max,
+                              (bool)idle_timeout, idle_timeout,
+                              connection->offered_capabilities,
+                              connection->desired_capabilities,
+                              connection->properties);
+      if (err) return err;
+      transport->open_sent = true;
+    }
+  }
+
+  return 0;
+}
+
+static uint16_t allocate_alias(pn_hash_t *aliases)
+{
+  for (uint32_t i = 0; i < 65536; i++) {
+    if (!pn_hash_get(aliases, i)) {
+      return i;
+    }
+  }
+
+  assert(false);
+  return 0;
+}
+
+size_t pn_session_outgoing_window(pn_session_t *ssn)
+{
+  uint32_t size = ssn->connection->transport->remote_max_frame;
+  if (!size) {
+    return ssn->outgoing_deliveries;
+  } else {
+    pn_sequence_t frames = ssn->outgoing_bytes/size;
+    if (ssn->outgoing_bytes % size) {
+      frames++;
+    }
+    return pn_max(frames, ssn->outgoing_deliveries);
+  }
+}
+
+size_t pn_session_incoming_window(pn_session_t *ssn)
+{
+  uint32_t size = ssn->connection->transport->local_max_frame;
+  if (!size) {
+    return 2147483647; // biggest legal value
+  } else {
+    return (ssn->incoming_capacity - ssn->incoming_bytes)/size;
+  }
+}
+
+static void pni_map_local_channel(pn_session_t *ssn)
+{
+  pn_transport_t *transport = ssn->connection->transport;
+  pn_session_state_t *state = &ssn->state;
+  uint16_t channel = allocate_alias(transport->local_channels);
+  state->local_channel = channel;
+  pn_hash_put(transport->local_channels, channel, ssn);
+}
+
+int pn_process_ssn_setup(pn_transport_t *transport, pn_endpoint_t *endpoint)
+{
+  if (endpoint->type == SESSION && transport->open_sent)
+  {
+    pn_session_t *ssn = (pn_session_t *) endpoint;
+    pn_session_state_t *state = &ssn->state;
+    if (!(endpoint->state & PN_LOCAL_UNINIT) && state->local_channel == (uint16_t) -1)
+    {
+      pni_map_local_channel(ssn);
+      state->incoming_window = pn_session_incoming_window(ssn);
+      state->outgoing_window = pn_session_outgoing_window(ssn);
+      pn_post_frame(transport->disp, state->local_channel, "DL[?HIII]", BEGIN,
+                    ((int16_t) state->remote_channel >= 0), state->remote_channel,
+                    state->outgoing_transfer_count,
+                    state->incoming_window,
+                    state->outgoing_window);
+    }
+  }
+
+  return 0;
+}
+
+static const char *expiry_symbol(pn_expiry_policy_t policy)
+{
+  switch (policy)
+  {
+  case PN_EXPIRE_WITH_LINK:
+    return "link-detach";
+  case PN_EXPIRE_WITH_SESSION:
+    return NULL;
+  case PN_EXPIRE_WITH_CONNECTION:
+    return "connection-close";
+  case PN_EXPIRE_NEVER:
+    return "never";
+  }
+  return NULL;
+}
+
+static void pni_map_local_handle(pn_link_t *link) {
+  pn_link_state_t *state = &link->state;
+  pn_session_state_t *ssn_state = &link->session->state;
+  state->local_handle = allocate_alias(ssn_state->local_handles);
+  pn_hash_put(ssn_state->local_handles, state->local_handle, link);
+}
+
+int pn_process_link_setup(pn_transport_t *transport, pn_endpoint_t *endpoint)
+{
+  if (transport->open_sent && (endpoint->type == SENDER ||
+                               endpoint->type == RECEIVER))
+  {
+    pn_link_t *link = (pn_link_t *) endpoint;
+    pn_session_state_t *ssn_state = &link->session->state;
+    pn_link_state_t *state = &link->state;
+    if (((int16_t) ssn_state->local_channel >= 0) &&
+        !(endpoint->state & PN_LOCAL_UNINIT) && state->local_handle == (uint32_t) -1)
+    {
+      pni_map_local_handle(link);
+      const pn_distribution_mode_t dist_mode = link->source.distribution_mode;
+      int err = pn_post_frame(transport->disp, ssn_state->local_channel,
+                              "DL[SIoBB?DL[SIsIoC?sCnCC]?DL[SIsIoCC]nnI]", ATTACH,
+                              pn_string_get(link->name),
+                              state->local_handle,
+                              endpoint->type == RECEIVER,
+                              link->snd_settle_mode,
+                              link->rcv_settle_mode,
+                              (bool) link->source.type, SOURCE,
+                              pn_string_get(link->source.address),
+                              link->source.durability,
+                              expiry_symbol(link->source.expiry_policy),
+                              link->source.timeout,
+                              link->source.dynamic,
+                              link->source.properties,
+                              (dist_mode != PN_DIST_MODE_UNSPECIFIED), dist_mode2symbol(dist_mode),
+                              link->source.filter,
+                              link->source.outcomes,
+                              link->source.capabilities,
+                              (bool) link->target.type, TARGET,
+                              pn_string_get(link->target.address),
+                              link->target.durability,
+                              expiry_symbol(link->target.expiry_policy),
+                              link->target.timeout,
+                              link->target.dynamic,
+                              link->target.properties,
+                              link->target.capabilities,
+                              0);
+      if (err) return err;
+    }
+  }
+
+  return 0;
+}
+
+int pn_post_flow(pn_transport_t *transport, pn_session_t *ssn, pn_link_t *link)
+{
+  ssn->state.incoming_window = pn_session_incoming_window(ssn);
+  ssn->state.outgoing_window = pn_session_outgoing_window(ssn);
+  bool linkq = (bool) link;
+  pn_link_state_t *state = &link->state;
+  return pn_post_frame(transport->disp, ssn->state.local_channel, "DL[?IIII?I?I?In?o]", FLOW,
+                       (int16_t) ssn->state.remote_channel >= 0, ssn->state.incoming_transfer_count,
+                       ssn->state.incoming_window,
+                       ssn->state.outgoing_transfer_count,
+                       ssn->state.outgoing_window,
+                       linkq, linkq ? state->local_handle : 0,
+                       linkq, linkq ? state->delivery_count : 0,
+                       linkq, linkq ? state->link_credit : 0,
+                       linkq, linkq ? link->drain : false);
+}
+
+int pn_process_flow_receiver(pn_transport_t *transport, pn_endpoint_t *endpoint)
+{
+  if (endpoint->type == RECEIVER && endpoint->state & PN_LOCAL_ACTIVE)
+  {
+    pn_link_t *rcv = (pn_link_t *) endpoint;
+    pn_session_t *ssn = rcv->session;
+    pn_link_state_t *state = &rcv->state;
+    if ((int16_t) ssn->state.local_channel >= 0 &&
+        (int32_t) state->local_handle >= 0 &&
+        ((rcv->drain || state->link_credit != rcv->credit - rcv->queued) || !ssn->state.incoming_window)) {
+      state->link_credit = rcv->credit - rcv->queued;
+      return pn_post_flow(transport, ssn, rcv);
+    }
+  }
+
+  return 0;
+}
+
+int pn_flush_disp(pn_transport_t *transport, pn_session_t *ssn)
+{
+  uint64_t code = ssn->state.disp_code;
+  bool settled = ssn->state.disp_settled;
+  if (ssn->state.disp) {
+    int err = pn_post_frame(transport->disp, ssn->state.local_channel, "DL[oIIo?DL[]]", DISPOSITION,
+                            ssn->state.disp_type, ssn->state.disp_first, ssn->state.disp_last,
+                            settled, (bool)code, code);
+    if (err) return err;
+    ssn->state.disp_type = 0;
+    ssn->state.disp_code = 0;
+    ssn->state.disp_settled = 0;
+    ssn->state.disp_first = 0;
+    ssn->state.disp_last = 0;
+    ssn->state.disp = false;
+  }
+  return 0;
+}
+
+int pn_post_disp(pn_transport_t *transport, pn_delivery_t *delivery)
+{
+  pn_link_t *link = delivery->link;
+  pn_session_t *ssn = link->session;
+  pn_session_state_t *ssn_state = &ssn->state;
+  pn_modified(transport->connection, &link->session->endpoint, false);
+  pn_delivery_state_t *state = &delivery->state;
+  assert(state->init);
+  bool role = (link->endpoint.type == RECEIVER);
+  uint64_t code = delivery->local.type;
+
+  if (!code && !delivery->local.settled) {
+    return 0;
+  }
+
+  if (!pni_disposition_batchable(&delivery->local)) {
+    pn_data_clear(transport->disp_data);
+    pni_disposition_encode(&delivery->local, transport->disp_data);
+    return pn_post_frame(transport->disp, ssn->state.local_channel,
+                         "DL[oIIo?DLC]", DISPOSITION,
+                         role, state->id, state->id, delivery->local.settled,
+                         (bool)code, code, transport->disp_data);
+  }
+
+  if (ssn_state->disp && code == ssn_state->disp_code &&
+      delivery->local.settled == ssn_state->disp_settled &&
+      ssn_state->disp_type == role) {
+    if (state->id == ssn_state->disp_first - 1) {
+      ssn_state->disp_first = state->id;
+      return 0;
+    } else if (state->id == ssn_state->disp_last + 1) {
+      ssn_state->disp_last = state->id;
+      return 0;
+    }
+  }
+
+  if (ssn_state->disp) {
+    int err = pn_flush_disp(transport, ssn);
+    if (err) return err;
+  }
+
+  ssn_state->disp_type = role;
+  ssn_state->disp_code = code;
+  ssn_state->disp_settled = delivery->local.settled;
+  ssn_state->disp_first = state->id;
+  ssn_state->disp_last = state->id;
+  ssn_state->disp = true;
+
+  return 0;
+}
+
+int pn_process_tpwork_sender(pn_transport_t *transport, pn_delivery_t *delivery, bool *settle)
+{
+  *settle = false;
+  pn_link_t *link = delivery->link;
+  pn_session_state_t *ssn_state = &link->session->state;
+  pn_link_state_t *link_state = &link->state;
+  bool xfr_posted = false;
+  if ((int16_t) ssn_state->local_channel >= 0 && (int32_t) link_state->local_handle >= 0) {
+    pn_delivery_state_t *state = &delivery->state;
+    if (!state->sent && (delivery->done || pn_buffer_size(delivery->bytes) > 0) &&
+        ssn_state->remote_incoming_window > 0 && link_state->link_credit > 0) {
+      if (!state->init) {
+        state = pn_delivery_map_push(&ssn_state->outgoing, delivery);
+      }
+
+      pn_bytes_t bytes = pn_buffer_bytes(delivery->bytes);
+      pn_set_payload(transport->disp, bytes.start, bytes.size);
+      pn_bytes_t tag = pn_buffer_bytes(delivery->tag);
+      int count = pn_post_transfer_frame(transport->disp,
+                                         ssn_state->local_channel,
+                                         link_state->local_handle,
+                                         state->id, &tag,
+                                         0, // message-format
+                                         delivery->local.settled,
+                                         !delivery->done,
+                                         ssn_state->remote_incoming_window);
+      if (count < 0) return count;
+      xfr_posted = true;
+      ssn_state->outgoing_transfer_count += count;
+      ssn_state->remote_incoming_window -= count;
+
+      int sent = bytes.size - transport->disp->output_size;
+      pn_buffer_trim(delivery->bytes, sent, 0);
+      link->session->outgoing_bytes -= sent;
+      if (!pn_buffer_size(delivery->bytes) && delivery->done) {
+        state->sent = true;
+        link_state->delivery_count++;
+        link_state->link_credit--;
+        link->queued--;
+        link->session->outgoing_deliveries--;
+      }
+
+      pn_collector_put(transport->connection->collector, PN_OBJECT, link, PN_LINK_FLOW);
+    }
+  }
+
+  pn_delivery_state_t *state = delivery->state.init ? &delivery->state : NULL;
+  if ((int16_t) ssn_state->local_channel >= 0 && !delivery->remote.settled
+      && state && state->sent && !xfr_posted) {
+    int err = pn_post_disp(transport, delivery);
+    if (err) return err;
+  }
+
+  *settle = delivery->local.settled && state && state->sent;
+  return 0;
+}
+
+int pn_process_tpwork_receiver(pn_transport_t *transport, pn_delivery_t *delivery, bool *settle)
+{
+  *settle = false;
+  pn_link_t *link = delivery->link;
+  // XXX: need to prevent duplicate disposition sending
+  pn_session_t *ssn = link->session;
+  if ((int16_t) ssn->state.local_channel >= 0 && !delivery->remote.settled && delivery->state.init) {
+    int err = pn_post_disp(transport, delivery);
+    if (err) return err;
+  }
+
+  // XXX: need to centralize this policy and improve it
+  if (!ssn->state.incoming_window) {
+    int err = pn_post_flow(transport, ssn, link);
+    if (err) return err;
+  }
+
+  *settle = delivery->local.settled;
+  return 0;
+}
+
+int pn_process_tpwork(pn_transport_t *transport, pn_endpoint_t *endpoint)
+{
+  if (endpoint->type == CONNECTION && !transport->close_sent)
+  {
+    pn_connection_t *conn = (pn_connection_t *) endpoint;
+    pn_delivery_t *delivery = conn->tpwork_head;
+    while (delivery)
+    {
+      pn_delivery_t *tp_next = delivery->tpwork_next;
+      bool settle = false;
+
+      pn_link_t *link = delivery->link;
+      pn_delivery_map_t *dm = NULL;
+      if (pn_link_is_sender(link)) {
+        dm = &link->session->state.outgoing;
+        int err = pn_process_tpwork_sender(transport, delivery, &settle);
+        if (err) return err;
+      } else {
+        dm = &link->session->state.incoming;
+        int err = pn_process_tpwork_receiver(transport, delivery, &settle);
+        if (err) return err;
+      }
+
+      if (settle) {
+        pn_full_settle(dm, delivery);
+      } else if (!pn_delivery_buffered(delivery)) {
+        pn_clear_tpwork(delivery);
+      }
+
+      delivery = tp_next;
+    }
+  }
+
+  return 0;
+}
+
+int pn_process_flush_disp(pn_transport_t *transport, pn_endpoint_t *endpoint)
+{
+  if (endpoint->type == SESSION) {
+    pn_session_t *session = (pn_session_t *) endpoint;
+    pn_session_state_t *state = &session->state;
+    if ((int16_t) state->local_channel >= 0 && !transport->close_sent)
+    {
+      int err = pn_flush_disp(transport, session);
+      if (err) return err;
+    }
+  }
+
+  return 0;
+}
+
+int pn_process_flow_sender(pn_transport_t *transport, pn_endpoint_t *endpoint)
+{
+  if (endpoint->type == SENDER && endpoint->state & PN_LOCAL_ACTIVE)
+  {
+    pn_link_t *snd = (pn_link_t *) endpoint;
+    pn_session_t *ssn = snd->session;
+    pn_link_state_t *state = &snd->state;
+    if ((int16_t) ssn->state.local_channel >= 0 &&
+        (int32_t) state->local_handle >= 0 &&
+        snd->drain && snd->drained) {
+      pn_delivery_t *tail = snd->unsettled_tail;
+      if (!tail || !pn_delivery_buffered(tail)) {
+        state->delivery_count += state->link_credit;
+        state->link_credit = 0;
+        snd->drained = 0;
+        return pn_post_flow(transport, ssn, snd);
+      }
+    }
+  }
+
+  return 0;
+}
+
+static void pni_unmap_local_handle(pn_link_t *link) {
+  pn_link_state_t *state = &link->state;
+  uintptr_t handle = state->local_handle;
+  state->local_handle = -2;
+  // may delete link
+  pn_hash_del(link->session->state.local_handles, handle);
+}
+
+int pn_process_link_teardown(pn_transport_t *transport, pn_endpoint_t *endpoint)
+{
+  if (endpoint->type == SENDER || endpoint->type == RECEIVER)
+  {
+    pn_link_t *link = (pn_link_t *) endpoint;
+    pn_session_t *session = link->session;
+    pn_session_state_t *ssn_state = &session->state;
+    pn_link_state_t *state = &link->state;
+    if (((endpoint->state & PN_LOCAL_CLOSED) || link->detached) && (int32_t) state->local_handle >= 0 &&
+        (int16_t) ssn_state->local_channel >= 0 && !transport->close_sent) {
+      if (pn_link_is_sender(link) && pn_link_queued(link) &&
+          (int32_t) state->remote_handle != -2 &&
+          (int16_t) ssn_state->remote_channel != -2 &&
+          !transport->close_rcvd) return 0;
+
+      const char *name = NULL;
+      const char *description = NULL;
+      pn_data_t *info = NULL;
+
+      if (pn_condition_is_set(&endpoint->condition)) {
+        name = pn_condition_get_name(&endpoint->condition);
+        description = pn_condition_get_description(&endpoint->condition);
+        info = pn_condition_info(&endpoint->condition);
+      }
+
+      int err =
+          pn_post_frame(transport->disp, ssn_state->local_channel,
+                        "DL[Io?DL[sSC]]", DETACH, state->local_handle, !link->detached,
+                        (bool)name, ERROR, name, description, info);
+      if (err) return err;
+      pni_unmap_local_handle(link);
+    }
+
+    pn_clear_modified(transport->connection, endpoint);
+  }
+
+  return 0;
+}
+
+bool pn_pointful_buffering(pn_transport_t *transport, pn_session_t *session)
+{
+  if (transport->close_rcvd) return false;
+  if (!transport->open_rcvd) return true;
+
+  pn_connection_t *conn = transport->connection;
+  pn_link_t *link = pn_link_head(conn, 0);
+  while (link) {
+    if (pn_link_is_sender(link) && pn_link_queued(link) > 0) {
+      pn_session_t *ssn = link->session;
+      if (session && session == ssn) {
+        if ((int32_t) link->state.remote_handle != -2 &&
+            (int16_t) session->state.remote_channel != -2) {
+          return true;
+        }
+      }
+    }
+    link = pn_link_next(link, 0);
+  }
+
+  return false;
+}
+
+static void pni_unmap_local_channel(pn_session_t *ssn) {
+  // XXX: should really update link state also
+  pni_transport_unbind_handles(ssn->state.local_handles, false);
+  pn_transport_t *transport = ssn->connection->transport;
+  pn_session_state_t *state = &ssn->state;
+  uintptr_t channel = state->local_channel;
+  state->local_channel = -2;
+  // may delete session
+  pn_hash_del(transport->local_channels, channel);
+}
+
+int pn_process_ssn_teardown(pn_transport_t *transport, pn_endpoint_t *endpoint)
+{
+  if (endpoint->type == SESSION)
+  {
+    pn_session_t *session = (pn_session_t *) endpoint;
+    pn_session_state_t *state = &session->state;
+    if (endpoint->state & PN_LOCAL_CLOSED && (int16_t) state->local_channel >= 0
+        && !transport->close_sent)
+    {
+      if (pn_pointful_buffering(transport, session)) {
+        return 0;
+      }
+
+      const char *name = NULL;
+      const char *description = NULL;
+      pn_data_t *info = NULL;
+
+      if (pn_condition_is_set(&endpoint->condition)) {
+        name = pn_condition_get_name(&endpoint->condition);
+        description = pn_condition_get_description(&endpoint->condition);
+        info = pn_condition_info(&endpoint->condition);
+      }
+
+      int err = pn_post_frame(transport->disp, state->local_channel, "DL[?DL[sSC]]", END,
+                              (bool) name, ERROR, name, description, info);
+      if (err) return err;
+      pni_unmap_local_channel(session);
+    }
+
+    pn_clear_modified(transport->connection, endpoint);
+  }
+  return 0;
+}
+
+int pn_process_conn_teardown(pn_transport_t *transport, pn_endpoint_t *endpoint)
+{
+  if (endpoint->type == CONNECTION)
+  {
+    if (endpoint->state & PN_LOCAL_CLOSED && !transport->close_sent) {
+      if (pn_pointful_buffering(transport, NULL)) return 0;
+      int err = pn_post_close(transport, NULL, NULL);
+      if (err) return err;
+      transport->close_sent = true;
+    }
+
+    pn_clear_modified(transport->connection, endpoint);
+  }
+  return 0;
+}
+
+int pn_phase(pn_transport_t *transport, int (*phase)(pn_transport_t *, pn_endpoint_t *))
+{
+  pn_connection_t *conn = transport->connection;
+  pn_endpoint_t *endpoint = conn->transport_head;
+  while (endpoint)
+  {
+    pn_endpoint_t *next = endpoint->transport_next;
+    int err = phase(transport, endpoint);
+    if (err) return err;
+    endpoint = next;
+  }
+  return 0;
+}
+
+int pn_process(pn_transport_t *transport)
+{
+  int err;
+  if ((err = pn_phase(transport, pn_process_conn_setup))) return err;
+  if ((err = pn_phase(transport, pn_process_ssn_setup))) return err;
+  if ((err = pn_phase(transport, pn_process_link_setup))) return err;
+  if ((err = pn_phase(transport, pn_process_flow_receiver))) return err;
+
+  // XXX: this has to happen two times because we might settle stuff
+  // on the first pass and create space for more work to be done on the
+  // second pass
+  if ((err = pn_phase(transport, pn_process_tpwork))) return err;
+  if ((err = pn_phase(transport, pn_process_tpwork))) return err;
+
+  if ((err = pn_phase(transport, pn_process_flush_disp))) return err;
+
+  if ((err = pn_phase(transport, pn_process_flow_sender))) return err;
+  if ((err = pn_phase(transport, pn_process_link_teardown))) return err;
+  if ((err = pn_phase(transport, pn_process_ssn_teardown))) return err;
+  if ((err = pn_phase(transport, pn_process_conn_teardown))) return err;
+
+  if (transport->connection->tpwork_head) {
+    pn_modified(transport->connection, &transport->connection->endpoint, false);
+  }
+
+  return 0;
+}
+
+static ssize_t pn_output_write_header(pn_transport_t *transport,
+                                      char *bytes, size_t size,
+                                      const char *header, size_t hdrsize,
+                                      const char *protocol,
+                                      ssize_t (*next)(pn_io_layer_t *, char *, size_t))
+{
+  if (transport->disp->trace & PN_TRACE_FRM)
+    pn_transport_logf(transport, "  -> %s", protocol);
+  assert(size >= hdrsize);
+  memmove(bytes, header, hdrsize);
+  transport->io_layers[PN_IO_AMQP].process_output = next;
+  return hdrsize;
+}
+
+static ssize_t pn_output_write_amqp_header(pn_io_layer_t *io_layer, char *bytes, size_t size)
+{
+  pn_transport_t *transport = (pn_transport_t *)io_layer->context;
+  return pn_output_write_header(transport, bytes, size, AMQP_HEADER, 8, "AMQP",
+                                pn_output_write_amqp);
+}
+
+static ssize_t pn_output_write_amqp(pn_io_layer_t *io_layer, char *bytes, size_t size)
+{
+  pn_transport_t *transport = (pn_transport_t *)io_layer->context;
+  if (transport->connection && !transport->done_processing) {
+    int err = pn_process(transport);
+    if (err) {
+      pn_transport_logf(transport, "process error %i", err);
+      transport->done_processing = true;
+    }
+  }
+
+  // write out any buffered data _before_ returning PN_EOS, else we
+  // could truncate an outgoing Close frame containing a useful error
+  // status
+  if (!transport->disp->available && transport->close_sent) {
+    return PN_EOS;
+  }
+
+  return pn_dispatcher_output(transport->disp, bytes, size);
+}
+
+// generate outbound data, return amount of pending output else error
+static ssize_t transport_produce(pn_transport_t *transport)
+{
+  pn_io_layer_t *io_layer = transport->io_layers;
+  ssize_t space = transport->output_size - transport->output_pending;
+
+  if (space <= 0) {     // can we expand the buffer?
+    int more = 0;
+    if (!transport->remote_max_frame)   // no limit, so double it
+      more = transport->output_size;
+    else if (transport->remote_max_frame > transport->output_size)
+      more = pn_min(transport->output_size, transport->remote_max_frame - transport->output_size);
+    if (more) {
+      char *newbuf = (char *)realloc( transport->output_buf, transport->output_size + more );
+      if (newbuf) {
+        transport->output_buf = newbuf;
+        transport->output_size += more;
+        space += more;
+      }
+    }
+  }
+
+  while (space > 0) {
+    ssize_t n;
+    n = io_layer->process_output( io_layer,
+                                  &transport->output_buf[transport->output_pending],
+                                  space );
+    if (n > 0) {
+      space -= n;
+      transport->output_pending += n;
+    } else if (n == 0) {
+      break;
+    } else {
+      if (transport->output_pending)
+        break;   // return what is available
+      if (transport->disp->trace & (PN_TRACE_RAW | PN_TRACE_FRM)) {
+        if (n < 0) {
+          pn_transport_log(transport, "  -> EOS");
+        }
+        /*else
+          pn_transport_logf(transport, "  -> EOS (%" PN_ZI ") %s", n,
+          pn_error_text(transport->error));*/
+      }
+      return n;
+    }
+  }
+  return transport->output_pending;
+}
+
+// deprecated
+ssize_t pn_transport_output(pn_transport_t *transport, char *bytes, size_t size)
+{
+  if (!transport) return PN_ARG_ERR;
+  ssize_t available = pn_transport_pending(transport);
+  if (available > 0) {
+    available = (ssize_t) pn_min( (size_t)available, size );
+    memmove( bytes, pn_transport_head(transport), available );
+    pn_transport_pop( transport, (size_t) available );
+  }
+  return available;
+}
+
+
+void pn_transport_trace(pn_transport_t *transport, pn_trace_t trace)
+{
+  if (transport->sasl) pn_sasl_trace(transport->sasl, trace);
+  if (transport->ssl) pn_ssl_trace(transport->ssl, trace);
+  transport->disp->trace = trace;
+}
+
+void pn_transport_set_tracer(pn_transport_t *transport, pn_tracer_t tracer)
+{
+  assert(transport);
+  assert(tracer);
+
+  transport->tracer = tracer;
+}
+
+pn_tracer_t pn_transport_get_tracer(pn_transport_t *transport)
+{
+  assert(transport);
+  return transport->tracer;
+}
+
+void pn_transport_set_context(pn_transport_t *transport, void *context)
+{
+  assert(transport);
+  transport->context = context;
+}
+
+void *pn_transport_get_context(pn_transport_t *transport)
+{
+  assert(transport);
+  return transport->context;
+}
+
+void pn_transport_log(pn_transport_t *transport, const char *message)
+{
+  assert(transport);
+  transport->tracer(transport, message);
+}
+
+void pn_transport_logf(pn_transport_t *transport, const char *fmt, ...)
+{
+  va_list ap;
+
+  va_start(ap, fmt);
+  pn_string_vformat(transport->scratch, fmt, ap);
+  va_end(ap);
+
+  pn_transport_log(transport, pn_string_get(transport->scratch));
+}
+
+uint16_t pn_transport_get_channel_max(pn_transport_t *transport)
+{
+  return transport->channel_max;
+}
+
+void pn_transport_set_channel_max(pn_transport_t *transport, uint16_t channel_max)
+{
+  transport->channel_max = channel_max;
+}
+
+uint16_t pn_transport_remote_channel_max(pn_transport_t *transport)
+{
+  return transport->remote_channel_max;
+}
+
+uint32_t pn_transport_get_max_frame(pn_transport_t *transport)
+{
+  return transport->local_max_frame;
+}
+
+void pn_transport_set_max_frame(pn_transport_t *transport, uint32_t size)
+{
+  // if size == 0, no advertised limit to input frame size.
+  if (size && size < AMQP_MIN_MAX_FRAME_SIZE)
+    size = AMQP_MIN_MAX_FRAME_SIZE;
+  transport->local_max_frame = size;
+}
+
+uint32_t pn_transport_get_remote_max_frame(pn_transport_t *transport)
+{
+  return transport->remote_max_frame;
+}
+
+pn_millis_t pn_transport_get_idle_timeout(pn_transport_t *transport)
+{
+  return transport->local_idle_timeout;
+}
+
+void pn_transport_set_idle_timeout(pn_transport_t *transport, pn_millis_t timeout)
+{
+  transport->local_idle_timeout = timeout;
+  transport->io_layers[PN_IO_AMQP].process_tick = pn_tick_amqp;
+}
+
+pn_millis_t pn_transport_get_remote_idle_timeout(pn_transport_t *transport)
+{
+  return transport->remote_idle_timeout;
+}
+
+pn_timestamp_t pn_transport_tick(pn_transport_t *transport, pn_timestamp_t now)
+{
+  pn_io_layer_t *io_layer = transport->io_layers;
+  return io_layer->process_tick( io_layer, now );
+}
+
+uint64_t pn_transport_get_frames_output(const pn_transport_t *transport)
+{
+  if (transport && transport->disp)
+    return transport->disp->output_frames_ct;
+  return 0;
+}
+
+uint64_t pn_transport_get_frames_input(const pn_transport_t *transport)
+{
+  if (transport && transport->disp)
+    return transport->disp->input_frames_ct;
+  return 0;
+}
+
+/** Pass through input handler */
+ssize_t pn_io_layer_input_passthru(pn_io_layer_t *io_layer, const char *data, size_t available)
+{
+  pn_io_layer_t *next = io_layer->next;
+  if (next)
+    return next->process_input( next, data, available );
+  return PN_EOS;
+}
+
+/** Pass through output handler */
+ssize_t pn_io_layer_output_passthru(pn_io_layer_t *io_layer, char *bytes, size_t size)
+{
+  pn_io_layer_t *next = io_layer->next;
+  if (next)
+    return next->process_output( next, bytes, size );
+  return PN_EOS;
+}
+
+/** Pass through tick handler */
+pn_timestamp_t pn_io_layer_tick_passthru(pn_io_layer_t *io_layer, pn_timestamp_t now)
+{
+  pn_io_layer_t *next = io_layer->next;
+  if (next)
+    return next->process_tick( next, now );
+  return 0;
+}
+
+
+///
+
+// input
+ssize_t pn_transport_capacity(pn_transport_t *transport)  /* <0 == done */
+{
+  if (transport->tail_closed) return PN_EOS;
+  //if (pn_error_code(transport->error)) return pn_error_code(transport->error);
+
+  ssize_t capacity = transport->input_size - transport->input_pending;
+  if ( capacity<=0 ) {
+    // can we expand the size of the input buffer?
+    int more = 0;
+    if (!transport->local_max_frame) {  // no limit (ha!)
+      more = transport->input_size;
+    } else if (transport->local_max_frame > transport->input_size) {
+      more = pn_min(transport->input_size, transport->local_max_frame - transport->input_size);
+    }
+    if (more) {
+      char *newbuf = (char *) realloc( transport->input_buf, transport->input_size + more );
+      if (newbuf) {
+        transport->input_buf = newbuf;
+        transport->input_size += more;
+        capacity += more;
+      }
+    }
+  }
+  return capacity;
+}
+
+
+char *pn_transport_tail(pn_transport_t *transport)
+{
+  if (transport && transport->input_pending < transport->input_size) {
+    return &transport->input_buf[transport->input_pending];
+  }
+  return NULL;
+}
+
+ssize_t pn_transport_push(pn_transport_t *transport, const char *src, size_t size)
+{
+  assert(transport);
+
+  ssize_t capacity = pn_transport_capacity(transport);
+  if (capacity < 0) {
+    return capacity;
+  } else if (size > (size_t) capacity) {
+    size = capacity;
+  }
+
+  char *dst = pn_transport_tail(transport);
+  assert(dst);
+  memmove(dst, src, size);
+
+  int n = pn_transport_process(transport, size);
+  if (n < 0) {
+    return n;
+  } else {
+    return size;
+  }
+}
+
+void pni_close_tail(pn_transport_t *transport)
+{
+  if (!transport->tail_closed) {
+    transport->tail_closed = true;
+  }
+}
+
+int pn_transport_process(pn_transport_t *transport, size_t size)
+{
+  assert(transport);
+  size = pn_min( size, (transport->input_size - transport->input_pending) );
+  transport->input_pending += size;
+  transport->bytes_input += size;
+
+  ssize_t n = transport_consume( transport );
+  if (n == PN_EOS) {
+    pni_close_tail(transport);
+  }
+
+  if (n < 0 && n != PN_EOS) return n;
+  return 0;
+}
+
+// input stream has closed
+int pn_transport_close_tail(pn_transport_t *transport)
+{
+  pni_close_tail(transport);
+  transport_consume( transport );
+  return 0;
+  // XXX: what if not all input processed at this point?  do we care???
+}
+
+// output
+ssize_t pn_transport_pending(pn_transport_t *transport)      /* <0 == done */
+{
+  assert(transport);
+  if (transport->head_closed) return PN_EOS;
+  return transport_produce( transport );
+}
+
+const char *pn_transport_head(pn_transport_t *transport)
+{
+  if (transport && transport->output_pending) {
+    return transport->output_buf;
+  }
+  return NULL;
+}
+
+ssize_t pn_transport_peek(pn_transport_t *transport, char *dst, size_t size)
+{
+  assert(transport);
+
+  ssize_t pending = pn_transport_pending(transport);
+  if (pending < 0) {
+    return pending;
+  } else if (size > (size_t) pending) {
+    size = pending;
+  }
+
+  if (pending > 0) {
+    const char *src = pn_transport_head(transport);
+    assert(src);
+    memmove(dst, src, size);
+  }
+
+  return size;
+}
+
+void pn_transport_pop(pn_transport_t *transport, size_t size)
+{
+  if (transport) {
+    assert( transport->output_pending >= size );
+    transport->output_pending -= size;
+    transport->bytes_output += size;
+    if (transport->output_pending) {
+      memmove( transport->output_buf,  &transport->output_buf[size],
+               transport->output_pending );
+    }
+
+    if (!transport->output_pending && pn_transport_pending(transport) < 0 &&
+        !transport->posted_head_closed) {
+      pn_collector_t *collector = pni_transport_collector(transport);
+      pn_collector_put(collector, PN_OBJECT, transport, PN_TRANSPORT_HEAD_CLOSED);
+      transport->posted_head_closed = true;
+      pni_maybe_post_closed(transport);
+    }
+  }
+}
+
+int pn_transport_close_head(pn_transport_t *transport)
+{
+  size_t pending = pn_transport_pending(transport);
+  transport->head_closed = true;
+  pn_transport_pop(transport, pending);
+  return 0;
+}
+
+// true if the transport will not generate further output
+bool pn_transport_quiesced(pn_transport_t *transport)
+{
+  if (!transport) return true;
+  ssize_t pending = pn_transport_pending(transport);
+  if (pending < 0) return true; // output done
+  else if (pending > 0) return false;
+  // no pending at transport, but check if data is buffered in I/O layers
+  pn_io_layer_t *io_layer = transport->io_layers;
+  while (io_layer != &transport->io_layers[PN_IO_LAYER_CT]) {
+    if (io_layer->buffered_output && io_layer->buffered_output( io_layer ))
+      return false;
+    ++io_layer;
+  }
+  return true;
+}
+
+bool pn_transport_closed(pn_transport_t *transport)
+{
+  assert(transport);
+  ssize_t capacity = pn_transport_capacity(transport);
+  ssize_t pending = pn_transport_pending(transport);
+  return capacity < 0 && pending < 0;
+}
+
+pn_connection_t *pn_transport_connection(pn_transport_t *transport)
+{
+  assert(transport);
+  return transport->connection;
+}

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/4c6f2122/proton-j/src/main/resources/cengine.py
----------------------------------------------------------------------
diff --git a/proton-j/src/main/resources/cengine.py b/proton-j/src/main/resources/cengine.py
index 63603bc..f9d4ddb 100644
--- a/proton-j/src/main/resources/cengine.py
+++ b/proton-j/src/main/resources/cengine.py
@@ -419,21 +419,22 @@ class pn_terminus:
   def decode(self, impl):
     if impl is not None:
       self.type = TERMINUS_TYPES_J2P[impl.__class__]
-      self.address = impl.getAddress()
-      self.durability = DURABILITY_J2P[impl.getDurable()]
-      self.expiry_policy = EXPIRY_POLICY_J2P[impl.getExpiryPolicy()]
-      self.timeout = impl.getTimeout().longValue()
-      self.dynamic = impl.getDynamic()
-      obj2dat(impl.getDynamicNodeProperties(), self.properties)
-      array2dat(impl.getCapabilities(), PN_SYMBOL, self.capabilities)
-      if self.type == PN_SOURCE:
-        self.distribution_mode = DISTRIBUTION_MODE_J2P[impl.getDistributionMode()]
-        array2dat(impl.getOutcomes(), PN_SYMBOL, self.outcomes)
-        obj2dat(impl.getFilter(), self.filter)
+      if self.type in (PN_SOURCE, PN_TARGET):
+        self.address = impl.getAddress()
+        self.durability = DURABILITY_J2P[impl.getDurable()]
+        self.expiry_policy = EXPIRY_POLICY_J2P[impl.getExpiryPolicy()]
+        self.timeout = impl.getTimeout().longValue()
+        self.dynamic = impl.getDynamic()
+        obj2dat(impl.getDynamicNodeProperties(), self.properties)
+        array2dat(impl.getCapabilities(), PN_SYMBOL, self.capabilities)
+        if self.type == PN_SOURCE:
+          self.distribution_mode = DISTRIBUTION_MODE_J2P[impl.getDistributionMode()]
+          array2dat(impl.getOutcomes(), PN_SYMBOL, self.outcomes)
+          obj2dat(impl.getFilter(), self.filter)
 
   def encode(self):
     impl = TERMINUS_TYPES_P2J[self.type]()
-    if impl is not None:
+    if self.type in (PN_SOURCE, PN_TARGET):
       impl.setAddress(self.address)
       impl.setDurable(DURABILITY_P2J[self.durability])
       impl.setExpiryPolicy(EXPIRY_POLICY_P2J[self.expiry_policy])

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/4c6f2122/tests/python/proton_tests/engine.py
----------------------------------------------------------------------
diff --git a/tests/python/proton_tests/engine.py b/tests/python/proton_tests/engine.py
index d35f518..eec73d0 100644
--- a/tests/python/proton_tests/engine.py
+++ b/tests/python/proton_tests/engine.py
@@ -547,6 +547,9 @@ class LinkTest(Test):
   def test_target(self):
     self._test_source_target(None, TerminusConfig(address="target"))
 
+  def test_coordinator(self):
+    self._test_source_target(None, TerminusConfig(type=Terminus.COORDINATOR))
+
   def test_source_target_full(self):
     self._test_source_target(TerminusConfig(address="source",
                                             timeout=3,
@@ -619,8 +622,8 @@ class LinkTest(Test):
 
 class TerminusConfig:
 
-  def __init__(self, address=None, timeout=None, durability=None, filter=None,
-               capabilities=None, dynamic=False, dist_mode=None):
+  def __init__(self, type=None, address=None, timeout=None, durability=None,
+               filter=None, capabilities=None, dynamic=False, dist_mode=None):
     self.address = address
     self.timeout = timeout
     self.durability = durability
@@ -628,8 +631,11 @@ class TerminusConfig:
     self.capabilities = capabilities
     self.dynamic = dynamic
     self.dist_mode = dist_mode
+    self.type = type
 
   def __call__(self, terminus):
+    if self.type is not None:
+      terminus.type = self.type
     if self.address is not None:
       terminus.address = self.address
     if self.timeout is not None:


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


[20/50] [abbrv] qpid-proton git commit: PROTON-717: mitigate the CRIME SSL vulnerability

Posted by gs...@apache.org.
PROTON-717: mitigate the CRIME SSL vulnerability

git-svn-id: https://svn.apache.org/repos/asf/qpid/proton/trunk@1632325 13f79535-47bb-0310-9956-ffa450edef68


Project: http://git-wip-us.apache.org/repos/asf/qpid-proton/repo
Commit: http://git-wip-us.apache.org/repos/asf/qpid-proton/commit/423dbc5d
Tree: http://git-wip-us.apache.org/repos/asf/qpid-proton/tree/423dbc5d
Diff: http://git-wip-us.apache.org/repos/asf/qpid-proton/diff/423dbc5d

Branch: refs/heads/examples
Commit: 423dbc5d3db9c48f830b689abce44ce0348608cb
Parents: 8f334e5
Author: Ken Giusti <kg...@apache.org>
Authored: Thu Oct 16 14:52:44 2014 +0000
Committer: Ken Giusti <kg...@apache.org>
Committed: Thu Oct 16 14:52:44 2014 +0000

----------------------------------------------------------------------
 proton-c/src/ssl/openssl.c | 4 ++++
 1 file changed, 4 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/423dbc5d/proton-c/src/ssl/openssl.c
----------------------------------------------------------------------
diff --git a/proton-c/src/ssl/openssl.c b/proton-c/src/ssl/openssl.c
index 7c71eef..c9536e2 100644
--- a/proton-c/src/ssl/openssl.c
+++ b/proton-c/src/ssl/openssl.c
@@ -481,6 +481,10 @@ pn_ssl_domain_t *pn_ssl_domain( pn_ssl_mode_t mode )
   }
   const long reject_insecure = SSL_OP_NO_SSLv2 | SSL_OP_NO_SSLv3;
   SSL_CTX_set_options(domain->ctx, reject_insecure);
+#ifdef SSL_OP_NO_COMPRESSION
+  // Mitigate the CRIME vulnerability
+  SSL_CTX_set_options(domain->ctx, SSL_OP_NO_COMPRESSION);
+#endif
 
   // by default, allow anonymous ciphers so certificates are not required 'out of the box'
   if (!SSL_CTX_set_cipher_list( domain->ctx, CIPHERS_ANONYMOUS )) {


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


[15/50] [abbrv] qpid-proton git commit: PROTON-714: don't overflow the input buffer

Posted by gs...@apache.org.
PROTON-714: don't overflow the input buffer

git-svn-id: https://svn.apache.org/repos/asf/qpid/proton/trunk@1632004 13f79535-47bb-0310-9956-ffa450edef68


Project: http://git-wip-us.apache.org/repos/asf/qpid-proton/repo
Commit: http://git-wip-us.apache.org/repos/asf/qpid-proton/commit/e843420a
Tree: http://git-wip-us.apache.org/repos/asf/qpid-proton/tree/e843420a
Diff: http://git-wip-us.apache.org/repos/asf/qpid-proton/diff/e843420a

Branch: refs/heads/examples
Commit: e843420acf266a836b965683129cd8693df3d796
Parents: 7c9abd0
Author: Rafael H. Schloming <rh...@apache.org>
Authored: Wed Oct 15 12:45:47 2014 +0000
Committer: Rafael H. Schloming <rh...@apache.org>
Committed: Wed Oct 15 12:45:47 2014 +0000

----------------------------------------------------------------------
 .../qpid/proton/engine/impl/ssl/SimpleSslTransportWrapper.java | 6 ++++++
 1 file changed, 6 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/e843420a/proton-j/src/main/java/org/apache/qpid/proton/engine/impl/ssl/SimpleSslTransportWrapper.java
----------------------------------------------------------------------
diff --git a/proton-j/src/main/java/org/apache/qpid/proton/engine/impl/ssl/SimpleSslTransportWrapper.java b/proton-j/src/main/java/org/apache/qpid/proton/engine/impl/ssl/SimpleSslTransportWrapper.java
index 2599290..a25ea46 100644
--- a/proton-j/src/main/java/org/apache/qpid/proton/engine/impl/ssl/SimpleSslTransportWrapper.java
+++ b/proton-j/src/main/java/org/apache/qpid/proton/engine/impl/ssl/SimpleSslTransportWrapper.java
@@ -125,7 +125,13 @@ public class SimpleSslTransportWrapper implements SslTransportWrapper
             } else {
                 ByteBuffer tail = _underlyingInput.tail();
                 _decodedInputBuffer.flip();
+                int limit = _decodedInputBuffer.limit();
+                int overflow = _decodedInputBuffer.remaining() - capacity;
+                if (overflow > 0) {
+                    _decodedInputBuffer.limit(limit - overflow);
+                }
                 tail.put(_decodedInputBuffer);
+                _decodedInputBuffer.limit(limit);
                 _decodedInputBuffer.compact();
                 _underlyingInput.process();
                 capacity = _underlyingInput.capacity();


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


[19/50] [abbrv] qpid-proton git commit: PROTON-716: reject connections using SSLv3 - it is insecure

Posted by gs...@apache.org.
PROTON-716: reject connections using SSLv3 - it is insecure

git-svn-id: https://svn.apache.org/repos/asf/qpid/proton/trunk@1632175 13f79535-47bb-0310-9956-ffa450edef68


Project: http://git-wip-us.apache.org/repos/asf/qpid-proton/repo
Commit: http://git-wip-us.apache.org/repos/asf/qpid-proton/commit/8f334e59
Tree: http://git-wip-us.apache.org/repos/asf/qpid-proton/tree/8f334e59
Diff: http://git-wip-us.apache.org/repos/asf/qpid-proton/diff/8f334e59

Branch: refs/heads/examples
Commit: 8f334e59670fe71c39f38d62d86fbc649cc1ede4
Parents: eb45c9d
Author: Ken Giusti <kg...@apache.org>
Authored: Wed Oct 15 20:46:42 2014 +0000
Committer: Ken Giusti <kg...@apache.org>
Committed: Wed Oct 15 20:46:42 2014 +0000

----------------------------------------------------------------------
 proton-c/src/ssl/openssl.c | 13 +++++++++----
 1 file changed, 9 insertions(+), 4 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/8f334e59/proton-c/src/ssl/openssl.c
----------------------------------------------------------------------
diff --git a/proton-c/src/ssl/openssl.c b/proton-c/src/ssl/openssl.c
index 9f6e134..7c71eef 100644
--- a/proton-c/src/ssl/openssl.c
+++ b/proton-c/src/ssl/openssl.c
@@ -451,9 +451,13 @@ pn_ssl_domain_t *pn_ssl_domain( pn_ssl_mode_t mode )
 
   domain->ref_count = 1;
   domain->mode = mode;
+
+  // enable all supported protocol versions, then explicitly disable the
+  // known vulnerable ones.  This should allow us to use the latest version
+  // of the TLS standard that the installed library supports.
   switch(mode) {
   case PN_SSL_MODE_CLIENT:
-    domain->ctx = SSL_CTX_new(TLSv1_client_method());
+    domain->ctx = SSL_CTX_new(SSLv23_client_method()); // and TLSv1+
     if (!domain->ctx) {
       _log_ssl_error( "Unable to initialize OpenSSL context.\n");
       free(domain);
@@ -462,20 +466,21 @@ pn_ssl_domain_t *pn_ssl_domain( pn_ssl_mode_t mode )
     break;
 
   case PN_SSL_MODE_SERVER:
-    domain->ctx = SSL_CTX_new(SSLv23_server_method());
+    domain->ctx = SSL_CTX_new(SSLv23_server_method()); // and TLSv1+
     if (!domain->ctx) {
       _log_ssl_error("Unable to initialize OpenSSL context.\n");
       free(domain);
       return NULL;
     }
-    SSL_CTX_set_options(domain->ctx, SSL_OP_NO_SSLv2);  // v2 is insecure
     break;
 
   default:
-    _log_error("Invalid valid for pn_ssl_mode_t: %d\n", mode);
+    _log_error("Invalid value for pn_ssl_mode_t: %d\n", mode);
     free(domain);
     return NULL;
   }
+  const long reject_insecure = SSL_OP_NO_SSLv2 | SSL_OP_NO_SSLv3;
+  SSL_CTX_set_options(domain->ctx, reject_insecure);
 
   // by default, allow anonymous ciphers so certificates are not required 'out of the box'
   if (!SSL_CTX_set_cipher_list( domain->ctx, CIPHERS_ANONYMOUS )) {


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


[50/50] [abbrv] qpid-proton git commit: Fixup merge from master

Posted by gs...@apache.org.
Fixup merge from master


Project: http://git-wip-us.apache.org/repos/asf/qpid-proton/repo
Commit: http://git-wip-us.apache.org/repos/asf/qpid-proton/commit/51a757bc
Tree: http://git-wip-us.apache.org/repos/asf/qpid-proton/tree/51a757bc
Diff: http://git-wip-us.apache.org/repos/asf/qpid-proton/diff/51a757bc

Branch: refs/heads/examples
Commit: 51a757bc432854e5b73a11c6af109654f3eb7e6f
Parents: 9050976
Author: Gordon Sim <gs...@redhat.com>
Authored: Fri Nov 14 10:51:12 2014 +0000
Committer: Gordon Sim <gs...@redhat.com>
Committed: Fri Nov 14 11:03:27 2014 +0000

----------------------------------------------------------------------
 proton-c/bindings/python/proton.py | 110 --------------------------------
 proton-c/src/transport/transport.c |  21 ------
 proton-c/src/windows/schannel.c    |  10 ---
 3 files changed, 141 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/51a757bc/proton-c/bindings/python/proton.py
----------------------------------------------------------------------
diff --git a/proton-c/bindings/python/proton.py b/proton-c/bindings/python/proton.py
index f9f10f7..7d98929 100644
--- a/proton-c/bindings/python/proton.py
+++ b/proton-c/bindings/python/proton.py
@@ -2222,9 +2222,6 @@ class Condition:
                                         (self.name, self.description, self.info)
                                         if x])
 
-  def __str__(self):
-    return ": ".join(filter(None, [self.name, self.description, self.info]))
-
   def __eq__(self, o):
     if not isinstance(o, Condition): return False
     return self.name == o.name and \
@@ -3876,110 +3873,3 @@ __all__ = [
            "timestamp",
            "ulong"
            ]
-
-
-class Url(object):
-  """
-  Simple URL parser/constructor, handles URLs of the form:
-
-    <scheme>://<user>:<password>@<host>:<port>/<path>
-
-  All components can be None if not specifeid in the URL string.
-
-  The port can be specified as a service name, e.g. 'amqp' in the
-  URL string but Url.port always gives the integer value.
-
-  @ivar scheme: Url scheme e.g. 'amqp' or 'amqps'
-  @ivar user: Username
-  @ivar password: Password
-  @ivar host: Host name, ipv6 literal or ipv4 dotted quad.
-  @ivar port: Integer port.
-  @ivar host_port: Returns host:port
-  """
-
-  AMQPS = "amqps"
-  AMQP = "amqp"
-
-  class Port(int):
-    """An integer port number that can be constructed from a service name string"""
-
-    def __new__(cls, value):
-      """@param value: integer port number or string service name."""
-      port = super(Url.Port, cls).__new__(cls, cls._port_int(value))
-      setattr(port, 'name', str(value))
-      return port
-
-    def __eq__(self, x): return str(self) == x or int(self) == x
-    def __ne__(self, x): return not self == x
-    def __str__(self): return str(self.name)
-
-    @staticmethod
-    def _port_int(value):
-      """Convert service, an integer or a service name, into an integer port number."""
-      try:
-        return int(value)
-      except ValueError:
-        try:
-          return socket.getservbyname(value)
-        except socket.error:
-          # Not every system has amqp/amqps defined as a service
-          if value == Url.AMQPS:  return 5671
-          elif value == Url.AMQP: return 5672
-          else:
-            raise ValueError("Not a valid port number or service name: '%s'" % value)
-
-  def __init__(self, url=None, **kwargs):
-    """
-    @param url: URL string to parse.
-    @param kwargs: scheme, user, password, host, port, path.
-      If specified, replaces corresponding part in url string.
-    """
-    if url:
-      self._url = pn_url_parse(str(url))
-      if not self._url: raise ValueError("Invalid URL '%s'" % url)
-    else:
-      self._url = pn_url()
-    for k in kwargs:            # Let kwargs override values parsed from url
-      getattr(self, k)          # Check for invalid kwargs
-      setattr(self, k, kwargs[k])
-
-  class PartDescriptor(object):
-    def __init__(self, part):
-      self.getter = globals()["pn_url_get_%s" % part]
-      self.setter = globals()["pn_url_set_%s" % part]
-    def __get__(self, obj, type=None): return self.getter(obj._url)
-    def __set__(self, obj, value): return self.setter(obj._url, str(value))
-
-  scheme = PartDescriptor('scheme')
-  username = PartDescriptor('username')
-  password = PartDescriptor('password')
-  host = PartDescriptor('host')
-  path = PartDescriptor('path')
-
-  def _get_port(self):
-    portstr = pn_url_get_port(self._url)
-    return portstr and Url.Port(portstr)
-
-  def _set_port(self, value):
-    if value is None: pn_url_set_port(self._url, None)
-    else: pn_url_set_port(self._url, str(Url.Port(value)))
-
-  port = property(_get_port, _set_port)
-
-  def __str__(self): return pn_url_str(self._url)
-
-  def __repr__(self): return "Url(%r)" % str(self)
-
-  def __del__(self):
-    pn_url_free(self._url);
-    self._url = None
-
-  def defaults(self):
-    """
-    Fill in missing values (scheme, host or port) with defaults
-    @return: self
-    """
-    self.scheme = self.scheme or self.AMQP
-    self.host = self.host or '0.0.0.0'
-    self.port = self.port or self.Port(self.scheme)
-    return self

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/51a757bc/proton-c/src/transport/transport.c
----------------------------------------------------------------------
diff --git a/proton-c/src/transport/transport.c b/proton-c/src/transport/transport.c
index d9dfab8..a118ea6 100644
--- a/proton-c/src/transport/transport.c
+++ b/proton-c/src/transport/transport.c
@@ -1076,14 +1076,6 @@ ssize_t pn_transport_input(pn_transport_t *transport, const char *bytes, size_t
   return original - available;
 }
 
-static void pni_maybe_post_closed(pn_transport_t *transport)
-{
-  pn_collector_t *collector = pni_transport_collector(transport);
-  if (transport->posted_head_closed && transport->posted_tail_closed) {
-    pn_collector_put(collector, PN_OBJECT, transport, PN_TRANSPORT_CLOSED);
-  }
-}
-
 // process pending input until none remaining or EOS
 static ssize_t transport_consume(pn_transport_t *transport)
 {
@@ -1105,12 +1097,6 @@ static ssize_t transport_consume(pn_transport_t *transport)
       if (transport->disp->trace & (PN_TRACE_RAW | PN_TRACE_FRM))
         pn_transport_log(transport, "  <- EOS");
       transport->input_pending = 0;  // XXX ???
-      if (!transport->posted_tail_closed) {
-        pn_collector_t *collector = pni_transport_collector(transport);
-        pn_collector_put(collector, PN_OBJECT, transport, PN_TRANSPORT_TAIL_CLOSED);
-        transport->posted_tail_closed = true;
-        pni_maybe_post_closed(transport);
-      }
       return n;
     }
   }
@@ -2185,13 +2171,6 @@ ssize_t pn_transport_push(pn_transport_t *transport, const char *src, size_t siz
   }
 }
 
-void pni_close_tail(pn_transport_t *transport)
-{
-  if (!transport->tail_closed) {
-    transport->tail_closed = true;
-  }
-}
-
 int pn_transport_process(pn_transport_t *transport, size_t size)
 {
   assert(transport);

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/51a757bc/proton-c/src/windows/schannel.c
----------------------------------------------------------------------
diff --git a/proton-c/src/windows/schannel.c b/proton-c/src/windows/schannel.c
index e91e0a3..9437582 100644
--- a/proton-c/src/windows/schannel.c
+++ b/proton-c/src/windows/schannel.c
@@ -520,8 +520,6 @@ int pn_ssl_get_peer_hostname( pn_ssl_t *ssl, char *hostname, size_t *bufsize )
 
 /** SChannel specific: */
 
-<<<<<<< HEAD
-=======
 const char *tls_version_check(pn_ssl_t *ssl)
 {
   SecPkgContext_ConnectionInfo info;
@@ -532,7 +530,6 @@ const char *tls_version_check(pn_ssl_t *ssl)
     "peer does not support TLS 1.0 security" : NULL;
 }
 
->>>>>>> master
 static void ssl_encrypt(pn_ssl_t *ssl, char *app_data, size_t count)
 {
   // Get SChannel to encrypt exactly one Record.
@@ -744,13 +741,10 @@ static void client_handshake( pn_ssl_t* ssl) {
       ssl_failed(ssl, "unexpected final server token");
       break;
     }
-<<<<<<< HEAD
-=======
     if (const char *err = tls_version_check(ssl)) {
       ssl_failed(ssl, err);
       break;
     }
->>>>>>> master
     if (token_buffs[1].BufferType == SECBUFFER_EXTRA && token_buffs[1].cbBuffer > 0) {
       // This seems to work but not documented, plus logic differs from decrypt message
       // since the pvBuffer value is not set.  Grrr.
@@ -923,11 +917,7 @@ static void app_inbytes_progress(pn_ssl_t *ssl, size_t minimum)
       assert(ssl->app_inbytes.size <= ib2.size);
       size_t consumed = ib2.size - ssl->app_inbytes.size;
       if (consumed > 0) {
-<<<<<<< HEAD
-          memmove((void *)ib2.start, ib2.start + consumed, consumed);
-=======
         memmove((void *)ib2.start, ib2.start + consumed, ssl->app_inbytes.size);
->>>>>>> master
         pn_buffer_trim(ssl->inbuf2, 0, consumed);
       }
       if (!pn_buffer_available(ssl->inbuf2)) {


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


[32/50] [abbrv] qpid-proton git commit: removed accidental addition

Posted by gs...@apache.org.
removed accidental addition

git-svn-id: https://svn.apache.org/repos/asf/qpid/proton/trunk@1635267 13f79535-47bb-0310-9956-ffa450edef68


Project: http://git-wip-us.apache.org/repos/asf/qpid-proton/repo
Commit: http://git-wip-us.apache.org/repos/asf/qpid-proton/commit/61fd13f0
Tree: http://git-wip-us.apache.org/repos/asf/qpid-proton/tree/61fd13f0
Diff: http://git-wip-us.apache.org/repos/asf/qpid-proton/diff/61fd13f0

Branch: refs/heads/examples
Commit: 61fd13f0247a66be44b98fc1e184406930ace91c
Parents: 4c6f212
Author: Rafael H. Schloming <rh...@apache.org>
Authored: Wed Oct 29 19:28:58 2014 +0000
Committer: Rafael H. Schloming <rh...@apache.org>
Committed: Wed Oct 29 19:28:58 2014 +0000

----------------------------------------------------------------------
 proton-c/src/transport/transport.c.orig | 2229 --------------------------
 1 file changed, 2229 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/61fd13f0/proton-c/src/transport/transport.c.orig
----------------------------------------------------------------------
diff --git a/proton-c/src/transport/transport.c.orig b/proton-c/src/transport/transport.c.orig
deleted file mode 100644
index f37e636..0000000
--- a/proton-c/src/transport/transport.c.orig
+++ /dev/null
@@ -1,2229 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-
-#include "engine/engine-internal.h"
-#include <stdlib.h>
-#include <string.h>
-#include <proton/framing.h>
-#include "protocol.h"
-#include "dispatch_actions.h"
-
-#include <assert.h>
-#include <stdarg.h>
-#include <stdio.h>
-
-#include "sasl/sasl-internal.h"
-#include "ssl/ssl-internal.h"
-#include "platform.h"
-#include "platform_fmt.h"
-
-static ssize_t transport_consume(pn_transport_t *transport);
-
-// delivery buffers
-
-void pn_delivery_map_init(pn_delivery_map_t *db, pn_sequence_t next)
-{
-  db->deliveries = pn_hash(PN_OBJECT, 0, 0.75);
-  db->next = next;
-}
-
-void pn_delivery_map_free(pn_delivery_map_t *db)
-{
-  pn_free(db->deliveries);
-}
-
-pn_delivery_t *pn_delivery_map_get(pn_delivery_map_t *db, pn_sequence_t id)
-{
-  return (pn_delivery_t *) pn_hash_get(db->deliveries, id);
-}
-
-static void pn_delivery_state_init(pn_delivery_state_t *ds, pn_delivery_t *delivery, pn_sequence_t id)
-{
-  ds->id = id;
-  ds->sent = false;
-  ds->init = true;
-}
-
-pn_delivery_state_t *pn_delivery_map_push(pn_delivery_map_t *db, pn_delivery_t *delivery)
-{
-  pn_delivery_state_t *ds = &delivery->state;
-  pn_delivery_state_init(ds, delivery, db->next++);
-  pn_hash_put(db->deliveries, ds->id, delivery);
-  return ds;
-}
-
-void pn_delivery_map_del(pn_delivery_map_t *db, pn_delivery_t *delivery)
-{
-  if (delivery->state.init) {
-    pn_hash_del(db->deliveries, delivery->state.id);
-  }
-  delivery->state.init = false;
-  delivery->state.sent = false;
-}
-
-void pn_delivery_map_clear(pn_delivery_map_t *dm)
-{
-  pn_hash_t *hash = dm->deliveries;
-  for (pn_handle_t entry = pn_hash_head(hash);
-       entry;
-       entry = pn_hash_next(hash, entry))
-  {
-    pn_delivery_t *dlv = (pn_delivery_t *) pn_hash_value(hash, entry);
-    pn_delivery_map_del(dm, dlv);
-  }
-  dm->next = 0;
-}
-
-static ssize_t pn_input_read_amqp_header(pn_io_layer_t *io_layer, const char *bytes, size_t available);
-static ssize_t pn_input_read_amqp(pn_io_layer_t *io_layer, const char *bytes, size_t available);
-static ssize_t pn_output_write_amqp_header(pn_io_layer_t *io_layer, char *bytes, size_t available);
-static ssize_t pn_output_write_amqp(pn_io_layer_t *io_layer, char *bytes, size_t available);
-static pn_timestamp_t pn_tick_amqp(pn_io_layer_t *io_layer, pn_timestamp_t now);
-
-static void pni_default_tracer(pn_transport_t *transport, const char *message)
-{
-  fprintf(stderr, "[%p]:%s\n", (void *) transport, message);
-}
-
-static void pn_transport_initialize(void *object)
-{
-  pn_transport_t *transport = (pn_transport_t *)object;
-  transport->freed = false;
-  transport->output_buf = NULL;
-  transport->output_size = PN_DEFAULT_MAX_FRAME_SIZE ? PN_DEFAULT_MAX_FRAME_SIZE : 16 * 1024;
-  transport->input_buf = NULL;
-  transport->input_size =  PN_DEFAULT_MAX_FRAME_SIZE ? PN_DEFAULT_MAX_FRAME_SIZE : 16 * 1024;
-  transport->tracer = pni_default_tracer;
-  transport->header_count = 0;
-  transport->sasl = NULL;
-  transport->ssl = NULL;
-  transport->scratch = pn_string(NULL);
-  transport->disp = pn_dispatcher(0, transport);
-  transport->connection = NULL;
-
-  pn_io_layer_t *io_layer = transport->io_layers;
-  while (io_layer != &transport->io_layers[PN_IO_AMQP]) {
-    io_layer->context = NULL;
-    io_layer->next = io_layer + 1;
-    io_layer->process_input = pn_io_layer_input_passthru;
-    io_layer->process_output = pn_io_layer_output_passthru;
-    io_layer->process_tick = pn_io_layer_tick_passthru;
-    io_layer->buffered_output = NULL;
-    io_layer->buffered_input = NULL;
-    ++io_layer;
-  }
-
-  pn_io_layer_t *amqp = &transport->io_layers[PN_IO_AMQP];
-  amqp->context = transport;
-  amqp->process_input = pn_input_read_amqp_header;
-  amqp->process_output = pn_output_write_amqp_header;
-  amqp->process_tick = pn_io_layer_tick_passthru;
-  amqp->buffered_output = NULL;
-  amqp->buffered_input = NULL;
-  amqp->next = NULL;
-
-  transport->open_sent = false;
-  transport->open_rcvd = false;
-  transport->close_sent = false;
-  transport->close_rcvd = false;
-  transport->tail_closed = false;
-  transport->head_closed = false;
-  transport->remote_container = NULL;
-  transport->remote_hostname = NULL;
-  transport->local_max_frame = PN_DEFAULT_MAX_FRAME_SIZE;
-  transport->remote_max_frame = 0;
-  transport->channel_max = 0;
-  transport->remote_channel_max = 0;
-  transport->local_idle_timeout = 0;
-  transport->dead_remote_deadline = 0;
-  transport->last_bytes_input = 0;
-  transport->remote_idle_timeout = 0;
-  transport->keepalive_deadline = 0;
-  transport->last_bytes_output = 0;
-  transport->remote_offered_capabilities = pn_data(0);
-  transport->remote_desired_capabilities = pn_data(0);
-  transport->remote_properties = pn_data(0);
-  transport->disp_data = pn_data(0);
-  pn_condition_init(&transport->remote_condition);
-  pn_condition_init(&transport->condition);
-  transport->error = pn_error();
-
-  transport->local_channels = pn_hash(PN_OBJECT, 0, 0.75);
-  transport->remote_channels = pn_hash(PN_OBJECT, 0, 0.75);
-
-  transport->bytes_input = 0;
-  transport->bytes_output = 0;
-
-  transport->input_pending = 0;
-  transport->output_pending = 0;
-
-  transport->done_processing = false;
-
-  transport->posted_head_closed = false;
-  transport->posted_tail_closed = false;
-}
-
-pn_session_t *pn_channel_state(pn_transport_t *transport, uint16_t channel)
-{
-  return (pn_session_t *) pn_hash_get(transport->remote_channels, channel);
-}
-
-static void pni_map_remote_channel(pn_session_t *session, uint16_t channel)
-{
-  pn_transport_t *transport = session->connection->transport;
-  pn_hash_put(transport->remote_channels, channel, session);
-  session->state.remote_channel = channel;
-}
-
-void pni_transport_unbind_handles(pn_hash_t *handles, bool reset_state);
-
-static void pni_unmap_remote_channel(pn_session_t *ssn)
-{
-  // XXX: should really update link state also
-  pni_transport_unbind_handles(ssn->state.remote_handles, false);
-  pn_transport_t *transport = ssn->connection->transport;
-  uint16_t channel = ssn->state.remote_channel;
-  ssn->state.remote_channel = -2;
-  // note: may free the session:
-  pn_hash_del(transport->remote_channels, channel);
-}
-
-
-static void pn_transport_finalize(void *object);
-#define pn_transport_hashcode NULL
-#define pn_transport_compare NULL
-#define pn_transport_inspect NULL
-
-pn_transport_t *pn_transport()
-{
-  static const pn_class_t clazz = PN_CLASS(pn_transport);
-  pn_transport_t *transport =
-    (pn_transport_t *) pn_class_new(&clazz, sizeof(pn_transport_t));
-  if (!transport) return NULL;
-
-  transport->output_buf = (char *) malloc(transport->output_size);
-  if (!transport->output_buf) {
-    pn_transport_free(transport);
-    return NULL;
-  }
-
-  transport->input_buf = (char *) malloc(transport->input_size);
-  if (!transport->input_buf) {
-    pn_transport_free(transport);
-    return NULL;
-  }
-  return transport;
-}
-
-void pn_transport_free(pn_transport_t *transport)
-{
-  if (!transport) return;
-  assert(!transport->freed);
-  transport->freed = true;
-  // once the application frees the transport, no further I/O
-  // processing can be done to the connection:
-  pn_transport_unbind(transport);
-  pn_decref(transport);
-}
-
-static void pn_transport_finalize(void *object)
-{
-  pn_transport_t *transport = (pn_transport_t *) object;
-
-  pn_ssl_free(transport->ssl);
-  pn_sasl_free(transport->sasl);
-  pn_dispatcher_free(transport->disp);
-  free(transport->remote_container);
-  free(transport->remote_hostname);
-  pn_free(transport->remote_offered_capabilities);
-  pn_free(transport->remote_desired_capabilities);
-  pn_free(transport->remote_properties);
-  pn_free(transport->disp_data);
-  pn_condition_tini(&transport->remote_condition);
-  pn_condition_tini(&transport->condition);
-  pn_error_free(transport->error);
-  pn_free(transport->local_channels);
-  pn_free(transport->remote_channels);
-  if (transport->input_buf) free(transport->input_buf);
-  if (transport->output_buf) free(transport->output_buf);
-  pn_free(transport->scratch);
-}
-
-int pn_transport_bind(pn_transport_t *transport, pn_connection_t *connection)
-{
-  assert(transport);
-  assert(connection);
-
-  if (transport->connection) return PN_STATE_ERR;
-  if (connection->transport) return PN_STATE_ERR;
-
-  transport->connection = connection;
-  connection->transport = transport;
-
-  pn_collector_put(connection->collector, PN_OBJECT, connection, PN_CONNECTION_BOUND);
-
-  pn_incref(connection);
-  if (transport->open_rcvd) {
-    PN_SET_REMOTE(connection->endpoint.state, PN_REMOTE_ACTIVE);
-    pn_collector_put(connection->collector, PN_OBJECT, connection, PN_CONNECTION_REMOTE_OPEN);
-    transport->disp->halt = false;
-    transport_consume(transport);        // blech - testBindAfterOpen
-  }
-
-  return 0;
-}
-
-void pni_transport_unbind_handles(pn_hash_t *handles, bool reset_state)
-{
-  for (pn_handle_t h = pn_hash_head(handles); h; h = pn_hash_next(handles, h)) {
-    uintptr_t key = pn_hash_key(handles, h);
-    if (reset_state) {
-      pn_link_t *link = (pn_link_t *) pn_hash_value(handles, h);
-      pn_link_unbound(link);
-    }
-    pn_hash_del(handles, key);
-  }
-}
-
-void pni_transport_unbind_channels(pn_hash_t *channels)
-{
-  for (pn_handle_t h = pn_hash_head(channels); h; h = pn_hash_next(channels, h)) {
-    uintptr_t key = pn_hash_key(channels, h);
-    pn_session_t *ssn = (pn_session_t *) pn_hash_value(channels, h);
-    pni_transport_unbind_handles(ssn->state.local_handles, true);
-    pni_transport_unbind_handles(ssn->state.remote_handles, true);
-    pn_session_unbound(ssn);
-    pn_hash_del(channels, key);
-  }
-}
-
-int pn_transport_unbind(pn_transport_t *transport)
-{
-  assert(transport);
-  if (!transport->connection) return 0;
-
-
-  pn_connection_t *conn = transport->connection;
-  transport->connection = NULL;
-
-  pn_collector_put(conn->collector, PN_OBJECT, conn, PN_CONNECTION_UNBOUND);
-
-  // XXX: what happens if the endpoints are freed before we get here?
-  pn_session_t *ssn = pn_session_head(conn, 0);
-  while (ssn) {
-    pn_delivery_map_clear(&ssn->state.incoming);
-    pn_delivery_map_clear(&ssn->state.outgoing);
-    ssn = pn_session_next(ssn, 0);
-  }
-
-  pn_endpoint_t *endpoint = conn->endpoint_head;
-  while (endpoint) {
-    pn_condition_clear(&endpoint->remote_condition);
-    pn_modified(conn, endpoint, true);
-    endpoint = endpoint->endpoint_next;
-  }
-
-  pni_transport_unbind_channels(transport->local_channels);
-  pni_transport_unbind_channels(transport->remote_channels);
-
-  pn_connection_unbound(conn);
-  pn_decref(conn);
-  return 0;
-}
-
-pn_error_t *pn_transport_error(pn_transport_t *transport)
-{
-  assert(transport);
-  if (pn_condition_is_set(&transport->condition)) {
-    pn_error_format(transport->error, PN_ERR, "%s: %s",
-                    pn_condition_get_name(&transport->condition),
-                    pn_condition_get_description(&transport->condition));
-  } else {
-    pn_error_clear(transport->error);
-  }
-  return transport->error;
-}
-
-pn_condition_t *pn_transport_condition(pn_transport_t *transport)
-{
-  assert(transport);
-  return &transport->condition;
-}
-
-static void pni_map_remote_handle(pn_link_t *link, uint32_t handle)
-{
-  link->state.remote_handle = handle;
-  pn_hash_put(link->session->state.remote_handles, handle, link);
-}
-
-static void pni_unmap_remote_handle(pn_link_t *link)
-{
-  uintptr_t handle = link->state.remote_handle;
-  link->state.remote_handle = -2;
-  // may delete link:
-  pn_hash_del(link->session->state.remote_handles, handle);
-}
-
-pn_link_t *pn_handle_state(pn_session_t *ssn, uint32_t handle)
-{
-  return (pn_link_t *) pn_hash_get(ssn->state.remote_handles, handle);
-}
-
-bool pni_disposition_batchable(pn_disposition_t *disposition)
-{
-  switch (disposition->type) {
-  case PN_ACCEPTED:
-    return true;
-  case PN_RELEASED:
-    return true;
-  default:
-    return false;
-  }
-}
-
-void pni_disposition_encode(pn_disposition_t *disposition, pn_data_t *data)
-{
-  pn_condition_t *cond = &disposition->condition;
-  switch (disposition->type) {
-  case PN_RECEIVED:
-    pn_data_put_list(data);
-    pn_data_enter(data);
-    pn_data_put_uint(data, disposition->section_number);
-    pn_data_put_ulong(data, disposition->section_offset);
-    pn_data_exit(data);
-    break;
-  case PN_ACCEPTED:
-  case PN_RELEASED:
-    return;
-  case PN_REJECTED:
-    pn_data_fill(data, "[?DL[sSC]]", pn_condition_is_set(cond), ERROR,
-                 pn_condition_get_name(cond),
-                 pn_condition_get_description(cond),
-                 pn_condition_info(cond));
-    break;
-  case PN_MODIFIED:
-    pn_data_fill(data, "[ooC]",
-                 disposition->failed,
-                 disposition->undeliverable,
-                 disposition->annotations);
-    break;
-  default:
-    pn_data_copy(data, disposition->data);
-    break;
-  }
-}
-
-int pn_post_close(pn_transport_t *transport, const char *condition, const char *description)
-{
-  pn_condition_t *cond = NULL;
-  if (transport->connection) {
-    cond = pn_connection_condition(transport->connection);
-  }
-  pn_data_t *info = NULL;
-  if (!condition && pn_condition_is_set(cond)) {
-    condition = pn_condition_get_name(cond);
-    description = pn_condition_get_description(cond);
-    info = pn_condition_info(cond);
-  }
-
-  return pn_post_frame(transport->disp, 0, "DL[?DL[sSC]]", CLOSE,
-                       (bool) condition, ERROR, condition, description, info);
-}
-
-static pn_collector_t *pni_transport_collector(pn_transport_t *transport)
-{
-  if (transport->connection && transport->connection->collector) {
-    return transport->connection->collector;
-  } else {
-    return NULL;
-  }
-}
-
-int pn_do_error(pn_transport_t *transport, const char *condition, const char *fmt, ...)
-{
-  va_list ap;
-  va_start(ap, fmt);
-  char buf[1024];
-  // XXX: result
-  vsnprintf(buf, 1024, fmt, ap);
-  va_end(ap);
-  if (!transport->close_sent) {
-    if (!transport->open_sent) {
-      pn_post_frame(transport->disp, 0, "DL[S]", OPEN, "");
-    }
-
-    pn_post_close(transport, condition, buf);
-    transport->close_sent = true;
-  }
-  transport->disp->halt = true;
-  pn_condition_set_name(&transport->condition, condition);
-  pn_condition_set_description(&transport->condition, buf);
-  pn_collector_t *collector = pni_transport_collector(transport);
-  pn_collector_put(collector, PN_OBJECT, transport, PN_TRANSPORT_ERROR);
-  pn_transport_logf(transport, "ERROR %s %s", condition, buf);
-  return PN_ERR;
-}
-
-static char *pn_bytes_strdup(pn_bytes_t str)
-{
-  return pn_strndup(str.start, str.size);
-}
-
-int pn_do_open(pn_dispatcher_t *disp)
-{
-  pn_transport_t *transport = disp->transport;
-  pn_connection_t *conn = transport->connection;
-  bool container_q, hostname_q;
-  pn_bytes_t remote_container, remote_hostname;
-  pn_data_clear(transport->remote_offered_capabilities);
-  pn_data_clear(transport->remote_desired_capabilities);
-  pn_data_clear(transport->remote_properties);
-  int err = pn_scan_args(disp, "D.[?S?SIHI..CCC]", &container_q,
-                         &remote_container, &hostname_q, &remote_hostname,
-                         &transport->remote_max_frame,
-                         &transport->remote_channel_max,
-                         &transport->remote_idle_timeout,
-                         transport->remote_offered_capabilities,
-                         transport->remote_desired_capabilities,
-                         transport->remote_properties);
-  if (err) return err;
-  if (transport->remote_max_frame > 0) {
-    if (transport->remote_max_frame < AMQP_MIN_MAX_FRAME_SIZE) {
-      pn_transport_logf(transport, "Peer advertised bad max-frame (%u), forcing to %u",
-                        transport->remote_max_frame, AMQP_MIN_MAX_FRAME_SIZE);
-      transport->remote_max_frame = AMQP_MIN_MAX_FRAME_SIZE;
-    }
-    disp->remote_max_frame = transport->remote_max_frame;
-    pn_buffer_clear( disp->frame );
-  }
-  if (container_q) {
-    transport->remote_container = pn_bytes_strdup(remote_container);
-  } else {
-    transport->remote_container = NULL;
-  }
-  if (hostname_q) {
-    transport->remote_hostname = pn_bytes_strdup(remote_hostname);
-  } else {
-    transport->remote_hostname = NULL;
-  }
-
-  if (conn) {
-    PN_SET_REMOTE(conn->endpoint.state, PN_REMOTE_ACTIVE);
-    pn_collector_put(conn->collector, PN_OBJECT, conn, PN_CONNECTION_REMOTE_OPEN);
-  } else {
-    transport->disp->halt = true;
-  }
-  if (transport->remote_idle_timeout)
-    transport->io_layers[PN_IO_AMQP].process_tick = pn_tick_amqp;  // enable timeouts
-  transport->open_rcvd = true;
-  return 0;
-}
-
-int pn_do_begin(pn_dispatcher_t *disp)
-{
-  pn_transport_t *transport = disp->transport;
-  bool reply;
-  uint16_t remote_channel;
-  pn_sequence_t next;
-  int err = pn_scan_args(disp, "D.[?HI]", &reply, &remote_channel, &next);
-  if (err) return err;
-
-  pn_session_t *ssn;
-  if (reply) {
-    // XXX: what if session is NULL?
-    ssn = (pn_session_t *) pn_hash_get(transport->local_channels, remote_channel);
-  } else {
-    ssn = pn_session(transport->connection);
-  }
-  ssn->state.incoming_transfer_count = next;
-  pni_map_remote_channel(ssn, disp->channel);
-  PN_SET_REMOTE(ssn->endpoint.state, PN_REMOTE_ACTIVE);
-  pn_collector_put(transport->connection->collector, PN_OBJECT, ssn, PN_SESSION_REMOTE_OPEN);
-  return 0;
-}
-
-pn_link_t *pn_find_link(pn_session_t *ssn, pn_bytes_t name, bool is_sender)
-{
-  pn_endpoint_type_t type = is_sender ? SENDER : RECEIVER;
-
-  for (size_t i = 0; i < pn_list_size(ssn->links); i++)
-  {
-    pn_link_t *link = (pn_link_t *) pn_list_get(ssn->links, i);
-    if (link->endpoint.type == type &&
-        !strncmp(name.start, pn_string_get(link->name), name.size))
-    {
-      return link;
-    }
-  }
-  return NULL;
-}
-
-static pn_expiry_policy_t symbol2policy(pn_bytes_t symbol)
-{
-  if (!symbol.start)
-    return PN_EXPIRE_WITH_SESSION;
-
-  if (!strncmp(symbol.start, "link-detach", symbol.size))
-    return PN_EXPIRE_WITH_LINK;
-  if (!strncmp(symbol.start, "session-end", symbol.size))
-    return PN_EXPIRE_WITH_SESSION;
-  if (!strncmp(symbol.start, "connection-close", symbol.size))
-    return PN_EXPIRE_WITH_CONNECTION;
-  if (!strncmp(symbol.start, "never", symbol.size))
-    return PN_EXPIRE_NEVER;
-
-  return PN_EXPIRE_WITH_SESSION;
-}
-
-static pn_distribution_mode_t symbol2dist_mode(const pn_bytes_t symbol)
-{
-  if (!symbol.start)
-    return PN_DIST_MODE_UNSPECIFIED;
-
-  if (!strncmp(symbol.start, "move", symbol.size))
-    return PN_DIST_MODE_MOVE;
-  if (!strncmp(symbol.start, "copy", symbol.size))
-    return PN_DIST_MODE_COPY;
-
-  return PN_DIST_MODE_UNSPECIFIED;
-}
-
-static const char *dist_mode2symbol(const pn_distribution_mode_t mode)
-{
-  switch (mode)
-  {
-  case PN_DIST_MODE_COPY:
-    return "copy";
-  case PN_DIST_MODE_MOVE:
-    return "move";
-  default:
-    return NULL;
-  }
-}
-
-int pn_terminus_set_address_bytes(pn_terminus_t *terminus, pn_bytes_t address)
-{
-  assert(terminus);
-  return pn_string_setn(terminus->address, address.start, address.size);
-}
-
-int pn_do_attach(pn_dispatcher_t *disp)
-{
-  pn_transport_t *transport = disp->transport;
-  pn_bytes_t name;
-  uint32_t handle;
-  bool is_sender;
-  pn_bytes_t source, target;
-  pn_durability_t src_dr, tgt_dr;
-  pn_bytes_t src_exp, tgt_exp;
-  pn_seconds_t src_timeout, tgt_timeout;
-  bool src_dynamic, tgt_dynamic;
-  pn_sequence_t idc;
-  pn_bytes_t dist_mode;
-  bool snd_settle, rcv_settle;
-  uint8_t snd_settle_mode, rcv_settle_mode;
-  int err = pn_scan_args(disp, "D.[SIo?B?BD.[SIsIo.s]D.[SIsIo]..I]", &name, &handle,
-                         &is_sender,
-                         &snd_settle, &snd_settle_mode,
-                         &rcv_settle, &rcv_settle_mode,
-                         &source, &src_dr, &src_exp, &src_timeout, &src_dynamic, &dist_mode,
-                         &target, &tgt_dr, &tgt_exp, &tgt_timeout, &tgt_dynamic,
-                         &idc);
-  if (err) return err;
-  char strbuf[128];      // avoid malloc for most link names
-  char *strheap = (name.size >= sizeof(strbuf)) ? (char *) malloc(name.size + 1) : NULL;
-  char *strname = strheap ? strheap : strbuf;
-  strncpy(strname, name.start, name.size);
-  strname[name.size] = '\0';
-
-  pn_session_t *ssn = pn_channel_state(transport, disp->channel);
-  if (!ssn) {
-      pn_do_error(transport, "amqp:connection:no-session", "attach without a session");
-      return PN_EOS;
-  }
-  pn_link_t *link = pn_find_link(ssn, name, is_sender);
-  if (!link) {
-    if (is_sender) {
-      link = (pn_link_t *) pn_sender(ssn, strname);
-    } else {
-      link = (pn_link_t *) pn_receiver(ssn, strname);
-    }
-  }
-
-  if (strheap) {
-    free(strheap);
-  }
-
-  pni_map_remote_handle(link, handle);
-  PN_SET_REMOTE(link->endpoint.state, PN_REMOTE_ACTIVE);
-  pn_terminus_t *rsrc = &link->remote_source;
-  if (source.start || src_dynamic) {
-    pn_terminus_set_type(rsrc, PN_SOURCE);
-    pn_terminus_set_address_bytes(rsrc, source);
-    pn_terminus_set_durability(rsrc, src_dr);
-    pn_terminus_set_expiry_policy(rsrc, symbol2policy(src_exp));
-    pn_terminus_set_timeout(rsrc, src_timeout);
-    pn_terminus_set_dynamic(rsrc, src_dynamic);
-    pn_terminus_set_distribution_mode(rsrc, symbol2dist_mode(dist_mode));
-  } else {
-    pn_terminus_set_type(rsrc, PN_UNSPECIFIED);
-  }
-  pn_terminus_t *rtgt = &link->remote_target;
-  if (target.start || tgt_dynamic) {
-    pn_terminus_set_type(rtgt, PN_TARGET);
-    pn_terminus_set_address_bytes(rtgt, target);
-    pn_terminus_set_durability(rtgt, tgt_dr);
-    pn_terminus_set_expiry_policy(rtgt, symbol2policy(tgt_exp));
-    pn_terminus_set_timeout(rtgt, tgt_timeout);
-    pn_terminus_set_dynamic(rtgt, tgt_dynamic);
-  } else {
-    pn_terminus_set_type(rtgt, PN_UNSPECIFIED);
-  }
-
-  if (snd_settle)
-    link->remote_snd_settle_mode = snd_settle_mode;
-  if (rcv_settle)
-    link->remote_rcv_settle_mode = rcv_settle_mode;
-
-  pn_data_clear(link->remote_source.properties);
-  pn_data_clear(link->remote_source.filter);
-  pn_data_clear(link->remote_source.outcomes);
-  pn_data_clear(link->remote_source.capabilities);
-  pn_data_clear(link->remote_target.properties);
-  pn_data_clear(link->remote_target.capabilities);
-
-  err = pn_scan_args(disp, "D.[.....D.[.....C.C.CC]D.[.....CC]",
-                     link->remote_source.properties,
-                     link->remote_source.filter,
-                     link->remote_source.outcomes,
-                     link->remote_source.capabilities,
-                     link->remote_target.properties,
-                     link->remote_target.capabilities);
-  if (err) return err;
-
-  pn_data_rewind(link->remote_source.properties);
-  pn_data_rewind(link->remote_source.filter);
-  pn_data_rewind(link->remote_source.outcomes);
-  pn_data_rewind(link->remote_source.capabilities);
-  pn_data_rewind(link->remote_target.properties);
-  pn_data_rewind(link->remote_target.capabilities);
-
-  if (!is_sender) {
-    link->state.delivery_count = idc;
-  }
-
-  pn_collector_put(transport->connection->collector, PN_OBJECT, link, PN_LINK_REMOTE_OPEN);
-  return 0;
-}
-
-int pn_post_flow(pn_transport_t *transport, pn_session_t *ssn, pn_link_t *link);
-
-// free the delivery
-static void pn_full_settle(pn_delivery_map_t *db, pn_delivery_t *delivery)
-{
-  assert(!delivery->work);
-  pn_clear_tpwork(delivery);
-  pn_real_settle(delivery);
-}
-
-int pn_do_transfer(pn_dispatcher_t *disp)
-{
-  // XXX: multi transfer
-  pn_transport_t *transport = disp->transport;
-  uint32_t handle;
-  pn_bytes_t tag;
-  bool id_present;
-  pn_sequence_t id;
-  bool settled;
-  bool more;
-  int err = pn_scan_args(disp, "D.[I?Iz.oo]", &handle, &id_present, &id, &tag,
-                         &settled, &more);
-  if (err) return err;
-  pn_session_t *ssn = pn_channel_state(transport, disp->channel);
-
-  if (!ssn->state.incoming_window) {
-    return pn_do_error(transport, "amqp:session:window-violation", "incoming session window exceeded");
-  }
-
-  pn_link_t *link = pn_handle_state(ssn, handle);
-  pn_delivery_t *delivery;
-  if (link->unsettled_tail && !link->unsettled_tail->done) {
-    delivery = link->unsettled_tail;
-  } else {
-    pn_delivery_map_t *incoming = &ssn->state.incoming;
-
-    if (!ssn->state.incoming_init) {
-      incoming->next = id;
-      ssn->state.incoming_init = true;
-      ssn->incoming_deliveries++;
-    }
-
-    delivery = pn_delivery(link, pn_dtag(tag.start, tag.size));
-    pn_delivery_state_t *state = pn_delivery_map_push(incoming, delivery);
-    if (id_present && id != state->id) {
-      return pn_do_error(transport, "amqp:session:invalid-field",
-                         "sequencing error, expected delivery-id %u, got %u",
-                         state->id, id);
-    }
-
-    link->state.delivery_count++;
-    link->state.link_credit--;
-    link->queued++;
-
-    // XXX: need to fill in remote state: delivery->remote.state = ...;
-    delivery->remote.settled = settled;
-    if (settled) {
-      delivery->updated = true;
-      pn_work_update(transport->connection, delivery);
-    }
-  }
-
-  pn_buffer_append(delivery->bytes, disp->payload, disp->size);
-  ssn->incoming_bytes += disp->size;
-  delivery->done = !more;
-
-  ssn->state.incoming_transfer_count++;
-  ssn->state.incoming_window--;
-
-  // XXX: need better policy for when to refresh window
-  if (!ssn->state.incoming_window && (int32_t) link->state.local_handle >= 0) {
-    pn_post_flow(transport, ssn, link);
-  }
-
-  pn_collector_put(transport->connection->collector, PN_OBJECT, delivery, PN_DELIVERY);
-  return 0;
-}
-
-int pn_do_flow(pn_dispatcher_t *disp)
-{
-  pn_transport_t *transport = disp->transport;
-  pn_sequence_t onext, inext, delivery_count;
-  uint32_t iwin, owin, link_credit;
-  uint32_t handle;
-  bool inext_init, handle_init, dcount_init, drain;
-  int err = pn_scan_args(disp, "D.[?IIII?I?II.o]", &inext_init, &inext, &iwin,
-                         &onext, &owin, &handle_init, &handle, &dcount_init,
-                         &delivery_count, &link_credit, &drain);
-  if (err) return err;
-
-  pn_session_t *ssn = pn_channel_state(transport, disp->channel);
-
-  if (inext_init) {
-    ssn->state.remote_incoming_window = inext + iwin - ssn->state.outgoing_transfer_count;
-  } else {
-    ssn->state.remote_incoming_window = iwin;
-  }
-
-  if (handle_init) {
-    pn_link_t *link = pn_handle_state(ssn, handle);
-    if (link->endpoint.type == SENDER) {
-      pn_sequence_t receiver_count;
-      if (dcount_init) {
-        receiver_count = delivery_count;
-      } else {
-        // our initial delivery count
-        receiver_count = 0;
-      }
-      pn_sequence_t old = link->state.link_credit;
-      link->state.link_credit = receiver_count + link_credit - link->state.delivery_count;
-      link->credit += link->state.link_credit - old;
-      link->drain = drain;
-      pn_delivery_t *delivery = pn_link_current(link);
-      if (delivery) pn_work_update(transport->connection, delivery);
-    } else {
-      pn_sequence_t delta = delivery_count - link->state.delivery_count;
-      if (delta > 0) {
-        link->state.delivery_count += delta;
-        link->state.link_credit -= delta;
-        link->credit -= delta;
-        link->drained += delta;
-      }
-    }
-
-    pn_collector_put(transport->connection->collector, PN_OBJECT, link, PN_LINK_FLOW);
-  }
-
-  return 0;
-}
-
-#define SCAN_ERROR_DEFAULT ("D.[D.[sSC]")
-#define SCAN_ERROR_DETACH ("D.[..D.[sSC]")
-#define SCAN_ERROR_DISP ("[D.[sSC]")
-
-static int pn_scan_error(pn_data_t *data, pn_condition_t *condition, const char *fmt)
-{
-  pn_bytes_t cond;
-  pn_bytes_t desc;
-  pn_condition_clear(condition);
-  int err = pn_data_scan(data, fmt, &cond, &desc, condition->info);
-  if (err) return err;
-  pn_string_setn(condition->name, cond.start, cond.size);
-  pn_string_setn(condition->description, desc.start, desc.size);
-  pn_data_rewind(condition->info);
-  return 0;
-}
-
-int pn_do_disposition(pn_dispatcher_t *disp)
-{
-  pn_transport_t *transport = disp->transport;
-  bool role;
-  pn_sequence_t first, last;
-  uint64_t type = 0;
-  bool last_init, settled, type_init;
-  pn_data_clear(transport->disp_data);
-  int err = pn_scan_args(disp, "D.[oI?IoD?LC]", &role, &first, &last_init,
-                         &last, &settled, &type_init, &type,
-                         transport->disp_data);
-  if (err) return err;
-  if (!last_init) last = first;
-
-  pn_session_t *ssn = pn_channel_state(transport, disp->channel);
-  pn_delivery_map_t *deliveries;
-  if (role) {
-    deliveries = &ssn->state.outgoing;
-  } else {
-    deliveries = &ssn->state.incoming;
-  }
-
-  pn_data_rewind(transport->disp_data);
-  bool remote_data = (pn_data_next(transport->disp_data) &&
-                      pn_data_get_list(transport->disp_data) > 0);
-
-  for (pn_sequence_t id = first; id <= last; id++) {
-    pn_delivery_t *delivery = pn_delivery_map_get(deliveries, id);
-    pn_disposition_t *remote = &delivery->remote;
-    if (delivery) {
-      if (type_init) remote->type = type;
-      if (remote_data) {
-        switch (type) {
-        case PN_RECEIVED:
-          pn_data_rewind(transport->disp_data);
-          pn_data_next(transport->disp_data);
-          pn_data_enter(transport->disp_data);
-          if (pn_data_next(transport->disp_data))
-            remote->section_number = pn_data_get_uint(transport->disp_data);
-          if (pn_data_next(transport->disp_data))
-            remote->section_offset = pn_data_get_ulong(transport->disp_data);
-          break;
-        case PN_ACCEPTED:
-          break;
-        case PN_REJECTED:
-          err = pn_scan_error(transport->disp_data, &remote->condition, SCAN_ERROR_DISP);
-          if (err) return err;
-          break;
-        case PN_RELEASED:
-          break;
-        case PN_MODIFIED:
-          pn_data_rewind(transport->disp_data);
-          pn_data_next(transport->disp_data);
-          pn_data_enter(transport->disp_data);
-          if (pn_data_next(transport->disp_data))
-            remote->failed = pn_data_get_bool(transport->disp_data);
-          if (pn_data_next(transport->disp_data))
-            remote->undeliverable = pn_data_get_bool(transport->disp_data);
-          pn_data_narrow(transport->disp_data);
-          pn_data_clear(remote->data);
-          pn_data_appendn(remote->annotations, transport->disp_data, 1);
-          pn_data_widen(transport->disp_data);
-          break;
-        default:
-          pn_data_copy(remote->data, transport->disp_data);
-          break;
-        }
-      }
-      remote->settled = settled;
-      delivery->updated = true;
-      pn_work_update(transport->connection, delivery);
-
-      pn_collector_put(transport->connection->collector, PN_OBJECT, delivery, PN_DELIVERY);
-    }
-  }
-
-  return 0;
-}
-
-int pn_do_detach(pn_dispatcher_t *disp)
-{
-  pn_transport_t *transport = disp->transport;
-  uint32_t handle;
-  bool closed;
-  int err = pn_scan_args(disp, "D.[Io]", &handle, &closed);
-  if (err) return err;
-
-  pn_session_t *ssn = pn_channel_state(transport, disp->channel);
-  if (!ssn) {
-    return pn_do_error(transport, "amqp:invalid-field", "no such channel: %u", disp->channel);
-  }
-  pn_link_t *link = pn_handle_state(ssn, handle);
-  if (!link) {
-    return pn_do_error(transport, "amqp:invalid-field", "no such handle: %u", handle);
-  }
-
-  err = pn_scan_error(disp->args, &link->endpoint.remote_condition, SCAN_ERROR_DETACH);
-  if (err) return err;
-
-  if (closed)
-  {
-    PN_SET_REMOTE(link->endpoint.state, PN_REMOTE_CLOSED);
-    pn_collector_put(transport->connection->collector, PN_OBJECT, link, PN_LINK_REMOTE_CLOSE);
-  } else {
-    pn_collector_put(transport->connection->collector, PN_OBJECT, link, PN_LINK_REMOTE_DETACH);
-  }
-
-  pni_unmap_remote_handle(link);
-  return 0;
-}
-
-int pn_do_end(pn_dispatcher_t *disp)
-{
-  pn_transport_t *transport = disp->transport;
-  pn_session_t *ssn = pn_channel_state(transport, disp->channel);
-  int err = pn_scan_error(disp->args, &ssn->endpoint.remote_condition, SCAN_ERROR_DEFAULT);
-  if (err) return err;
-  PN_SET_REMOTE(ssn->endpoint.state, PN_REMOTE_CLOSED);
-  pn_collector_put(transport->connection->collector, PN_OBJECT, ssn, PN_SESSION_REMOTE_CLOSE);
-  pni_unmap_remote_channel(ssn);
-  return 0;
-}
-
-int pn_do_close(pn_dispatcher_t *disp)
-{
-  pn_transport_t *transport = disp->transport;
-  pn_connection_t *conn = transport->connection;
-  int err = pn_scan_error(disp->args, &transport->remote_condition, SCAN_ERROR_DEFAULT);
-  if (err) return err;
-  transport->close_rcvd = true;
-  PN_SET_REMOTE(conn->endpoint.state, PN_REMOTE_CLOSED);
-  pn_collector_put(transport->connection->collector, PN_OBJECT, conn, PN_CONNECTION_REMOTE_CLOSE);
-  return 0;
-}
-
-// deprecated
-ssize_t pn_transport_input(pn_transport_t *transport, const char *bytes, size_t available)
-{
-  if (!transport) return PN_ARG_ERR;
-  if (available == 0) {
-    return pn_transport_close_tail(transport);
-  }
-  const size_t original = available;
-  ssize_t capacity = pn_transport_capacity(transport);
-  if (capacity < 0) return capacity;
-  while (available && capacity) {
-    char *dest = pn_transport_tail(transport);
-    assert(dest);
-    size_t count = pn_min( (size_t)capacity, available );
-    memmove( dest, bytes, count );
-    available -= count;
-    bytes += count;
-    int rc = pn_transport_process( transport, count );
-    if (rc < 0) return rc;
-    capacity = pn_transport_capacity(transport);
-    if (capacity < 0) return capacity;
-  }
-
-  return original - available;
-}
-
-static void pni_maybe_post_closed(pn_transport_t *transport)
-{
-  pn_collector_t *collector = pni_transport_collector(transport);
-  if (transport->posted_head_closed && transport->posted_tail_closed) {
-    pn_collector_put(collector, PN_OBJECT, transport, PN_TRANSPORT_CLOSED);
-  }
-}
-
-// process pending input until none remaining or EOS
-static ssize_t transport_consume(pn_transport_t *transport)
-{
-  pn_io_layer_t *io_layer = transport->io_layers;
-  size_t consumed = 0;
-
-  while (transport->input_pending || transport->tail_closed) {
-    ssize_t n;
-    n = io_layer->process_input( io_layer,
-                                 transport->input_buf + consumed,
-                                 transport->input_pending );
-    if (n > 0) {
-      consumed += n;
-      transport->input_pending -= n;
-    } else if (n == 0) {
-      break;
-    } else {
-      assert(n == PN_EOS);
-      if (transport->disp->trace & (PN_TRACE_RAW | PN_TRACE_FRM))
-        pn_transport_log(transport, "  <- EOS");
-      transport->input_pending = 0;  // XXX ???
-      if (!transport->posted_tail_closed) {
-        pn_collector_t *collector = pni_transport_collector(transport);
-        pn_collector_put(collector, PN_OBJECT, transport, PN_TRANSPORT_TAIL_CLOSED);
-        transport->posted_tail_closed = true;
-        pni_maybe_post_closed(transport);
-      }
-      return n;
-    }
-  }
-
-  if (transport->input_pending && consumed) {
-    memmove( transport->input_buf,  &transport->input_buf[consumed], transport->input_pending );
-  }
-
-  return consumed;
-}
-
-static ssize_t pn_input_read_header(pn_transport_t *transport, const char *bytes, size_t available,
-                                    const char *header, size_t size, const char *protocol,
-                                    ssize_t (*next)(pn_io_layer_t *, const char *, size_t))
-{
-  const char *point = header + transport->header_count;
-  int delta = pn_min(available, size - transport->header_count);
-  if (!available || memcmp(bytes, point, delta)) {
-    char quoted[1024];
-    pn_quote_data(quoted, 1024, bytes, available);
-    pn_do_error(transport, "amqp:connection:framing-error",
-                "%s header mismatch: '%s'%s", protocol, quoted,
-                available ? "" : " (connection aborted)");
-    return PN_EOS;
-  } else {
-    transport->header_count += delta;
-    if (transport->header_count == size) {
-      transport->header_count = 0;
-      transport->io_layers[PN_IO_AMQP].process_input = next;
-
-      if (transport->disp->trace & PN_TRACE_FRM)
-        pn_transport_logf(transport, "  <- %s", protocol);
-    }
-    return delta;
-  }
-}
-
-#define AMQP_HEADER ("AMQP\x00\x01\x00\x00")
-
-static ssize_t pn_input_read_amqp_header(pn_io_layer_t *io_layer, const char *bytes, size_t available)
-{
-  pn_transport_t *transport = (pn_transport_t *)io_layer->context;
-  return pn_input_read_header(transport, bytes, available, AMQP_HEADER, 8,
-                              "AMQP", pn_input_read_amqp);
-}
-
-static ssize_t pn_input_read_amqp(pn_io_layer_t *io_layer, const char *bytes, size_t available)
-{
-  pn_transport_t *transport = (pn_transport_t *)io_layer->context;
-  if (transport->close_rcvd) {
-    if (available > 0) {
-      pn_do_error(transport, "amqp:connection:framing-error", "data after close");
-      return PN_EOS;
-    }
-  }
-
-  if (!available) {
-    pn_do_error(transport, "amqp:connection:framing-error", "connection aborted");
-    return PN_EOS;
-  }
-
-
-  ssize_t n = pn_dispatcher_input(transport->disp, bytes, available);
-  if (n < 0) {
-    //return pn_error_set(transport->error, n, "dispatch error");
-    return PN_EOS;
-  } else if (transport->close_rcvd) {
-    return PN_EOS;
-  } else {
-    return n;
-  }
-}
-
-/* process AMQP related timer events */
-static pn_timestamp_t pn_tick_amqp(pn_io_layer_t *io_layer, pn_timestamp_t now)
-{
-  pn_timestamp_t timeout = 0;
-  pn_transport_t *transport = (pn_transport_t *)io_layer->context;
-
-  if (transport->local_idle_timeout) {
-    if (transport->dead_remote_deadline == 0 ||
-        transport->last_bytes_input != transport->bytes_input) {
-      transport->dead_remote_deadline = now + transport->local_idle_timeout;
-      transport->last_bytes_input = transport->bytes_input;
-    } else if (transport->dead_remote_deadline <= now) {
-      transport->dead_remote_deadline = now + transport->local_idle_timeout;
-      // Note: AMQP-1.0 really should define a generic "timeout" error, but does not.
-      pn_do_error(transport, "amqp:resource-limit-exceeded", "local-idle-timeout expired");
-    }
-    timeout = transport->dead_remote_deadline;
-  }
-
-  // Prevent remote idle timeout as describe by AMQP 1.0:
-  if (transport->remote_idle_timeout && !transport->close_sent) {
-    if (transport->keepalive_deadline == 0 ||
-        transport->last_bytes_output != transport->bytes_output) {
-      transport->keepalive_deadline = now + (pn_timestamp_t)(transport->remote_idle_timeout/2.0);
-      transport->last_bytes_output = transport->bytes_output;
-    } else if (transport->keepalive_deadline <= now) {
-      transport->keepalive_deadline = now + (pn_timestamp_t)(transport->remote_idle_timeout/2.0);
-      if (transport->disp->available == 0) {    // no outbound data pending
-        // so send empty frame (and account for it!)
-        pn_post_frame(transport->disp, 0, "");
-        transport->last_bytes_output += transport->disp->available;
-      }
-    }
-    timeout = pn_timestamp_min( timeout, transport->keepalive_deadline );
-  }
-
-  return timeout;
-}
-
-int pn_process_conn_setup(pn_transport_t *transport, pn_endpoint_t *endpoint)
-{
-  if (endpoint->type == CONNECTION)
-  {
-    if (!(endpoint->state & PN_LOCAL_UNINIT) && !transport->open_sent)
-    {
-      // as per the recommendation in the spec, advertise half our
-      // actual timeout to the remote
-      const pn_millis_t idle_timeout = transport->local_idle_timeout
-          ? (transport->local_idle_timeout/2)
-          : 0;
-      pn_connection_t *connection = (pn_connection_t *) endpoint;
-      const char *cid = pn_string_get(connection->container);
-      int err = pn_post_frame(transport->disp, 0, "DL[SS?I?H?InnCCC]", OPEN,
-                              cid ? cid : "",
-                              pn_string_get(connection->hostname),
-                              // if not zero, advertise our max frame size and idle timeout
-                              (bool)transport->local_max_frame, transport->local_max_frame,
-                              (bool)transport->channel_max, transport->channel_max,
-                              (bool)idle_timeout, idle_timeout,
-                              connection->offered_capabilities,
-                              connection->desired_capabilities,
-                              connection->properties);
-      if (err) return err;
-      transport->open_sent = true;
-    }
-  }
-
-  return 0;
-}
-
-static uint16_t allocate_alias(pn_hash_t *aliases)
-{
-  for (uint32_t i = 0; i < 65536; i++) {
-    if (!pn_hash_get(aliases, i)) {
-      return i;
-    }
-  }
-
-  assert(false);
-  return 0;
-}
-
-size_t pn_session_outgoing_window(pn_session_t *ssn)
-{
-  uint32_t size = ssn->connection->transport->remote_max_frame;
-  if (!size) {
-    return ssn->outgoing_deliveries;
-  } else {
-    pn_sequence_t frames = ssn->outgoing_bytes/size;
-    if (ssn->outgoing_bytes % size) {
-      frames++;
-    }
-    return pn_max(frames, ssn->outgoing_deliveries);
-  }
-}
-
-size_t pn_session_incoming_window(pn_session_t *ssn)
-{
-  uint32_t size = ssn->connection->transport->local_max_frame;
-  if (!size) {
-    return 2147483647; // biggest legal value
-  } else {
-    return (ssn->incoming_capacity - ssn->incoming_bytes)/size;
-  }
-}
-
-static void pni_map_local_channel(pn_session_t *ssn)
-{
-  pn_transport_t *transport = ssn->connection->transport;
-  pn_session_state_t *state = &ssn->state;
-  uint16_t channel = allocate_alias(transport->local_channels);
-  state->local_channel = channel;
-  pn_hash_put(transport->local_channels, channel, ssn);
-}
-
-int pn_process_ssn_setup(pn_transport_t *transport, pn_endpoint_t *endpoint)
-{
-  if (endpoint->type == SESSION && transport->open_sent)
-  {
-    pn_session_t *ssn = (pn_session_t *) endpoint;
-    pn_session_state_t *state = &ssn->state;
-    if (!(endpoint->state & PN_LOCAL_UNINIT) && state->local_channel == (uint16_t) -1)
-    {
-      pni_map_local_channel(ssn);
-      state->incoming_window = pn_session_incoming_window(ssn);
-      state->outgoing_window = pn_session_outgoing_window(ssn);
-      pn_post_frame(transport->disp, state->local_channel, "DL[?HIII]", BEGIN,
-                    ((int16_t) state->remote_channel >= 0), state->remote_channel,
-                    state->outgoing_transfer_count,
-                    state->incoming_window,
-                    state->outgoing_window);
-    }
-  }
-
-  return 0;
-}
-
-static const char *expiry_symbol(pn_expiry_policy_t policy)
-{
-  switch (policy)
-  {
-  case PN_EXPIRE_WITH_LINK:
-    return "link-detach";
-  case PN_EXPIRE_WITH_SESSION:
-    return NULL;
-  case PN_EXPIRE_WITH_CONNECTION:
-    return "connection-close";
-  case PN_EXPIRE_NEVER:
-    return "never";
-  }
-  return NULL;
-}
-
-static void pni_map_local_handle(pn_link_t *link) {
-  pn_link_state_t *state = &link->state;
-  pn_session_state_t *ssn_state = &link->session->state;
-  state->local_handle = allocate_alias(ssn_state->local_handles);
-  pn_hash_put(ssn_state->local_handles, state->local_handle, link);
-}
-
-int pn_process_link_setup(pn_transport_t *transport, pn_endpoint_t *endpoint)
-{
-  if (transport->open_sent && (endpoint->type == SENDER ||
-                               endpoint->type == RECEIVER))
-  {
-    pn_link_t *link = (pn_link_t *) endpoint;
-    pn_session_state_t *ssn_state = &link->session->state;
-    pn_link_state_t *state = &link->state;
-    if (((int16_t) ssn_state->local_channel >= 0) &&
-        !(endpoint->state & PN_LOCAL_UNINIT) && state->local_handle == (uint32_t) -1)
-    {
-      pni_map_local_handle(link);
-      const pn_distribution_mode_t dist_mode = link->source.distribution_mode;
-      int err = pn_post_frame(transport->disp, ssn_state->local_channel,
-                              "DL[SIoBB?DL[SIsIoC?sCnCC]?DL[SIsIoCC]nnI]", ATTACH,
-                              pn_string_get(link->name),
-                              state->local_handle,
-                              endpoint->type == RECEIVER,
-                              link->snd_settle_mode,
-                              link->rcv_settle_mode,
-                              (bool) link->source.type, SOURCE,
-                              pn_string_get(link->source.address),
-                              link->source.durability,
-                              expiry_symbol(link->source.expiry_policy),
-                              link->source.timeout,
-                              link->source.dynamic,
-                              link->source.properties,
-                              (dist_mode != PN_DIST_MODE_UNSPECIFIED), dist_mode2symbol(dist_mode),
-                              link->source.filter,
-                              link->source.outcomes,
-                              link->source.capabilities,
-                              (bool) link->target.type, TARGET,
-                              pn_string_get(link->target.address),
-                              link->target.durability,
-                              expiry_symbol(link->target.expiry_policy),
-                              link->target.timeout,
-                              link->target.dynamic,
-                              link->target.properties,
-                              link->target.capabilities,
-                              0);
-      if (err) return err;
-    }
-  }
-
-  return 0;
-}
-
-int pn_post_flow(pn_transport_t *transport, pn_session_t *ssn, pn_link_t *link)
-{
-  ssn->state.incoming_window = pn_session_incoming_window(ssn);
-  ssn->state.outgoing_window = pn_session_outgoing_window(ssn);
-  bool linkq = (bool) link;
-  pn_link_state_t *state = &link->state;
-  return pn_post_frame(transport->disp, ssn->state.local_channel, "DL[?IIII?I?I?In?o]", FLOW,
-                       (int16_t) ssn->state.remote_channel >= 0, ssn->state.incoming_transfer_count,
-                       ssn->state.incoming_window,
-                       ssn->state.outgoing_transfer_count,
-                       ssn->state.outgoing_window,
-                       linkq, linkq ? state->local_handle : 0,
-                       linkq, linkq ? state->delivery_count : 0,
-                       linkq, linkq ? state->link_credit : 0,
-                       linkq, linkq ? link->drain : false);
-}
-
-int pn_process_flow_receiver(pn_transport_t *transport, pn_endpoint_t *endpoint)
-{
-  if (endpoint->type == RECEIVER && endpoint->state & PN_LOCAL_ACTIVE)
-  {
-    pn_link_t *rcv = (pn_link_t *) endpoint;
-    pn_session_t *ssn = rcv->session;
-    pn_link_state_t *state = &rcv->state;
-    if ((int16_t) ssn->state.local_channel >= 0 &&
-        (int32_t) state->local_handle >= 0 &&
-        ((rcv->drain || state->link_credit != rcv->credit - rcv->queued) || !ssn->state.incoming_window)) {
-      state->link_credit = rcv->credit - rcv->queued;
-      return pn_post_flow(transport, ssn, rcv);
-    }
-  }
-
-  return 0;
-}
-
-int pn_flush_disp(pn_transport_t *transport, pn_session_t *ssn)
-{
-  uint64_t code = ssn->state.disp_code;
-  bool settled = ssn->state.disp_settled;
-  if (ssn->state.disp) {
-    int err = pn_post_frame(transport->disp, ssn->state.local_channel, "DL[oIIo?DL[]]", DISPOSITION,
-                            ssn->state.disp_type, ssn->state.disp_first, ssn->state.disp_last,
-                            settled, (bool)code, code);
-    if (err) return err;
-    ssn->state.disp_type = 0;
-    ssn->state.disp_code = 0;
-    ssn->state.disp_settled = 0;
-    ssn->state.disp_first = 0;
-    ssn->state.disp_last = 0;
-    ssn->state.disp = false;
-  }
-  return 0;
-}
-
-int pn_post_disp(pn_transport_t *transport, pn_delivery_t *delivery)
-{
-  pn_link_t *link = delivery->link;
-  pn_session_t *ssn = link->session;
-  pn_session_state_t *ssn_state = &ssn->state;
-  pn_modified(transport->connection, &link->session->endpoint, false);
-  pn_delivery_state_t *state = &delivery->state;
-  assert(state->init);
-  bool role = (link->endpoint.type == RECEIVER);
-  uint64_t code = delivery->local.type;
-
-  if (!code && !delivery->local.settled) {
-    return 0;
-  }
-
-  if (!pni_disposition_batchable(&delivery->local)) {
-    pn_data_clear(transport->disp_data);
-    pni_disposition_encode(&delivery->local, transport->disp_data);
-    return pn_post_frame(transport->disp, ssn->state.local_channel,
-                         "DL[oIIo?DLC]", DISPOSITION,
-                         role, state->id, state->id, delivery->local.settled,
-                         (bool)code, code, transport->disp_data);
-  }
-
-  if (ssn_state->disp && code == ssn_state->disp_code &&
-      delivery->local.settled == ssn_state->disp_settled &&
-      ssn_state->disp_type == role) {
-    if (state->id == ssn_state->disp_first - 1) {
-      ssn_state->disp_first = state->id;
-      return 0;
-    } else if (state->id == ssn_state->disp_last + 1) {
-      ssn_state->disp_last = state->id;
-      return 0;
-    }
-  }
-
-  if (ssn_state->disp) {
-    int err = pn_flush_disp(transport, ssn);
-    if (err) return err;
-  }
-
-  ssn_state->disp_type = role;
-  ssn_state->disp_code = code;
-  ssn_state->disp_settled = delivery->local.settled;
-  ssn_state->disp_first = state->id;
-  ssn_state->disp_last = state->id;
-  ssn_state->disp = true;
-
-  return 0;
-}
-
-int pn_process_tpwork_sender(pn_transport_t *transport, pn_delivery_t *delivery, bool *settle)
-{
-  *settle = false;
-  pn_link_t *link = delivery->link;
-  pn_session_state_t *ssn_state = &link->session->state;
-  pn_link_state_t *link_state = &link->state;
-  bool xfr_posted = false;
-  if ((int16_t) ssn_state->local_channel >= 0 && (int32_t) link_state->local_handle >= 0) {
-    pn_delivery_state_t *state = &delivery->state;
-    if (!state->sent && (delivery->done || pn_buffer_size(delivery->bytes) > 0) &&
-        ssn_state->remote_incoming_window > 0 && link_state->link_credit > 0) {
-      if (!state->init) {
-        state = pn_delivery_map_push(&ssn_state->outgoing, delivery);
-      }
-
-      pn_bytes_t bytes = pn_buffer_bytes(delivery->bytes);
-      pn_set_payload(transport->disp, bytes.start, bytes.size);
-      pn_bytes_t tag = pn_buffer_bytes(delivery->tag);
-      int count = pn_post_transfer_frame(transport->disp,
-                                         ssn_state->local_channel,
-                                         link_state->local_handle,
-                                         state->id, &tag,
-                                         0, // message-format
-                                         delivery->local.settled,
-                                         !delivery->done,
-                                         ssn_state->remote_incoming_window);
-      if (count < 0) return count;
-      xfr_posted = true;
-      ssn_state->outgoing_transfer_count += count;
-      ssn_state->remote_incoming_window -= count;
-
-      int sent = bytes.size - transport->disp->output_size;
-      pn_buffer_trim(delivery->bytes, sent, 0);
-      link->session->outgoing_bytes -= sent;
-      if (!pn_buffer_size(delivery->bytes) && delivery->done) {
-        state->sent = true;
-        link_state->delivery_count++;
-        link_state->link_credit--;
-        link->queued--;
-        link->session->outgoing_deliveries--;
-      }
-
-      pn_collector_put(transport->connection->collector, PN_OBJECT, link, PN_LINK_FLOW);
-    }
-  }
-
-  pn_delivery_state_t *state = delivery->state.init ? &delivery->state : NULL;
-  if ((int16_t) ssn_state->local_channel >= 0 && !delivery->remote.settled
-      && state && state->sent && !xfr_posted) {
-    int err = pn_post_disp(transport, delivery);
-    if (err) return err;
-  }
-
-  *settle = delivery->local.settled && state && state->sent;
-  return 0;
-}
-
-int pn_process_tpwork_receiver(pn_transport_t *transport, pn_delivery_t *delivery, bool *settle)
-{
-  *settle = false;
-  pn_link_t *link = delivery->link;
-  // XXX: need to prevent duplicate disposition sending
-  pn_session_t *ssn = link->session;
-  if ((int16_t) ssn->state.local_channel >= 0 && !delivery->remote.settled && delivery->state.init) {
-    int err = pn_post_disp(transport, delivery);
-    if (err) return err;
-  }
-
-  // XXX: need to centralize this policy and improve it
-  if (!ssn->state.incoming_window) {
-    int err = pn_post_flow(transport, ssn, link);
-    if (err) return err;
-  }
-
-  *settle = delivery->local.settled;
-  return 0;
-}
-
-int pn_process_tpwork(pn_transport_t *transport, pn_endpoint_t *endpoint)
-{
-  if (endpoint->type == CONNECTION && !transport->close_sent)
-  {
-    pn_connection_t *conn = (pn_connection_t *) endpoint;
-    pn_delivery_t *delivery = conn->tpwork_head;
-    while (delivery)
-    {
-      pn_delivery_t *tp_next = delivery->tpwork_next;
-      bool settle = false;
-
-      pn_link_t *link = delivery->link;
-      pn_delivery_map_t *dm = NULL;
-      if (pn_link_is_sender(link)) {
-        dm = &link->session->state.outgoing;
-        int err = pn_process_tpwork_sender(transport, delivery, &settle);
-        if (err) return err;
-      } else {
-        dm = &link->session->state.incoming;
-        int err = pn_process_tpwork_receiver(transport, delivery, &settle);
-        if (err) return err;
-      }
-
-      if (settle) {
-        pn_full_settle(dm, delivery);
-      } else if (!pn_delivery_buffered(delivery)) {
-        pn_clear_tpwork(delivery);
-      }
-
-      delivery = tp_next;
-    }
-  }
-
-  return 0;
-}
-
-int pn_process_flush_disp(pn_transport_t *transport, pn_endpoint_t *endpoint)
-{
-  if (endpoint->type == SESSION) {
-    pn_session_t *session = (pn_session_t *) endpoint;
-    pn_session_state_t *state = &session->state;
-    if ((int16_t) state->local_channel >= 0 && !transport->close_sent)
-    {
-      int err = pn_flush_disp(transport, session);
-      if (err) return err;
-    }
-  }
-
-  return 0;
-}
-
-int pn_process_flow_sender(pn_transport_t *transport, pn_endpoint_t *endpoint)
-{
-  if (endpoint->type == SENDER && endpoint->state & PN_LOCAL_ACTIVE)
-  {
-    pn_link_t *snd = (pn_link_t *) endpoint;
-    pn_session_t *ssn = snd->session;
-    pn_link_state_t *state = &snd->state;
-    if ((int16_t) ssn->state.local_channel >= 0 &&
-        (int32_t) state->local_handle >= 0 &&
-        snd->drain && snd->drained) {
-      pn_delivery_t *tail = snd->unsettled_tail;
-      if (!tail || !pn_delivery_buffered(tail)) {
-        state->delivery_count += state->link_credit;
-        state->link_credit = 0;
-        snd->drained = 0;
-        return pn_post_flow(transport, ssn, snd);
-      }
-    }
-  }
-
-  return 0;
-}
-
-static void pni_unmap_local_handle(pn_link_t *link) {
-  pn_link_state_t *state = &link->state;
-  uintptr_t handle = state->local_handle;
-  state->local_handle = -2;
-  // may delete link
-  pn_hash_del(link->session->state.local_handles, handle);
-}
-
-int pn_process_link_teardown(pn_transport_t *transport, pn_endpoint_t *endpoint)
-{
-  if (endpoint->type == SENDER || endpoint->type == RECEIVER)
-  {
-    pn_link_t *link = (pn_link_t *) endpoint;
-    pn_session_t *session = link->session;
-    pn_session_state_t *ssn_state = &session->state;
-    pn_link_state_t *state = &link->state;
-    if (((endpoint->state & PN_LOCAL_CLOSED) || link->detached) && (int32_t) state->local_handle >= 0 &&
-        (int16_t) ssn_state->local_channel >= 0 && !transport->close_sent) {
-      if (pn_link_is_sender(link) && pn_link_queued(link) &&
-          (int32_t) state->remote_handle != -2 &&
-          (int16_t) ssn_state->remote_channel != -2 &&
-          !transport->close_rcvd) return 0;
-
-      const char *name = NULL;
-      const char *description = NULL;
-      pn_data_t *info = NULL;
-
-      if (pn_condition_is_set(&endpoint->condition)) {
-        name = pn_condition_get_name(&endpoint->condition);
-        description = pn_condition_get_description(&endpoint->condition);
-        info = pn_condition_info(&endpoint->condition);
-      }
-
-      int err =
-          pn_post_frame(transport->disp, ssn_state->local_channel,
-                        "DL[Io?DL[sSC]]", DETACH, state->local_handle, !link->detached,
-                        (bool)name, ERROR, name, description, info);
-      if (err) return err;
-      pni_unmap_local_handle(link);
-    }
-
-    pn_clear_modified(transport->connection, endpoint);
-  }
-
-  return 0;
-}
-
-bool pn_pointful_buffering(pn_transport_t *transport, pn_session_t *session)
-{
-  if (transport->close_rcvd) return false;
-  if (!transport->open_rcvd) return true;
-
-  pn_connection_t *conn = transport->connection;
-  pn_link_t *link = pn_link_head(conn, 0);
-  while (link) {
-    if (pn_link_is_sender(link) && pn_link_queued(link) > 0) {
-      pn_session_t *ssn = link->session;
-      if (session && session == ssn) {
-        if ((int32_t) link->state.remote_handle != -2 &&
-            (int16_t) session->state.remote_channel != -2) {
-          return true;
-        }
-      }
-    }
-    link = pn_link_next(link, 0);
-  }
-
-  return false;
-}
-
-static void pni_unmap_local_channel(pn_session_t *ssn) {
-  // XXX: should really update link state also
-  pni_transport_unbind_handles(ssn->state.local_handles, false);
-  pn_transport_t *transport = ssn->connection->transport;
-  pn_session_state_t *state = &ssn->state;
-  uintptr_t channel = state->local_channel;
-  state->local_channel = -2;
-  // may delete session
-  pn_hash_del(transport->local_channels, channel);
-}
-
-int pn_process_ssn_teardown(pn_transport_t *transport, pn_endpoint_t *endpoint)
-{
-  if (endpoint->type == SESSION)
-  {
-    pn_session_t *session = (pn_session_t *) endpoint;
-    pn_session_state_t *state = &session->state;
-    if (endpoint->state & PN_LOCAL_CLOSED && (int16_t) state->local_channel >= 0
-        && !transport->close_sent)
-    {
-      if (pn_pointful_buffering(transport, session)) {
-        return 0;
-      }
-
-      const char *name = NULL;
-      const char *description = NULL;
-      pn_data_t *info = NULL;
-
-      if (pn_condition_is_set(&endpoint->condition)) {
-        name = pn_condition_get_name(&endpoint->condition);
-        description = pn_condition_get_description(&endpoint->condition);
-        info = pn_condition_info(&endpoint->condition);
-      }
-
-      int err = pn_post_frame(transport->disp, state->local_channel, "DL[?DL[sSC]]", END,
-                              (bool) name, ERROR, name, description, info);
-      if (err) return err;
-      pni_unmap_local_channel(session);
-    }
-
-    pn_clear_modified(transport->connection, endpoint);
-  }
-  return 0;
-}
-
-int pn_process_conn_teardown(pn_transport_t *transport, pn_endpoint_t *endpoint)
-{
-  if (endpoint->type == CONNECTION)
-  {
-    if (endpoint->state & PN_LOCAL_CLOSED && !transport->close_sent) {
-      if (pn_pointful_buffering(transport, NULL)) return 0;
-      int err = pn_post_close(transport, NULL, NULL);
-      if (err) return err;
-      transport->close_sent = true;
-    }
-
-    pn_clear_modified(transport->connection, endpoint);
-  }
-  return 0;
-}
-
-int pn_phase(pn_transport_t *transport, int (*phase)(pn_transport_t *, pn_endpoint_t *))
-{
-  pn_connection_t *conn = transport->connection;
-  pn_endpoint_t *endpoint = conn->transport_head;
-  while (endpoint)
-  {
-    pn_endpoint_t *next = endpoint->transport_next;
-    int err = phase(transport, endpoint);
-    if (err) return err;
-    endpoint = next;
-  }
-  return 0;
-}
-
-int pn_process(pn_transport_t *transport)
-{
-  int err;
-  if ((err = pn_phase(transport, pn_process_conn_setup))) return err;
-  if ((err = pn_phase(transport, pn_process_ssn_setup))) return err;
-  if ((err = pn_phase(transport, pn_process_link_setup))) return err;
-  if ((err = pn_phase(transport, pn_process_flow_receiver))) return err;
-
-  // XXX: this has to happen two times because we might settle stuff
-  // on the first pass and create space for more work to be done on the
-  // second pass
-  if ((err = pn_phase(transport, pn_process_tpwork))) return err;
-  if ((err = pn_phase(transport, pn_process_tpwork))) return err;
-
-  if ((err = pn_phase(transport, pn_process_flush_disp))) return err;
-
-  if ((err = pn_phase(transport, pn_process_flow_sender))) return err;
-  if ((err = pn_phase(transport, pn_process_link_teardown))) return err;
-  if ((err = pn_phase(transport, pn_process_ssn_teardown))) return err;
-  if ((err = pn_phase(transport, pn_process_conn_teardown))) return err;
-
-  if (transport->connection->tpwork_head) {
-    pn_modified(transport->connection, &transport->connection->endpoint, false);
-  }
-
-  return 0;
-}
-
-static ssize_t pn_output_write_header(pn_transport_t *transport,
-                                      char *bytes, size_t size,
-                                      const char *header, size_t hdrsize,
-                                      const char *protocol,
-                                      ssize_t (*next)(pn_io_layer_t *, char *, size_t))
-{
-  if (transport->disp->trace & PN_TRACE_FRM)
-    pn_transport_logf(transport, "  -> %s", protocol);
-  assert(size >= hdrsize);
-  memmove(bytes, header, hdrsize);
-  transport->io_layers[PN_IO_AMQP].process_output = next;
-  return hdrsize;
-}
-
-static ssize_t pn_output_write_amqp_header(pn_io_layer_t *io_layer, char *bytes, size_t size)
-{
-  pn_transport_t *transport = (pn_transport_t *)io_layer->context;
-  return pn_output_write_header(transport, bytes, size, AMQP_HEADER, 8, "AMQP",
-                                pn_output_write_amqp);
-}
-
-static ssize_t pn_output_write_amqp(pn_io_layer_t *io_layer, char *bytes, size_t size)
-{
-  pn_transport_t *transport = (pn_transport_t *)io_layer->context;
-  if (transport->connection && !transport->done_processing) {
-    int err = pn_process(transport);
-    if (err) {
-      pn_transport_logf(transport, "process error %i", err);
-      transport->done_processing = true;
-    }
-  }
-
-  // write out any buffered data _before_ returning PN_EOS, else we
-  // could truncate an outgoing Close frame containing a useful error
-  // status
-  if (!transport->disp->available && transport->close_sent) {
-    return PN_EOS;
-  }
-
-  return pn_dispatcher_output(transport->disp, bytes, size);
-}
-
-// generate outbound data, return amount of pending output else error
-static ssize_t transport_produce(pn_transport_t *transport)
-{
-  pn_io_layer_t *io_layer = transport->io_layers;
-  ssize_t space = transport->output_size - transport->output_pending;
-
-  if (space <= 0) {     // can we expand the buffer?
-    int more = 0;
-    if (!transport->remote_max_frame)   // no limit, so double it
-      more = transport->output_size;
-    else if (transport->remote_max_frame > transport->output_size)
-      more = pn_min(transport->output_size, transport->remote_max_frame - transport->output_size);
-    if (more) {
-      char *newbuf = (char *)realloc( transport->output_buf, transport->output_size + more );
-      if (newbuf) {
-        transport->output_buf = newbuf;
-        transport->output_size += more;
-        space += more;
-      }
-    }
-  }
-
-  while (space > 0) {
-    ssize_t n;
-    n = io_layer->process_output( io_layer,
-                                  &transport->output_buf[transport->output_pending],
-                                  space );
-    if (n > 0) {
-      space -= n;
-      transport->output_pending += n;
-    } else if (n == 0) {
-      break;
-    } else {
-      if (transport->output_pending)
-        break;   // return what is available
-      if (transport->disp->trace & (PN_TRACE_RAW | PN_TRACE_FRM)) {
-        if (n < 0) {
-          pn_transport_log(transport, "  -> EOS");
-        }
-        /*else
-          pn_transport_logf(transport, "  -> EOS (%" PN_ZI ") %s", n,
-          pn_error_text(transport->error));*/
-      }
-      return n;
-    }
-  }
-  return transport->output_pending;
-}
-
-// deprecated
-ssize_t pn_transport_output(pn_transport_t *transport, char *bytes, size_t size)
-{
-  if (!transport) return PN_ARG_ERR;
-  ssize_t available = pn_transport_pending(transport);
-  if (available > 0) {
-    available = (ssize_t) pn_min( (size_t)available, size );
-    memmove( bytes, pn_transport_head(transport), available );
-    pn_transport_pop( transport, (size_t) available );
-  }
-  return available;
-}
-
-
-void pn_transport_trace(pn_transport_t *transport, pn_trace_t trace)
-{
-  if (transport->sasl) pn_sasl_trace(transport->sasl, trace);
-  if (transport->ssl) pn_ssl_trace(transport->ssl, trace);
-  transport->disp->trace = trace;
-}
-
-void pn_transport_set_tracer(pn_transport_t *transport, pn_tracer_t tracer)
-{
-  assert(transport);
-  assert(tracer);
-
-  transport->tracer = tracer;
-}
-
-pn_tracer_t pn_transport_get_tracer(pn_transport_t *transport)
-{
-  assert(transport);
-  return transport->tracer;
-}
-
-void pn_transport_set_context(pn_transport_t *transport, void *context)
-{
-  assert(transport);
-  transport->context = context;
-}
-
-void *pn_transport_get_context(pn_transport_t *transport)
-{
-  assert(transport);
-  return transport->context;
-}
-
-void pn_transport_log(pn_transport_t *transport, const char *message)
-{
-  assert(transport);
-  transport->tracer(transport, message);
-}
-
-void pn_transport_logf(pn_transport_t *transport, const char *fmt, ...)
-{
-  va_list ap;
-
-  va_start(ap, fmt);
-  pn_string_vformat(transport->scratch, fmt, ap);
-  va_end(ap);
-
-  pn_transport_log(transport, pn_string_get(transport->scratch));
-}
-
-uint16_t pn_transport_get_channel_max(pn_transport_t *transport)
-{
-  return transport->channel_max;
-}
-
-void pn_transport_set_channel_max(pn_transport_t *transport, uint16_t channel_max)
-{
-  transport->channel_max = channel_max;
-}
-
-uint16_t pn_transport_remote_channel_max(pn_transport_t *transport)
-{
-  return transport->remote_channel_max;
-}
-
-uint32_t pn_transport_get_max_frame(pn_transport_t *transport)
-{
-  return transport->local_max_frame;
-}
-
-void pn_transport_set_max_frame(pn_transport_t *transport, uint32_t size)
-{
-  // if size == 0, no advertised limit to input frame size.
-  if (size && size < AMQP_MIN_MAX_FRAME_SIZE)
-    size = AMQP_MIN_MAX_FRAME_SIZE;
-  transport->local_max_frame = size;
-}
-
-uint32_t pn_transport_get_remote_max_frame(pn_transport_t *transport)
-{
-  return transport->remote_max_frame;
-}
-
-pn_millis_t pn_transport_get_idle_timeout(pn_transport_t *transport)
-{
-  return transport->local_idle_timeout;
-}
-
-void pn_transport_set_idle_timeout(pn_transport_t *transport, pn_millis_t timeout)
-{
-  transport->local_idle_timeout = timeout;
-  transport->io_layers[PN_IO_AMQP].process_tick = pn_tick_amqp;
-}
-
-pn_millis_t pn_transport_get_remote_idle_timeout(pn_transport_t *transport)
-{
-  return transport->remote_idle_timeout;
-}
-
-pn_timestamp_t pn_transport_tick(pn_transport_t *transport, pn_timestamp_t now)
-{
-  pn_io_layer_t *io_layer = transport->io_layers;
-  return io_layer->process_tick( io_layer, now );
-}
-
-uint64_t pn_transport_get_frames_output(const pn_transport_t *transport)
-{
-  if (transport && transport->disp)
-    return transport->disp->output_frames_ct;
-  return 0;
-}
-
-uint64_t pn_transport_get_frames_input(const pn_transport_t *transport)
-{
-  if (transport && transport->disp)
-    return transport->disp->input_frames_ct;
-  return 0;
-}
-
-/** Pass through input handler */
-ssize_t pn_io_layer_input_passthru(pn_io_layer_t *io_layer, const char *data, size_t available)
-{
-  pn_io_layer_t *next = io_layer->next;
-  if (next)
-    return next->process_input( next, data, available );
-  return PN_EOS;
-}
-
-/** Pass through output handler */
-ssize_t pn_io_layer_output_passthru(pn_io_layer_t *io_layer, char *bytes, size_t size)
-{
-  pn_io_layer_t *next = io_layer->next;
-  if (next)
-    return next->process_output( next, bytes, size );
-  return PN_EOS;
-}
-
-/** Pass through tick handler */
-pn_timestamp_t pn_io_layer_tick_passthru(pn_io_layer_t *io_layer, pn_timestamp_t now)
-{
-  pn_io_layer_t *next = io_layer->next;
-  if (next)
-    return next->process_tick( next, now );
-  return 0;
-}
-
-
-///
-
-// input
-ssize_t pn_transport_capacity(pn_transport_t *transport)  /* <0 == done */
-{
-  if (transport->tail_closed) return PN_EOS;
-  //if (pn_error_code(transport->error)) return pn_error_code(transport->error);
-
-  ssize_t capacity = transport->input_size - transport->input_pending;
-  if ( capacity<=0 ) {
-    // can we expand the size of the input buffer?
-    int more = 0;
-    if (!transport->local_max_frame) {  // no limit (ha!)
-      more = transport->input_size;
-    } else if (transport->local_max_frame > transport->input_size) {
-      more = pn_min(transport->input_size, transport->local_max_frame - transport->input_size);
-    }
-    if (more) {
-      char *newbuf = (char *) realloc( transport->input_buf, transport->input_size + more );
-      if (newbuf) {
-        transport->input_buf = newbuf;
-        transport->input_size += more;
-        capacity += more;
-      }
-    }
-  }
-  return capacity;
-}
-
-
-char *pn_transport_tail(pn_transport_t *transport)
-{
-  if (transport && transport->input_pending < transport->input_size) {
-    return &transport->input_buf[transport->input_pending];
-  }
-  return NULL;
-}
-
-ssize_t pn_transport_push(pn_transport_t *transport, const char *src, size_t size)
-{
-  assert(transport);
-
-  ssize_t capacity = pn_transport_capacity(transport);
-  if (capacity < 0) {
-    return capacity;
-  } else if (size > (size_t) capacity) {
-    size = capacity;
-  }
-
-  char *dst = pn_transport_tail(transport);
-  assert(dst);
-  memmove(dst, src, size);
-
-  int n = pn_transport_process(transport, size);
-  if (n < 0) {
-    return n;
-  } else {
-    return size;
-  }
-}
-
-void pni_close_tail(pn_transport_t *transport)
-{
-  if (!transport->tail_closed) {
-    transport->tail_closed = true;
-  }
-}
-
-int pn_transport_process(pn_transport_t *transport, size_t size)
-{
-  assert(transport);
-  size = pn_min( size, (transport->input_size - transport->input_pending) );
-  transport->input_pending += size;
-  transport->bytes_input += size;
-
-  ssize_t n = transport_consume( transport );
-  if (n == PN_EOS) {
-    pni_close_tail(transport);
-  }
-
-  if (n < 0 && n != PN_EOS) return n;
-  return 0;
-}
-
-// input stream has closed
-int pn_transport_close_tail(pn_transport_t *transport)
-{
-  pni_close_tail(transport);
-  transport_consume( transport );
-  return 0;
-  // XXX: what if not all input processed at this point?  do we care???
-}
-
-// output
-ssize_t pn_transport_pending(pn_transport_t *transport)      /* <0 == done */
-{
-  assert(transport);
-  if (transport->head_closed) return PN_EOS;
-  return transport_produce( transport );
-}
-
-const char *pn_transport_head(pn_transport_t *transport)
-{
-  if (transport && transport->output_pending) {
-    return transport->output_buf;
-  }
-  return NULL;
-}
-
-ssize_t pn_transport_peek(pn_transport_t *transport, char *dst, size_t size)
-{
-  assert(transport);
-
-  ssize_t pending = pn_transport_pending(transport);
-  if (pending < 0) {
-    return pending;
-  } else if (size > (size_t) pending) {
-    size = pending;
-  }
-
-  if (pending > 0) {
-    const char *src = pn_transport_head(transport);
-    assert(src);
-    memmove(dst, src, size);
-  }
-
-  return size;
-}
-
-void pn_transport_pop(pn_transport_t *transport, size_t size)
-{
-  if (transport) {
-    assert( transport->output_pending >= size );
-    transport->output_pending -= size;
-    transport->bytes_output += size;
-    if (transport->output_pending) {
-      memmove( transport->output_buf,  &transport->output_buf[size],
-               transport->output_pending );
-    }
-
-    if (!transport->output_pending && pn_transport_pending(transport) < 0 &&
-        !transport->posted_head_closed) {
-      pn_collector_t *collector = pni_transport_collector(transport);
-      pn_collector_put(collector, PN_OBJECT, transport, PN_TRANSPORT_HEAD_CLOSED);
-      transport->posted_head_closed = true;
-      pni_maybe_post_closed(transport);
-    }
-  }
-}
-
-int pn_transport_close_head(pn_transport_t *transport)
-{
-  size_t pending = pn_transport_pending(transport);
-  transport->head_closed = true;
-  pn_transport_pop(transport, pending);
-  return 0;
-}
-
-// true if the transport will not generate further output
-bool pn_transport_quiesced(pn_transport_t *transport)
-{
-  if (!transport) return true;
-  ssize_t pending = pn_transport_pending(transport);
-  if (pending < 0) return true; // output done
-  else if (pending > 0) return false;
-  // no pending at transport, but check if data is buffered in I/O layers
-  pn_io_layer_t *io_layer = transport->io_layers;
-  while (io_layer != &transport->io_layers[PN_IO_LAYER_CT]) {
-    if (io_layer->buffered_output && io_layer->buffered_output( io_layer ))
-      return false;
-    ++io_layer;
-  }
-  return true;
-}
-
-bool pn_transport_closed(pn_transport_t *transport)
-{
-  assert(transport);
-  ssize_t capacity = pn_transport_capacity(transport);
-  ssize_t pending = pn_transport_pending(transport);
-  return capacity < 0 && pending < 0;
-}
-
-pn_connection_t *pn_transport_connection(pn_transport_t *transport)
-{
-  assert(transport);
-  return transport->connection;
-}


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


[18/50] [abbrv] qpid-proton git commit: PROTON-708: changed pn_driver_error to return the pn_error_t

Posted by gs...@apache.org.
PROTON-708: changed pn_driver_error to return the pn_error_t

git-svn-id: https://svn.apache.org/repos/asf/qpid/proton/trunk@1632098 13f79535-47bb-0310-9956-ffa450edef68


Project: http://git-wip-us.apache.org/repos/asf/qpid-proton/repo
Commit: http://git-wip-us.apache.org/repos/asf/qpid-proton/commit/eb45c9d7
Tree: http://git-wip-us.apache.org/repos/asf/qpid-proton/tree/eb45c9d7
Diff: http://git-wip-us.apache.org/repos/asf/qpid-proton/diff/eb45c9d7

Branch: refs/heads/examples
Commit: eb45c9d742ad4961579d8c724fe2947d5cc9f901
Parents: 0329abf
Author: Rafael H. Schloming <rh...@apache.org>
Authored: Wed Oct 15 15:47:26 2014 +0000
Committer: Rafael H. Schloming <rh...@apache.org>
Committed: Wed Oct 15 15:47:26 2014 +0000

----------------------------------------------------------------------
 proton-c/include/proton/driver.h | 13 ++++++++++---
 proton-c/src/posix/driver.c      |  8 +++++---
 proton-c/src/windows/driver.c    |  8 +++++---
 3 files changed, 20 insertions(+), 9 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/eb45c9d7/proton-c/include/proton/driver.h
----------------------------------------------------------------------
diff --git a/proton-c/include/proton/driver.h b/proton-c/include/proton/driver.h
index 6ba2863..ccf80a0 100644
--- a/proton-c/include/proton/driver.h
+++ b/proton-c/include/proton/driver.h
@@ -73,13 +73,20 @@ PN_EXTERN pn_driver_t *pn_driver(void);
  */
 PN_EXTERN int pn_driver_errno(pn_driver_t *d);
 
-/** Return the most recent error text for d.
+/** Get additional error information associated with the driver.
+ *
+ * Whenever a driver operation fails, additional error information can
+ * be obtained using this function. The error object that is returned
+ * may also be used to clear the error condition.
+ *
+ * The pointer returned by this operation is valid until the
+ * driver object is freed.
  *
  * @param[in] d the driver
  *
- * @return the most recent error text for d
+ * @return the driver's error object
  */
-PN_EXTERN const char *pn_driver_error(pn_driver_t *d);
+PN_EXTERN pn_error_t *pn_driver_error(pn_driver_t *d);
 
 /** Set the tracing level for the given driver.
  *

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/eb45c9d7/proton-c/src/posix/driver.c
----------------------------------------------------------------------
diff --git a/proton-c/src/posix/driver.c b/proton-c/src/posix/driver.c
index d71ca7d..4bc71bb 100644
--- a/proton-c/src/posix/driver.c
+++ b/proton-c/src/posix/driver.c
@@ -576,12 +576,14 @@ pn_driver_t *pn_driver()
 
 int pn_driver_errno(pn_driver_t *d)
 {
-  return d ? pn_error_code(d->error) : PN_ARG_ERR;
+  assert(d);
+  return pn_error_code(d->error);
 }
 
-const char *pn_driver_error(pn_driver_t *d)
+pn_error_t *pn_driver_error(pn_driver_t *d)
 {
-  return d ? pn_error_text(d->error) : NULL;
+  assert(d);
+  return d->error;
 }
 
 void pn_driver_trace(pn_driver_t *d, pn_trace_t trace)

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/eb45c9d7/proton-c/src/windows/driver.c
----------------------------------------------------------------------
diff --git a/proton-c/src/windows/driver.c b/proton-c/src/windows/driver.c
index ddccd82..43662f9 100644
--- a/proton-c/src/windows/driver.c
+++ b/proton-c/src/windows/driver.c
@@ -712,12 +712,14 @@ pn_driver_t *pn_driver()
 
 int pn_driver_errno(pn_driver_t *d)
 {
-  return d ? pn_error_code(d->error) : PN_ARG_ERR;
+  assert(d);
+  return pn_error_code(d->error);
 }
 
-const char *pn_driver_error(pn_driver_t *d)
+pn_error_t *pn_driver_error(pn_driver_t *d)
 {
-  return d ? pn_error_text(d->error) : NULL;
+  assert(d);
+  return d->error;
 }
 
 void pn_driver_trace(pn_driver_t *d, pn_trace_t trace)


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


[23/50] [abbrv] qpid-proton git commit: fixed Collector.put

Posted by gs...@apache.org.
fixed Collector.put

git-svn-id: https://svn.apache.org/repos/asf/qpid/proton/trunk@1632774 13f79535-47bb-0310-9956-ffa450edef68


Project: http://git-wip-us.apache.org/repos/asf/qpid-proton/repo
Commit: http://git-wip-us.apache.org/repos/asf/qpid-proton/commit/8d6532d8
Tree: http://git-wip-us.apache.org/repos/asf/qpid-proton/tree/8d6532d8
Diff: http://git-wip-us.apache.org/repos/asf/qpid-proton/diff/8d6532d8

Branch: refs/heads/examples
Commit: 8d6532d87a82712c628410a6df8354ed83920d7f
Parents: 7e8b6b6
Author: Rafael H. Schloming <rh...@apache.org>
Authored: Sat Oct 18 11:57:31 2014 +0000
Committer: Rafael H. Schloming <rh...@apache.org>
Committed: Sat Oct 18 11:57:31 2014 +0000

----------------------------------------------------------------------
 proton-c/bindings/python/proton.py | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/8d6532d8/proton-c/bindings/python/proton.py
----------------------------------------------------------------------
diff --git a/proton-c/bindings/python/proton.py b/proton-c/bindings/python/proton.py
index d9548ed..bf76af0 100644
--- a/proton-c/bindings/python/proton.py
+++ b/proton-c/bindings/python/proton.py
@@ -3359,7 +3359,7 @@ class Collector:
     self._contexts = set()
 
   def put(self, obj, etype):
-    pn_collector_put(self._impl, PN_PYREF, pn_py2void(obj), etype)
+    pn_collector_put(self._impl, PN_PYREF, pn_py2void(obj), etype.number)
 
   def peek(self):
     event = pn_collector_peek(self._impl)


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


[27/50] [abbrv] qpid-proton git commit: PROTON-724: make sure to pop any pending output in pn_transport_close_head()

Posted by gs...@apache.org.
PROTON-724: make sure to pop any pending output in pn_transport_close_head()

git-svn-id: https://svn.apache.org/repos/asf/qpid/proton/trunk@1633863 13f79535-47bb-0310-9956-ffa450edef68


Project: http://git-wip-us.apache.org/repos/asf/qpid-proton/repo
Commit: http://git-wip-us.apache.org/repos/asf/qpid-proton/commit/51625e52
Tree: http://git-wip-us.apache.org/repos/asf/qpid-proton/tree/51625e52
Diff: http://git-wip-us.apache.org/repos/asf/qpid-proton/diff/51625e52

Branch: refs/heads/examples
Commit: 51625e520d3b9b9cd89daa72e60fe3117df2c69b
Parents: 2b674b2
Author: Rafael H. Schloming <rh...@apache.org>
Authored: Thu Oct 23 16:08:49 2014 +0000
Committer: Rafael H. Schloming <rh...@apache.org>
Committed: Thu Oct 23 16:08:49 2014 +0000

----------------------------------------------------------------------
 proton-c/src/transport/transport.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/51625e52/proton-c/src/transport/transport.c
----------------------------------------------------------------------
diff --git a/proton-c/src/transport/transport.c b/proton-c/src/transport/transport.c
index b92696b..4b85c54 100644
--- a/proton-c/src/transport/transport.c
+++ b/proton-c/src/transport/transport.c
@@ -2173,7 +2173,7 @@ ssize_t pn_transport_peek(pn_transport_t *transport, char *dst, size_t size)
 
 void pn_transport_pop(pn_transport_t *transport, size_t size)
 {
-  if (transport && size) {
+  if (transport) {
     assert( transport->output_pending >= size );
     transport->output_pending -= size;
     transport->bytes_output += size;
@@ -2194,7 +2194,9 @@ void pn_transport_pop(pn_transport_t *transport, size_t size)
 
 int pn_transport_close_head(pn_transport_t *transport)
 {
+  size_t pending = pn_transport_pending(transport);
   transport->head_closed = true;
+  pn_transport_pop(transport, pending);
   return 0;
 }
 


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


[38/50] [abbrv] qpid-proton git commit: PROTON-736: Only encode Ruby strings as UTF-8 if it says it's UTF-8

Posted by gs...@apache.org.
PROTON-736: Only encode Ruby strings as UTF-8 if it says it's UTF-8

For Ruby 1.9 and later the String method has methods for both checking
the encoding of a string and also for changing that encoding and
validating it. So for those version of Ruby the code checks if a string
is UTF-8, or if it can be "forced" to be UTF-8, and, if so, sends it as
a String.

Otherwise, it considers the string to be only binary data and sends it
as Binary.

On Ruby 1.8 these functions don't exist. So what the code does is check
the string for non-unicode data. If none is found then it sends it as a
String, otherwise it treats it as a Binary.


Project: http://git-wip-us.apache.org/repos/asf/qpid-proton/repo
Commit: http://git-wip-us.apache.org/repos/asf/qpid-proton/commit/8a042a22
Tree: http://git-wip-us.apache.org/repos/asf/qpid-proton/tree/8a042a22
Diff: http://git-wip-us.apache.org/repos/asf/qpid-proton/diff/8a042a22

Branch: refs/heads/examples
Commit: 8a042a22f2e2a2b40f9507d1b18ea74c918d8e13
Parents: 24cda63
Author: Darryl L. Pierce <mc...@gmail.com>
Authored: Wed Nov 5 10:15:54 2014 -0500
Committer: Darryl L. Pierce <mc...@apache.org>
Committed: Thu Nov 6 13:05:03 2014 -0500

----------------------------------------------------------------------
 .../bindings/ruby/lib/qpid_proton/mapping.rb    | 22 +++++++++++++++++++-
 1 file changed, 21 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/8a042a22/proton-c/bindings/ruby/lib/qpid_proton/mapping.rb
----------------------------------------------------------------------
diff --git a/proton-c/bindings/ruby/lib/qpid_proton/mapping.rb b/proton-c/bindings/ruby/lib/qpid_proton/mapping.rb
index 4cc25ce..841156c 100644
--- a/proton-c/bindings/ruby/lib/qpid_proton/mapping.rb
+++ b/proton-c/bindings/ruby/lib/qpid_proton/mapping.rb
@@ -110,7 +110,27 @@ module Qpid # :nodoc:
 
     class << STRING
       def put(data, value)
-        data.string = value.to_s
+        # In Ruby 1.9+ we have encoding methods that can check the content of
+        # the string, so use them to see if what we have is unicode. If so,
+        # good! If not, then just treat is as binary.
+        #
+        # No such thing in Ruby 1.8. So there we need to use Iconv to try and
+        # convert it to unicode. If it works, good! But if it raises an
+        # exception then we'll treat it as binary.
+        if RUBY_VERSION >= "1.9"
+          if value.encoding == "UTF-8" || value.force_encoding("UTF-8").valid_encoding?
+            data.string = value.to_s
+          else
+            data.binary = value.to_s
+          end
+        else
+          begin
+            newval = Iconv.new("UTF8//TRANSLIT//IGNORE", "UTF8").iconv(value.to_s)
+            data.string = newval
+          rescue
+            data.binary = value
+          end
+        end
       end
     end
 


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


[05/50] [abbrv] qpid-proton git commit: PROTON-618: update line endings only, for consistency with other files

Posted by gs...@apache.org.
PROTON-618: update line endings only, for consistency with other files

git-svn-id: https://svn.apache.org/repos/asf/qpid/proton/trunk@1629675 13f79535-47bb-0310-9956-ffa450edef68


Project: http://git-wip-us.apache.org/repos/asf/qpid-proton/repo
Commit: http://git-wip-us.apache.org/repos/asf/qpid-proton/commit/c575aed2
Tree: http://git-wip-us.apache.org/repos/asf/qpid-proton/tree/c575aed2
Diff: http://git-wip-us.apache.org/repos/asf/qpid-proton/diff/c575aed2

Branch: refs/heads/examples
Commit: c575aed29d96360ca2ae21090cb2dd2f3fa4e5b7
Parents: ebdf51e
Author: Robert Gemmell <ro...@apache.org>
Authored: Mon Oct 6 14:50:55 2014 +0000
Committer: Robert Gemmell <ro...@apache.org>
Committed: Mon Oct 6 14:50:55 2014 +0000

----------------------------------------------------------------------
 .../org/apache/qpid/proton/amqp/Binary.java     | 378 +++++++++----------
 .../org/apache/qpid/proton/amqp/Symbol.java     | 188 ++++-----
 .../apache/qpid/proton/amqp/UnsignedByte.java   | 268 ++++++-------
 .../qpid/proton/amqp/UnsignedInteger.java       | 298 +++++++--------
 .../apache/qpid/proton/amqp/UnsignedLong.java   | 320 ++++++++--------
 .../apache/qpid/proton/amqp/UnsignedShort.java  | 268 ++++++-------
 6 files changed, 860 insertions(+), 860 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/c575aed2/proton-j/src/main/java/org/apache/qpid/proton/amqp/Binary.java
----------------------------------------------------------------------
diff --git a/proton-j/src/main/java/org/apache/qpid/proton/amqp/Binary.java b/proton-j/src/main/java/org/apache/qpid/proton/amqp/Binary.java
index a416f3f..f640e3c 100644
--- a/proton-j/src/main/java/org/apache/qpid/proton/amqp/Binary.java
+++ b/proton-j/src/main/java/org/apache/qpid/proton/amqp/Binary.java
@@ -1,189 +1,189 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.proton.amqp;
-
-import java.nio.ByteBuffer;
-import java.util.Collection;
-
-import static java.lang.Math.min;
-
-public final class Binary
-{
-
-    private final byte[] _data;
-    private final int _offset;
-    private final int _length;
-    private int _hashCode;
-
-    public Binary(final byte[] data)
-    {
-        this(data, 0, data.length);
-    }
-
-    public Binary(final byte[] data, final int offset, final int length)
-    {
-        _data = data;
-        _offset = offset;
-        _length = length;
-    }
-
-    public ByteBuffer asByteBuffer()
-    {
-        return ByteBuffer.wrap(_data, _offset, _length);
-    }
-
-    @Override
-    public final int hashCode()
-    {
-        int hc = _hashCode;
-        if(hc == 0)
-        {
-            for (int i = 0; i < _length; i++)
-            {
-                hc = 31*hc + (0xFF & _data[_offset + i]);
-            }
-            _hashCode = hc;
-        }
-        return hc;
-    }
-
-    @Override
-    public final boolean equals(Object o)
-    {
-        if (this == o)
-        {
-            return true;
-        }
-
-        if (o == null || getClass() != o.getClass())
-        {
-            return false;
-        }
-
-        Binary buf = (Binary) o;
-        final int size = _length;
-        if (size != buf._length)
-        {
-            return false;
-        }
-
-        final byte[] myData = _data;
-        final byte[] theirData = buf._data;
-        int myOffset = _offset;
-        int theirOffset = buf._offset;
-        final int myLimit = myOffset + size;
-
-        while(myOffset < myLimit)
-        {
-            if (myData[myOffset++] != theirData[theirOffset++])
-            {
-                return false;
-            }
-        }
-
-        return true;
-    }
-
-
-    public int getArrayOffset()
-    {
-        return _offset;
-    }
-
-    public byte[] getArray()
-    {
-        return _data;
-    }
-
-    public int getLength()
-    {
-        return _length;
-    }
-
-    public String toString()
-    {
-        StringBuilder str = new StringBuilder();
-
-
-        for (int i = 0; i < _length; i++)
-        {
-            byte c = _data[_offset + i];
-
-            if (c > 31 && c < 127 && c != '\\')
-            {
-                str.append((char)c);
-            }
-            else
-            {
-                str.append(String.format("\\x%02x", c));
-            }
-        }
-
-        return str.toString();
-
-    }
-
-    public static Binary combine(final Collection<Binary> binaries)
-    {
-
-        if(binaries.size() == 1)
-        {
-            return binaries.iterator().next();
-        }
-
-        int size = 0;
-        for(Binary binary : binaries)
-        {
-            size += binary.getLength();
-        }
-        byte[] data = new byte[size];
-        int offset = 0;
-        for(Binary binary : binaries)
-        {
-            System.arraycopy(binary._data, binary._offset, data, offset, binary._length);
-            offset += binary._length;
-        }
-        return new Binary(data);
-    }
-
-    public Binary subBinary(final int offset, final int length)
-    {
-        return new Binary(_data, _offset+offset, length);
-    }
-
-    public static Binary create(ByteBuffer buffer) 
-    {
-        if( buffer == null )
-            return null;
-        if( buffer.isDirect() || buffer.isReadOnly() )
-        {
-            byte data[] = new byte [buffer.remaining()];
-            ByteBuffer dup = buffer.duplicate();
-            dup.get(data);
-            return new Binary(data);
-        }
-        else 
-        {
-            return new Binary(buffer.array(), buffer.arrayOffset()+buffer.position(), buffer.remaining());
-        }
-    }
-
-}
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.proton.amqp;
+
+import java.nio.ByteBuffer;
+import java.util.Collection;
+
+import static java.lang.Math.min;
+
+public final class Binary
+{
+
+    private final byte[] _data;
+    private final int _offset;
+    private final int _length;
+    private int _hashCode;
+
+    public Binary(final byte[] data)
+    {
+        this(data, 0, data.length);
+    }
+
+    public Binary(final byte[] data, final int offset, final int length)
+    {
+        _data = data;
+        _offset = offset;
+        _length = length;
+    }
+
+    public ByteBuffer asByteBuffer()
+    {
+        return ByteBuffer.wrap(_data, _offset, _length);
+    }
+
+    @Override
+    public final int hashCode()
+    {
+        int hc = _hashCode;
+        if(hc == 0)
+        {
+            for (int i = 0; i < _length; i++)
+            {
+                hc = 31*hc + (0xFF & _data[_offset + i]);
+            }
+            _hashCode = hc;
+        }
+        return hc;
+    }
+
+    @Override
+    public final boolean equals(Object o)
+    {
+        if (this == o)
+        {
+            return true;
+        }
+
+        if (o == null || getClass() != o.getClass())
+        {
+            return false;
+        }
+
+        Binary buf = (Binary) o;
+        final int size = _length;
+        if (size != buf._length)
+        {
+            return false;
+        }
+
+        final byte[] myData = _data;
+        final byte[] theirData = buf._data;
+        int myOffset = _offset;
+        int theirOffset = buf._offset;
+        final int myLimit = myOffset + size;
+
+        while(myOffset < myLimit)
+        {
+            if (myData[myOffset++] != theirData[theirOffset++])
+            {
+                return false;
+            }
+        }
+
+        return true;
+    }
+
+
+    public int getArrayOffset()
+    {
+        return _offset;
+    }
+
+    public byte[] getArray()
+    {
+        return _data;
+    }
+
+    public int getLength()
+    {
+        return _length;
+    }
+
+    public String toString()
+    {
+        StringBuilder str = new StringBuilder();
+
+
+        for (int i = 0; i < _length; i++)
+        {
+            byte c = _data[_offset + i];
+
+            if (c > 31 && c < 127 && c != '\\')
+            {
+                str.append((char)c);
+            }
+            else
+            {
+                str.append(String.format("\\x%02x", c));
+            }
+        }
+
+        return str.toString();
+
+    }
+
+    public static Binary combine(final Collection<Binary> binaries)
+    {
+
+        if(binaries.size() == 1)
+        {
+            return binaries.iterator().next();
+        }
+
+        int size = 0;
+        for(Binary binary : binaries)
+        {
+            size += binary.getLength();
+        }
+        byte[] data = new byte[size];
+        int offset = 0;
+        for(Binary binary : binaries)
+        {
+            System.arraycopy(binary._data, binary._offset, data, offset, binary._length);
+            offset += binary._length;
+        }
+        return new Binary(data);
+    }
+
+    public Binary subBinary(final int offset, final int length)
+    {
+        return new Binary(_data, _offset+offset, length);
+    }
+
+    public static Binary create(ByteBuffer buffer) 
+    {
+        if( buffer == null )
+            return null;
+        if( buffer.isDirect() || buffer.isReadOnly() )
+        {
+            byte data[] = new byte [buffer.remaining()];
+            ByteBuffer dup = buffer.duplicate();
+            dup.get(data);
+            return new Binary(data);
+        }
+        else 
+        {
+            return new Binary(buffer.array(), buffer.arrayOffset()+buffer.position(), buffer.remaining());
+        }
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/c575aed2/proton-j/src/main/java/org/apache/qpid/proton/amqp/Symbol.java
----------------------------------------------------------------------
diff --git a/proton-j/src/main/java/org/apache/qpid/proton/amqp/Symbol.java b/proton-j/src/main/java/org/apache/qpid/proton/amqp/Symbol.java
index 717feb9..17e6177 100644
--- a/proton-j/src/main/java/org/apache/qpid/proton/amqp/Symbol.java
+++ b/proton-j/src/main/java/org/apache/qpid/proton/amqp/Symbol.java
@@ -1,94 +1,94 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-
-package org.apache.qpid.proton.amqp;
-
-import java.util.concurrent.ConcurrentHashMap;
-
-public final class Symbol implements Comparable<Symbol>, CharSequence
-{
-    private final String _underlying;
-    private static final ConcurrentHashMap<String, Symbol> _symbols = new ConcurrentHashMap<String, Symbol>(2048);
-
-    private Symbol(String underlying)
-    {
-        _underlying = underlying;
-    }
-
-    public int length()
-    {
-        return _underlying.length();
-    }
-
-    public int compareTo(Symbol o)
-    {
-        return _underlying.compareTo(o._underlying);
-    }
-
-    public char charAt(int index)
-    {
-        return _underlying.charAt(index);
-    }
-
-    public CharSequence subSequence(int beginIndex, int endIndex)
-    {
-        return _underlying.subSequence(beginIndex, endIndex);
-    }
-
-    @Override
-    public String toString()
-    {
-        return _underlying;
-    }
-
-    @Override
-    public int hashCode()
-    {
-        return _underlying.hashCode();
-    }
-
-    public static Symbol valueOf(String symbolVal)
-    {
-        return getSymbol(symbolVal);
-    }
-
-    public static Symbol getSymbol(String symbolVal)
-    {
-        if(symbolVal == null)
-        {
-            return null;
-        }
-        Symbol symbol = _symbols.get(symbolVal);
-        if(symbol == null)
-        {
-            symbolVal = symbolVal.intern();
-            symbol = new Symbol(symbolVal);
-            Symbol existing;
-            if((existing = _symbols.putIfAbsent(symbolVal, symbol)) != null)
-            {
-                symbol = existing;
-            }
-        }
-        return symbol;
-    }
-
-
-}
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.qpid.proton.amqp;
+
+import java.util.concurrent.ConcurrentHashMap;
+
+public final class Symbol implements Comparable<Symbol>, CharSequence
+{
+    private final String _underlying;
+    private static final ConcurrentHashMap<String, Symbol> _symbols = new ConcurrentHashMap<String, Symbol>(2048);
+
+    private Symbol(String underlying)
+    {
+        _underlying = underlying;
+    }
+
+    public int length()
+    {
+        return _underlying.length();
+    }
+
+    public int compareTo(Symbol o)
+    {
+        return _underlying.compareTo(o._underlying);
+    }
+
+    public char charAt(int index)
+    {
+        return _underlying.charAt(index);
+    }
+
+    public CharSequence subSequence(int beginIndex, int endIndex)
+    {
+        return _underlying.subSequence(beginIndex, endIndex);
+    }
+
+    @Override
+    public String toString()
+    {
+        return _underlying;
+    }
+
+    @Override
+    public int hashCode()
+    {
+        return _underlying.hashCode();
+    }
+
+    public static Symbol valueOf(String symbolVal)
+    {
+        return getSymbol(symbolVal);
+    }
+
+    public static Symbol getSymbol(String symbolVal)
+    {
+        if(symbolVal == null)
+        {
+            return null;
+        }
+        Symbol symbol = _symbols.get(symbolVal);
+        if(symbol == null)
+        {
+            symbolVal = symbolVal.intern();
+            symbol = new Symbol(symbolVal);
+            Symbol existing;
+            if((existing = _symbols.putIfAbsent(symbolVal, symbol)) != null)
+            {
+                symbol = existing;
+            }
+        }
+        return symbol;
+    }
+
+
+}

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/c575aed2/proton-j/src/main/java/org/apache/qpid/proton/amqp/UnsignedByte.java
----------------------------------------------------------------------
diff --git a/proton-j/src/main/java/org/apache/qpid/proton/amqp/UnsignedByte.java b/proton-j/src/main/java/org/apache/qpid/proton/amqp/UnsignedByte.java
index 4a9639c..7815915 100644
--- a/proton-j/src/main/java/org/apache/qpid/proton/amqp/UnsignedByte.java
+++ b/proton-j/src/main/java/org/apache/qpid/proton/amqp/UnsignedByte.java
@@ -1,134 +1,134 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-
-package org.apache.qpid.proton.amqp;
-
-public final class UnsignedByte extends Number implements Comparable<UnsignedByte>
-{
-    private final byte _underlying;
-    private static final UnsignedByte[] cachedValues = new UnsignedByte[256];
-
-    static
-    {
-        for(int i = 0; i<256; i++)
-        {
-            cachedValues[i] = new UnsignedByte((byte)i);
-        }
-    }
-
-    public UnsignedByte(byte underlying)
-    {
-        _underlying = underlying;
-    }
-
-    @Override
-    public byte byteValue()
-    {
-        return _underlying;
-    }
-
-    @Override
-    public short shortValue()
-    {
-        return (short) intValue();
-    }
-
-    @Override
-    public int intValue()
-    {
-        return ((int)_underlying) & 0xFF;
-    }
-
-    @Override
-    public long longValue()
-    {
-        return ((long) _underlying) & 0xFFl;
-    }
-
-    @Override
-    public float floatValue()
-    {
-        return (float) longValue();
-    }
-
-    @Override
-    public double doubleValue()
-    {
-        return (double) longValue();
-    }
-
-    @Override
-    public boolean equals(Object o)
-    {
-        if (this == o)
-        {
-            return true;
-        }
-        if (o == null || getClass() != o.getClass())
-        {
-            return false;
-        }
-
-        UnsignedByte that = (UnsignedByte) o;
-
-        if (_underlying != that._underlying)
-        {
-            return false;
-        }
-
-        return true;
-    }
-
-    public int compareTo(UnsignedByte o)
-    {
-        return Integer.signum(intValue() - o.intValue());
-    }
-
-    @Override
-    public int hashCode()
-    {
-        return _underlying;
-    }
-
-    @Override
-    public String toString()
-    {
-        return String.valueOf(intValue());
-    }
-
-    public static UnsignedByte valueOf(byte underlying)
-    {
-        final int index = ((int) underlying) & 0xFF;
-        return cachedValues[index];
-    }
-
-    public static UnsignedByte valueOf(final String value)
-            throws NumberFormatException
-    {
-        int intVal = Integer.parseInt(value);
-        if(intVal < 0 || intVal >= (1<<8))
-        {
-            throw new NumberFormatException("Value \""+value+"\" lies outside the range [" + 0 + "-" + (1<<8) +").");
-        }
-        return valueOf((byte)intVal);
-    }
-
-}
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.qpid.proton.amqp;
+
+public final class UnsignedByte extends Number implements Comparable<UnsignedByte>
+{
+    private final byte _underlying;
+    private static final UnsignedByte[] cachedValues = new UnsignedByte[256];
+
+    static
+    {
+        for(int i = 0; i<256; i++)
+        {
+            cachedValues[i] = new UnsignedByte((byte)i);
+        }
+    }
+
+    public UnsignedByte(byte underlying)
+    {
+        _underlying = underlying;
+    }
+
+    @Override
+    public byte byteValue()
+    {
+        return _underlying;
+    }
+
+    @Override
+    public short shortValue()
+    {
+        return (short) intValue();
+    }
+
+    @Override
+    public int intValue()
+    {
+        return ((int)_underlying) & 0xFF;
+    }
+
+    @Override
+    public long longValue()
+    {
+        return ((long) _underlying) & 0xFFl;
+    }
+
+    @Override
+    public float floatValue()
+    {
+        return (float) longValue();
+    }
+
+    @Override
+    public double doubleValue()
+    {
+        return (double) longValue();
+    }
+
+    @Override
+    public boolean equals(Object o)
+    {
+        if (this == o)
+        {
+            return true;
+        }
+        if (o == null || getClass() != o.getClass())
+        {
+            return false;
+        }
+
+        UnsignedByte that = (UnsignedByte) o;
+
+        if (_underlying != that._underlying)
+        {
+            return false;
+        }
+
+        return true;
+    }
+
+    public int compareTo(UnsignedByte o)
+    {
+        return Integer.signum(intValue() - o.intValue());
+    }
+
+    @Override
+    public int hashCode()
+    {
+        return _underlying;
+    }
+
+    @Override
+    public String toString()
+    {
+        return String.valueOf(intValue());
+    }
+
+    public static UnsignedByte valueOf(byte underlying)
+    {
+        final int index = ((int) underlying) & 0xFF;
+        return cachedValues[index];
+    }
+
+    public static UnsignedByte valueOf(final String value)
+            throws NumberFormatException
+    {
+        int intVal = Integer.parseInt(value);
+        if(intVal < 0 || intVal >= (1<<8))
+        {
+            throw new NumberFormatException("Value \""+value+"\" lies outside the range [" + 0 + "-" + (1<<8) +").");
+        }
+        return valueOf((byte)intVal);
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/c575aed2/proton-j/src/main/java/org/apache/qpid/proton/amqp/UnsignedInteger.java
----------------------------------------------------------------------
diff --git a/proton-j/src/main/java/org/apache/qpid/proton/amqp/UnsignedInteger.java b/proton-j/src/main/java/org/apache/qpid/proton/amqp/UnsignedInteger.java
index 9269417..aeadb40 100644
--- a/proton-j/src/main/java/org/apache/qpid/proton/amqp/UnsignedInteger.java
+++ b/proton-j/src/main/java/org/apache/qpid/proton/amqp/UnsignedInteger.java
@@ -1,149 +1,149 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-
-package org.apache.qpid.proton.amqp;
-
-public final class UnsignedInteger extends Number implements Comparable<UnsignedInteger>
-{
-    private final int _underlying;
-    private static final UnsignedInteger[] cachedValues = new UnsignedInteger[256];
-
-    static
-    {
-        for(int i = 0; i < 256; i++)
-        {
-            cachedValues[i] = new UnsignedInteger(i);
-        }
-    }
-
-    public static final UnsignedInteger ZERO = cachedValues[0];
-    public static final UnsignedInteger ONE = cachedValues[1];
-    public static final UnsignedInteger MAX_VALUE = new UnsignedInteger(0xffffffff);
-
-
-    public UnsignedInteger(int underlying)
-    {
-        _underlying = underlying;
-    }
-
-    @Override
-    public int intValue()
-    {
-        return _underlying;
-    }
-
-    @Override
-    public long longValue()
-    {
-        return ((long) _underlying) & 0xFFFFFFFFl;
-    }
-
-    @Override
-    public float floatValue()
-    {
-        return (float) longValue();
-    }
-
-    @Override
-    public double doubleValue()
-    {
-        return (double) longValue();
-    }
-
-    @Override
-    public boolean equals(Object o)
-    {
-        if (this == o)
-        {
-            return true;
-        }
-        if (o == null || getClass() != o.getClass())
-        {
-            return false;
-        }
-
-        UnsignedInteger that = (UnsignedInteger) o;
-
-        if (_underlying != that._underlying)
-        {
-            return false;
-        }
-
-        return true;
-    }
-
-    public int compareTo(UnsignedInteger o)
-    {
-        return Long.signum(longValue() - o.longValue());
-    }
-
-    @Override
-    public int hashCode()
-    {
-        return _underlying;
-    }
-
-    @Override
-    public String toString()
-    {
-        return String.valueOf(longValue());
-    }
-
-    public static UnsignedInteger valueOf(int underlying)
-    {
-        if((underlying & 0xFFFFFF00) == 0)
-        {
-            return cachedValues[underlying];
-        }
-        else
-        {
-            return new UnsignedInteger(underlying);
-        }
-    }
-
-    public UnsignedInteger add(final UnsignedInteger i)
-    {
-        int val = _underlying + i._underlying;
-        return UnsignedInteger.valueOf(val);
-    }
-
-    public UnsignedInteger subtract(final UnsignedInteger i)
-    {
-        int val = _underlying - i._underlying;
-        return UnsignedInteger.valueOf(val);
-    }
-
-    public static UnsignedInteger valueOf(final String value)
-    {
-        long longVal = Long.parseLong(value);
-        return valueOf(longVal);
-    }
-
-    public static UnsignedInteger valueOf(final long longVal)
-    {
-        if(longVal < 0L || longVal >= (1L<<32))
-        {
-            throw new NumberFormatException("Value \""+longVal+"\" lies outside the range [" + 0L + "-" + (1L<<32) +").");
-        }
-        return valueOf((int)longVal);
-    }
-
-}
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.qpid.proton.amqp;
+
+public final class UnsignedInteger extends Number implements Comparable<UnsignedInteger>
+{
+    private final int _underlying;
+    private static final UnsignedInteger[] cachedValues = new UnsignedInteger[256];
+
+    static
+    {
+        for(int i = 0; i < 256; i++)
+        {
+            cachedValues[i] = new UnsignedInteger(i);
+        }
+    }
+
+    public static final UnsignedInteger ZERO = cachedValues[0];
+    public static final UnsignedInteger ONE = cachedValues[1];
+    public static final UnsignedInteger MAX_VALUE = new UnsignedInteger(0xffffffff);
+
+
+    public UnsignedInteger(int underlying)
+    {
+        _underlying = underlying;
+    }
+
+    @Override
+    public int intValue()
+    {
+        return _underlying;
+    }
+
+    @Override
+    public long longValue()
+    {
+        return ((long) _underlying) & 0xFFFFFFFFl;
+    }
+
+    @Override
+    public float floatValue()
+    {
+        return (float) longValue();
+    }
+
+    @Override
+    public double doubleValue()
+    {
+        return (double) longValue();
+    }
+
+    @Override
+    public boolean equals(Object o)
+    {
+        if (this == o)
+        {
+            return true;
+        }
+        if (o == null || getClass() != o.getClass())
+        {
+            return false;
+        }
+
+        UnsignedInteger that = (UnsignedInteger) o;
+
+        if (_underlying != that._underlying)
+        {
+            return false;
+        }
+
+        return true;
+    }
+
+    public int compareTo(UnsignedInteger o)
+    {
+        return Long.signum(longValue() - o.longValue());
+    }
+
+    @Override
+    public int hashCode()
+    {
+        return _underlying;
+    }
+
+    @Override
+    public String toString()
+    {
+        return String.valueOf(longValue());
+    }
+
+    public static UnsignedInteger valueOf(int underlying)
+    {
+        if((underlying & 0xFFFFFF00) == 0)
+        {
+            return cachedValues[underlying];
+        }
+        else
+        {
+            return new UnsignedInteger(underlying);
+        }
+    }
+
+    public UnsignedInteger add(final UnsignedInteger i)
+    {
+        int val = _underlying + i._underlying;
+        return UnsignedInteger.valueOf(val);
+    }
+
+    public UnsignedInteger subtract(final UnsignedInteger i)
+    {
+        int val = _underlying - i._underlying;
+        return UnsignedInteger.valueOf(val);
+    }
+
+    public static UnsignedInteger valueOf(final String value)
+    {
+        long longVal = Long.parseLong(value);
+        return valueOf(longVal);
+    }
+
+    public static UnsignedInteger valueOf(final long longVal)
+    {
+        if(longVal < 0L || longVal >= (1L<<32))
+        {
+            throw new NumberFormatException("Value \""+longVal+"\" lies outside the range [" + 0L + "-" + (1L<<32) +").");
+        }
+        return valueOf((int)longVal);
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/c575aed2/proton-j/src/main/java/org/apache/qpid/proton/amqp/UnsignedLong.java
----------------------------------------------------------------------
diff --git a/proton-j/src/main/java/org/apache/qpid/proton/amqp/UnsignedLong.java b/proton-j/src/main/java/org/apache/qpid/proton/amqp/UnsignedLong.java
index 2597498..1fa5b85 100644
--- a/proton-j/src/main/java/org/apache/qpid/proton/amqp/UnsignedLong.java
+++ b/proton-j/src/main/java/org/apache/qpid/proton/amqp/UnsignedLong.java
@@ -1,160 +1,160 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-
-package org.apache.qpid.proton.amqp;
-
-import java.math.BigInteger;
-
-public final class UnsignedLong extends Number implements Comparable<UnsignedLong>
-{
-    private static final BigInteger TWO_TO_THE_SIXTY_FOUR = new BigInteger( new byte[] { (byte) 1, (byte) 0, (byte) 0, (byte) 0, (byte) 0, (byte) 0, (byte) 0, (byte) 0, (byte) 0 });
-    private static final BigInteger LONG_MAX_VALUE = BigInteger.valueOf(Long.MAX_VALUE);
-
-    private static final UnsignedLong[] cachedValues = new UnsignedLong[256];
-
-    static
-    {
-        for(int i = 0; i<256; i++)
-        {
-            cachedValues[i] = new UnsignedLong(i);
-        }
-    }
-
-    public static final UnsignedLong ZERO = cachedValues[0];
-
-    private final long _underlying;
-
-
-    public UnsignedLong(long underlying)
-    {
-        _underlying = underlying;
-    }
-
-    @Override
-    public int intValue()
-    {
-        return (int) _underlying;
-    }
-
-    @Override
-    public long longValue()
-    {
-        return _underlying;
-    }
-
-    public BigInteger bigIntegerValue()
-    {
-        if(_underlying >= 0L)
-        {
-            return BigInteger.valueOf(_underlying);
-        }
-        else
-        {
-            return TWO_TO_THE_SIXTY_FOUR.add(BigInteger.valueOf(_underlying));
-        }
-    }
-
-    @Override
-    public float floatValue()
-    {
-        return (float) longValue();
-    }
-
-    @Override
-    public double doubleValue()
-    {
-        return (double) longValue();
-    }
-
-    @Override
-    public boolean equals(Object o)
-    {
-        if (this == o)
-        {
-            return true;
-        }
-        if (o == null || getClass() != o.getClass())
-        {
-            return false;
-        }
-
-        UnsignedLong that = (UnsignedLong) o;
-
-        if (_underlying != that._underlying)
-        {
-            return false;
-        }
-
-        return true;
-    }
-
-    public int compareTo(UnsignedLong o)
-    {
-        return bigIntegerValue().compareTo(o.bigIntegerValue());
-    }
-
-    @Override
-    public int hashCode()
-    {
-        return (int)(_underlying ^ (_underlying >>> 32));
-    }
-
-    @Override
-    public String toString()
-    {
-        return String.valueOf(bigIntegerValue());
-    }
-
-    public static UnsignedLong valueOf(long underlying)
-    {
-        if((underlying & 0xFFL) == underlying)
-        {
-            return cachedValues[(int)underlying];
-        }
-        else
-        {
-            return new UnsignedLong(underlying);
-        }
-    }
-
-    public static UnsignedLong valueOf(final String value)
-    {
-        BigInteger bigInt = new BigInteger(value);
-
-        return valueOf(bigInt);
-    }
-
-    public static UnsignedLong valueOf(BigInteger bigInt)
-    {
-        if(bigInt.signum() == -1 || bigInt.bitLength() > 64)
-        {
-            throw new NumberFormatException("Value \""+bigInt+"\" lies outside the range [0 - 2^64).");
-        }
-        else if(bigInt.compareTo(LONG_MAX_VALUE)>=0)
-        {
-            return UnsignedLong.valueOf(bigInt.longValue());
-        }
-        else
-        {
-            return UnsignedLong.valueOf(TWO_TO_THE_SIXTY_FOUR.subtract(bigInt).negate().longValue());
-        }
-    }
-}
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.qpid.proton.amqp;
+
+import java.math.BigInteger;
+
+public final class UnsignedLong extends Number implements Comparable<UnsignedLong>
+{
+    private static final BigInteger TWO_TO_THE_SIXTY_FOUR = new BigInteger( new byte[] { (byte) 1, (byte) 0, (byte) 0, (byte) 0, (byte) 0, (byte) 0, (byte) 0, (byte) 0, (byte) 0 });
+    private static final BigInteger LONG_MAX_VALUE = BigInteger.valueOf(Long.MAX_VALUE);
+
+    private static final UnsignedLong[] cachedValues = new UnsignedLong[256];
+
+    static
+    {
+        for(int i = 0; i<256; i++)
+        {
+            cachedValues[i] = new UnsignedLong(i);
+        }
+    }
+
+    public static final UnsignedLong ZERO = cachedValues[0];
+
+    private final long _underlying;
+
+
+    public UnsignedLong(long underlying)
+    {
+        _underlying = underlying;
+    }
+
+    @Override
+    public int intValue()
+    {
+        return (int) _underlying;
+    }
+
+    @Override
+    public long longValue()
+    {
+        return _underlying;
+    }
+
+    public BigInteger bigIntegerValue()
+    {
+        if(_underlying >= 0L)
+        {
+            return BigInteger.valueOf(_underlying);
+        }
+        else
+        {
+            return TWO_TO_THE_SIXTY_FOUR.add(BigInteger.valueOf(_underlying));
+        }
+    }
+
+    @Override
+    public float floatValue()
+    {
+        return (float) longValue();
+    }
+
+    @Override
+    public double doubleValue()
+    {
+        return (double) longValue();
+    }
+
+    @Override
+    public boolean equals(Object o)
+    {
+        if (this == o)
+        {
+            return true;
+        }
+        if (o == null || getClass() != o.getClass())
+        {
+            return false;
+        }
+
+        UnsignedLong that = (UnsignedLong) o;
+
+        if (_underlying != that._underlying)
+        {
+            return false;
+        }
+
+        return true;
+    }
+
+    public int compareTo(UnsignedLong o)
+    {
+        return bigIntegerValue().compareTo(o.bigIntegerValue());
+    }
+
+    @Override
+    public int hashCode()
+    {
+        return (int)(_underlying ^ (_underlying >>> 32));
+    }
+
+    @Override
+    public String toString()
+    {
+        return String.valueOf(bigIntegerValue());
+    }
+
+    public static UnsignedLong valueOf(long underlying)
+    {
+        if((underlying & 0xFFL) == underlying)
+        {
+            return cachedValues[(int)underlying];
+        }
+        else
+        {
+            return new UnsignedLong(underlying);
+        }
+    }
+
+    public static UnsignedLong valueOf(final String value)
+    {
+        BigInteger bigInt = new BigInteger(value);
+
+        return valueOf(bigInt);
+    }
+
+    public static UnsignedLong valueOf(BigInteger bigInt)
+    {
+        if(bigInt.signum() == -1 || bigInt.bitLength() > 64)
+        {
+            throw new NumberFormatException("Value \""+bigInt+"\" lies outside the range [0 - 2^64).");
+        }
+        else if(bigInt.compareTo(LONG_MAX_VALUE)>=0)
+        {
+            return UnsignedLong.valueOf(bigInt.longValue());
+        }
+        else
+        {
+            return UnsignedLong.valueOf(TWO_TO_THE_SIXTY_FOUR.subtract(bigInt).negate().longValue());
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/c575aed2/proton-j/src/main/java/org/apache/qpid/proton/amqp/UnsignedShort.java
----------------------------------------------------------------------
diff --git a/proton-j/src/main/java/org/apache/qpid/proton/amqp/UnsignedShort.java b/proton-j/src/main/java/org/apache/qpid/proton/amqp/UnsignedShort.java
index ae1dce6..8d9d8bd 100644
--- a/proton-j/src/main/java/org/apache/qpid/proton/amqp/UnsignedShort.java
+++ b/proton-j/src/main/java/org/apache/qpid/proton/amqp/UnsignedShort.java
@@ -1,134 +1,134 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-
-package org.apache.qpid.proton.amqp;
-
-public final class UnsignedShort extends Number implements Comparable<UnsignedShort>
-{
-    private final short _underlying;
-    private static final UnsignedShort[] cachedValues = new UnsignedShort[256];
-
-    public static final UnsignedShort MAX_VALUE = new UnsignedShort((short) -1);
-
-    static
-    {
-        for(short i = 0; i < 256; i++)
-        {
-            cachedValues[i] = new UnsignedShort(i);
-        }
-    }
-
-    public UnsignedShort(short underlying)
-    {
-        _underlying = underlying;
-    }
-
-    public short shortValue()
-    {
-        return _underlying;
-    }
-
-    @Override
-    public int intValue()
-    {
-        return _underlying & 0xFFFF;
-    }
-
-    @Override
-    public long longValue()
-    {
-        return ((long) _underlying) & 0xFFFFl;
-    }
-
-    @Override
-    public float floatValue()
-    {
-        return (float) intValue();
-    }
-
-    @Override
-    public double doubleValue()
-    {
-        return (double) intValue();
-    }
-
-    @Override
-    public boolean equals(Object o)
-    {
-        if (this == o)
-        {
-            return true;
-        }
-        if (o == null || getClass() != o.getClass())
-        {
-            return false;
-        }
-
-        UnsignedShort that = (UnsignedShort) o;
-
-        if (_underlying != that._underlying)
-        {
-            return false;
-        }
-
-        return true;
-    }
-
-    public int compareTo(UnsignedShort o)
-    {
-        return Integer.signum(intValue() - o.intValue());
-    }
-
-    @Override
-    public int hashCode()
-    {
-        return _underlying;
-    }
-
-    @Override
-    public String toString()
-    {
-        return String.valueOf(longValue());
-    }
-
-    public static UnsignedShort valueOf(short underlying)
-    {
-        if((underlying & 0xFF00) == 0)
-        {
-            return cachedValues[underlying];
-        }
-        else
-        {
-            return new UnsignedShort(underlying);
-        }
-    }
-
-    public static UnsignedShort valueOf(final String value)
-    {
-        int intVal = Integer.parseInt(value);
-        if(intVal < 0 || intVal >= (1<<16))
-        {
-            throw new NumberFormatException("Value \""+value+"\" lies outside the range [" + 0 + "-" + (1<<16) +").");
-        }
-        return valueOf((short)intVal);
-
-    }
-}
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.qpid.proton.amqp;
+
+public final class UnsignedShort extends Number implements Comparable<UnsignedShort>
+{
+    private final short _underlying;
+    private static final UnsignedShort[] cachedValues = new UnsignedShort[256];
+
+    public static final UnsignedShort MAX_VALUE = new UnsignedShort((short) -1);
+
+    static
+    {
+        for(short i = 0; i < 256; i++)
+        {
+            cachedValues[i] = new UnsignedShort(i);
+        }
+    }
+
+    public UnsignedShort(short underlying)
+    {
+        _underlying = underlying;
+    }
+
+    public short shortValue()
+    {
+        return _underlying;
+    }
+
+    @Override
+    public int intValue()
+    {
+        return _underlying & 0xFFFF;
+    }
+
+    @Override
+    public long longValue()
+    {
+        return ((long) _underlying) & 0xFFFFl;
+    }
+
+    @Override
+    public float floatValue()
+    {
+        return (float) intValue();
+    }
+
+    @Override
+    public double doubleValue()
+    {
+        return (double) intValue();
+    }
+
+    @Override
+    public boolean equals(Object o)
+    {
+        if (this == o)
+        {
+            return true;
+        }
+        if (o == null || getClass() != o.getClass())
+        {
+            return false;
+        }
+
+        UnsignedShort that = (UnsignedShort) o;
+
+        if (_underlying != that._underlying)
+        {
+            return false;
+        }
+
+        return true;
+    }
+
+    public int compareTo(UnsignedShort o)
+    {
+        return Integer.signum(intValue() - o.intValue());
+    }
+
+    @Override
+    public int hashCode()
+    {
+        return _underlying;
+    }
+
+    @Override
+    public String toString()
+    {
+        return String.valueOf(longValue());
+    }
+
+    public static UnsignedShort valueOf(short underlying)
+    {
+        if((underlying & 0xFF00) == 0)
+        {
+            return cachedValues[underlying];
+        }
+        else
+        {
+            return new UnsignedShort(underlying);
+        }
+    }
+
+    public static UnsignedShort valueOf(final String value)
+    {
+        int intVal = Integer.parseInt(value);
+        if(intVal < 0 || intVal >= (1<<16))
+        {
+            throw new NumberFormatException("Value \""+value+"\" lies outside the range [" + 0 + "-" + (1<<16) +").");
+        }
+        return valueOf((short)intVal);
+
+    }
+}


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


[12/50] [abbrv] qpid-proton git commit: PROTON-711: add support (disabled by default) for using a byte value for destination type annotations during outbound transformation

Posted by gs...@apache.org.
PROTON-711: add support (disabled by default) for using a byte value for destination type annotations during outbound transformation

git-svn-id: https://svn.apache.org/repos/asf/qpid/proton/trunk@1631794 13f79535-47bb-0310-9956-ffa450edef68


Project: http://git-wip-us.apache.org/repos/asf/qpid-proton/repo
Commit: http://git-wip-us.apache.org/repos/asf/qpid-proton/commit/72b7beba
Tree: http://git-wip-us.apache.org/repos/asf/qpid-proton/tree/72b7beba
Diff: http://git-wip-us.apache.org/repos/asf/qpid-proton/diff/72b7beba

Branch: refs/heads/examples
Commit: 72b7beba08f6eda64f9ce7d46d04f8d4e05f99c5
Parents: c87fc8a
Author: Robert Gemmell <ro...@apache.org>
Authored: Tue Oct 14 15:33:34 2014 +0000
Committer: Robert Gemmell <ro...@apache.org>
Committed: Tue Oct 14 15:33:34 2014 +0000

----------------------------------------------------------------------
 .../proton/jms/AutoOutboundTransformer.java     |   6 +
 .../jms/JMSMappingOutboundTransformer.java      |  44 ++++--
 .../org/apache/qpid/proton/jms/JMSVendor.java   |  16 +-
 .../qpid/proton/jms/OutboundTransformer.java    |  14 +-
 .../jms/JMSMappingOutboundTransformerTest.java  | 149 +++++++++++++++++--
 5 files changed, 197 insertions(+), 32 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/72b7beba/contrib/proton-jms/src/main/java/org/apache/qpid/proton/jms/AutoOutboundTransformer.java
----------------------------------------------------------------------
diff --git a/contrib/proton-jms/src/main/java/org/apache/qpid/proton/jms/AutoOutboundTransformer.java b/contrib/proton-jms/src/main/java/org/apache/qpid/proton/jms/AutoOutboundTransformer.java
index f62760b..0440709 100644
--- a/contrib/proton-jms/src/main/java/org/apache/qpid/proton/jms/AutoOutboundTransformer.java
+++ b/contrib/proton-jms/src/main/java/org/apache/qpid/proton/jms/AutoOutboundTransformer.java
@@ -46,4 +46,10 @@ public class AutoOutboundTransformer extends JMSMappingOutboundTransformer {
         }
     }
 
+    @Override
+    public void setUseByteDestinationTypeAnnotations(boolean useByteDestinationTypeAnnotations)
+    {
+        super.setUseByteDestinationTypeAnnotations(useByteDestinationTypeAnnotations);
+        transformer.setUseByteDestinationTypeAnnotations(useByteDestinationTypeAnnotations);
+    }
 }

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/72b7beba/contrib/proton-jms/src/main/java/org/apache/qpid/proton/jms/JMSMappingOutboundTransformer.java
----------------------------------------------------------------------
diff --git a/contrib/proton-jms/src/main/java/org/apache/qpid/proton/jms/JMSMappingOutboundTransformer.java b/contrib/proton-jms/src/main/java/org/apache/qpid/proton/jms/JMSMappingOutboundTransformer.java
index ba91f0a..38c9aac 100644
--- a/contrib/proton-jms/src/main/java/org/apache/qpid/proton/jms/JMSMappingOutboundTransformer.java
+++ b/contrib/proton-jms/src/main/java/org/apache/qpid/proton/jms/JMSMappingOutboundTransformer.java
@@ -224,21 +224,39 @@ public class JMSMappingOutboundTransformer extends OutboundTransformer {
         return (ProtonJMessage) org.apache.qpid.proton.message.Message.Factory.create(header, da, ma, props, ap, body, footer);
     }
 
-    private static String destinationAttributes(Destination destination) {
-        if( destination instanceof Queue ) {
-            if( destination instanceof TemporaryQueue ) {
-                return "temporary,queue";
-            } else {
-                return "queue";
+    private Object destinationAttributes(Destination destination) {
+        if(isUseByteDestinationTypeAnnotations()) {
+            if( destination instanceof Queue ) {
+                if( destination instanceof TemporaryQueue ) {
+                    return JMSVendor.TEMP_QUEUE_TYPE;
+                } else {
+                    return JMSVendor.QUEUE_TYPE;
+                }
             }
-        }
-        if( destination instanceof Topic ) {
-            if( destination instanceof TemporaryTopic ) {
-                return "temporary,topic";
-            } else {
-                return "topic";
+            if( destination instanceof Topic ) {
+                if( destination instanceof TemporaryTopic ) {
+                    return JMSVendor.TEMP_TOPIC_TYPE;
+                } else {
+                    return JMSVendor.TOPIC_TYPE;
+                }
+            }
+            return JMSVendor.QUEUE_TYPE;
+        } else {
+            if( destination instanceof Queue ) {
+                if( destination instanceof TemporaryQueue ) {
+                    return "temporary,queue";
+                } else {
+                    return "queue";
+                }
+            }
+            if( destination instanceof Topic ) {
+                if( destination instanceof TemporaryTopic ) {
+                    return "temporary,topic";
+                } else {
+                    return "topic";
+                }
             }
+            return "";
         }
-        return "";
     }
 }

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/72b7beba/contrib/proton-jms/src/main/java/org/apache/qpid/proton/jms/JMSVendor.java
----------------------------------------------------------------------
diff --git a/contrib/proton-jms/src/main/java/org/apache/qpid/proton/jms/JMSVendor.java b/contrib/proton-jms/src/main/java/org/apache/qpid/proton/jms/JMSVendor.java
index 5d02069..b1a9b25 100644
--- a/contrib/proton-jms/src/main/java/org/apache/qpid/proton/jms/JMSVendor.java
+++ b/contrib/proton-jms/src/main/java/org/apache/qpid/proton/jms/JMSVendor.java
@@ -1,15 +1,23 @@
 package org.apache.qpid.proton.jms;
 
-import javax.jms.*;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.Set;
+import javax.jms.BytesMessage;
+import javax.jms.Destination;
+import javax.jms.MapMessage;
+import javax.jms.Message;
+import javax.jms.ObjectMessage;
+import javax.jms.StreamMessage;
+import javax.jms.TextMessage;
 
 /**
  * @author <a href="http://hiramchirino.com">Hiram Chirino</a>
  */
 abstract public class JMSVendor {
 
+    public static final byte QUEUE_TYPE = 0x00;
+    public static final byte TOPIC_TYPE = 0x01;
+    public static final byte TEMP_QUEUE_TYPE = 0x02;
+    public static final byte TEMP_TOPIC_TYPE = 0x03;
+
     public abstract BytesMessage createBytesMessage();
 
     public abstract StreamMessage createStreamMessage();

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/72b7beba/contrib/proton-jms/src/main/java/org/apache/qpid/proton/jms/OutboundTransformer.java
----------------------------------------------------------------------
diff --git a/contrib/proton-jms/src/main/java/org/apache/qpid/proton/jms/OutboundTransformer.java b/contrib/proton-jms/src/main/java/org/apache/qpid/proton/jms/OutboundTransformer.java
index 09a6e15..596a4ed 100644
--- a/contrib/proton-jms/src/main/java/org/apache/qpid/proton/jms/OutboundTransformer.java
+++ b/contrib/proton-jms/src/main/java/org/apache/qpid/proton/jms/OutboundTransformer.java
@@ -16,8 +16,6 @@
  */
 package org.apache.qpid.proton.jms;
 
-import org.apache.qpid.proton.engine.Delivery;
-
 import javax.jms.Message;
 
 /**
@@ -43,7 +41,7 @@ public abstract class OutboundTransformer {
     String replyToGroupIDKey;
     String prefixFooterKey;
 
-
+    private boolean useByteDestinationTypeAnnotations;
 
    public OutboundTransformer(JMSVendor vendor) {
         this.vendor = vendor;
@@ -52,6 +50,16 @@ public abstract class OutboundTransformer {
 
     public abstract EncodedMessage transform(Message jms) throws Exception;
 
+    public boolean isUseByteDestinationTypeAnnotations()
+    {
+        return useByteDestinationTypeAnnotations;
+    }
+
+    public void setUseByteDestinationTypeAnnotations(boolean useByteDestinationTypeAnnotations)
+    {
+        this.useByteDestinationTypeAnnotations = useByteDestinationTypeAnnotations;
+    }
+
     public String getPrefixVendor() {
         return prefixVendor;
     }

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/72b7beba/contrib/proton-jms/src/test/java/org/apache/qpid/proton/jms/JMSMappingOutboundTransformerTest.java
----------------------------------------------------------------------
diff --git a/contrib/proton-jms/src/test/java/org/apache/qpid/proton/jms/JMSMappingOutboundTransformerTest.java b/contrib/proton-jms/src/test/java/org/apache/qpid/proton/jms/JMSMappingOutboundTransformerTest.java
index 1b14627..2bb5209 100644
--- a/contrib/proton-jms/src/test/java/org/apache/qpid/proton/jms/JMSMappingOutboundTransformerTest.java
+++ b/contrib/proton-jms/src/test/java/org/apache/qpid/proton/jms/JMSMappingOutboundTransformerTest.java
@@ -54,13 +54,34 @@ public class JMSMappingOutboundTransformerTest
         assertEquals(contentString, ((AmqpValue) amqp.getBody()).getValue());
     }
 
+    @Test
+    public void testDefaultsTolStringDestinationTypeAnnotationValues()
+    {
+        JMSVendor mockVendor = createMockVendor();
+        JMSMappingOutboundTransformer transformer = new JMSMappingOutboundTransformer(mockVendor);
+
+        assertFalse("Expected the older string style annotation values to be used by default", transformer.isUseByteDestinationTypeAnnotations());
+    }
+
+    @Test
+    public void testSetGetIsUseByteDestinationTypeAnnotations()
+    {
+        JMSVendor mockVendor = createMockVendor();
+        JMSMappingOutboundTransformer transformer = new JMSMappingOutboundTransformer(mockVendor);
+
+        assertFalse(transformer.isUseByteDestinationTypeAnnotations());
+        transformer.setUseByteDestinationTypeAnnotations(true);
+        assertTrue(transformer.isUseByteDestinationTypeAnnotations());
+    }
+
     // ======= JMSDestination Handling =========
     // =========================================
 
+    // --- String type annotation ---
     @Test
     public void testConvertMessageWithJMSDestinationNull() throws Exception
     {
-        doTestConvertMessageWithJMSDestination(null, null);
+        doTestConvertMessageWithJMSDestination(null, null, false);
     }
 
     @Test
@@ -68,7 +89,7 @@ public class JMSMappingOutboundTransformerTest
     {
         Queue mockDest = Mockito.mock(Queue.class);
 
-        doTestConvertMessageWithJMSDestination(mockDest, "queue");
+        doTestConvertMessageWithJMSDestination(mockDest, "queue", false);
     }
 
     @Test
@@ -76,7 +97,7 @@ public class JMSMappingOutboundTransformerTest
     {
         TemporaryQueue mockDest = Mockito.mock(TemporaryQueue.class);
 
-        doTestConvertMessageWithJMSDestination(mockDest, "temporary,queue");
+        doTestConvertMessageWithJMSDestination(mockDest, "temporary,queue", false);
     }
 
     @Test
@@ -84,7 +105,7 @@ public class JMSMappingOutboundTransformerTest
     {
         Topic mockDest = Mockito.mock(Topic.class);
 
-        doTestConvertMessageWithJMSDestination(mockDest, "topic");
+        doTestConvertMessageWithJMSDestination(mockDest, "topic", false);
     }
 
     @Test
@@ -92,10 +113,58 @@ public class JMSMappingOutboundTransformerTest
     {
         TemporaryTopic mockDest = Mockito.mock(TemporaryTopic.class);
 
-        doTestConvertMessageWithJMSDestination(mockDest, "temporary,topic");
+        doTestConvertMessageWithJMSDestination(mockDest, "temporary,topic", false);
     }
 
-    private void doTestConvertMessageWithJMSDestination(Destination jmsDestination, Object expectedAnnotationValue) throws Exception
+    // --- byte type annotation ---
+
+    @Test
+    public void testConvertMessageWithJMSDestinationNullUsingByteAnnotation() throws Exception
+    {
+        doTestConvertMessageWithJMSDestination(null, null, true);
+    }
+
+    @Test
+    public void testConvertMessageWithJMSDestinationQueueUsingByteAnnotation() throws Exception
+    {
+        Queue mockDest = Mockito.mock(Queue.class);
+
+        doTestConvertMessageWithJMSDestination(mockDest, JMSVendor.QUEUE_TYPE, true);
+    }
+
+    @Test
+    public void testConvertMessageWithJMSDestinationTemporaryQueueUsingByteAnnotation() throws Exception
+    {
+        TemporaryQueue mockDest = Mockito.mock(TemporaryQueue.class);
+
+        doTestConvertMessageWithJMSDestination(mockDest, JMSVendor.TEMP_QUEUE_TYPE, true);
+    }
+
+    @Test
+    public void testConvertMessageWithJMSDestinationTopicUsingByteAnnotation() throws Exception
+    {
+        Topic mockDest = Mockito.mock(Topic.class);
+
+        doTestConvertMessageWithJMSDestination(mockDest, JMSVendor.TOPIC_TYPE, true);
+    }
+
+    @Test
+    public void testConvertMessageWithJMSDestinationTemporaryTopicUsingByteAnnotation() throws Exception
+    {
+        TemporaryTopic mockDest = Mockito.mock(TemporaryTopic.class);
+
+        doTestConvertMessageWithJMSDestination(mockDest, JMSVendor.TEMP_TOPIC_TYPE, true);
+    }
+
+    @Test
+    public void testConvertMessageWithJMSDestinationUnkownUsingByteAnnotation() throws Exception
+    {
+        Destination mockDest = Mockito.mock(Destination.class);
+
+        doTestConvertMessageWithJMSDestination(mockDest, JMSVendor.QUEUE_TYPE, true);
+    }
+
+    private void doTestConvertMessageWithJMSDestination(Destination jmsDestination, Object expectedAnnotationValue, boolean byteType) throws Exception
     {
         TextMessage mockTextMessage = createMockTextMessage();
         Mockito.when(mockTextMessage.getText()).thenReturn("myTextMessageContent");
@@ -109,6 +178,10 @@ public class JMSMappingOutboundTransformerTest
         }
 
         JMSMappingOutboundTransformer transformer = new JMSMappingOutboundTransformer(mockVendor);
+        if(byteType)
+        {
+            transformer.setUseByteDestinationTypeAnnotations(true);
+        }
 
         Message amqp = transformer.convert(mockTextMessage);
 
@@ -133,10 +206,11 @@ public class JMSMappingOutboundTransformerTest
     // ======= JMSReplyTo Handling =========
     // =====================================
 
+    // --- String type annotation ---
     @Test
     public void testConvertMessageWithJMSReplyToNull() throws Exception
     {
-        doTestConvertMessageWithJMSReplyTo(null, null);
+        doTestConvertMessageWithJMSReplyTo(null, null, false);
     }
 
     @Test
@@ -144,7 +218,7 @@ public class JMSMappingOutboundTransformerTest
     {
         Queue mockDest = Mockito.mock(Queue.class);
 
-        doTestConvertMessageWithJMSReplyTo(mockDest, "queue");
+        doTestConvertMessageWithJMSReplyTo(mockDest, "queue", false);
     }
 
     @Test
@@ -152,7 +226,7 @@ public class JMSMappingOutboundTransformerTest
     {
         TemporaryQueue mockDest = Mockito.mock(TemporaryQueue.class);
 
-        doTestConvertMessageWithJMSReplyTo(mockDest, "temporary,queue");
+        doTestConvertMessageWithJMSReplyTo(mockDest, "temporary,queue", false);
     }
 
     @Test
@@ -160,7 +234,7 @@ public class JMSMappingOutboundTransformerTest
     {
         Topic mockDest = Mockito.mock(Topic.class);
 
-        doTestConvertMessageWithJMSReplyTo(mockDest, "topic");
+        doTestConvertMessageWithJMSReplyTo(mockDest, "topic", false);
     }
 
     @Test
@@ -168,10 +242,57 @@ public class JMSMappingOutboundTransformerTest
     {
         TemporaryTopic mockDest = Mockito.mock(TemporaryTopic.class);
 
-        doTestConvertMessageWithJMSReplyTo(mockDest, "temporary,topic");
+        doTestConvertMessageWithJMSReplyTo(mockDest, "temporary,topic", false);
+    }
+
+    // --- byte type annotation ---
+    @Test
+    public void testConvertMessageWithJMSReplyToNullUsingByteAnnotation() throws Exception
+    {
+        doTestConvertMessageWithJMSReplyTo(null, null, true);
+    }
+
+    @Test
+    public void testConvertMessageWithJMSReplyToQueueUsingByteAnnotation() throws Exception
+    {
+        Queue mockDest = Mockito.mock(Queue.class);
+
+        doTestConvertMessageWithJMSReplyTo(mockDest, JMSVendor.QUEUE_TYPE, true);
+    }
+
+    @Test
+    public void testConvertMessageWithJMSReplyToTemporaryQueueUsingByteAnnotation() throws Exception
+    {
+        TemporaryQueue mockDest = Mockito.mock(TemporaryQueue.class);
+
+        doTestConvertMessageWithJMSReplyTo(mockDest, JMSVendor.TEMP_QUEUE_TYPE, true);
+    }
+
+    @Test
+    public void testConvertMessageWithJMSReplyToTopicUsingByteAnnotation() throws Exception
+    {
+        Topic mockDest = Mockito.mock(Topic.class);
+
+        doTestConvertMessageWithJMSReplyTo(mockDest, JMSVendor.TOPIC_TYPE, true);
+    }
+
+    @Test
+    public void testConvertMessageWithJMSReplyToTemporaryTopicUsingByteAnnotation() throws Exception
+    {
+        TemporaryTopic mockDest = Mockito.mock(TemporaryTopic.class);
+
+        doTestConvertMessageWithJMSReplyTo(mockDest, JMSVendor.TEMP_TOPIC_TYPE, true);
+    }
+
+    @Test
+    public void testConvertMessageWithJMSReplyToUnkownUsingByteAnnotation() throws Exception
+    {
+        Destination mockDest = Mockito.mock(Destination.class);
+
+        doTestConvertMessageWithJMSReplyTo(mockDest, JMSVendor.QUEUE_TYPE, true);
     }
 
-    private void doTestConvertMessageWithJMSReplyTo(Destination jmsReplyTo, Object expectedAnnotationValue) throws Exception
+    private void doTestConvertMessageWithJMSReplyTo(Destination jmsReplyTo, Object expectedAnnotationValue, boolean byteType) throws Exception
     {
         TextMessage mockTextMessage = createMockTextMessage();
         Mockito.when(mockTextMessage.getText()).thenReturn("myTextMessageContent");
@@ -185,6 +306,10 @@ public class JMSMappingOutboundTransformerTest
         }
 
         JMSMappingOutboundTransformer transformer = new JMSMappingOutboundTransformer(mockVendor);
+        if(byteType)
+        {
+            transformer.setUseByteDestinationTypeAnnotations(true);
+        }
 
         Message amqp = transformer.convert(mockTextMessage);
 


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


[33/50] [abbrv] qpid-proton git commit: bumped the release version on trunk

Posted by gs...@apache.org.
bumped the release version on trunk

git-svn-id: https://svn.apache.org/repos/asf/qpid/proton/trunk@1635463 13f79535-47bb-0310-9956-ffa450edef68


Project: http://git-wip-us.apache.org/repos/asf/qpid-proton/repo
Commit: http://git-wip-us.apache.org/repos/asf/qpid-proton/commit/15c9e9e0
Tree: http://git-wip-us.apache.org/repos/asf/qpid-proton/tree/15c9e9e0
Diff: http://git-wip-us.apache.org/repos/asf/qpid-proton/diff/15c9e9e0

Branch: refs/heads/examples
Commit: 15c9e9e09c8e06d8315f2ce214d76c77c974a154
Parents: 61fd13f
Author: Rafael H. Schloming <rh...@apache.org>
Authored: Thu Oct 30 10:45:16 2014 +0000
Committer: Rafael H. Schloming <rh...@apache.org>
Committed: Thu Oct 30 10:45:16 2014 +0000

----------------------------------------------------------------------
 version.txt | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/15c9e9e0/version.txt
----------------------------------------------------------------------
diff --git a/version.txt b/version.txt
index aec258d..b63ba69 100644
--- a/version.txt
+++ b/version.txt
@@ -1 +1 @@
-0.8
+0.9


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


[47/50] [abbrv] qpid-proton git commit: Some updates to tutorial text

Posted by gs...@apache.org.
http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/0c822c6d/tutorial/_build/html/tutorial.html
----------------------------------------------------------------------
diff --git a/tutorial/_build/html/tutorial.html b/tutorial/_build/html/tutorial.html
index 25fd3fd..049fd8a 100644
--- a/tutorial/_build/html/tutorial.html
+++ b/tutorial/_build/html/tutorial.html
@@ -8,16 +8,15 @@
   <head>
     <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
     
-    <title>Hello World! &mdash; Proton 0.8 documentation</title>
+    <title>Hello World! &mdash; Proton 0.9-alpha documentation</title>
     
-    <link rel="stylesheet" href="_static/haiku.css" type="text/css" />
+    <link rel="stylesheet" href="_static/default.css" type="text/css" />
     <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
-    <link rel="stylesheet" href="_static/print.css" type="text/css" />
     
     <script type="text/javascript">
       var DOCUMENTATION_OPTIONS = {
         URL_ROOT:    '',
-        VERSION:     '0.8',
+        VERSION:     '0.9-alpha',
         COLLAPSE_INDEX: false,
         FILE_SUFFIX: '.html',
         HAS_SOURCE:  true
@@ -26,27 +25,27 @@
     <script type="text/javascript" src="_static/jquery.js"></script>
     <script type="text/javascript" src="_static/underscore.js"></script>
     <script type="text/javascript" src="_static/doctools.js"></script>
-    <script type="text/javascript" src="_static/theme_extras.js"></script>
-    <link rel="top" title="Proton 0.8 documentation" href="index.html" />
+    <link rel="top" title="Proton 0.9-alpha documentation" href="index.html" />
     <link rel="prev" title="Some Proton Examples" href="index.html" /> 
   </head>
   <body>
-      <div class="header"><h1 class="heading"><a href="index.html">
-          <span>Proton 0.8 documentation</span></a></h1>
-        <h2 class="heading"><span>Hello World!</span></h2>
-      </div>
-      <div class="topnav">
-      
-        <p>
-        «&#160;&#160;<a href="index.html">Some Proton Examples</a>
-        &#160;&#160;::&#160;&#160;
-        <a class="uplink" href="index.html">Contents</a>
-        </p>
-
-      </div>
-      <div class="content">
-        
-        
+    <div class="related">
+      <h3>Navigation</h3>
+      <ul>
+        <li class="right" style="margin-right: 10px">
+          <a href="genindex.html" title="General Index"
+             accesskey="I">index</a></li>
+        <li class="right" >
+          <a href="index.html" title="Some Proton Examples"
+             accesskey="P">previous</a> |</li>
+        <li><a href="index.html">Proton 0.9-alpha documentation</a> &raquo;</li> 
+      </ul>
+    </div>  
+
+    <div class="document">
+      <div class="documentwrapper">
+          <div class="body">
+            
   <div class="section" id="hello-world">
 <h1>Hello World!<a class="headerlink" href="#hello-world" title="Permalink to this headline">¶</a></h1>
 <p>Tradition dictates that we start with hello world! However rather than
@@ -74,120 +73,62 @@ sending and receiving a single message.</p>
 19
 20
 21
-22
-23
-24
-25
-26
-27
-28
-29
-30
-31
-32
-33
-34
-35
-36
-37
-38
-39
-40
-41</pre></div></td><td class="code"><div class="highlight"><pre><span class="kn">from</span> <span class="nn">proton</span> <span class="kn">import</span> <span class="n">Message</span>
-<span class="kn">from</span> <span class="nn">proton_events</span> <span class="kn">import</span> <span class="n">EventLoop</span><span class="p">,</span> <span class="n">IncomingMessageHandler</span>
-
-<span class="k">class</span> <span class="nc">HelloWorldReceiver</span><span class="p">(</span><span class="n">IncomingMessageHandler</span><span class="p">):</span>
-    <span class="k">def</span> <span class="nf">on_message</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">event</span><span class="p">):</span>
-        <span class="k">print</span> <span class="n">event</span><span class="o">.</span><span class="n">message</span><span class="o">.</span><span class="n">body</span>
-        <span class="n">event</span><span class="o">.</span><span class="n">connection</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
-
-<span class="k">class</span> <span class="nc">HelloWorldSender</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
-    <span class="k">def</span> <span class="nf">on_link_flow</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">event</span><span class="p">):</span>
-        <span class="n">event</span><span class="o">.</span><span class="n">link</span><span class="o">.</span><span class="n">send_msg</span><span class="p">(</span><span class="n">Message</span><span class="p">(</span><span class="n">body</span><span class="o">=</span><span class="s">u&quot;Hello World!&quot;</span><span class="p">))</span>
-        <span class="n">event</span><span class="o">.</span><span class="n">link</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
+22</pre></div></td><td class="code"><div class="highlight"><pre><span class="kn">from</span> <span class="nn">proton</span> <span class="kn">import</span> <span class="n">Message</span>
+<span class="kn">import</span> <span class="nn">proton_events</span>
 
-<span class="k">class</span> <span class="nc">HelloWorld</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
-    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">eventloop</span><span class="p">,</span> <span class="n">url</span><span class="p">,</span> <span class="n">address</span><span class="p">):</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">eventloop</span> <span class="o">=</span> <span class="n">eventloop</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">conn</span> <span class="o">=</span> <span class="n">eventloop</span><span class="o">.</span><span class="n">connect</span><span class="p">(</span><span class="n">url</span><span class="p">,</span> <span class="n">handler</span><span class="o">=</span><span class="bp">self</span><span class="p">)</span>
+<span class="k">class</span> <span class="nc">HelloWorld</span><span class="p">(</span><span class="n">proton_events</span><span class="o">.</span><span class="n">ClientHandler</span><span class="p">):</span>
+    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">server</span><span class="p">,</span> <span class="n">address</span><span class="p">):</span>
         <span class="bp">self</span><span class="o">.</span><span class="n">address</span> <span class="o">=</span> <span class="n">address</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">conn</span> <span class="o">=</span> <span class="n">proton_events</span><span class="o">.</span><span class="n">connect</span><span class="p">(</span><span class="n">server</span><span class="p">,</span> <span class="n">handler</span><span class="o">=</span><span class="bp">self</span><span class="p">)</span>
 
-    <span class="k">def</span> <span class="nf">on_connection_remote_open</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">event</span><span class="p">):</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">conn</span><span class="o">.</span><span class="n">receiver</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">address</span><span class="p">,</span> <span class="n">handler</span><span class="o">=</span><span class="n">HelloWorldReceiver</span><span class="p">())</span>
-
-    <span class="k">def</span> <span class="nf">on_link_remote_open</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">event</span><span class="p">):</span>
-        <span class="k">if</span> <span class="n">event</span><span class="o">.</span><span class="n">link</span><span class="o">.</span><span class="n">is_receiver</span><span class="p">:</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">conn</span><span class="o">.</span><span class="n">sender</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">address</span><span class="p">,</span> <span class="n">handler</span><span class="o">=</span><span class="n">HelloWorldSender</span><span class="p">())</span>
+    <span class="k">def</span> <span class="nf">on_connection_opened</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">event</span><span class="p">):</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">conn</span><span class="o">.</span><span class="n">create_receiver</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">address</span><span class="p">)</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">conn</span><span class="o">.</span><span class="n">create_sender</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">address</span><span class="p">)</span>
 
-    <span class="k">def</span> <span class="nf">on_link_remote_close</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">event</span><span class="p">):</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">closed</span><span class="p">(</span><span class="n">event</span><span class="o">.</span><span class="n">link</span><span class="o">.</span><span class="n">remote_condition</span><span class="p">)</span>
-
-    <span class="k">def</span> <span class="nf">on_connection_remote_close</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">event</span><span class="p">):</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">closed</span><span class="p">(</span><span class="n">event</span><span class="o">.</span><span class="n">connection</span><span class="o">.</span><span class="n">remote_condition</span><span class="p">)</span>
-
-    <span class="k">def</span> <span class="nf">closed</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">error</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
-        <span class="k">if</span> <span class="n">error</span><span class="p">:</span>
-            <span class="k">print</span> <span class="s">&quot;Closed due to </span><span class="si">%s</span><span class="s">&quot;</span> <span class="o">%</span> <span class="n">error</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">conn</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
+    <span class="k">def</span> <span class="nf">on_credit</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">event</span><span class="p">):</span>
+        <span class="n">event</span><span class="o">.</span><span class="n">sender</span><span class="o">.</span><span class="n">send_msg</span><span class="p">(</span><span class="n">Message</span><span class="p">(</span><span class="n">body</span><span class="o">=</span><span class="s">u&quot;Hello World!&quot;</span><span class="p">))</span>
+        <span class="n">event</span><span class="o">.</span><span class="n">sender</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
 
-    <span class="k">def</span> <span class="nf">run</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">eventloop</span><span class="o">.</span><span class="n">run</span><span class="p">()</span>
+    <span class="k">def</span> <span class="nf">on_message</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">event</span><span class="p">):</span>
+        <span class="k">print</span> <span class="n">event</span><span class="o">.</span><span class="n">message</span><span class="o">.</span><span class="n">body</span>
+        <span class="n">event</span><span class="o">.</span><span class="n">connection</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
 
-<span class="n">HelloWorld</span><span class="p">(</span><span class="n">EventLoop</span><span class="p">(),</span> <span class="s">&quot;localhost:5672&quot;</span><span class="p">,</span> <span class="s">&quot;examples&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">run</span><span class="p">()</span>
+<span class="n">HelloWorld</span><span class="p">(</span><span class="s">&quot;localhost:5672&quot;</span><span class="p">,</span> <span class="s">&quot;examples&quot;</span><span class="p">)</span>
+<span class="n">proton_events</span><span class="o">.</span><span class="n">run</span><span class="p">()</span>
 </pre></div>
 </td></tr></table></div>
-<p>You can see the import of <tt class="docutils literal"><span class="pre">EventLoop</span></tt> from <tt class="docutils literal"><span class="pre">proton_events</span></tt> on the
-second line. This is a helper class that makes programming with proton
-a little easier for the common cases. It includes within it an event
-loop, and programs written using this utility are generally structured
-to react to various events. This reactive style is particularly suited
-to messaging applications.</p>
-<p>To be notified of a particular event, you define a class with the
-appropriately name method on it. That method is then called by the
-event loop when the event occurs.</p>
-<p>The first class we define, <tt class="docutils literal"><span class="pre">HelloWorldReceiver</span></tt>, handles the event
-where a message is received and so implements a <tt class="docutils literal"><span class="pre">on_message()</span></tt>
-method. Within that we simply print the body of the message (line 6)
-and then close the connection (line 7).</p>
-<p>The second class, <tt class="docutils literal"><span class="pre">HelloWorldSender</span></tt>, handles the event where the
-flow of messages is enabled over our sending link by implementing a
-<tt class="docutils literal"><span class="pre">on_link_flow()</span></tt> method and sending the message within that. Doing
-this ensures that we only send when the recipient is ready and able to
-receive the message. This is particularly important when the volume of
-messages might be large. In our case we are just going to send one
-message, which we do on line 11, so we can then just close the sending
-link on line 12.</p>
-<p>The <tt class="docutils literal"><span class="pre">HelloWorld</span></tt> class ties everything together. It&#8217;s constructor
-takes the instance of the event loop to use, a url to connect to, and
-an address through which the message will be sent. To run the example
-you will need to have a broker (or similar) accepting connections on
-that url either with a queue (or topic) matching the given address or
-else configured to create such a queue (or topic) dynamically.</p>
-<p>On line 17 we request that a connection be made to the process this
-url refers to by calling <tt class="docutils literal"><span class="pre">connect()</span></tt> on the <tt class="docutils literal"><span class="pre">EventLoop</span></tt>. This call
-returns a <tt class="docutils literal"><span class="pre">MessagingContext</span></tt> object through which we can create
-objects for sending and receiving messages to the process it is
-connected to. However we will delay doing that until our connection is
-fully established, i.e. until the remote peer &#8216;opens&#8217; the connection
-(the open here is the &#8216;handshake&#8217; for establishing an operational AMQP
-connection).</p>
-<p>To be notified of this we pass a reference to self as the handler in
-<tt class="docutils literal"><span class="pre">connect()</span></tt> and define an <tt class="docutils literal"><span class="pre">on_connection_remote_open()</span></tt> method
-within which we can create our receiver using the connection context
-we obtained from the earlier <tt class="docutils literal"><span class="pre">connect()</span></tt> call, and passing the
-handler implementation defined by <tt class="docutils literal"><span class="pre">HelloWorldReceiver</span></tt>. When the
-remote peer confirms the establishment of that receiver we get a
-callback on <tt class="docutils literal"><span class="pre">on_link_remote_open()</span></tt> and that is where we then create
-our sender, passing it the <tt class="docutils literal"><span class="pre">HelloWorldSender</span></tt> handler. Delaying the
-creation of the sender until the receiver is established avoids losing
-messages even when these are not queued up by the remote peer.</p>
-<p>We&#8217;ll add definitions to <tt class="docutils literal"><span class="pre">HelloWorld</span></tt> of <tt class="docutils literal"><span class="pre">on_link_remote_close()</span></tt>
-and <tt class="docutils literal"><span class="pre">on_connection_remote_close()</span></tt> also, so that we can be notified
-if the broker we are connected to closes either link or the connection
-for any reason.</p>
-<p>Finally we actually enter the event loop, to handle all the necessary
-IO and make all the necessary event callbacks, by calling <tt class="docutils literal"><span class="pre">run()</span></tt> on
-it.</p>
+<p>This example uses proton in an event-driven or reactive manner. The
+flow of control is an &#8216;event loop&#8217;, where the events may be triggered
+by data arriving on a socket among other things and are then passed to
+relevant &#8216;handlers&#8217;. Applications are then structured as a set of
+defined handlers for events of interest; to be notified of a
+particular event, you define a class with an appropriately name method
+on it, inform the event loop of that method which then calls it
+whenever the event occurs.</p>
+<p>The class we define in this example, <tt class="docutils literal"><span class="pre">HelloWorld</span></tt>, has methods to
+handle three types of events.</p>
+<p>The first, <tt class="docutils literal"><span class="pre">on_connection_opened()</span></tt>, is called when the connection
+is opened, and when that occurs we create a receiver over which to
+receive our message and a sender over which to send it.</p>
+<p>The second method, <tt class="docutils literal"><span class="pre">on_credit()</span></tt>, is called when our sender has been
+issued by the peer with &#8216;credit&#8217;, allowing it to send messages. A
+credit based flow control mechanism like this ensures we only send
+messages when the recipient is ready and able to receive them. This is
+particularly important when the volume of messages might be large. In
+our case we are just going to send one message.</p>
+<p>The third and final method, <tt class="docutils literal"><span class="pre">on_message()</span></tt>, is called when a message
+arrives. Within that method we simply print the body of the message
+and then close the connection.</p>
+<p>This particular example assumes a broker (or similar service), which
+accepts connections and routes published messages to intended
+recipients. The constructor for the <tt class="docutils literal"><span class="pre">HelloWorld</span></tt> class takes the
+details of the broker to connect to, and the address through which the
+message is sent and received (for a broker this corresponds to a queue
+or topic name).</p>
+<p>After an instance of <tt class="docutils literal"><span class="pre">HelloWorld</span></tt> is constructed, the event loop is
+entered by the call to the <tt class="docutils literal"><span class="pre">run()</span></tt> method on the last line. This
+call will return only when the loop determines there are no more
+events possible (at which point our example program will then exit).</p>
 </div>
 <div class="section" id="hello-world-direct">
 <h1>Hello World, Direct!<a class="headerlink" href="#hello-world-direct" title="Permalink to this headline">¶</a></h1>
@@ -227,54 +168,40 @@ directly if desired.</p>
 30
 31
 32
-33
-34
-35
-36
-37
-38
-39
-40</pre></div></td><td class="code"><div class="highlight"><pre><span class="kn">from</span> <span class="nn">proton</span> <span class="kn">import</span> <span class="n">Message</span>
-<span class="kn">from</span> <span class="nn">proton_events</span> <span class="kn">import</span> <span class="n">EventLoop</span><span class="p">,</span> <span class="n">FlowController</span><span class="p">,</span> <span class="n">Handshaker</span><span class="p">,</span> <span class="n">IncomingMessageHandler</span>
+33</pre></div></td><td class="code"><div class="highlight"><pre><span class="kn">from</span> <span class="nn">proton</span> <span class="kn">import</span> <span class="n">Message</span>
+<span class="kn">from</span> <span class="nn">proton_events</span> <span class="kn">import</span> <span class="n">ClientHandler</span><span class="p">,</span> <span class="n">EventLoop</span><span class="p">,</span> <span class="n">FlowController</span><span class="p">,</span> <span class="n">Handshaker</span><span class="p">,</span> <span class="n">IncomingMessageHandler</span>
 
 <span class="k">class</span> <span class="nc">HelloWorldReceiver</span><span class="p">(</span><span class="n">IncomingMessageHandler</span><span class="p">):</span>
     <span class="k">def</span> <span class="nf">on_message</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">event</span><span class="p">):</span>
         <span class="k">print</span> <span class="n">event</span><span class="o">.</span><span class="n">message</span><span class="o">.</span><span class="n">body</span>
         <span class="n">event</span><span class="o">.</span><span class="n">connection</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
 
-<span class="k">class</span> <span class="nc">HelloWorldSender</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
-    <span class="k">def</span> <span class="nf">on_link_flow</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">event</span><span class="p">):</span>
-        <span class="n">event</span><span class="o">.</span><span class="n">link</span><span class="o">.</span><span class="n">send_msg</span><span class="p">(</span><span class="n">Message</span><span class="p">(</span><span class="n">body</span><span class="o">=</span><span class="s">u&quot;Hello World!&quot;</span><span class="p">))</span>
-        <span class="n">event</span><span class="o">.</span><span class="n">link</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
-
-<span class="k">class</span> <span class="nc">HelloWorld</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
+<span class="k">class</span> <span class="nc">HelloWorld</span><span class="p">(</span><span class="n">ClientHandler</span><span class="p">):</span>
     <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">eventloop</span><span class="p">,</span> <span class="n">url</span><span class="p">,</span> <span class="n">address</span><span class="p">):</span>
         <span class="bp">self</span><span class="o">.</span><span class="n">eventloop</span> <span class="o">=</span> <span class="n">eventloop</span>
-<span class="hll">        <span class="bp">self</span><span class="o">.</span><span class="n">acceptor</span> <span class="o">=</span> <span class="n">eventloop</span><span class="o">.</span><span class="n">listen</span><span class="p">(</span><span class="n">url</span><span class="p">)</span>
-</span>        <span class="bp">self</span><span class="o">.</span><span class="n">conn</span> <span class="o">=</span> <span class="n">eventloop</span><span class="o">.</span><span class="n">connect</span><span class="p">(</span><span class="n">url</span><span class="p">,</span> <span class="n">handler</span><span class="o">=</span><span class="bp">self</span><span class="p">)</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">acceptor</span> <span class="o">=</span> <span class="n">eventloop</span><span class="o">.</span><span class="n">listen</span><span class="p">(</span><span class="n">url</span><span class="p">)</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">conn</span> <span class="o">=</span> <span class="n">eventloop</span><span class="o">.</span><span class="n">connect</span><span class="p">(</span><span class="n">url</span><span class="p">,</span> <span class="n">handler</span><span class="o">=</span><span class="bp">self</span><span class="p">)</span>
         <span class="bp">self</span><span class="o">.</span><span class="n">address</span> <span class="o">=</span> <span class="n">address</span>
 
-    <span class="k">def</span> <span class="nf">on_connection_remote_open</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">event</span><span class="p">):</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">conn</span><span class="o">.</span><span class="n">sender</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">address</span><span class="p">,</span> <span class="n">handler</span><span class="o">=</span><span class="n">HelloWorldSender</span><span class="p">())</span>
-
-    <span class="k">def</span> <span class="nf">on_link_remote_close</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">event</span><span class="p">):</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">closed</span><span class="p">(</span><span class="n">event</span><span class="o">.</span><span class="n">link</span><span class="o">.</span><span class="n">remote_condition</span><span class="p">)</span>
+    <span class="k">def</span> <span class="nf">on_connection_opened</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">event</span><span class="p">):</span>
+<span class="hll">        <span class="bp">self</span><span class="o">.</span><span class="n">conn</span><span class="o">.</span><span class="n">create_sender</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">address</span><span class="p">)</span>
+</span>
+    <span class="k">def</span> <span class="nf">on_credit</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">event</span><span class="p">):</span>
+        <span class="n">event</span><span class="o">.</span><span class="n">sender</span><span class="o">.</span><span class="n">send_msg</span><span class="p">(</span><span class="n">Message</span><span class="p">(</span><span class="n">body</span><span class="o">=</span><span class="s">u&quot;Hello World!&quot;</span><span class="p">))</span>
+        <span class="n">event</span><span class="o">.</span><span class="n">sender</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
 
-    <span class="k">def</span> <span class="nf">on_connection_remote_close</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">event</span><span class="p">):</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">closed</span><span class="p">(</span><span class="n">event</span><span class="o">.</span><span class="n">connection</span><span class="o">.</span><span class="n">remote_condition</span><span class="p">)</span>
+    <span class="k">def</span> <span class="nf">on_accepted</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">event</span><span class="p">):</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">conn</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
 
-    <span class="k">def</span> <span class="nf">closed</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">error</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
-        <span class="k">if</span> <span class="n">error</span><span class="p">:</span>
-            <span class="k">print</span> <span class="s">&quot;Closed due to </span><span class="si">%s</span><span class="s">&quot;</span> <span class="o">%</span> <span class="n">error</span>
-<span class="hll">        <span class="bp">self</span><span class="o">.</span><span class="n">conn</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
-</span>        <span class="bp">self</span><span class="o">.</span><span class="n">acceptor</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
+    <span class="k">def</span> <span class="nf">on_connection_closed</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">event</span><span class="p">):</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">acceptor</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
 
     <span class="k">def</span> <span class="nf">run</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
         <span class="bp">self</span><span class="o">.</span><span class="n">eventloop</span><span class="o">.</span><span class="n">run</span><span class="p">()</span>
-<span class="hll">
-</span><span class="n">eventloop</span> <span class="o">=</span> <span class="n">EventLoop</span><span class="p">(</span><span class="n">HelloWorldReceiver</span><span class="p">(),</span> <span class="n">Handshaker</span><span class="p">(),</span> <span class="n">FlowController</span><span class="p">(</span><span class="mi">1</span><span class="p">))</span>
-<span class="n">HelloWorld</span><span class="p">(</span><span class="n">eventloop</span><span class="p">,</span> <span class="s">&quot;localhost:8888&quot;</span><span class="p">,</span> <span class="s">&quot;examples&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">run</span><span class="p">()</span>
-</pre></div>
+
+<span class="n">eventloop</span> <span class="o">=</span> <span class="n">EventLoop</span><span class="p">(</span><span class="n">HelloWorldReceiver</span><span class="p">(),</span> <span class="n">Handshaker</span><span class="p">(),</span> <span class="n">FlowController</span><span class="p">(</span><span class="mi">1</span><span class="p">))</span>
+<span class="hll"><span class="n">HelloWorld</span><span class="p">(</span><span class="n">eventloop</span><span class="p">,</span> <span class="s">&quot;localhost:8888&quot;</span><span class="p">,</span> <span class="s">&quot;examples&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">run</span><span class="p">()</span>
+</span></pre></div>
 </td></tr></table></div>
 <p>The first difference, on line 17, is that rather than creating a
 receiver on the same connection as our sender, we listen for incoming
@@ -314,98 +241,16 @@ with some further cleanup.</p>
  8
  9
 10
-11
-12
-13
-14
-15
-16
-17
-18
-19
-20
-21
-22
-23
-24
-25
-26
-27
-28
-29
-30
-31
-32
-33
-34
-35
-36
-37
-38
-39
-40
-41
-42
-43
-44
-45
-46
-47
-48
-49
-50
-51
-52</pre></div></td><td class="code"><div class="highlight"><pre><span class="kn">import</span> <span class="nn">time</span>
-<span class="kn">from</span> <span class="nn">proton_events</span> <span class="kn">import</span> <span class="n">IncomingMessageHandler</span><span class="p">,</span> <span class="n">EventLoop</span>
-
-<span class="k">class</span> <span class="nc">Recv</span><span class="p">(</span><span class="n">IncomingMessageHandler</span><span class="p">):</span>
-    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">eventloop</span><span class="p">,</span> <span class="n">host</span><span class="p">,</span> <span class="n">address</span><span class="p">):</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">eventloop</span> <span class="o">=</span> <span class="n">eventloop</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">host</span> <span class="o">=</span> <span class="n">host</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">address</span> <span class="o">=</span> <span class="n">address</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">delay</span> <span class="o">=</span> <span class="mi">0</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">connect</span><span class="p">()</span>
-
-    <span class="k">def</span> <span class="nf">connect</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">conn</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">eventloop</span><span class="o">.</span><span class="n">connect</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">host</span><span class="p">,</span> <span class="n">handler</span><span class="o">=</span><span class="bp">self</span><span class="p">)</span>
+11</pre></div></td><td class="code"><div class="highlight"><pre><span class="kn">import</span> <span class="nn">proton_events</span>
 
+<span class="k">class</span> <span class="nc">Recv</span><span class="p">(</span><span class="n">proton_events</span><span class="o">.</span><span class="n">ClientHandler</span><span class="p">):</span>
     <span class="k">def</span> <span class="nf">on_message</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">event</span><span class="p">):</span>
         <span class="k">print</span> <span class="n">event</span><span class="o">.</span><span class="n">message</span><span class="o">.</span><span class="n">body</span>
 
-    <span class="k">def</span> <span class="nf">on_connection_remote_open</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">event</span><span class="p">):</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">delay</span> <span class="o">=</span> <span class="mi">0</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">conn</span><span class="o">.</span><span class="n">receiver</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">address</span><span class="p">)</span>
-
-    <span class="k">def</span> <span class="nf">on_link_remote_close</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">event</span><span class="p">):</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">closed</span><span class="p">(</span><span class="n">event</span><span class="o">.</span><span class="n">link</span><span class="o">.</span><span class="n">remote_condition</span><span class="p">)</span>
-
-    <span class="k">def</span> <span class="nf">on_connection_remote_close</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">event</span><span class="p">):</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">closed</span><span class="p">(</span><span class="n">event</span><span class="o">.</span><span class="n">connection</span><span class="o">.</span><span class="n">remote_condition</span><span class="p">)</span>
-
-    <span class="k">def</span> <span class="nf">closed</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">error</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
-        <span class="k">if</span> <span class="n">error</span><span class="p">:</span>
-            <span class="k">print</span> <span class="s">&quot;Closed due to </span><span class="si">%s</span><span class="s">&quot;</span> <span class="o">%</span> <span class="n">error</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">conn</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
-
-    <span class="k">def</span> <span class="nf">on_disconnected</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">conn</span><span class="p">):</span>
-        <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">delay</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">delay</span> <span class="o">=</span> <span class="mf">0.1</span>
-            <span class="k">print</span> <span class="s">&quot;Disconnected, reconnecting...&quot;</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">connect</span><span class="p">()</span>
-        <span class="k">else</span><span class="p">:</span>
-            <span class="k">print</span> <span class="s">&quot;Disconnected will try to reconnect after </span><span class="si">%d</span><span class="s"> seconds&quot;</span> <span class="o">%</span> <span class="bp">self</span><span class="o">.</span><span class="n">delay</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">eventloop</span><span class="o">.</span><span class="n">schedule</span><span class="p">(</span><span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">()</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">delay</span><span class="p">,</span> <span class="n">connection</span><span class="o">=</span><span class="n">conn</span><span class="p">)</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">delay</span> <span class="o">=</span> <span class="nb">min</span><span class="p">(</span><span class="mi">10</span><span class="p">,</span> <span class="mi">2</span><span class="o">*</span><span class="bp">self</span><span class="o">.</span><span class="n">delay</span><span class="p">)</span>
-
-    <span class="k">def</span> <span class="nf">on_timer</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">event</span><span class="p">):</span>
-        <span class="k">print</span> <span class="s">&quot;Reconnecting...&quot;</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">connect</span><span class="p">()</span>
-
-    <span class="k">def</span> <span class="nf">run</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">eventloop</span><span class="o">.</span><span class="n">run</span><span class="p">()</span>
-
 <span class="k">try</span><span class="p">:</span>
-    <span class="n">Recv</span><span class="p">(</span><span class="n">EventLoop</span><span class="p">(),</span> <span class="s">&quot;localhost:5672&quot;</span><span class="p">,</span> <span class="s">&quot;examples&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">run</span><span class="p">()</span>
+    <span class="n">conn</span> <span class="o">=</span> <span class="n">proton_events</span><span class="o">.</span><span class="n">connect</span><span class="p">(</span><span class="s">&quot;localhost:5672&quot;</span><span class="p">,</span> <span class="n">handler</span><span class="o">=</span><span class="n">Recv</span><span class="p">())</span>
+    <span class="n">conn</span><span class="o">.</span><span class="n">create_receiver</span><span class="p">(</span><span class="s">&quot;examples&quot;</span><span class="p">)</span>
+    <span class="n">proton_events</span><span class="o">.</span><span class="n">run</span><span class="p">()</span>
 <span class="k">except</span> <span class="ne">KeyboardInterrupt</span><span class="p">:</span> <span class="k">pass</span>
 </pre></div>
 </td></tr></table></div>
@@ -437,119 +282,35 @@ with some further cleanup.</p>
 26
 27
 28
-29
-30
-31
-32
-33
-34
-35
-36
-37
-38
-39
-40
-41
-42
-43
-44
-45
-46
-47
-48
-49
-50
-51
-52
-53
-54
-55
-56
-57
-58
-59
-60
-61
-62
-63
-64
-65
-66
-67
-68
-69
-70
-71</pre></div></td><td class="code"><div class="highlight"><pre><span class="kn">import</span> <span class="nn">time</span>
-<span class="kn">from</span> <span class="nn">proton</span> <span class="kn">import</span> <span class="n">Message</span>
-<span class="kn">from</span> <span class="nn">proton_events</span> <span class="kn">import</span> <span class="n">OutgoingMessageHandler</span><span class="p">,</span> <span class="n">EventLoop</span>
-
-<span class="k">class</span> <span class="nc">Send</span><span class="p">(</span><span class="n">OutgoingMessageHandler</span><span class="p">):</span>
-    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">eventloop</span><span class="p">,</span> <span class="n">host</span><span class="p">,</span> <span class="n">address</span><span class="p">,</span> <span class="n">messages</span><span class="p">):</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">eventloop</span> <span class="o">=</span> <span class="n">eventloop</span>
+29</pre></div></td><td class="code"><div class="highlight"><pre><span class="kn">from</span> <span class="nn">proton</span> <span class="kn">import</span> <span class="n">Message</span>
+<span class="kn">import</span> <span class="nn">proton_events</span>
+
+<span class="k">class</span> <span class="nc">Send</span><span class="p">(</span><span class="n">proton_events</span><span class="o">.</span><span class="n">ClientHandler</span><span class="p">):</span>
+    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">messages</span><span class="p">):</span>
         <span class="bp">self</span><span class="o">.</span><span class="n">sent</span> <span class="o">=</span> <span class="mi">0</span>
         <span class="bp">self</span><span class="o">.</span><span class="n">confirmed</span> <span class="o">=</span> <span class="mi">0</span>
         <span class="bp">self</span><span class="o">.</span><span class="n">total</span> <span class="o">=</span> <span class="n">messages</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">address</span> <span class="o">=</span> <span class="n">address</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">host</span> <span class="o">=</span> <span class="n">host</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">delay</span> <span class="o">=</span> <span class="mi">0</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">connect</span><span class="p">()</span>
-
-    <span class="k">def</span> <span class="nf">connect</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">conn</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">eventloop</span><span class="o">.</span><span class="n">connect</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">host</span><span class="p">,</span> <span class="n">handler</span><span class="o">=</span><span class="bp">self</span><span class="p">)</span>
-
-    <span class="k">def</span> <span class="nf">on_link_flow</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">event</span><span class="p">):</span>
-        <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">sender</span><span class="o">.</span><span class="n">credit</span><span class="p">):</span>
-            <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">sent</span> <span class="o">==</span> <span class="bp">self</span><span class="o">.</span><span class="n">total</span><span class="p">:</span>
-                <span class="bp">self</span><span class="o">.</span><span class="n">sender</span><span class="o">.</span><span class="n">drained</span><span class="p">()</span>
-                <span class="k">break</span>
-            <span class="n">msg</span> <span class="o">=</span> <span class="n">Message</span><span class="p">(</span><span class="n">body</span><span class="o">=</span><span class="p">{</span><span class="s">&#39;sequence&#39;</span><span class="p">:</span><span class="bp">self</span><span class="o">.</span><span class="n">sent</span><span class="p">})</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">sender</span><span class="o">.</span><span class="n">send_msg</span><span class="p">(</span><span class="n">msg</span><span class="p">,</span> <span class="n">handler</span><span class="o">=</span><span class="bp">self</span><span class="p">)</span>
+
+    <span class="k">def</span> <span class="nf">on_credit</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">event</span><span class="p">):</span>
+        <span class="k">while</span> <span class="n">event</span><span class="o">.</span><span class="n">link</span><span class="o">.</span><span class="n">credit</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">sent</span> <span class="o">&lt;</span> <span class="bp">self</span><span class="o">.</span><span class="n">total</span><span class="p">:</span>
+            <span class="n">msg</span> <span class="o">=</span> <span class="n">Message</span><span class="p">(</span><span class="n">body</span><span class="o">=</span><span class="p">{</span><span class="s">&#39;sequence&#39;</span><span class="p">:(</span><span class="bp">self</span><span class="o">.</span><span class="n">sent</span><span class="o">+</span><span class="mi">1</span><span class="p">)})</span>
+            <span class="n">event</span><span class="o">.</span><span class="n">link</span><span class="o">.</span><span class="n">send_msg</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span>
             <span class="bp">self</span><span class="o">.</span><span class="n">sent</span> <span class="o">+=</span> <span class="mi">1</span>
 
     <span class="k">def</span> <span class="nf">on_accepted</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">event</span><span class="p">):</span>
-        <span class="sd">&quot;&quot;&quot;</span>
-<span class="sd">        Stop the application once all of the messages are sent and acknowledged,</span>
-<span class="sd">        &quot;&quot;&quot;</span>
         <span class="bp">self</span><span class="o">.</span><span class="n">confirmed</span> <span class="o">+=</span> <span class="mi">1</span>
         <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">confirmed</span> <span class="o">==</span> <span class="bp">self</span><span class="o">.</span><span class="n">total</span><span class="p">:</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">sender</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">conn</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
+            <span class="k">print</span> <span class="s">&quot;all messages confirmed&quot;</span>
+            <span class="n">event</span><span class="o">.</span><span class="n">connection</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
 
-    <span class="k">def</span> <span class="nf">on_connection_remote_open</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">event</span><span class="p">):</span>
+    <span class="k">def</span> <span class="nf">on_disconnected</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">event</span><span class="p">):</span>
         <span class="bp">self</span><span class="o">.</span><span class="n">sent</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">confirmed</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">sender</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">conn</span><span class="o">.</span><span class="n">sender</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">address</span><span class="p">)</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">sender</span><span class="o">.</span><span class="n">offered</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">total</span><span class="p">)</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">delay</span> <span class="o">=</span> <span class="mi">0</span>
-
-    <span class="k">def</span> <span class="nf">on_link_remote_close</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">event</span><span class="p">):</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">closed</span><span class="p">(</span><span class="n">event</span><span class="o">.</span><span class="n">link</span><span class="o">.</span><span class="n">remote_condition</span><span class="p">)</span>
-
-    <span class="k">def</span> <span class="nf">on_connection_remote_close</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">event</span><span class="p">):</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">closed</span><span class="p">(</span><span class="n">event</span><span class="o">.</span><span class="n">connection</span><span class="o">.</span><span class="n">remote_condition</span><span class="p">)</span>
-
-    <span class="k">def</span> <span class="nf">closed</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">error</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
-        <span class="k">if</span> <span class="n">error</span><span class="p">:</span>
-            <span class="k">print</span> <span class="s">&quot;Closed due to </span><span class="si">%s</span><span class="s">&quot;</span> <span class="o">%</span> <span class="n">error</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">conn</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
-
-    <span class="k">def</span> <span class="nf">on_disconnected</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">conn</span><span class="p">):</span>
-        <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">delay</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">delay</span> <span class="o">=</span> <span class="mf">0.1</span>
-            <span class="k">print</span> <span class="s">&quot;Disconnected, reconnecting...&quot;</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">connect</span><span class="p">()</span>
-        <span class="k">else</span><span class="p">:</span>
-            <span class="k">print</span> <span class="s">&quot;Disconnected will try to reconnect after </span><span class="si">%d</span><span class="s"> seconds&quot;</span> <span class="o">%</span> <span class="bp">self</span><span class="o">.</span><span class="n">delay</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">eventloop</span><span class="o">.</span><span class="n">schedule</span><span class="p">(</span><span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">()</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">delay</span><span class="p">,</span> <span class="n">connection</span><span class="o">=</span><span class="n">conn</span><span class="p">)</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">delay</span> <span class="o">=</span> <span class="nb">min</span><span class="p">(</span><span class="mi">10</span><span class="p">,</span> <span class="mi">2</span><span class="o">*</span><span class="bp">self</span><span class="o">.</span><span class="n">delay</span><span class="p">)</span>
-
-    <span class="k">def</span> <span class="nf">on_timer</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">event</span><span class="p">):</span>
-        <span class="k">print</span> <span class="s">&quot;Reconnecting...&quot;</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">connect</span><span class="p">()</span>
-
-    <span class="k">def</span> <span class="nf">run</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">eventloop</span><span class="o">.</span><span class="n">run</span><span class="p">()</span>
 
-<span class="n">Send</span><span class="p">(</span><span class="n">EventLoop</span><span class="p">(),</span> <span class="s">&quot;localhost:5672&quot;</span><span class="p">,</span> <span class="s">&quot;examples&quot;</span><span class="p">,</span> <span class="mi">10000</span><span class="p">)</span><span class="o">.</span><span class="n">run</span><span class="p">()</span>
+<span class="k">try</span><span class="p">:</span>
+    <span class="n">conn</span> <span class="o">=</span> <span class="n">proton_events</span><span class="o">.</span><span class="n">connect</span><span class="p">(</span><span class="s">&quot;localhost:5672&quot;</span><span class="p">,</span> <span class="n">handler</span><span class="o">=</span><span class="n">Send</span><span class="p">(</span><span class="mi">10000</span><span class="p">))</span>
+    <span class="n">conn</span><span class="o">.</span><span class="n">create_sender</span><span class="p">(</span><span class="s">&quot;examples&quot;</span><span class="p">)</span>
+    <span class="n">proton_events</span><span class="o">.</span><span class="n">run</span><span class="p">()</span>
+<span class="k">except</span> <span class="ne">KeyboardInterrupt</span><span class="p">:</span> <span class="k">pass</span>
 </pre></div>
 </td></tr></table></div>
 </div>
@@ -588,26 +349,32 @@ the body of the request converted to uppercase.</p>
 24
 25
 26
-27</pre></div></td><td class="code"><div class="highlight"><pre><span class="kn">from</span> <span class="nn">proton</span> <span class="kn">import</span> <span class="n">Message</span>
-<span class="kn">from</span> <span class="nn">proton_events</span> <span class="kn">import</span> <span class="n">EventLoop</span><span class="p">,</span> <span class="n">IncomingMessageHandler</span>
+27
+28
+29
+30</pre></div></td><td class="code"><div class="highlight"><pre><span class="kn">from</span> <span class="nn">proton</span> <span class="kn">import</span> <span class="n">Message</span>
+<span class="kn">from</span> <span class="nn">proton_events</span> <span class="kn">import</span> <span class="n">EventLoop</span><span class="p">,</span> <span class="n">ClientHandler</span>
 
-<span class="k">class</span> <span class="nc">Server</span><span class="p">(</span><span class="n">IncomingMessageHandler</span><span class="p">):</span>
+<span class="k">class</span> <span class="nc">Server</span><span class="p">(</span><span class="n">ClientHandler</span><span class="p">):</span>
     <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">eventloop</span><span class="p">,</span> <span class="n">host</span><span class="p">,</span> <span class="n">address</span><span class="p">):</span>
         <span class="bp">self</span><span class="o">.</span><span class="n">eventloop</span> <span class="o">=</span> <span class="n">eventloop</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">conn</span> <span class="o">=</span> <span class="n">eventloop</span><span class="o">.</span><span class="n">connect</span><span class="p">(</span><span class="n">host</span><span class="p">)</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">receiver</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">conn</span><span class="o">.</span><span class="n">receiver</span><span class="p">(</span><span class="n">address</span><span class="p">,</span> <span class="n">handler</span><span class="o">=</span><span class="bp">self</span><span class="p">)</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">conn</span> <span class="o">=</span> <span class="n">eventloop</span><span class="o">.</span><span class="n">connect</span><span class="p">(</span><span class="n">host</span><span class="p">,</span> <span class="n">handler</span><span class="o">=</span><span class="bp">self</span><span class="p">)</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">receiver</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">conn</span><span class="o">.</span><span class="n">create_receiver</span><span class="p">(</span><span class="n">address</span><span class="p">,</span> <span class="n">handler</span><span class="o">=</span><span class="bp">self</span><span class="p">)</span>
         <span class="bp">self</span><span class="o">.</span><span class="n">senders</span> <span class="o">=</span> <span class="p">{}</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">relay</span> <span class="o">=</span> <span class="bp">None</span>
 
     <span class="k">def</span> <span class="nf">on_message</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">event</span><span class="p">):</span>
-        <span class="n">sender</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">senders</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">event</span><span class="o">.</span><span class="n">message</span><span class="o">.</span><span class="n">reply_to</span><span class="p">)</span>
+        <span class="n">sender</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">relay</span>
         <span class="k">if</span> <span class="ow">not</span> <span class="n">sender</span><span class="p">:</span>
-            <span class="n">sender</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">conn</span><span class="o">.</span><span class="n">sender</span><span class="p">(</span><span class="n">event</span><span class="o">.</span><span class="n">message</span><span class="o">.</span><span class="n">reply_to</span><span class="p">)</span>
+            <span class="n">sender</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">senders</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">event</span><span class="o">.</span><span class="n">message</span><span class="o">.</span><span class="n">reply_to</span><span class="p">)</span>
+        <span class="k">if</span> <span class="ow">not</span> <span class="n">sender</span><span class="p">:</span>
+            <span class="n">sender</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">conn</span><span class="o">.</span><span class="n">create_sender</span><span class="p">(</span><span class="n">event</span><span class="o">.</span><span class="n">message</span><span class="o">.</span><span class="n">reply_to</span><span class="p">)</span>
             <span class="bp">self</span><span class="o">.</span><span class="n">senders</span><span class="p">[</span><span class="n">event</span><span class="o">.</span><span class="n">message</span><span class="o">.</span><span class="n">reply_to</span><span class="p">]</span> <span class="o">=</span> <span class="n">sender</span>
-        <span class="n">sender</span><span class="o">.</span><span class="n">send_msg</span><span class="p">(</span><span class="n">Message</span><span class="p">(</span><span class="n">body</span><span class="o">=</span><span class="n">event</span><span class="o">.</span><span class="n">message</span><span class="o">.</span><span class="n">body</span><span class="o">.</span><span class="n">upper</span><span class="p">()))</span>
+        <span class="n">sender</span><span class="o">.</span><span class="n">send_msg</span><span class="p">(</span><span class="n">Message</span><span class="p">(</span><span class="n">address</span><span class="o">=</span><span class="n">event</span><span class="o">.</span><span class="n">message</span><span class="o">.</span><span class="n">reply_to</span><span class="p">,</span> <span class="n">body</span><span class="o">=</span><span class="n">event</span><span class="o">.</span><span class="n">message</span><span class="o">.</span><span class="n">body</span><span class="o">.</span><span class="n">upper</span><span class="p">()))</span>
 
-    <span class="k">def</span> <span class="nf">on_connection_remote_close</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">endpoint</span><span class="p">,</span> <span class="n">error</span><span class="p">):</span>
-        <span class="k">if</span> <span class="n">error</span><span class="p">:</span> <span class="k">print</span> <span class="s">&quot;Closed due to </span><span class="si">%s</span><span class="s">&quot;</span> <span class="o">%</span> <span class="n">error</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">conn</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
+    <span class="k">def</span> <span class="nf">on_connection_opened</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">event</span><span class="p">):</span>
+        <span class="k">if</span> <span class="n">event</span><span class="o">.</span><span class="n">connection</span><span class="o">.</span><span class="n">remote_offered_capabilities</span> <span class="ow">and</span> <span class="s">&#39;ANONYMOUS-RELAY&#39;</span> <span class="ow">in</span> <span class="n">event</span><span class="o">.</span><span class="n">connection</span><span class="o">.</span><span class="n">remote_offered_capabilities</span><span class="p">:</span>
+            <span class="bp">self</span><span class="o">.</span><span class="n">relay</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">conn</span><span class="o">.</span><span class="n">create_sender</span><span class="p">(</span><span class="bp">None</span><span class="p">)</span>
 
     <span class="k">def</span> <span class="nf">run</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
         <span class="bp">self</span><span class="o">.</span><span class="n">eventloop</span><span class="o">.</span><span class="n">run</span><span class="p">()</span>
@@ -656,21 +423,21 @@ the senders incase we get further requests wit the same reply-to.</p>
 32
 33
 34</pre></div></td><td class="code"><div class="highlight"><pre><span class="kn">from</span> <span class="nn">proton</span> <span class="kn">import</span> <span class="n">Message</span>
-<span class="kn">from</span> <span class="nn">proton_events</span> <span class="kn">import</span> <span class="n">EventLoop</span><span class="p">,</span> <span class="n">IncomingMessageHandler</span>
+<span class="kn">from</span> <span class="nn">proton_events</span> <span class="kn">import</span> <span class="n">EventLoop</span><span class="p">,</span> <span class="n">ClientHandler</span>
 
-<span class="k">class</span> <span class="nc">Client</span><span class="p">(</span><span class="n">IncomingMessageHandler</span><span class="p">):</span>
+<span class="k">class</span> <span class="nc">Client</span><span class="p">(</span><span class="n">ClientHandler</span><span class="p">):</span>
     <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">eventloop</span><span class="p">,</span> <span class="n">host</span><span class="p">,</span> <span class="n">address</span><span class="p">,</span> <span class="n">requests</span><span class="p">):</span>
         <span class="bp">self</span><span class="o">.</span><span class="n">eventloop</span> <span class="o">=</span> <span class="n">eventloop</span>
         <span class="bp">self</span><span class="o">.</span><span class="n">conn</span> <span class="o">=</span> <span class="n">eventloop</span><span class="o">.</span><span class="n">connect</span><span class="p">(</span><span class="n">host</span><span class="p">)</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">sender</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">conn</span><span class="o">.</span><span class="n">sender</span><span class="p">(</span><span class="n">address</span><span class="p">)</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">receiver</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">conn</span><span class="o">.</span><span class="n">receiver</span><span class="p">(</span><span class="bp">None</span><span class="p">,</span> <span class="n">dynamic</span><span class="o">=</span><span class="bp">True</span><span class="p">,</span> <span class="n">handler</span><span class="o">=</span><span class="bp">self</span><span class="p">)</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">sender</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">conn</span><span class="o">.</span><span class="n">create_sender</span><span class="p">(</span><span class="n">address</span><span class="p">)</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">receiver</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">conn</span><span class="o">.</span><span class="n">create_receiver</span><span class="p">(</span><span class="bp">None</span><span class="p">,</span> <span class="n">dynamic</span><span class="o">=</span><span class="bp">True</span><span class="p">,</span> <span class="n">handler</span><span class="o">=</span><span class="bp">self</span><span class="p">)</span>
         <span class="bp">self</span><span class="o">.</span><span class="n">requests</span> <span class="o">=</span> <span class="n">requests</span>
 
     <span class="k">def</span> <span class="nf">next_request</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
         <span class="n">req</span> <span class="o">=</span> <span class="n">Message</span><span class="p">(</span><span class="n">reply_to</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">receiver</span><span class="o">.</span><span class="n">remote_source</span><span class="o">.</span><span class="n">address</span><span class="p">,</span> <span class="n">body</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">requests</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span>
         <span class="bp">self</span><span class="o">.</span><span class="n">sender</span><span class="o">.</span><span class="n">send_msg</span><span class="p">(</span><span class="n">req</span><span class="p">)</span>
 
-    <span class="k">def</span> <span class="nf">on_link_remote_open</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">event</span><span class="p">):</span>
+    <span class="k">def</span> <span class="nf">on_link_opened</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">event</span><span class="p">):</span>
         <span class="bp">self</span><span class="o">.</span><span class="n">next_request</span><span class="p">()</span>
 
     <span class="k">def</span> <span class="nf">on_message</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">event</span><span class="p">):</span>
@@ -704,17 +471,22 @@ request.</p>
 </div>
 
 
+          </div>
       </div>
-      <div class="bottomnav">
-      
-        <p>
-        «&#160;&#160;<a href="index.html">Some Proton Examples</a>
-        &#160;&#160;::&#160;&#160;
-        <a class="uplink" href="index.html">Contents</a>
-        </p>
-
-      </div>
-
+      <div class="clearer"></div>
+    </div>
+    <div class="related">
+      <h3>Navigation</h3>
+      <ul>
+        <li class="right" style="margin-right: 10px">
+          <a href="genindex.html" title="General Index"
+             >index</a></li>
+        <li class="right" >
+          <a href="index.html" title="Some Proton Examples"
+             >previous</a> |</li>
+        <li><a href="index.html">Proton 0.9-alpha documentation</a> &raquo;</li> 
+      </ul>
+    </div>
     <div class="footer">
         &copy; Copyright 2014, Apache Qpid.
       Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.3.

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/0c822c6d/tutorial/conf.py
----------------------------------------------------------------------
diff --git a/tutorial/conf.py b/tutorial/conf.py
index 7ddac55..8644399 100644
--- a/tutorial/conf.py
+++ b/tutorial/conf.py
@@ -48,9 +48,9 @@ copyright = u'2014, Apache Qpid'
 # built documents.
 #
 # The short X.Y version.
-version = '0.8'
+version = '0.9'
 # The full version, including alpha/beta/rc tags.
-release = '0.8'
+release = '0.9-alpha'
 
 # The language for content autogenerated by Sphinx. Refer to documentation
 # for a list of supported languages.
@@ -91,12 +91,12 @@ pygments_style = 'sphinx'
 
 # The theme to use for HTML and HTML Help pages.  See the documentation for
 # a list of builtin themes.
-html_theme = 'haiku'
+html_theme = 'default'
 
 # Theme options are theme-specific and customize the look and feel of a theme
 # further.  For a list of options available for each theme, see the
 # documentation.
-#html_theme_options = {}
+html_theme_options = {'nosidebar':'true'}
 
 # Add any paths that contain custom themes here, relative to this directory.
 #html_theme_path = []

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/0c822c6d/tutorial/helloworld.py
----------------------------------------------------------------------
diff --git a/tutorial/helloworld.py b/tutorial/helloworld.py
index 9ec5334..9dfc356 100755
--- a/tutorial/helloworld.py
+++ b/tutorial/helloworld.py
@@ -22,9 +22,9 @@ from proton import Message
 import proton_events
 
 class HelloWorld(proton_events.ClientHandler):
-    def __init__(self, conn, address):
-        self.conn = conn
+    def __init__(self, server, address):
         self.address = address
+        self.conn = proton_events.connect(server, handler=self)
 
     def on_connection_opened(self, event):
         self.conn.create_receiver(self.address)
@@ -38,7 +38,6 @@ class HelloWorld(proton_events.ClientHandler):
         print event.message.body
         event.connection.close()
 
-conn = proton_events.connect("localhost:5672")
-conn.handler=HelloWorld(conn, "examples")
+HelloWorld("localhost:5672", "examples")
 proton_events.run()
 

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/0c822c6d/tutorial/tutorial.rst
----------------------------------------------------------------------
diff --git a/tutorial/tutorial.rst b/tutorial/tutorial.rst
index 62aeadc..89eb563 100644
--- a/tutorial/tutorial.rst
+++ b/tutorial/tutorial.rst
@@ -11,66 +11,44 @@ sending and receiving a single message.
    :lines: 21-
    :linenos:
 
-You can see the import of ``EventLoop`` from ``proton_events`` on the
-second line. This is a helper class that makes programming with proton
-a little easier for the common cases. It includes within it an event
-loop, and programs written using this utility are generally structured
-to react to various events. This reactive style is particularly suited
-to messaging applications.
-
-To be notified of a particular event, you define a class with the
-appropriately name method on it. That method is then called by the
-event loop when the event occurs.
-
-The first class we define, ``HelloWorldReceiver``, handles the event
-where a message is received and so implements a ``on_message()``
-method. Within that we simply print the body of the message (line 6)
-and then close the connection (line 7).
-
-The second class, ``HelloWorldSender``, handles the event where the
-flow of messages is enabled over our sending link by implementing a
-``on_link_flow()`` method and sending the message within that. Doing
-this ensures that we only send when the recipient is ready and able to
-receive the message. This is particularly important when the volume of
-messages might be large. In our case we are just going to send one
-message, which we do on line 11, so we can then just close the sending
-link on line 12.
-
-The ``HelloWorld`` class ties everything together. It's constructor
-takes the instance of the event loop to use, a url to connect to, and
-an address through which the message will be sent. To run the example
-you will need to have a broker (or similar) accepting connections on
-that url either with a queue (or topic) matching the given address or
-else configured to create such a queue (or topic) dynamically.
-
-On line 17 we request that a connection be made to the process this
-url refers to by calling ``connect()`` on the ``EventLoop``. This call
-returns a ``MessagingContext`` object through which we can create
-objects for sending and receiving messages to the process it is
-connected to. However we will delay doing that until our connection is
-fully established, i.e. until the remote peer 'opens' the connection
-(the open here is the 'handshake' for establishing an operational AMQP
-connection).
-
-To be notified of this we pass a reference to self as the handler in
-``connect()`` and define an ``on_connection_remote_open()`` method
-within which we can create our receiver using the connection context
-we obtained from the earlier ``connect()`` call, and passing the
-handler implementation defined by ``HelloWorldReceiver``. When the
-remote peer confirms the establishment of that receiver we get a
-callback on ``on_link_remote_open()`` and that is where we then create
-our sender, passing it the ``HelloWorldSender`` handler. Delaying the
-creation of the sender until the receiver is established avoids losing
-messages even when these are not queued up by the remote peer.
-
-We'll add definitions to ``HelloWorld`` of ``on_link_remote_close()``
-and ``on_connection_remote_close()`` also, so that we can be notified
-if the broker we are connected to closes either link or the connection
-for any reason.
-
-Finally we actually enter the event loop, to handle all the necessary
-IO and make all the necessary event callbacks, by calling ``run()`` on
-it.
+This example uses proton in an event-driven or reactive manner. The
+flow of control is an 'event loop', where the events may be triggered
+by data arriving on a socket among other things and are then passed to
+relevant 'handlers'. Applications are then structured as a set of
+defined handlers for events of interest; to be notified of a
+particular event, you define a class with an appropriately name method
+on it, inform the event loop of that method which then calls it
+whenever the event occurs.
+
+The class we define in this example, ``HelloWorld``, has methods to
+handle three types of events.
+
+The first, ``on_connection_opened()``, is called when the connection
+is opened, and when that occurs we create a receiver over which to
+receive our message and a sender over which to send it.
+
+The second method, ``on_credit()``, is called when our sender has been
+issued by the peer with 'credit', allowing it to send messages. A
+credit based flow control mechanism like this ensures we only send
+messages when the recipient is ready and able to receive them. This is
+particularly important when the volume of messages might be large. In
+our case we are just going to send one message.
+
+The third and final method, ``on_message()``, is called when a message
+arrives. Within that method we simply print the body of the message
+and then close the connection.
+
+This particular example assumes a broker (or similar service), which
+accepts connections and routes published messages to intended
+recipients. The constructor for the ``HelloWorld`` class takes the
+details of the broker to connect to, and the address through which the
+message is sent and received (for a broker this corresponds to a queue
+or topic name).
+
+After an instance of ``HelloWorld`` is constructed, the event loop is
+entered by the call to the ``run()`` method on the last line. This
+call will return only when the loop determines there are no more
+events possible (at which point our example program will then exit).
 
 ====================
 Hello World, Direct!


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


[28/50] [abbrv] qpid-proton git commit: removed extraneous and harmful __str__

Posted by gs...@apache.org.
removed extraneous and harmful __str__

git-svn-id: https://svn.apache.org/repos/asf/qpid/proton/trunk@1634078 13f79535-47bb-0310-9956-ffa450edef68


Project: http://git-wip-us.apache.org/repos/asf/qpid-proton/repo
Commit: http://git-wip-us.apache.org/repos/asf/qpid-proton/commit/d16ab03c
Tree: http://git-wip-us.apache.org/repos/asf/qpid-proton/tree/d16ab03c
Diff: http://git-wip-us.apache.org/repos/asf/qpid-proton/diff/d16ab03c

Branch: refs/heads/examples
Commit: d16ab03cf517ac4e1ecd47a036d559c46529765b
Parents: 51625e5
Author: Rafael H. Schloming <rh...@apache.org>
Authored: Fri Oct 24 15:44:49 2014 +0000
Committer: Rafael H. Schloming <rh...@apache.org>
Committed: Fri Oct 24 15:44:49 2014 +0000

----------------------------------------------------------------------
 proton-c/bindings/python/proton.py | 3 ---
 1 file changed, 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/d16ab03c/proton-c/bindings/python/proton.py
----------------------------------------------------------------------
diff --git a/proton-c/bindings/python/proton.py b/proton-c/bindings/python/proton.py
index 862b673..8399952 100644
--- a/proton-c/bindings/python/proton.py
+++ b/proton-c/bindings/python/proton.py
@@ -2218,9 +2218,6 @@ class Condition:
                                         (self.name, self.description, self.info)
                                         if x])
 
-  def __str__(self):
-    return ": ".join(filter(None, [self.name, self.description, self.info]))
-
   def __eq__(self, o):
     if not isinstance(o, Condition): return False
     return self.name == o.name and \


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


[13/50] [abbrv] qpid-proton git commit: PROTON-711: add support (disabled by default) for using a byte value for destination type annotations during inbound transformation

Posted by gs...@apache.org.
PROTON-711: add support (disabled by default) for using a byte value for destination type annotations during inbound transformation

git-svn-id: https://svn.apache.org/repos/asf/qpid/proton/trunk@1631795 13f79535-47bb-0310-9956-ffa450edef68


Project: http://git-wip-us.apache.org/repos/asf/qpid-proton/repo
Commit: http://git-wip-us.apache.org/repos/asf/qpid-proton/commit/960eeff9
Tree: http://git-wip-us.apache.org/repos/asf/qpid-proton/tree/960eeff9
Diff: http://git-wip-us.apache.org/repos/asf/qpid-proton/diff/960eeff9

Branch: refs/heads/examples
Commit: 960eeff9eefa5b8dc52de356d1118ae0b017a319
Parents: 72b7beb
Author: Robert Gemmell <ro...@apache.org>
Authored: Tue Oct 14 15:33:50 2014 +0000
Committer: Robert Gemmell <ro...@apache.org>
Committed: Tue Oct 14 15:33:50 2014 +0000

----------------------------------------------------------------------
 .../qpid/proton/jms/InboundTransformer.java     | 84 ++++++++++++-----
 .../jms/JMSMappingInboundTransformerTest.java   | 97 +++++++++++++++++---
 2 files changed, 146 insertions(+), 35 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/960eeff9/contrib/proton-jms/src/main/java/org/apache/qpid/proton/jms/InboundTransformer.java
----------------------------------------------------------------------
diff --git a/contrib/proton-jms/src/main/java/org/apache/qpid/proton/jms/InboundTransformer.java b/contrib/proton-jms/src/main/java/org/apache/qpid/proton/jms/InboundTransformer.java
index 0374e6a..cef10c4 100644
--- a/contrib/proton-jms/src/main/java/org/apache/qpid/proton/jms/InboundTransformer.java
+++ b/contrib/proton-jms/src/main/java/org/apache/qpid/proton/jms/InboundTransformer.java
@@ -53,12 +53,22 @@ public abstract class InboundTransformer {
     int defaultPriority = javax.jms.Message.DEFAULT_PRIORITY;
     long defaultTtl = javax.jms.Message.DEFAULT_TIME_TO_LIVE;
 
+    private boolean useByteDestinationTypeAnnotations = false;
+
     public InboundTransformer(JMSVendor vendor) {
         this.vendor = vendor;
     }
 
     abstract public Message transform(EncodedMessage amqpMessage) throws Exception;
 
+    public boolean isUseByteDestinationTypeAnnotations() {
+        return useByteDestinationTypeAnnotations;
+    }
+
+    public void setUseByteDestinationTypeAnnotations(boolean useByteDestinationTypeAnnotations) {
+        this.useByteDestinationTypeAnnotations = useByteDestinationTypeAnnotations;
+    }
+
     public int getDefaultDeliveryMode() {
         return defaultDeliveryMode;
     }
@@ -130,8 +140,16 @@ public abstract class InboundTransformer {
             }
         }
 
-        Class<? extends Destination> toAttributes = Destination.class;
-        Class<? extends Destination> replyToAttributes = Destination.class;
+        Class<? extends Destination> toAttributes = null;
+        Class<? extends Destination> replyToAttributes = null;
+
+        if (isUseByteDestinationTypeAnnotations()){
+            toAttributes = Queue.class;
+            replyToAttributes = Queue.class;
+        } else {
+            toAttributes = Destination.class;
+            replyToAttributes = Destination.class;
+        }
 
         final MessageAnnotations ma = amqp.getMessageAnnotations();
         if( ma!=null ) {
@@ -140,9 +158,9 @@ public abstract class InboundTransformer {
                 if( "x-opt-jms-type".equals(key.toString()) && entry.getValue() != null ) {
                     jms.setJMSType(entry.getValue().toString());
                 } else if( "x-opt-to-type".equals(key.toString()) ) {
-                    toAttributes = toClassFromAttributes(entry.getValue().toString());
+                    toAttributes = toClassFromAttributes(entry.getValue());
                 } else if( "x-opt-reply-type".equals(key.toString()) ) {
-                    replyToAttributes = toClassFromAttributes(entry.getValue().toString());
+                    replyToAttributes = toClassFromAttributes(entry.getValue());
                 } else {
                     setProperty(jms, prefixVendor + prefixMessageAnnotations + key, entry.getValue());
                 }
@@ -246,29 +264,49 @@ public abstract class InboundTransformer {
         return Collections.unmodifiableSet(s);
     }
 
-    Class<? extends Destination> toClassFromAttributes(String value)
+    Class<? extends Destination> toClassFromAttributes(Object value)
     {
-        if( value ==null ) {
-            return null;
-        }
-        HashSet<String> attributes = new HashSet<String>();
-        for( String x: value.split("\\s*,\\s*") ) {
-            attributes.add(x);
-        }
+        if(isUseByteDestinationTypeAnnotations()) {
+            if(value instanceof Byte) {
+                switch ((Byte) value) {
+                    case JMSVendor.QUEUE_TYPE:
+                        return Queue.class;
+                    case JMSVendor.TOPIC_TYPE:
+                        return Topic.class;
+                    case JMSVendor.TEMP_QUEUE_TYPE:
+                        return TemporaryQueue.class;
+                    case JMSVendor.TEMP_TOPIC_TYPE:
+                        return TemporaryTopic.class;
+                    default:
+                        return Queue.class;
+                }
+            }
 
-        if( QUEUE_ATTRIBUTES.equals(attributes) ) {
             return Queue.class;
+        } else {
+            if( value == null ) {
+                return null;
+            }
+            String valueString = value.toString();
+            HashSet<String> attributes = new HashSet<String>();
+            for( String x: valueString.split("\\s*,\\s*") ) {
+                attributes.add(x);
+            }
+
+            if( QUEUE_ATTRIBUTES.equals(attributes) ) {
+                return Queue.class;
+            }
+            if( TOPIC_ATTRIBUTES.equals(attributes) ) {
+                return Topic.class;
+            }
+            if( TEMP_QUEUE_ATTRIBUTES.equals(attributes) ) {
+                return TemporaryQueue.class;
+            }
+            if( TEMP_TOPIC_ATTRIBUTES.equals(attributes) ) {
+                return TemporaryTopic.class;
+            }
+            return Destination.class;
         }
-        if( TOPIC_ATTRIBUTES.equals(attributes) ) {
-            return Topic.class;
-        }
-        if( TEMP_QUEUE_ATTRIBUTES.equals(attributes) ) {
-            return TemporaryQueue.class;
-        }
-        if( TEMP_TOPIC_ATTRIBUTES.equals(attributes) ) {
-            return TemporaryTopic.class;
-        }
-        return Destination.class;
     }
 
 

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/960eeff9/contrib/proton-jms/src/test/java/org/apache/qpid/proton/jms/JMSMappingInboundTransformerTest.java
----------------------------------------------------------------------
diff --git a/contrib/proton-jms/src/test/java/org/apache/qpid/proton/jms/JMSMappingInboundTransformerTest.java b/contrib/proton-jms/src/test/java/org/apache/qpid/proton/jms/JMSMappingInboundTransformerTest.java
index 42a99ca..2413310 100644
--- a/contrib/proton-jms/src/test/java/org/apache/qpid/proton/jms/JMSMappingInboundTransformerTest.java
+++ b/contrib/proton-jms/src/test/java/org/apache/qpid/proton/jms/JMSMappingInboundTransformerTest.java
@@ -60,41 +60,78 @@ public class JMSMappingInboundTransformerTest
     // ======= JMSDestination Handling =========
     // =========================================
 
+    // --- String type annotation ---
     @Test
     public void testTransformWithNoToTypeDestinationTypeAnnotation() throws Exception
     {
-        doTransformWithToTypeDestinationTypeAnnotationTestImpl(null, Destination.class);
+        doTransformWithToTypeDestinationTypeAnnotationTestImpl(null, Destination.class, false);
     }
 
     @Test
     public void testTransformWithQueueStringToTypeDestinationTypeAnnotation() throws Exception
     {
-        doTransformWithToTypeDestinationTypeAnnotationTestImpl("queue", Queue.class);
+        doTransformWithToTypeDestinationTypeAnnotationTestImpl("queue", Queue.class, false);
     }
 
     @Test
     public void testTransformWithTemporaryQueueStringToTypeDestinationTypeAnnotation() throws Exception
     {
-        doTransformWithToTypeDestinationTypeAnnotationTestImpl("queue,temporary", TemporaryQueue.class);
+        doTransformWithToTypeDestinationTypeAnnotationTestImpl("queue,temporary", TemporaryQueue.class, false);
     }
 
     @Test
     public void testTransformWithTopicStringToTypeDestinationTypeAnnotation() throws Exception
     {
-        doTransformWithToTypeDestinationTypeAnnotationTestImpl("topic", Topic.class);
+        doTransformWithToTypeDestinationTypeAnnotationTestImpl("topic", Topic.class, false);
     }
 
     @Test
     public void testTransformWithTemporaryTopicStringToTypeDestinationTypeAnnotation() throws Exception
     {
-        doTransformWithToTypeDestinationTypeAnnotationTestImpl("topic,temporary", TemporaryTopic.class);
+        doTransformWithToTypeDestinationTypeAnnotationTestImpl("topic,temporary", TemporaryTopic.class, false);
     }
 
-    private void doTransformWithToTypeDestinationTypeAnnotationTestImpl(Object toTypeAnnotationValue, Class<? extends Destination> expectedClass) throws Exception
+    // --- byte type annotation ---
+
+    @Test
+    public void testTransformWithNoToTypeDestinationTypeAnnotationUsingByteAnnotation() throws Exception
+    {
+        doTransformWithToTypeDestinationTypeAnnotationTestImpl(null, Queue.class, true);
+    }
+
+    @Test
+    public void testTransformWithQueueByteToTypeDestinationTypeAnnotation() throws Exception
+    {
+        doTransformWithToTypeDestinationTypeAnnotationTestImpl(JMSVendor.QUEUE_TYPE, Queue.class, true);
+    }
+
+    @Test
+    public void testTransformWithTemporaryQueueByteToTypeDestinationTypeAnnotation() throws Exception
+    {
+        doTransformWithToTypeDestinationTypeAnnotationTestImpl(JMSVendor.TEMP_QUEUE_TYPE, TemporaryQueue.class, true);
+    }
+
+    @Test
+    public void testTransformWithTopicByteToTypeDestinationTypeAnnotation() throws Exception
+    {
+        doTransformWithToTypeDestinationTypeAnnotationTestImpl(JMSVendor.TOPIC_TYPE, Topic.class, true);
+    }
+
+    @Test
+    public void testTransformWithTemporaryTopicByteToTypeDestinationTypeAnnotation() throws Exception
+    {
+        doTransformWithToTypeDestinationTypeAnnotationTestImpl(JMSVendor.TEMP_TOPIC_TYPE, TemporaryTopic.class, true);
+    }
+
+    private void doTransformWithToTypeDestinationTypeAnnotationTestImpl(Object toTypeAnnotationValue, Class<? extends Destination> expectedClass, boolean byteType) throws Exception
     {
         TextMessage mockTextMessage = createMockTextMessage();
         JMSVendor mockVendor = createMockVendor(mockTextMessage);
         JMSMappingInboundTransformer transformer = new JMSMappingInboundTransformer(mockVendor);
+        if(byteType)
+        {
+            transformer.setUseByteDestinationTypeAnnotations(true);
+        }
 
         String toAddress = "toAddress";
         Message amqp = Message.Factory.create();
@@ -120,41 +157,77 @@ public class JMSMappingInboundTransformerTest
     // ======= JMSReplyTo Handling =========
     // =====================================
 
+    // --- String type annotation ---
     @Test
     public void testTransformWithNoReplyToTypeDestinationTypeAnnotation() throws Exception
     {
-        doTransformWithReplyToTypeDestinationTypeAnnotationTestImpl(null,Destination.class);
+        doTransformWithReplyToTypeDestinationTypeAnnotationTestImpl(null,Destination.class, false);
     }
 
     @Test
     public void testTransformWithQueueStringReplyToTypeDestinationTypeAnnotation() throws Exception
     {
-        doTransformWithReplyToTypeDestinationTypeAnnotationTestImpl("queue", Queue.class);
+        doTransformWithReplyToTypeDestinationTypeAnnotationTestImpl("queue", Queue.class, false);
     }
 
     @Test
     public void testTransformWithTemporaryQueueStringReplyToTypeDestinationTypeAnnotation() throws Exception
     {
-        doTransformWithReplyToTypeDestinationTypeAnnotationTestImpl("queue,temporary", TemporaryQueue.class);
+        doTransformWithReplyToTypeDestinationTypeAnnotationTestImpl("queue,temporary", TemporaryQueue.class, false);
     }
 
     @Test
     public void testTransformWithTopicStringReplyToTypeDestinationTypeAnnotation() throws Exception
     {
-        doTransformWithReplyToTypeDestinationTypeAnnotationTestImpl("topic", Topic.class);
+        doTransformWithReplyToTypeDestinationTypeAnnotationTestImpl("topic", Topic.class, false);
     }
 
     @Test
     public void testTransformWithTemporaryTopicStringReplyToTypeDestinationTypeAnnotation() throws Exception
     {
-        doTransformWithReplyToTypeDestinationTypeAnnotationTestImpl("topic,temporary", TemporaryTopic.class);
+        doTransformWithReplyToTypeDestinationTypeAnnotationTestImpl("topic,temporary", TemporaryTopic.class, false);
     }
 
-    private void doTransformWithReplyToTypeDestinationTypeAnnotationTestImpl(Object replyToTypeAnnotationValue, Class<? extends Destination> expectedClass) throws Exception
+    // --- byte type annotation ---
+    @Test
+    public void testTransformWithNoReplyToTypeDestinationTypeAnnotationUsingByteAnnotation() throws Exception
+    {
+        doTransformWithReplyToTypeDestinationTypeAnnotationTestImpl(null,Queue.class, true);
+    }
+
+    @Test
+    public void testTransformWithQueueByteReplyToTypeDestinationTypeAnnotation() throws Exception
+    {
+        doTransformWithReplyToTypeDestinationTypeAnnotationTestImpl(JMSVendor.QUEUE_TYPE, Queue.class, true);
+    }
+
+    @Test
+    public void testTransformWithTemporaryQueueByteReplyToTypeDestinationTypeAnnotation() throws Exception
+    {
+        doTransformWithReplyToTypeDestinationTypeAnnotationTestImpl(JMSVendor.TEMP_QUEUE_TYPE, TemporaryQueue.class, true);
+    }
+
+    @Test
+    public void testTransformWithTopicByteReplyToTypeDestinationTypeAnnotation() throws Exception
+    {
+        doTransformWithReplyToTypeDestinationTypeAnnotationTestImpl(JMSVendor.TOPIC_TYPE, Topic.class, true);
+    }
+
+    @Test
+    public void testTransformWithTemporaryTopicByteReplyToTypeDestinationTypeAnnotation() throws Exception
+    {
+        doTransformWithReplyToTypeDestinationTypeAnnotationTestImpl(JMSVendor.TEMP_TOPIC_TYPE, TemporaryTopic.class, true);
+    }
+
+    private void doTransformWithReplyToTypeDestinationTypeAnnotationTestImpl(Object replyToTypeAnnotationValue, Class<? extends Destination> expectedClass, boolean byteType) throws Exception
     {
         TextMessage mockTextMessage = createMockTextMessage();
         JMSVendor mockVendor = createMockVendor(mockTextMessage);
         JMSMappingInboundTransformer transformer = new JMSMappingInboundTransformer(mockVendor);
+        if(byteType)
+        {
+            transformer.setUseByteDestinationTypeAnnotations(true);
+        }
 
         String replyToAddress = "replyToAddress";
         Message amqp = Message.Factory.create();


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


[45/50] [abbrv] qpid-proton git commit: PROTON-736: Default Ruby 1.8 encoding to be binary unless explicit

Posted by gs...@apache.org.
PROTON-736: Default Ruby 1.8 encoding to be binary unless explicit

Also updated the patch to not re-encode the original string while
checking its value.


Project: http://git-wip-us.apache.org/repos/asf/qpid-proton/repo
Commit: http://git-wip-us.apache.org/repos/asf/qpid-proton/commit/cccd0506
Tree: http://git-wip-us.apache.org/repos/asf/qpid-proton/tree/cccd0506
Diff: http://git-wip-us.apache.org/repos/asf/qpid-proton/diff/cccd0506

Branch: refs/heads/examples
Commit: cccd05067d45623e3690945ebe4cda764c96e955
Parents: ebf80e2
Author: Darryl L. Pierce <mc...@gmail.com>
Authored: Tue Nov 11 14:04:58 2014 -0500
Committer: Darryl L. Pierce <mc...@gmail.com>
Committed: Wed Nov 12 11:51:31 2014 -0500

----------------------------------------------------------------------
 .../bindings/ruby/lib/qpid_proton/mapping.rb    | 25 ++++++++++++++++----
 1 file changed, 21 insertions(+), 4 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/cccd0506/proton-c/bindings/ruby/lib/qpid_proton/mapping.rb
----------------------------------------------------------------------
diff --git a/proton-c/bindings/ruby/lib/qpid_proton/mapping.rb b/proton-c/bindings/ruby/lib/qpid_proton/mapping.rb
index e7e3322..778f936 100644
--- a/proton-c/bindings/ruby/lib/qpid_proton/mapping.rb
+++ b/proton-c/bindings/ruby/lib/qpid_proton/mapping.rb
@@ -106,15 +106,32 @@ module Qpid # :nodoc:
     DECIMAL128 = Mapping.new(Cproton::PN_DECIMAL128, "decimal128")
     UUID       = Mapping.new(Cproton::PN_UUID, "uuid")
     BINARY     = Mapping.new(Cproton::PN_BINARY, "binary")
-    STRING     = Mapping.new(Cproton::PN_STRING, "string", [String, Symbol])
+    STRING     = Mapping.new(Cproton::PN_STRING, "string", [String, Symbol,
+                                                           UTFString,
+                                                           BinaryString])
 
     class << STRING
       def put(data, value)
-        if value.is_a?(Qpid::Proton::UTFString) || Qpid::Proton.is_valid_utf?(value)
-          data.string = value.to_s
+        isutf = false
+
+        if value.is_a?(Qpid::Proton::UTFString)
+          isutf = true
         else
-          data.binary = value.to_s
+          # For Ruby 1.8 we will just treat all strings as binary.
+          # For Ruby 1.9+ we can check the encoding first to see what it is
+          if RUBY_VERSION >= "1.9"
+            # If the string is ASCII-8BIT then treat is as binary. Otherwise,
+            # try to convert it to UTF-8 and, if successful, send as that.
+            if value.encoding != Encoding::ASCII_8BIT &&
+                value.encode(Encoding::UTF_8).valid_encoding?
+              isutf = true
+            end
+          end
         end
+
+        data.string = value if isutf
+        data.binary = value if !isutf
+
       end
     end
 


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


[21/50] [abbrv] qpid-proton git commit: PROTON-717: disable SSLv3

Posted by gs...@apache.org.
PROTON-717: disable SSLv3

git-svn-id: https://svn.apache.org/repos/asf/qpid/proton/trunk@1632372 13f79535-47bb-0310-9956-ffa450edef68


Project: http://git-wip-us.apache.org/repos/asf/qpid-proton/repo
Commit: http://git-wip-us.apache.org/repos/asf/qpid-proton/commit/ad5e094e
Tree: http://git-wip-us.apache.org/repos/asf/qpid-proton/tree/ad5e094e
Diff: http://git-wip-us.apache.org/repos/asf/qpid-proton/diff/ad5e094e

Branch: refs/heads/examples
Commit: ad5e094ebb7f1ead3171885e3d7a221260c75511
Parents: 423dbc5
Author: Rafael H. Schloming <rh...@apache.org>
Authored: Thu Oct 16 16:05:11 2014 +0000
Committer: Rafael H. Schloming <rh...@apache.org>
Committed: Thu Oct 16 16:05:11 2014 +0000

----------------------------------------------------------------------
 .../engine/impl/ssl/SslEngineFacadeFactory.java      | 15 +++++++++++++++
 1 file changed, 15 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/ad5e094e/proton-j/src/main/java/org/apache/qpid/proton/engine/impl/ssl/SslEngineFacadeFactory.java
----------------------------------------------------------------------
diff --git a/proton-j/src/main/java/org/apache/qpid/proton/engine/impl/ssl/SslEngineFacadeFactory.java b/proton-j/src/main/java/org/apache/qpid/proton/engine/impl/ssl/SslEngineFacadeFactory.java
index 37021d6..9824d00 100644
--- a/proton-j/src/main/java/org/apache/qpid/proton/engine/impl/ssl/SslEngineFacadeFactory.java
+++ b/proton-j/src/main/java/org/apache/qpid/proton/engine/impl/ssl/SslEngineFacadeFactory.java
@@ -204,9 +204,24 @@ public class SslEngineFacadeFactory
         boolean useClientMode = mode == SslDomain.Mode.CLIENT ? true : false;
         sslEngine.setUseClientMode(useClientMode);
 
+        removeSSLv3Support(sslEngine);
+
         return sslEngine;
     }
 
+    private static final String SSLV3_PROTOCOL = "SSLv3";
+
+    private static void removeSSLv3Support(final SSLEngine engine)
+    {
+        List<String> enabledProtocols = Arrays.asList(engine.getEnabledProtocols());
+        if(enabledProtocols.contains(SSLV3_PROTOCOL))
+        {
+            List<String> allowedProtocols = new ArrayList<String>(enabledProtocols);
+            allowedProtocols.remove(SSLV3_PROTOCOL);
+            engine.setEnabledProtocols(allowedProtocols.toArray(new String[allowedProtocols.size()]));
+        }
+    }
+
     /**
      * @param sslPeerDetails is allowed to be null. A non-null value is used to hint that SSL resumption
      * should be attempted


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


[49/50] [abbrv] qpid-proton git commit: Merged from master

Posted by gs...@apache.org.
Merged from master


Project: http://git-wip-us.apache.org/repos/asf/qpid-proton/repo
Commit: http://git-wip-us.apache.org/repos/asf/qpid-proton/commit/90509763
Tree: http://git-wip-us.apache.org/repos/asf/qpid-proton/tree/90509763
Diff: http://git-wip-us.apache.org/repos/asf/qpid-proton/diff/90509763

Branch: refs/heads/examples
Commit: 905097636da6fd4d6f03cccd53207acfdadbe6f6
Parents: 0c822c6 c5c1879
Author: Gordon Sim <gs...@redhat.com>
Authored: Fri Nov 14 10:47:32 2014 +0000
Committer: Gordon Sim <gs...@redhat.com>
Committed: Fri Nov 14 10:47:32 2014 +0000

----------------------------------------------------------------------
 .../jms/AMQPNativeOutboundTransformer.java      |   4 +-
 .../proton/jms/AutoOutboundTransformer.java     |   6 +
 .../qpid/proton/jms/InboundTransformer.java     |  84 +++--
 .../jms/JMSMappingOutboundTransformer.java      |  44 ++-
 .../org/apache/qpid/proton/jms/JMSVendor.java   |  16 +-
 .../qpid/proton/jms/OutboundTransformer.java    |  14 +-
 .../jms/JMSMappingInboundTransformerTest.java   | 287 +++++++++++++++
 .../jms/JMSMappingOutboundTransformerTest.java  | 351 +++++++++++++++++++
 examples/README.txt                             |   3 +
 proton-c/bindings/python/proton.py              |  75 ++--
 proton-c/bindings/ruby/lib/qpid_proton.rb       |   1 +
 proton-c/bindings/ruby/lib/qpid_proton/data.rb  |   4 +-
 .../bindings/ruby/lib/qpid_proton/mapping.rb    |  25 +-
 .../bindings/ruby/lib/qpid_proton/message.rb    |  43 ++-
 .../bindings/ruby/lib/qpid_proton/messenger.rb  |  14 +-
 .../bindings/ruby/lib/qpid_proton/strings.rb    |  69 ++++
 proton-c/include/proton/cproton.i               |   1 +
 proton-c/include/proton/driver.h                |  13 +-
 proton-c/include/proton/transport.h             |  13 +
 proton-c/src/engine/engine-internal.h           |   6 +-
 proton-c/src/engine/engine.c                    |   9 +-
 proton-c/src/posix/driver.c                     |   8 +-
 proton-c/src/posix/io.c                         |  14 +-
 proton-c/src/protocol.py                        |   2 +
 proton-c/src/sasl/sasl.c                        |   9 +-
 proton-c/src/ssl/openssl.c                      | 148 ++++----
 proton-c/src/transport/transport.c              |  93 +++--
 proton-c/src/windows/driver.c                   |   8 +-
 proton-c/src/windows/io.c                       |  17 +-
 proton-c/src/windows/schannel.c                 |  27 +-
 .../impl/ssl/SimpleSslTransportWrapper.java     |   6 +
 .../engine/impl/ssl/SslEngineFacadeFactory.java |  15 +
 proton-j/src/main/resources/cengine.py          |  25 +-
 tests/python/proton_tests/engine.py             |  37 +-
 version.txt                                     |   2 +-
 35 files changed, 1266 insertions(+), 227 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/90509763/proton-c/bindings/python/proton.py
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/90509763/proton-c/src/transport/transport.c
----------------------------------------------------------------------
diff --cc proton-c/src/transport/transport.c
index d74873b,601d6a2..d9dfab8
--- a/proton-c/src/transport/transport.c
+++ b/proton-c/src/transport/transport.c
@@@ -790,17 -806,10 +809,14 @@@ int pn_do_transfer(pn_dispatcher_t *dis
      delivery = pn_delivery(link, pn_dtag(tag.start, tag.size));
      pn_delivery_state_t *state = pn_delivery_map_push(incoming, delivery);
      if (id_present && id != state->id) {
-       int err = pn_do_error(transport, "amqp:session:invalid-field",
-                             "sequencing error, expected delivery-id %u, got %u",
-                             state->id, id);
-       // XXX: this will probably leave delivery buffer state messed up
-       pn_full_settle(incoming, delivery);
-       return err;
+       return pn_do_error(transport, "amqp:session:invalid-field",
+                          "sequencing error, expected delivery-id %u, got %u",
+                          state->id, id);
      }
 +    if (has_type) {
 +      delivery->remote.type = type;
 +      pn_data_copy(delivery->remote.data, transport->disp_data);
 +  }
  
      link->state.delivery_count++;
      link->state.link_credit--;

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/90509763/proton-c/src/windows/schannel.c
----------------------------------------------------------------------
diff --cc proton-c/src/windows/schannel.c
index 385267f,9437582..e91e0a3
--- a/proton-c/src/windows/schannel.c
+++ b/proton-c/src/windows/schannel.c
@@@ -521,6 -520,16 +520,19 @@@ int pn_ssl_get_peer_hostname( pn_ssl_t 
  
  /** SChannel specific: */
  
++<<<<<<< HEAD
++=======
+ const char *tls_version_check(pn_ssl_t *ssl)
+ {
+   SecPkgContext_ConnectionInfo info;
+   QueryContextAttributes(&ssl->ctxt_handle, SECPKG_ATTR_CONNECTION_INFO, &info);
+   // Ascending bit patterns denote newer SSL/TLS protocol versions.
+   // SP_PROT_TLS1_0_SERVER is not defined until VS2010.
+   return (info.dwProtocol < SP_PROT_TLS1_SERVER) ?
+     "peer does not support TLS 1.0 security" : NULL;
+ }
+ 
++>>>>>>> master
  static void ssl_encrypt(pn_ssl_t *ssl, char *app_data, size_t count)
  {
    // Get SChannel to encrypt exactly one Record.
@@@ -732,6 -741,10 +744,13 @@@ static void client_handshake( pn_ssl_t
        ssl_failed(ssl, "unexpected final server token");
        break;
      }
++<<<<<<< HEAD
++=======
+     if (const char *err = tls_version_check(ssl)) {
+       ssl_failed(ssl, err);
+       break;
+     }
++>>>>>>> master
      if (token_buffs[1].BufferType == SECBUFFER_EXTRA && token_buffs[1].cbBuffer > 0) {
        // This seems to work but not documented, plus logic differs from decrypt message
        // since the pvBuffer value is not set.  Grrr.
@@@ -904,7 -917,7 +923,11 @@@ static void app_inbytes_progress(pn_ssl
        assert(ssl->app_inbytes.size <= ib2.size);
        size_t consumed = ib2.size - ssl->app_inbytes.size;
        if (consumed > 0) {
++<<<<<<< HEAD
 +          memmove((void *)ib2.start, ib2.start + consumed, consumed);
++=======
+         memmove((void *)ib2.start, ib2.start + consumed, ssl->app_inbytes.size);
++>>>>>>> master
          pn_buffer_trim(ssl->inbuf2, 0, consumed);
        }
        if (!pn_buffer_available(ssl->inbuf2)) {


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


[35/50] [abbrv] qpid-proton git commit: added timestamp conversion for message properties, cleaned up conversion elsewhere

Posted by gs...@apache.org.
added timestamp conversion for message properties, cleaned up conversion elsewhere

git-svn-id: https://svn.apache.org/repos/asf/qpid/proton/trunk@1636938 13f79535-47bb-0310-9956-ffa450edef68


Project: http://git-wip-us.apache.org/repos/asf/qpid-proton/repo
Commit: http://git-wip-us.apache.org/repos/asf/qpid-proton/commit/1d28726e
Tree: http://git-wip-us.apache.org/repos/asf/qpid-proton/tree/1d28726e
Diff: http://git-wip-us.apache.org/repos/asf/qpid-proton/diff/1d28726e

Branch: refs/heads/examples
Commit: 1d28726e66c207a90b9d97bed2077b32c0ad6e80
Parents: 6e52724
Author: Rafael H. Schloming <rh...@apache.org>
Authored: Wed Nov 5 19:19:37 2014 +0000
Committer: Rafael H. Schloming <rh...@apache.org>
Committed: Wed Nov 5 19:19:37 2014 +0000

----------------------------------------------------------------------
 proton-c/bindings/python/proton.py | 45 ++++++++++++++++++---------------
 1 file changed, 24 insertions(+), 21 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/1d28726e/proton-c/bindings/python/proton.py
----------------------------------------------------------------------
diff --git a/proton-c/bindings/python/proton.py b/proton-c/bindings/python/proton.py
index 0ac79d4..00c36c0 100644
--- a/proton-c/bindings/python/proton.py
+++ b/proton-c/bindings/python/proton.py
@@ -343,13 +343,13 @@ will not be verified.
     if t == -1:
       return None
     else:
-      return float(t)/1000
+      return millis2secs(t)
 
   def _set_timeout(self, value):
     if value is None:
       t = -1
     else:
-      t = long(1000*value)
+      t = secs2millis(value)
     self._check(pn_messenger_set_timeout(self._mng, t))
 
   timeout = property(_get_timeout, _set_timeout,
@@ -565,7 +565,7 @@ first message.
     if timeout is None:
       t = -1
     else:
-      t = long(1000*timeout)
+      t = secs2millis(timeout)
     err = pn_messenger_work(self._mng, t)
     if (err == PN_TIMEOUT):
       return False
@@ -759,7 +759,7 @@ first message.
   def deadline(self):
     tstamp = pn_messenger_deadline(self._mng)
     if tstamp:
-      return float(tstamp)/1000
+      return millis2secs(tstamp)
     else:
       return None
 
@@ -902,15 +902,15 @@ The priority of the message.
 """)
 
   def _get_ttl(self):
-    return pn_message_get_ttl(self._msg)
+    return millis2secs(pn_message_get_ttl(self._msg))
 
   def _set_ttl(self, value):
-    self._check(pn_message_set_ttl(self._msg, value))
+    self._check(pn_message_set_ttl(self._msg, secs2millis(value)))
 
   ttl = property(_get_ttl, _set_ttl,
                  doc="""
-The time to live of the message measured in milliseconds. Expired
-messages may be dropped.
+The time to live of the message measured in seconds. Expired messages
+may be dropped.
 """)
 
   def _is_first_acquirer(self):
@@ -1028,10 +1028,10 @@ The content-encoding of the message.
 """)
 
   def _get_expiry_time(self):
-    return pn_message_get_expiry_time(self._msg)
+    return millis2secs(pn_message_get_expiry_time(self._msg))
 
   def _set_expiry_time(self, value):
-    self._check(pn_message_set_expiry_time(self._msg, value))
+    self._check(pn_message_set_expiry_time(self._msg, secs2millis(value)))
 
   expiry_time = property(_get_expiry_time, _set_expiry_time,
                          doc="""
@@ -1039,10 +1039,10 @@ The expiry time of the message.
 """)
 
   def _get_creation_time(self):
-    return pn_message_get_creation_time(self._msg)
+    return millis2secs(pn_message_get_creation_time(self._msg))
 
   def _set_creation_time(self, value):
-    self._check(pn_message_set_creation_time(self._msg, value))
+    self._check(pn_message_set_creation_time(self._msg, secs2millis(value)))
 
   creation_time = property(_get_creation_time, _set_creation_time,
                            doc="""
@@ -1177,7 +1177,7 @@ class Selectable(object):
     if not self._impl: raise ValueError("selectable freed")
     tstamp = pn_selectable_deadline(self._impl)
     if tstamp:
-      return float(tstamp)/1000
+      return millis2secs(tstamp)
     else:
       return None
 
@@ -2256,6 +2256,12 @@ def obj2dat(obj, dimpl):
     d = Data(dimpl)
     d.put_object(obj)
 
+def secs2millis(secs):
+  return long(secs*1000)
+
+def millis2secs(millis):
+  return float(millis)/1000.0
+
 class Connection(Endpoint):
 
   @staticmethod
@@ -3027,8 +3033,7 @@ class Transport(object):
     """Process any timed events (like heartbeat generation).
     now = seconds since epoch (float).
     """
-    next = pn_transport_tick(self._trans, long(now * 1000))
-    return float(next) / 1000.0
+    return millis2secs(pn_transport_tick(self._trans, secs2millis(now)))
 
   def capacity(self):
     c = pn_transport_capacity(self._trans)
@@ -3103,11 +3108,10 @@ Sets the maximum channel that may be used on the transport.
 
   # AMQP 1.0 idle-time-out
   def _get_idle_timeout(self):
-    msec = pn_transport_get_idle_timeout(self._trans)
-    return float(msec)/1000.0
+    return millis2secs(pn_transport_get_idle_timeout(self._trans))
 
   def _set_idle_timeout(self, sec):
-    pn_transport_set_idle_timeout(self._trans, long(sec * 1000))
+    pn_transport_set_idle_timeout(self._trans, secs2millis(sec))
 
   idle_timeout = property(_get_idle_timeout, _set_idle_timeout,
                           doc="""
@@ -3116,8 +3120,7 @@ The idle timeout of the connection (float, in seconds).
 
   @property
   def remote_idle_timeout(self):
-    msec = pn_transport_get_remote_idle_timeout(self._trans)
-    return float(msec)/1000.0
+    return millis2secs(pn_transport_get_remote_idle_timeout(self._trans))
 
   @property
   def frames_output(self):
@@ -3678,7 +3681,7 @@ class Driver(object):
     if timeout_sec is None or timeout_sec < 0.0:
       t = -1
     else:
-      t = long(1000*timeout_sec)
+      t = secs2millis(timeout_sec)
     return pn_driver_wait(self._driver, t)
 
   def wakeup(self):


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


[11/50] [abbrv] qpid-proton git commit: PROTON-711: add tests for the existing destination type annotation processing done by the transformers

Posted by gs...@apache.org.
PROTON-711: add tests for the existing destination type annotation processing done by the transformers

git-svn-id: https://svn.apache.org/repos/asf/qpid/proton/trunk@1631793 13f79535-47bb-0310-9956-ffa450edef68


Project: http://git-wip-us.apache.org/repos/asf/qpid-proton/repo
Commit: http://git-wip-us.apache.org/repos/asf/qpid-proton/commit/c87fc8a2
Tree: http://git-wip-us.apache.org/repos/asf/qpid-proton/tree/c87fc8a2
Diff: http://git-wip-us.apache.org/repos/asf/qpid-proton/diff/c87fc8a2

Branch: refs/heads/examples
Commit: c87fc8a2944ad8d68dec4e66c78768a071da35c0
Parents: 12c6d30
Author: Robert Gemmell <ro...@apache.org>
Authored: Tue Oct 14 15:33:15 2014 +0000
Committer: Robert Gemmell <ro...@apache.org>
Committed: Tue Oct 14 15:33:15 2014 +0000

----------------------------------------------------------------------
 .../jms/JMSMappingInboundTransformerTest.java   | 214 ++++++++++++++++++
 .../jms/JMSMappingOutboundTransformerTest.java  | 226 +++++++++++++++++++
 2 files changed, 440 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/c87fc8a2/contrib/proton-jms/src/test/java/org/apache/qpid/proton/jms/JMSMappingInboundTransformerTest.java
----------------------------------------------------------------------
diff --git a/contrib/proton-jms/src/test/java/org/apache/qpid/proton/jms/JMSMappingInboundTransformerTest.java b/contrib/proton-jms/src/test/java/org/apache/qpid/proton/jms/JMSMappingInboundTransformerTest.java
new file mode 100644
index 0000000..42a99ca
--- /dev/null
+++ b/contrib/proton-jms/src/test/java/org/apache/qpid/proton/jms/JMSMappingInboundTransformerTest.java
@@ -0,0 +1,214 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.qpid.proton.jms;
+
+import static org.junit.Assert.*;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.jms.Destination;
+import javax.jms.Queue;
+import javax.jms.TemporaryQueue;
+import javax.jms.TemporaryTopic;
+import javax.jms.TextMessage;
+import javax.jms.Topic;
+
+import org.apache.qpid.proton.amqp.Symbol;
+import org.apache.qpid.proton.amqp.messaging.AmqpValue;
+import org.apache.qpid.proton.amqp.messaging.MessageAnnotations;
+import org.apache.qpid.proton.message.Message;
+import org.junit.Test;
+import org.mockito.Mockito;
+
+public class JMSMappingInboundTransformerTest
+{
+    @Test
+    public void testTransformMessageWithAmqpValueStringCreatesTextMessage() throws Exception
+    {
+        TextMessage mockTextMessage = createMockTextMessage();
+        JMSVendor mockVendor = createMockVendor(mockTextMessage);
+        JMSMappingInboundTransformer transformer = new JMSMappingInboundTransformer(mockVendor);
+
+        String contentString = "myTextMessageContent";
+        Message amqp = Message.Factory.create();
+        amqp.setBody(new AmqpValue(contentString));
+
+        EncodedMessage em = encodeMessage(amqp);
+
+        javax.jms.Message jmsMessage = transformer.transform(em);
+
+        assertTrue("Expected TextMessage", jmsMessage instanceof TextMessage);
+        Mockito.verify(mockTextMessage).setText(contentString);
+        assertSame("Expected provided mock message, got a different one", mockTextMessage, jmsMessage);
+    }
+
+    // ======= JMSDestination Handling =========
+    // =========================================
+
+    @Test
+    public void testTransformWithNoToTypeDestinationTypeAnnotation() throws Exception
+    {
+        doTransformWithToTypeDestinationTypeAnnotationTestImpl(null, Destination.class);
+    }
+
+    @Test
+    public void testTransformWithQueueStringToTypeDestinationTypeAnnotation() throws Exception
+    {
+        doTransformWithToTypeDestinationTypeAnnotationTestImpl("queue", Queue.class);
+    }
+
+    @Test
+    public void testTransformWithTemporaryQueueStringToTypeDestinationTypeAnnotation() throws Exception
+    {
+        doTransformWithToTypeDestinationTypeAnnotationTestImpl("queue,temporary", TemporaryQueue.class);
+    }
+
+    @Test
+    public void testTransformWithTopicStringToTypeDestinationTypeAnnotation() throws Exception
+    {
+        doTransformWithToTypeDestinationTypeAnnotationTestImpl("topic", Topic.class);
+    }
+
+    @Test
+    public void testTransformWithTemporaryTopicStringToTypeDestinationTypeAnnotation() throws Exception
+    {
+        doTransformWithToTypeDestinationTypeAnnotationTestImpl("topic,temporary", TemporaryTopic.class);
+    }
+
+    private void doTransformWithToTypeDestinationTypeAnnotationTestImpl(Object toTypeAnnotationValue, Class<? extends Destination> expectedClass) throws Exception
+    {
+        TextMessage mockTextMessage = createMockTextMessage();
+        JMSVendor mockVendor = createMockVendor(mockTextMessage);
+        JMSMappingInboundTransformer transformer = new JMSMappingInboundTransformer(mockVendor);
+
+        String toAddress = "toAddress";
+        Message amqp = Message.Factory.create();
+        amqp.setBody(new AmqpValue("myTextMessageContent"));
+        amqp.setAddress(toAddress);
+        if(toTypeAnnotationValue != null)
+        {
+            Map<Symbol, Object> map = new HashMap<Symbol, Object>();
+            map.put(Symbol.valueOf("x-opt-to-type"), toTypeAnnotationValue);
+            MessageAnnotations ma = new MessageAnnotations(map);
+            amqp.setMessageAnnotations(ma);
+        }
+
+        EncodedMessage em = encodeMessage(amqp);
+
+        javax.jms.Message jmsMessage = transformer.transform(em);
+        assertTrue("Expected TextMessage", jmsMessage instanceof TextMessage);
+
+        // Verify that createDestination was called with the provided 'to' address and 'Destination' class
+        Mockito.verify(mockVendor).createDestination(toAddress, expectedClass);
+    }
+
+    // ======= JMSReplyTo Handling =========
+    // =====================================
+
+    @Test
+    public void testTransformWithNoReplyToTypeDestinationTypeAnnotation() throws Exception
+    {
+        doTransformWithReplyToTypeDestinationTypeAnnotationTestImpl(null,Destination.class);
+    }
+
+    @Test
+    public void testTransformWithQueueStringReplyToTypeDestinationTypeAnnotation() throws Exception
+    {
+        doTransformWithReplyToTypeDestinationTypeAnnotationTestImpl("queue", Queue.class);
+    }
+
+    @Test
+    public void testTransformWithTemporaryQueueStringReplyToTypeDestinationTypeAnnotation() throws Exception
+    {
+        doTransformWithReplyToTypeDestinationTypeAnnotationTestImpl("queue,temporary", TemporaryQueue.class);
+    }
+
+    @Test
+    public void testTransformWithTopicStringReplyToTypeDestinationTypeAnnotation() throws Exception
+    {
+        doTransformWithReplyToTypeDestinationTypeAnnotationTestImpl("topic", Topic.class);
+    }
+
+    @Test
+    public void testTransformWithTemporaryTopicStringReplyToTypeDestinationTypeAnnotation() throws Exception
+    {
+        doTransformWithReplyToTypeDestinationTypeAnnotationTestImpl("topic,temporary", TemporaryTopic.class);
+    }
+
+    private void doTransformWithReplyToTypeDestinationTypeAnnotationTestImpl(Object replyToTypeAnnotationValue, Class<? extends Destination> expectedClass) throws Exception
+    {
+        TextMessage mockTextMessage = createMockTextMessage();
+        JMSVendor mockVendor = createMockVendor(mockTextMessage);
+        JMSMappingInboundTransformer transformer = new JMSMappingInboundTransformer(mockVendor);
+
+        String replyToAddress = "replyToAddress";
+        Message amqp = Message.Factory.create();
+        amqp.setBody(new AmqpValue("myTextMessageContent"));
+        amqp.setReplyTo(replyToAddress);
+        if(replyToTypeAnnotationValue != null)
+        {
+            Map<Symbol, Object> map = new HashMap<Symbol, Object>();
+            map.put(Symbol.valueOf("x-opt-reply-type"), replyToTypeAnnotationValue);
+            MessageAnnotations ma = new MessageAnnotations(map);
+            amqp.setMessageAnnotations(ma);
+        }
+
+        EncodedMessage em = encodeMessage(amqp);
+
+        javax.jms.Message jmsMessage = transformer.transform(em);
+        assertTrue("Expected TextMessage", jmsMessage instanceof TextMessage);
+
+        // Verify that createDestination was called with the provided 'replyTo' address and 'Destination' class
+        Mockito.verify(mockVendor).createDestination(replyToAddress,expectedClass);
+    }
+
+    // ======= Utility Methods =========
+    // =================================
+
+    private TextMessage createMockTextMessage()
+    {
+        TextMessage mockTextMessage = Mockito.mock(TextMessage.class);
+
+        return mockTextMessage;
+    }
+
+    private JMSVendor createMockVendor(TextMessage mockTextMessage)
+    {
+        JMSVendor mockVendor = Mockito.mock(JMSVendor.class);
+        Mockito.when(mockVendor.createTextMessage()).thenReturn(mockTextMessage);
+
+        return mockVendor;
+    }
+
+    private EncodedMessage encodeMessage(Message message)
+    {
+        byte[] encodeBuffer = new byte[1024 * 8];
+        int encodedSize;
+        while (true) {
+            try {
+                encodedSize = message.encode(encodeBuffer, 0, encodeBuffer.length);
+                break;
+            } catch (java.nio.BufferOverflowException e) {
+                encodeBuffer = new byte[encodeBuffer.length * 2];
+            }
+        }
+
+        long messageFormat = 0;
+        return new EncodedMessage(messageFormat, encodeBuffer, 0, encodedSize);
+    }
+}

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/c87fc8a2/contrib/proton-jms/src/test/java/org/apache/qpid/proton/jms/JMSMappingOutboundTransformerTest.java
----------------------------------------------------------------------
diff --git a/contrib/proton-jms/src/test/java/org/apache/qpid/proton/jms/JMSMappingOutboundTransformerTest.java b/contrib/proton-jms/src/test/java/org/apache/qpid/proton/jms/JMSMappingOutboundTransformerTest.java
new file mode 100644
index 0000000..1b14627
--- /dev/null
+++ b/contrib/proton-jms/src/test/java/org/apache/qpid/proton/jms/JMSMappingOutboundTransformerTest.java
@@ -0,0 +1,226 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.qpid.proton.jms;
+
+import static org.junit.Assert.*;
+
+import java.util.Collections;
+import java.util.Map;
+
+import javax.jms.Destination;
+import javax.jms.Queue;
+import javax.jms.TemporaryQueue;
+import javax.jms.TemporaryTopic;
+import javax.jms.TextMessage;
+import javax.jms.Topic;
+
+import org.apache.qpid.proton.amqp.Symbol;
+import org.apache.qpid.proton.amqp.messaging.AmqpValue;
+import org.apache.qpid.proton.amqp.messaging.MessageAnnotations;
+import org.apache.qpid.proton.message.Message;
+import org.junit.Test;
+import org.mockito.Mockito;
+
+public class JMSMappingOutboundTransformerTest
+{
+    @Test
+    public void testConvertMessageWithTextMessageCreatesAmqpValueStringBody() throws Exception
+    {
+        String contentString = "myTextMessageContent";
+        TextMessage mockTextMessage = createMockTextMessage();
+        Mockito.when(mockTextMessage.getText()).thenReturn(contentString);
+        JMSVendor mockVendor = createMockVendor();
+
+        JMSMappingOutboundTransformer transformer = new JMSMappingOutboundTransformer(mockVendor);
+
+        Message amqp = transformer.convert(mockTextMessage);
+
+        assertNotNull(amqp.getBody());
+        assertTrue(amqp.getBody() instanceof AmqpValue);
+        assertEquals(contentString, ((AmqpValue) amqp.getBody()).getValue());
+    }
+
+    // ======= JMSDestination Handling =========
+    // =========================================
+
+    @Test
+    public void testConvertMessageWithJMSDestinationNull() throws Exception
+    {
+        doTestConvertMessageWithJMSDestination(null, null);
+    }
+
+    @Test
+    public void testConvertMessageWithJMSDestinationQueue() throws Exception
+    {
+        Queue mockDest = Mockito.mock(Queue.class);
+
+        doTestConvertMessageWithJMSDestination(mockDest, "queue");
+    }
+
+    @Test
+    public void testConvertMessageWithJMSDestinationTemporaryQueue() throws Exception
+    {
+        TemporaryQueue mockDest = Mockito.mock(TemporaryQueue.class);
+
+        doTestConvertMessageWithJMSDestination(mockDest, "temporary,queue");
+    }
+
+    @Test
+    public void testConvertMessageWithJMSDestinationTopic() throws Exception
+    {
+        Topic mockDest = Mockito.mock(Topic.class);
+
+        doTestConvertMessageWithJMSDestination(mockDest, "topic");
+    }
+
+    @Test
+    public void testConvertMessageWithJMSDestinationTemporaryTopic() throws Exception
+    {
+        TemporaryTopic mockDest = Mockito.mock(TemporaryTopic.class);
+
+        doTestConvertMessageWithJMSDestination(mockDest, "temporary,topic");
+    }
+
+    private void doTestConvertMessageWithJMSDestination(Destination jmsDestination, Object expectedAnnotationValue) throws Exception
+    {
+        TextMessage mockTextMessage = createMockTextMessage();
+        Mockito.when(mockTextMessage.getText()).thenReturn("myTextMessageContent");
+        Mockito.when(mockTextMessage.getJMSDestination()).thenReturn(jmsDestination);
+        JMSVendor mockVendor = createMockVendor();
+        String toAddress = "someToAddress";
+        if(jmsDestination != null)
+        {
+            Mockito.when(mockVendor.toAddress(Mockito.any(Destination.class)))
+                    .thenReturn(toAddress);
+        }
+
+        JMSMappingOutboundTransformer transformer = new JMSMappingOutboundTransformer(mockVendor);
+
+        Message amqp = transformer.convert(mockTextMessage);
+
+        MessageAnnotations ma = amqp.getMessageAnnotations();
+        Map<Symbol, Object> maMap = ma == null ? null : ma.getValue();
+        if(maMap != null)
+        {
+            Object actualValue = maMap.get(Symbol.valueOf("x-opt-to-type"));
+            assertEquals("Unexpected annotation value", expectedAnnotationValue, actualValue);
+        }
+        else if (expectedAnnotationValue != null)
+        {
+            fail("Expected annotation value, but there were no annotations");
+        }
+
+        if(jmsDestination != null)
+        {
+            assertEquals("Unexpected 'to' address", toAddress, amqp.getAddress());
+        }
+    }
+
+    // ======= JMSReplyTo Handling =========
+    // =====================================
+
+    @Test
+    public void testConvertMessageWithJMSReplyToNull() throws Exception
+    {
+        doTestConvertMessageWithJMSReplyTo(null, null);
+    }
+
+    @Test
+    public void testConvertMessageWithJMSReplyToQueue() throws Exception
+    {
+        Queue mockDest = Mockito.mock(Queue.class);
+
+        doTestConvertMessageWithJMSReplyTo(mockDest, "queue");
+    }
+
+    @Test
+    public void testConvertMessageWithJMSReplyToTemporaryQueue() throws Exception
+    {
+        TemporaryQueue mockDest = Mockito.mock(TemporaryQueue.class);
+
+        doTestConvertMessageWithJMSReplyTo(mockDest, "temporary,queue");
+    }
+
+    @Test
+    public void testConvertMessageWithJMSReplyToTopic() throws Exception
+    {
+        Topic mockDest = Mockito.mock(Topic.class);
+
+        doTestConvertMessageWithJMSReplyTo(mockDest, "topic");
+    }
+
+    @Test
+    public void testConvertMessageWithJMSReplyToTemporaryTopic() throws Exception
+    {
+        TemporaryTopic mockDest = Mockito.mock(TemporaryTopic.class);
+
+        doTestConvertMessageWithJMSReplyTo(mockDest, "temporary,topic");
+    }
+
+    private void doTestConvertMessageWithJMSReplyTo(Destination jmsReplyTo, Object expectedAnnotationValue) throws Exception
+    {
+        TextMessage mockTextMessage = createMockTextMessage();
+        Mockito.when(mockTextMessage.getText()).thenReturn("myTextMessageContent");
+        Mockito.when(mockTextMessage.getJMSReplyTo()).thenReturn(jmsReplyTo);
+        JMSVendor mockVendor = createMockVendor();
+        String replyToAddress = "someReplyToAddress";
+        if(jmsReplyTo != null)
+        {
+            Mockito.when(mockVendor.toAddress(Mockito.any(Destination.class)))
+                    .thenReturn(replyToAddress);
+        }
+
+        JMSMappingOutboundTransformer transformer = new JMSMappingOutboundTransformer(mockVendor);
+
+        Message amqp = transformer.convert(mockTextMessage);
+
+        MessageAnnotations ma = amqp.getMessageAnnotations();
+        Map<Symbol, Object> maMap = ma == null ? null : ma.getValue();
+        if(maMap != null)
+        {
+            Object actualValue = maMap.get(Symbol.valueOf("x-opt-reply-type"));
+            assertEquals("Unexpected annotation value", expectedAnnotationValue, actualValue);
+        }
+        else if (expectedAnnotationValue != null)
+        {
+            fail("Expected annotation value, but there were no annotations");
+        }
+
+        if(jmsReplyTo != null)
+        {
+            assertEquals("Unexpected 'reply-to' address", replyToAddress, amqp.getReplyTo());
+        }
+    }
+
+    // ======= Utility Methods =========
+    // =================================
+
+    private TextMessage createMockTextMessage() throws Exception
+    {
+        TextMessage mockTextMessage = Mockito.mock(TextMessage.class);
+        Mockito.when(mockTextMessage.getPropertyNames()).thenReturn(Collections.emptyEnumeration());
+
+        return mockTextMessage;
+    }
+
+    private JMSVendor createMockVendor()
+    {
+        JMSVendor mockVendor = Mockito.mock(JMSVendor.class);
+
+        return mockVendor;
+    }
+}


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


[29/50] [abbrv] qpid-proton git commit: PROTON-728: don't try to settle the delivery, just abort the connection

Posted by gs...@apache.org.
PROTON-728: don't try to settle the delivery, just abort the connection

git-svn-id: https://svn.apache.org/repos/asf/qpid/proton/trunk@1634115 13f79535-47bb-0310-9956-ffa450edef68


Project: http://git-wip-us.apache.org/repos/asf/qpid-proton/repo
Commit: http://git-wip-us.apache.org/repos/asf/qpid-proton/commit/f139ae64
Tree: http://git-wip-us.apache.org/repos/asf/qpid-proton/tree/f139ae64
Diff: http://git-wip-us.apache.org/repos/asf/qpid-proton/diff/f139ae64

Branch: refs/heads/examples
Commit: f139ae643b22b53b3fe5dc135338de820b99d087
Parents: d16ab03
Author: Rafael H. Schloming <rh...@apache.org>
Authored: Fri Oct 24 18:21:35 2014 +0000
Committer: Rafael H. Schloming <rh...@apache.org>
Committed: Fri Oct 24 18:21:35 2014 +0000

----------------------------------------------------------------------
 proton-c/src/transport/transport.c | 9 +++------
 1 file changed, 3 insertions(+), 6 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/f139ae64/proton-c/src/transport/transport.c
----------------------------------------------------------------------
diff --git a/proton-c/src/transport/transport.c b/proton-c/src/transport/transport.c
index 4b85c54..f37e636 100644
--- a/proton-c/src/transport/transport.c
+++ b/proton-c/src/transport/transport.c
@@ -779,12 +779,9 @@ int pn_do_transfer(pn_dispatcher_t *disp)
     delivery = pn_delivery(link, pn_dtag(tag.start, tag.size));
     pn_delivery_state_t *state = pn_delivery_map_push(incoming, delivery);
     if (id_present && id != state->id) {
-      int err = pn_do_error(transport, "amqp:session:invalid-field",
-                            "sequencing error, expected delivery-id %u, got %u",
-                            state->id, id);
-      // XXX: this will probably leave delivery buffer state messed up
-      pn_full_settle(incoming, delivery);
-      return err;
+      return pn_do_error(transport, "amqp:session:invalid-field",
+                         "sequencing error, expected delivery-id %u, got %u",
+                         state->id, id);
     }
 
     link->state.delivery_count++;


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


[42/50] [abbrv] qpid-proton git commit: PROTON-736: Created the UTFString and BinaryString classes for Ruby.

Posted by gs...@apache.org.
PROTON-736: Created the UTFString and BinaryString classes for Ruby.

This allows users to explictly call out that a string is either UTF-8 or
a binary string.

For the UTFString type, it validates that the content provided is
actually UTF-8 and raises a RuntimeError if it's not.

Results returned from a Message object are wrapped in the appropriate
class.

This solution is Ruby 1.8, 1.9 and 2.0 compatible.


Project: http://git-wip-us.apache.org/repos/asf/qpid-proton/repo
Commit: http://git-wip-us.apache.org/repos/asf/qpid-proton/commit/6371e9eb
Tree: http://git-wip-us.apache.org/repos/asf/qpid-proton/tree/6371e9eb
Diff: http://git-wip-us.apache.org/repos/asf/qpid-proton/diff/6371e9eb

Branch: refs/heads/examples
Commit: 6371e9eba3b82a4927bcfb06919d4b3ea419a8d8
Parents: bdeaf34
Author: Darryl L. Pierce <mc...@gmail.com>
Authored: Mon Nov 10 09:30:47 2014 -0500
Committer: Darryl L. Pierce <mc...@gmail.com>
Committed: Mon Nov 10 11:20:15 2014 -0500

----------------------------------------------------------------------
 proton-c/bindings/ruby/lib/qpid_proton.rb       |  1 +
 proton-c/bindings/ruby/lib/qpid_proton/data.rb  |  4 +-
 .../bindings/ruby/lib/qpid_proton/mapping.rb    | 22 +------
 .../bindings/ruby/lib/qpid_proton/strings.rb    | 69 ++++++++++++++++++++
 4 files changed, 75 insertions(+), 21 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/6371e9eb/proton-c/bindings/ruby/lib/qpid_proton.rb
----------------------------------------------------------------------
diff --git a/proton-c/bindings/ruby/lib/qpid_proton.rb b/proton-c/bindings/ruby/lib/qpid_proton.rb
index e28c684..4da4e11 100644
--- a/proton-c/bindings/ruby/lib/qpid_proton.rb
+++ b/proton-c/bindings/ruby/lib/qpid_proton.rb
@@ -22,6 +22,7 @@ require "date"
 
 require "qpid_proton/version"
 require "qpid_proton/described"
+require "qpid_proton/strings"
 require "qpid_proton/mapping"
 require "qpid_proton/array"
 require "qpid_proton/hash"

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/6371e9eb/proton-c/bindings/ruby/lib/qpid_proton/data.rb
----------------------------------------------------------------------
diff --git a/proton-c/bindings/ruby/lib/qpid_proton/data.rb b/proton-c/bindings/ruby/lib/qpid_proton/data.rb
index 9644fb4..1e515c8 100644
--- a/proton-c/bindings/ruby/lib/qpid_proton/data.rb
+++ b/proton-c/bindings/ruby/lib/qpid_proton/data.rb
@@ -725,7 +725,7 @@ module Qpid
       # If the current node is binary, returns its value. Otherwise, it returns
       # an empty string ("").
       def binary
-        Cproton.pn_data_get_binary(@data)
+        Qpid::Proton::BinaryString.new(Cproton.pn_data_get_binary(@data))
       end
 
       # Puts a unicode string value.
@@ -742,7 +742,7 @@ module Qpid
       # If the current node is a string, returns its value. Otherwise, it
       # returns an empty string ("").
       def string
-        Cproton.pn_data_get_string(@data)
+        Qpid::Proton::UTFString.new(Cproton.pn_data_get_string(@data))
       end
 
       # Puts a symbolic value.

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/6371e9eb/proton-c/bindings/ruby/lib/qpid_proton/mapping.rb
----------------------------------------------------------------------
diff --git a/proton-c/bindings/ruby/lib/qpid_proton/mapping.rb b/proton-c/bindings/ruby/lib/qpid_proton/mapping.rb
index 841156c..e7e3322 100644
--- a/proton-c/bindings/ruby/lib/qpid_proton/mapping.rb
+++ b/proton-c/bindings/ruby/lib/qpid_proton/mapping.rb
@@ -110,26 +110,10 @@ module Qpid # :nodoc:
 
     class << STRING
       def put(data, value)
-        # In Ruby 1.9+ we have encoding methods that can check the content of
-        # the string, so use them to see if what we have is unicode. If so,
-        # good! If not, then just treat is as binary.
-        #
-        # No such thing in Ruby 1.8. So there we need to use Iconv to try and
-        # convert it to unicode. If it works, good! But if it raises an
-        # exception then we'll treat it as binary.
-        if RUBY_VERSION >= "1.9"
-          if value.encoding == "UTF-8" || value.force_encoding("UTF-8").valid_encoding?
-            data.string = value.to_s
-          else
-            data.binary = value.to_s
-          end
+        if value.is_a?(Qpid::Proton::UTFString) || Qpid::Proton.is_valid_utf?(value)
+          data.string = value.to_s
         else
-          begin
-            newval = Iconv.new("UTF8//TRANSLIT//IGNORE", "UTF8").iconv(value.to_s)
-            data.string = newval
-          rescue
-            data.binary = value
-          end
+          data.binary = value.to_s
         end
       end
     end

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/6371e9eb/proton-c/bindings/ruby/lib/qpid_proton/strings.rb
----------------------------------------------------------------------
diff --git a/proton-c/bindings/ruby/lib/qpid_proton/strings.rb b/proton-c/bindings/ruby/lib/qpid_proton/strings.rb
new file mode 100644
index 0000000..dad96ad
--- /dev/null
+++ b/proton-c/bindings/ruby/lib/qpid_proton/strings.rb
@@ -0,0 +1,69 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+
+module Qpid # :nodoc:
+
+  module Proton # :nodoc:
+
+    def self.is_valid_utf?(value)
+      # In Ruby 1.9+ we have encoding methods that can check the content of
+      # the string, so use them to see if what we have is unicode. If so,
+      # good! If not, then just treat is as binary.
+      #
+      # No such thing in Ruby 1.8. So there we need to use Iconv to try and
+      # convert it to unicode. If it works, good! But if it raises an
+      # exception then we'll treat it as binary.
+      if RUBY_VERSION >= "1.9"
+        return true if (value.encoding == "UTF-8" ||
+                        value.force_encoding("UTF-8").valid_encoding?)
+
+        return false
+      else
+        begin
+          newval = Iconv.new("UTF8//TRANSLIT//IGNORE", "UTF8").iconv(value.to_s)
+          return true
+        rescue
+          return false
+        end
+      end
+    end
+
+    # UTFString lets an application explicitly state that a
+    # string of characters is to be UTF-8 encoded.
+    #
+    class UTFString < ::String
+
+      def initialize(value)
+        if !Qpid::Proton.is_valid_utf?(value)
+          raise RuntimeError.new("invalid UTF string")
+        end
+
+        super(value)
+      end
+
+    end
+
+    # BinaryString lets an application explicitly declare that
+    # a string value represents arbitrary data.
+    #
+    class BinaryString < ::String; end
+
+  end
+
+end


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


[40/50] [abbrv] qpid-proton git commit: exclude pn_transport_vlogf from swig

Posted by gs...@apache.org.
exclude pn_transport_vlogf from swig


Project: http://git-wip-us.apache.org/repos/asf/qpid-proton/repo
Commit: http://git-wip-us.apache.org/repos/asf/qpid-proton/commit/89cbc9ce
Tree: http://git-wip-us.apache.org/repos/asf/qpid-proton/tree/89cbc9ce
Diff: http://git-wip-us.apache.org/repos/asf/qpid-proton/diff/89cbc9ce

Branch: refs/heads/examples
Commit: 89cbc9cec27504f6a6af6d7f6184a52a786ca3f4
Parents: a5d6545
Author: Rafael Schloming <rh...@alum.mit.edu>
Authored: Sat Nov 8 08:44:12 2014 -0500
Committer: Rafael Schloming <rh...@alum.mit.edu>
Committed: Sat Nov 8 08:44:12 2014 -0500

----------------------------------------------------------------------
 proton-c/include/proton/cproton.i | 1 +
 1 file changed, 1 insertion(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/89cbc9ce/proton-c/include/proton/cproton.i
----------------------------------------------------------------------
diff --git a/proton-c/include/proton/cproton.i b/proton-c/include/proton/cproton.i
index 55f2237..dd35c0a 100644
--- a/proton-c/include/proton/cproton.i
+++ b/proton-c/include/proton/cproton.i
@@ -618,6 +618,7 @@ typedef unsigned long int uintptr_t;
 %include "proton/terminus.h"
 %include "proton/delivery.h"
 %include "proton/disposition.h"
+%ignore pn_transport_vlogf;
 %include "proton/transport.h"
 %include "proton/event.h"
 


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


[04/50] [abbrv] qpid-proton git commit: added missing doxygen for new transport events

Posted by gs...@apache.org.
added missing doxygen for new transport events

git-svn-id: https://svn.apache.org/repos/asf/qpid/proton/trunk@1628669 13f79535-47bb-0310-9956-ffa450edef68


Project: http://git-wip-us.apache.org/repos/asf/qpid-proton/repo
Commit: http://git-wip-us.apache.org/repos/asf/qpid-proton/commit/ebdf51e4
Tree: http://git-wip-us.apache.org/repos/asf/qpid-proton/tree/ebdf51e4
Diff: http://git-wip-us.apache.org/repos/asf/qpid-proton/diff/ebdf51e4

Branch: refs/heads/examples
Commit: ebdf51e41467a5d2a3e1a1615393bec395b00f15
Parents: 53b034c
Author: Rafael H. Schloming <rh...@apache.org>
Authored: Wed Oct 1 10:13:46 2014 +0000
Committer: Rafael H. Schloming <rh...@apache.org>
Committed: Wed Oct 1 10:13:46 2014 +0000

----------------------------------------------------------------------
 proton-c/include/proton/event.h | 19 +++++++++++++++++++
 1 file changed, 19 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/ebdf51e4/proton-c/include/proton/event.h
----------------------------------------------------------------------
diff --git a/proton-c/include/proton/event.h b/proton-c/include/proton/event.h
index 7473132..97095c6 100644
--- a/proton-c/include/proton/event.h
+++ b/proton-c/include/proton/event.h
@@ -238,12 +238,31 @@ typedef enum {
    */
   PN_TRANSPORT,
 
+  /**
+   * Indicates that a transport error has occurred. Use
+   * ::pn_transport_condition() to access the details of the error
+   * from the associated transport.
+   */
   PN_TRANSPORT_ERROR,
 
+  /**
+   * Indicates that the head of the transport has been closed. This
+   * means the transport will never produce more bytes for output to
+   * the network. Events of this type point to the relevant transport.
+   */
   PN_TRANSPORT_HEAD_CLOSED,
 
+  /**
+   * Indicates that the tail of the transport has been closed. This
+   * means the transport will never be able to process more bytes from
+   * the network. Events of this type point to the relevant transport.
+   */
   PN_TRANSPORT_TAIL_CLOSED,
 
+  /**
+   * Indicates that the both the head and tail of the transport are
+   * closed. Events of this type point to the relevant transport.
+   */
   PN_TRANSPORT_CLOSED
 
 } pn_event_type_t;


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


[48/50] [abbrv] qpid-proton git commit: Some updates to tutorial text

Posted by gs...@apache.org.
Some updates to tutorial text


Project: http://git-wip-us.apache.org/repos/asf/qpid-proton/repo
Commit: http://git-wip-us.apache.org/repos/asf/qpid-proton/commit/0c822c6d
Tree: http://git-wip-us.apache.org/repos/asf/qpid-proton/tree/0c822c6d
Diff: http://git-wip-us.apache.org/repos/asf/qpid-proton/diff/0c822c6d

Branch: refs/heads/examples
Commit: 0c822c6d3d077be84d84e48b95d46b74ba2e6112
Parents: a55a53d
Author: Gordon Sim <gs...@redhat.com>
Authored: Fri Nov 14 09:23:48 2014 +0000
Committer: Gordon Sim <gs...@redhat.com>
Committed: Fri Nov 14 09:23:48 2014 +0000

----------------------------------------------------------------------
 tutorial/_build/doctrees/environment.pickle | Bin 4868 -> 4949 bytes
 tutorial/_build/doctrees/index.doctree      | Bin 3516 -> 3508 bytes
 tutorial/_build/doctrees/tutorial.doctree   | Bin 46400 -> 33559 bytes
 tutorial/_build/html/.buildinfo             |   2 +-
 tutorial/_build/html/_sources/tutorial.txt  |  98 ++---
 tutorial/_build/html/_static/default.css    | 256 +++++++++++
 tutorial/_build/html/_static/sidebar.js     | 151 +++++++
 tutorial/_build/html/genindex.html          |  56 +--
 tutorial/_build/html/index.html             |  66 +--
 tutorial/_build/html/objects.inv            | Bin 202 -> 202 bytes
 tutorial/_build/html/search.html            |  56 +--
 tutorial/_build/html/searchindex.js         |   2 +-
 tutorial/_build/html/tutorial.html          | 524 +++++++----------------
 tutorial/conf.py                            |   8 +-
 tutorial/helloworld.py                      |   7 +-
 tutorial/tutorial.rst                       |  98 ++---
 16 files changed, 733 insertions(+), 591 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/0c822c6d/tutorial/_build/doctrees/environment.pickle
----------------------------------------------------------------------
diff --git a/tutorial/_build/doctrees/environment.pickle b/tutorial/_build/doctrees/environment.pickle
index 7abf93c..2d7a398 100644
Binary files a/tutorial/_build/doctrees/environment.pickle and b/tutorial/_build/doctrees/environment.pickle differ

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/0c822c6d/tutorial/_build/doctrees/index.doctree
----------------------------------------------------------------------
diff --git a/tutorial/_build/doctrees/index.doctree b/tutorial/_build/doctrees/index.doctree
index e4ec403..de2c704 100644
Binary files a/tutorial/_build/doctrees/index.doctree and b/tutorial/_build/doctrees/index.doctree differ

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/0c822c6d/tutorial/_build/doctrees/tutorial.doctree
----------------------------------------------------------------------
diff --git a/tutorial/_build/doctrees/tutorial.doctree b/tutorial/_build/doctrees/tutorial.doctree
index fcd4d81..a093651 100644
Binary files a/tutorial/_build/doctrees/tutorial.doctree and b/tutorial/_build/doctrees/tutorial.doctree differ

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/0c822c6d/tutorial/_build/html/.buildinfo
----------------------------------------------------------------------
diff --git a/tutorial/_build/html/.buildinfo b/tutorial/_build/html/.buildinfo
index ba11589..eed68be 100644
--- a/tutorial/_build/html/.buildinfo
+++ b/tutorial/_build/html/.buildinfo
@@ -1,4 +1,4 @@
 # Sphinx build info version 1
 # This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done.
-config: c06a81077f28195f54475c7e611de571
+config: 2657ccbc7cab07e4ab00891ea70f9dd0
 tags: fbb0d17656682115ca4d033fb2f83ba1

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/0c822c6d/tutorial/_build/html/_sources/tutorial.txt
----------------------------------------------------------------------
diff --git a/tutorial/_build/html/_sources/tutorial.txt b/tutorial/_build/html/_sources/tutorial.txt
index 62aeadc..89eb563 100644
--- a/tutorial/_build/html/_sources/tutorial.txt
+++ b/tutorial/_build/html/_sources/tutorial.txt
@@ -11,66 +11,44 @@ sending and receiving a single message.
    :lines: 21-
    :linenos:
 
-You can see the import of ``EventLoop`` from ``proton_events`` on the
-second line. This is a helper class that makes programming with proton
-a little easier for the common cases. It includes within it an event
-loop, and programs written using this utility are generally structured
-to react to various events. This reactive style is particularly suited
-to messaging applications.
-
-To be notified of a particular event, you define a class with the
-appropriately name method on it. That method is then called by the
-event loop when the event occurs.
-
-The first class we define, ``HelloWorldReceiver``, handles the event
-where a message is received and so implements a ``on_message()``
-method. Within that we simply print the body of the message (line 6)
-and then close the connection (line 7).
-
-The second class, ``HelloWorldSender``, handles the event where the
-flow of messages is enabled over our sending link by implementing a
-``on_link_flow()`` method and sending the message within that. Doing
-this ensures that we only send when the recipient is ready and able to
-receive the message. This is particularly important when the volume of
-messages might be large. In our case we are just going to send one
-message, which we do on line 11, so we can then just close the sending
-link on line 12.
-
-The ``HelloWorld`` class ties everything together. It's constructor
-takes the instance of the event loop to use, a url to connect to, and
-an address through which the message will be sent. To run the example
-you will need to have a broker (or similar) accepting connections on
-that url either with a queue (or topic) matching the given address or
-else configured to create such a queue (or topic) dynamically.
-
-On line 17 we request that a connection be made to the process this
-url refers to by calling ``connect()`` on the ``EventLoop``. This call
-returns a ``MessagingContext`` object through which we can create
-objects for sending and receiving messages to the process it is
-connected to. However we will delay doing that until our connection is
-fully established, i.e. until the remote peer 'opens' the connection
-(the open here is the 'handshake' for establishing an operational AMQP
-connection).
-
-To be notified of this we pass a reference to self as the handler in
-``connect()`` and define an ``on_connection_remote_open()`` method
-within which we can create our receiver using the connection context
-we obtained from the earlier ``connect()`` call, and passing the
-handler implementation defined by ``HelloWorldReceiver``. When the
-remote peer confirms the establishment of that receiver we get a
-callback on ``on_link_remote_open()`` and that is where we then create
-our sender, passing it the ``HelloWorldSender`` handler. Delaying the
-creation of the sender until the receiver is established avoids losing
-messages even when these are not queued up by the remote peer.
-
-We'll add definitions to ``HelloWorld`` of ``on_link_remote_close()``
-and ``on_connection_remote_close()`` also, so that we can be notified
-if the broker we are connected to closes either link or the connection
-for any reason.
-
-Finally we actually enter the event loop, to handle all the necessary
-IO and make all the necessary event callbacks, by calling ``run()`` on
-it.
+This example uses proton in an event-driven or reactive manner. The
+flow of control is an 'event loop', where the events may be triggered
+by data arriving on a socket among other things and are then passed to
+relevant 'handlers'. Applications are then structured as a set of
+defined handlers for events of interest; to be notified of a
+particular event, you define a class with an appropriately name method
+on it, inform the event loop of that method which then calls it
+whenever the event occurs.
+
+The class we define in this example, ``HelloWorld``, has methods to
+handle three types of events.
+
+The first, ``on_connection_opened()``, is called when the connection
+is opened, and when that occurs we create a receiver over which to
+receive our message and a sender over which to send it.
+
+The second method, ``on_credit()``, is called when our sender has been
+issued by the peer with 'credit', allowing it to send messages. A
+credit based flow control mechanism like this ensures we only send
+messages when the recipient is ready and able to receive them. This is
+particularly important when the volume of messages might be large. In
+our case we are just going to send one message.
+
+The third and final method, ``on_message()``, is called when a message
+arrives. Within that method we simply print the body of the message
+and then close the connection.
+
+This particular example assumes a broker (or similar service), which
+accepts connections and routes published messages to intended
+recipients. The constructor for the ``HelloWorld`` class takes the
+details of the broker to connect to, and the address through which the
+message is sent and received (for a broker this corresponds to a queue
+or topic name).
+
+After an instance of ``HelloWorld`` is constructed, the event loop is
+entered by the call to the ``run()`` method on the last line. This
+call will return only when the loop determines there are no more
+events possible (at which point our example program will then exit).
 
 ====================
 Hello World, Direct!

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/0c822c6d/tutorial/_build/html/_static/default.css
----------------------------------------------------------------------
diff --git a/tutorial/_build/html/_static/default.css b/tutorial/_build/html/_static/default.css
new file mode 100644
index 0000000..21f3f50
--- /dev/null
+++ b/tutorial/_build/html/_static/default.css
@@ -0,0 +1,256 @@
+/*
+ * default.css_t
+ * ~~~~~~~~~~~~~
+ *
+ * Sphinx stylesheet -- default theme.
+ *
+ * :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS.
+ * :license: BSD, see LICENSE for details.
+ *
+ */
+
+@import url("basic.css");
+
+/* -- page layout ----------------------------------------------------------- */
+
+body {
+    font-family: sans-serif;
+    font-size: 100%;
+    background-color: #11303d;
+    color: #000;
+    margin: 0;
+    padding: 0;
+}
+
+div.document {
+    background-color: #1c4e63;
+}
+
+div.documentwrapper {
+    float: left;
+    width: 100%;
+}
+
+div.bodywrapper {
+    margin: 0 0 0 230px;
+}
+
+div.body {
+    background-color: #ffffff;
+    color: #000000;
+    padding: 0 20px 30px 20px;
+}
+
+div.footer {
+    color: #ffffff;
+    width: 100%;
+    padding: 9px 0 9px 0;
+    text-align: center;
+    font-size: 75%;
+}
+
+div.footer a {
+    color: #ffffff;
+    text-decoration: underline;
+}
+
+div.related {
+    background-color: #133f52;
+    line-height: 30px;
+    color: #ffffff;
+}
+
+div.related a {
+    color: #ffffff;
+}
+
+div.sphinxsidebar {
+}
+
+div.sphinxsidebar h3 {
+    font-family: 'Trebuchet MS', sans-serif;
+    color: #ffffff;
+    font-size: 1.4em;
+    font-weight: normal;
+    margin: 0;
+    padding: 0;
+}
+
+div.sphinxsidebar h3 a {
+    color: #ffffff;
+}
+
+div.sphinxsidebar h4 {
+    font-family: 'Trebuchet MS', sans-serif;
+    color: #ffffff;
+    font-size: 1.3em;
+    font-weight: normal;
+    margin: 5px 0 0 0;
+    padding: 0;
+}
+
+div.sphinxsidebar p {
+    color: #ffffff;
+}
+
+div.sphinxsidebar p.topless {
+    margin: 5px 10px 10px 10px;
+}
+
+div.sphinxsidebar ul {
+    margin: 10px;
+    padding: 0;
+    color: #ffffff;
+}
+
+div.sphinxsidebar a {
+    color: #98dbcc;
+}
+
+div.sphinxsidebar input {
+    border: 1px solid #98dbcc;
+    font-family: sans-serif;
+    font-size: 1em;
+}
+
+
+
+/* -- hyperlink styles ------------------------------------------------------ */
+
+a {
+    color: #355f7c;
+    text-decoration: none;
+}
+
+a:visited {
+    color: #355f7c;
+    text-decoration: none;
+}
+
+a:hover {
+    text-decoration: underline;
+}
+
+
+
+/* -- body styles ----------------------------------------------------------- */
+
+div.body h1,
+div.body h2,
+div.body h3,
+div.body h4,
+div.body h5,
+div.body h6 {
+    font-family: 'Trebuchet MS', sans-serif;
+    background-color: #f2f2f2;
+    font-weight: normal;
+    color: #20435c;
+    border-bottom: 1px solid #ccc;
+    margin: 20px -20px 10px -20px;
+    padding: 3px 0 3px 10px;
+}
+
+div.body h1 { margin-top: 0; font-size: 200%; }
+div.body h2 { font-size: 160%; }
+div.body h3 { font-size: 140%; }
+div.body h4 { font-size: 120%; }
+div.body h5 { font-size: 110%; }
+div.body h6 { font-size: 100%; }
+
+a.headerlink {
+    color: #c60f0f;
+    font-size: 0.8em;
+    padding: 0 4px 0 4px;
+    text-decoration: none;
+}
+
+a.headerlink:hover {
+    background-color: #c60f0f;
+    color: white;
+}
+
+div.body p, div.body dd, div.body li {
+    text-align: justify;
+    line-height: 130%;
+}
+
+div.admonition p.admonition-title + p {
+    display: inline;
+}
+
+div.admonition p {
+    margin-bottom: 5px;
+}
+
+div.admonition pre {
+    margin-bottom: 5px;
+}
+
+div.admonition ul, div.admonition ol {
+    margin-bottom: 5px;
+}
+
+div.note {
+    background-color: #eee;
+    border: 1px solid #ccc;
+}
+
+div.seealso {
+    background-color: #ffc;
+    border: 1px solid #ff6;
+}
+
+div.topic {
+    background-color: #eee;
+}
+
+div.warning {
+    background-color: #ffe4e4;
+    border: 1px solid #f66;
+}
+
+p.admonition-title {
+    display: inline;
+}
+
+p.admonition-title:after {
+    content: ":";
+}
+
+pre {
+    padding: 5px;
+    background-color: #eeffcc;
+    color: #333333;
+    line-height: 120%;
+    border: 1px solid #ac9;
+    border-left: none;
+    border-right: none;
+}
+
+tt {
+    background-color: #ecf0f3;
+    padding: 0 1px 0 1px;
+    font-size: 0.95em;
+}
+
+th {
+    background-color: #ede;
+}
+
+.warning tt {
+    background: #efc2c2;
+}
+
+.note tt {
+    background: #d6d6d6;
+}
+
+.viewcode-back {
+    font-family: sans-serif;
+}
+
+div.viewcode-block:target {
+    background-color: #f4debf;
+    border-top: 1px solid #ac9;
+    border-bottom: 1px solid #ac9;
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/0c822c6d/tutorial/_build/html/_static/sidebar.js
----------------------------------------------------------------------
diff --git a/tutorial/_build/html/_static/sidebar.js b/tutorial/_build/html/_static/sidebar.js
new file mode 100644
index 0000000..a45e192
--- /dev/null
+++ b/tutorial/_build/html/_static/sidebar.js
@@ -0,0 +1,151 @@
+/*
+ * sidebar.js
+ * ~~~~~~~~~~
+ *
+ * This script makes the Sphinx sidebar collapsible.
+ *
+ * .sphinxsidebar contains .sphinxsidebarwrapper.  This script adds
+ * in .sphixsidebar, after .sphinxsidebarwrapper, the #sidebarbutton
+ * used to collapse and expand the sidebar.
+ *
+ * When the sidebar is collapsed the .sphinxsidebarwrapper is hidden
+ * and the width of the sidebar and the margin-left of the document
+ * are decreased. When the sidebar is expanded the opposite happens.
+ * This script saves a per-browser/per-session cookie used to
+ * remember the position of the sidebar among the pages.
+ * Once the browser is closed the cookie is deleted and the position
+ * reset to the default (expanded).
+ *
+ * :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS.
+ * :license: BSD, see LICENSE for details.
+ *
+ */
+
+$(function() {
+  // global elements used by the functions.
+  // the 'sidebarbutton' element is defined as global after its
+  // creation, in the add_sidebar_button function
+  var bodywrapper = $('.bodywrapper');
+  var sidebar = $('.sphinxsidebar');
+  var sidebarwrapper = $('.sphinxsidebarwrapper');
+
+  // for some reason, the document has no sidebar; do not run into errors
+  if (!sidebar.length) return;
+
+  // original margin-left of the bodywrapper and width of the sidebar
+  // with the sidebar expanded
+  var bw_margin_expanded = bodywrapper.css('margin-left');
+  var ssb_width_expanded = sidebar.width();
+
+  // margin-left of the bodywrapper and width of the sidebar
+  // with the sidebar collapsed
+  var bw_margin_collapsed = '.8em';
+  var ssb_width_collapsed = '.8em';
+
+  // colors used by the current theme
+  var dark_color = $('.related').css('background-color');
+  var light_color = $('.document').css('background-color');
+
+  function sidebar_is_collapsed() {
+    return sidebarwrapper.is(':not(:visible)');
+  }
+
+  function toggle_sidebar() {
+    if (sidebar_is_collapsed())
+      expand_sidebar();
+    else
+      collapse_sidebar();
+  }
+
+  function collapse_sidebar() {
+    sidebarwrapper.hide();
+    sidebar.css('width', ssb_width_collapsed);
+    bodywrapper.css('margin-left', bw_margin_collapsed);
+    sidebarbutton.css({
+        'margin-left': '0',
+        'height': bodywrapper.height()
+    });
+    sidebarbutton.find('span').text('»');
+    sidebarbutton.attr('title', _('Expand sidebar'));
+    document.cookie = 'sidebar=collapsed';
+  }
+
+  function expand_sidebar() {
+    bodywrapper.css('margin-left', bw_margin_expanded);
+    sidebar.css('width', ssb_width_expanded);
+    sidebarwrapper.show();
+    sidebarbutton.css({
+        'margin-left': ssb_width_expanded-12,
+        'height': bodywrapper.height()
+    });
+    sidebarbutton.find('span').text('«');
+    sidebarbutton.attr('title', _('Collapse sidebar'));
+    document.cookie = 'sidebar=expanded';
+  }
+
+  function add_sidebar_button() {
+    sidebarwrapper.css({
+        'float': 'left',
+        'margin-right': '0',
+        'width': ssb_width_expanded - 28
+    });
+    // create the button
+    sidebar.append(
+        '<div id="sidebarbutton"><span>&laquo;</span></div>'
+    );
+    var sidebarbutton = $('#sidebarbutton');
+    light_color = sidebarbutton.css('background-color');
+    // find the height of the viewport to center the '<<' in the page
+    var viewport_height;
+    if (window.innerHeight)
+ 	  viewport_height = window.innerHeight;
+    else
+	  viewport_height = $(window).height();
+    sidebarbutton.find('span').css({
+        'display': 'block',
+        'margin-top': (viewport_height - sidebar.position().top - 20) / 2
+    });
+
+    sidebarbutton.click(toggle_sidebar);
+    sidebarbutton.attr('title', _('Collapse sidebar'));
+    sidebarbutton.css({
+        'color': '#FFFFFF',
+        'border-left': '1px solid ' + dark_color,
+        'font-size': '1.2em',
+        'cursor': 'pointer',
+        'height': bodywrapper.height(),
+        'padding-top': '1px',
+        'margin-left': ssb_width_expanded - 12
+    });
+
+    sidebarbutton.hover(
+      function () {
+          $(this).css('background-color', dark_color);
+      },
+      function () {
+          $(this).css('background-color', light_color);
+      }
+    );
+  }
+
+  function set_position_from_cookie() {
+    if (!document.cookie)
+      return;
+    var items = document.cookie.split(';');
+    for(var k=0; k<items.length; k++) {
+      var key_val = items[k].split('=');
+      var key = key_val[0];
+      if (key == 'sidebar') {
+        var value = key_val[1];
+        if ((value == 'collapsed') && (!sidebar_is_collapsed()))
+          collapse_sidebar();
+        else if ((value == 'expanded') && (sidebar_is_collapsed()))
+          expand_sidebar();
+      }
+    }
+  }
+
+  add_sidebar_button();
+  var sidebarbutton = $('#sidebarbutton');
+  set_position_from_cookie();
+});

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/0c822c6d/tutorial/_build/html/genindex.html
----------------------------------------------------------------------
diff --git a/tutorial/_build/html/genindex.html b/tutorial/_build/html/genindex.html
index b0bb020..0484f18 100644
--- a/tutorial/_build/html/genindex.html
+++ b/tutorial/_build/html/genindex.html
@@ -10,16 +10,15 @@
   <head>
     <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
     
-    <title>Index &mdash; Proton 0.8 documentation</title>
+    <title>Index &mdash; Proton 0.9-alpha documentation</title>
     
-    <link rel="stylesheet" href="_static/haiku.css" type="text/css" />
+    <link rel="stylesheet" href="_static/default.css" type="text/css" />
     <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
-    <link rel="stylesheet" href="_static/print.css" type="text/css" />
     
     <script type="text/javascript">
       var DOCUMENTATION_OPTIONS = {
         URL_ROOT:    '',
-        VERSION:     '0.8',
+        VERSION:     '0.9-alpha',
         COLLAPSE_INDEX: false,
         FILE_SUFFIX: '.html',
         HAS_SOURCE:  true
@@ -28,24 +27,23 @@
     <script type="text/javascript" src="_static/jquery.js"></script>
     <script type="text/javascript" src="_static/underscore.js"></script>
     <script type="text/javascript" src="_static/doctools.js"></script>
-    <script type="text/javascript" src="_static/theme_extras.js"></script>
-    <link rel="top" title="Proton 0.8 documentation" href="index.html" /> 
+    <link rel="top" title="Proton 0.9-alpha documentation" href="index.html" /> 
   </head>
   <body>
-      <div class="header"><h1 class="heading"><a href="index.html">
-          <span>Proton 0.8 documentation</span></a></h1>
-        <h2 class="heading"><span>Index</span></h2>
-      </div>
-      <div class="topnav">
-      
-        <p>
-        <a class="uplink" href="index.html">Contents</a>
-        </p>
+    <div class="related">
+      <h3>Navigation</h3>
+      <ul>
+        <li class="right" style="margin-right: 10px">
+          <a href="#" title="General Index"
+             accesskey="I">index</a></li>
+        <li><a href="index.html">Proton 0.9-alpha documentation</a> &raquo;</li> 
+      </ul>
+    </div>  
 
-      </div>
-      <div class="content">
-        
-        
+    <div class="document">
+      <div class="documentwrapper">
+          <div class="body">
+            
 
 <h1 id="index">Index</h1>
 
@@ -54,15 +52,19 @@
 </div>
 
 
+          </div>
       </div>
-      <div class="bottomnav">
-      
-        <p>
-        <a class="uplink" href="index.html">Contents</a>
-        </p>
-
-      </div>
-
+      <div class="clearer"></div>
+    </div>
+    <div class="related">
+      <h3>Navigation</h3>
+      <ul>
+        <li class="right" style="margin-right: 10px">
+          <a href="#" title="General Index"
+             >index</a></li>
+        <li><a href="index.html">Proton 0.9-alpha documentation</a> &raquo;</li> 
+      </ul>
+    </div>
     <div class="footer">
         &copy; Copyright 2014, Apache Qpid.
       Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.3.

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/0c822c6d/tutorial/_build/html/index.html
----------------------------------------------------------------------
diff --git a/tutorial/_build/html/index.html b/tutorial/_build/html/index.html
index 2d6a9cc..ac10c8d 100644
--- a/tutorial/_build/html/index.html
+++ b/tutorial/_build/html/index.html
@@ -8,16 +8,15 @@
   <head>
     <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
     
-    <title>Some Proton Examples &mdash; Proton 0.8 documentation</title>
+    <title>Some Proton Examples &mdash; Proton 0.9-alpha documentation</title>
     
-    <link rel="stylesheet" href="_static/haiku.css" type="text/css" />
+    <link rel="stylesheet" href="_static/default.css" type="text/css" />
     <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
-    <link rel="stylesheet" href="_static/print.css" type="text/css" />
     
     <script type="text/javascript">
       var DOCUMENTATION_OPTIONS = {
         URL_ROOT:    '',
-        VERSION:     '0.8',
+        VERSION:     '0.9-alpha',
         COLLAPSE_INDEX: false,
         FILE_SUFFIX: '.html',
         HAS_SOURCE:  true
@@ -26,27 +25,27 @@
     <script type="text/javascript" src="_static/jquery.js"></script>
     <script type="text/javascript" src="_static/underscore.js"></script>
     <script type="text/javascript" src="_static/doctools.js"></script>
-    <script type="text/javascript" src="_static/theme_extras.js"></script>
-    <link rel="top" title="Proton 0.8 documentation" href="#" />
+    <link rel="top" title="Proton 0.9-alpha documentation" href="#" />
     <link rel="next" title="Hello World!" href="tutorial.html" /> 
   </head>
   <body>
-      <div class="header"><h1 class="heading"><a href="#">
-          <span>Proton 0.8 documentation</span></a></h1>
-        <h2 class="heading"><span>Some Proton Examples</span></h2>
-      </div>
-      <div class="topnav">
-      
-        <p>
-        <a class="uplink" href="#">Contents</a>
-        &#160;&#160;::&#160;&#160;
-        <a href="tutorial.html">Hello World!</a>&#160;&#160;»
-        </p>
+    <div class="related">
+      <h3>Navigation</h3>
+      <ul>
+        <li class="right" style="margin-right: 10px">
+          <a href="genindex.html" title="General Index"
+             accesskey="I">index</a></li>
+        <li class="right" >
+          <a href="tutorial.html" title="Hello World!"
+             accesskey="N">next</a> |</li>
+        <li><a href="#">Proton 0.9-alpha documentation</a> &raquo;</li> 
+      </ul>
+    </div>  
 
-      </div>
-      <div class="content">
-        
-        
+    <div class="document">
+      <div class="documentwrapper">
+          <div class="body">
+            
   <div class="section" id="some-proton-examples">
 <h1>Some Proton Examples<a class="headerlink" href="#some-proton-examples" title="Permalink to this headline">¶</a></h1>
 <p>Contents:</p>
@@ -61,17 +60,22 @@
 </div>
 
 
+          </div>
       </div>
-      <div class="bottomnav">
-      
-        <p>
-        <a class="uplink" href="#">Contents</a>
-        &#160;&#160;::&#160;&#160;
-        <a href="tutorial.html">Hello World!</a>&#160;&#160;»
-        </p>
-
-      </div>
-
+      <div class="clearer"></div>
+    </div>
+    <div class="related">
+      <h3>Navigation</h3>
+      <ul>
+        <li class="right" style="margin-right: 10px">
+          <a href="genindex.html" title="General Index"
+             >index</a></li>
+        <li class="right" >
+          <a href="tutorial.html" title="Hello World!"
+             >next</a> |</li>
+        <li><a href="#">Proton 0.9-alpha documentation</a> &raquo;</li> 
+      </ul>
+    </div>
     <div class="footer">
         &copy; Copyright 2014, Apache Qpid.
       Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.3.

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/0c822c6d/tutorial/_build/html/objects.inv
----------------------------------------------------------------------
diff --git a/tutorial/_build/html/objects.inv b/tutorial/_build/html/objects.inv
index 501066a..7516f12 100644
Binary files a/tutorial/_build/html/objects.inv and b/tutorial/_build/html/objects.inv differ

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/0c822c6d/tutorial/_build/html/search.html
----------------------------------------------------------------------
diff --git a/tutorial/_build/html/search.html b/tutorial/_build/html/search.html
index 67a39eb..84bb3b2 100644
--- a/tutorial/_build/html/search.html
+++ b/tutorial/_build/html/search.html
@@ -8,16 +8,15 @@
   <head>
     <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
     
-    <title>Search &mdash; Proton 0.8 documentation</title>
+    <title>Search &mdash; Proton 0.9-alpha documentation</title>
     
-    <link rel="stylesheet" href="_static/haiku.css" type="text/css" />
+    <link rel="stylesheet" href="_static/default.css" type="text/css" />
     <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
-    <link rel="stylesheet" href="_static/print.css" type="text/css" />
     
     <script type="text/javascript">
       var DOCUMENTATION_OPTIONS = {
         URL_ROOT:    '',
-        VERSION:     '0.8',
+        VERSION:     '0.9-alpha',
         COLLAPSE_INDEX: false,
         FILE_SUFFIX: '.html',
         HAS_SOURCE:  true
@@ -27,8 +26,7 @@
     <script type="text/javascript" src="_static/underscore.js"></script>
     <script type="text/javascript" src="_static/doctools.js"></script>
     <script type="text/javascript" src="_static/searchtools.js"></script>
-    <script type="text/javascript" src="_static/theme_extras.js"></script>
-    <link rel="top" title="Proton 0.8 documentation" href="index.html" />
+    <link rel="top" title="Proton 0.9-alpha documentation" href="index.html" />
   <script type="text/javascript">
     jQuery(function() { Search.loadIndex("searchindex.js"); });
   </script>
@@ -36,20 +34,20 @@
 
   </head>
   <body>
-      <div class="header"><h1 class="heading"><a href="index.html">
-          <span>Proton 0.8 documentation</span></a></h1>
-        <h2 class="heading"><span>Search</span></h2>
-      </div>
-      <div class="topnav">
-      
-        <p>
-        <a class="uplink" href="index.html">Contents</a>
-        </p>
+    <div class="related">
+      <h3>Navigation</h3>
+      <ul>
+        <li class="right" style="margin-right: 10px">
+          <a href="genindex.html" title="General Index"
+             accesskey="I">index</a></li>
+        <li><a href="index.html">Proton 0.9-alpha documentation</a> &raquo;</li> 
+      </ul>
+    </div>  
 
-      </div>
-      <div class="content">
-        
-        
+    <div class="document">
+      <div class="documentwrapper">
+          <div class="body">
+            
   <h1 id="search-documentation">Search</h1>
   <div id="fallback" class="admonition warning">
   <script type="text/javascript">$('#fallback').hide();</script>
@@ -74,15 +72,19 @@
   
   </div>
 
+          </div>
       </div>
-      <div class="bottomnav">
-      
-        <p>
-        <a class="uplink" href="index.html">Contents</a>
-        </p>
-
-      </div>
-
+      <div class="clearer"></div>
+    </div>
+    <div class="related">
+      <h3>Navigation</h3>
+      <ul>
+        <li class="right" style="margin-right: 10px">
+          <a href="genindex.html" title="General Index"
+             >index</a></li>
+        <li><a href="index.html">Proton 0.9-alpha documentation</a> &raquo;</li> 
+      </ul>
+    </div>
     <div class="footer">
         &copy; Copyright 2014, Apache Qpid.
       Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.3.

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/0c822c6d/tutorial/_build/html/searchindex.js
----------------------------------------------------------------------
diff --git a/tutorial/_build/html/searchindex.js b/tutorial/_build/html/searchindex.js
index 19096e1..cfcb4e9 100644
--- a/tutorial/_build/html/searchindex.js
+++ b/tutorial/_build/html/searchindex.js
@@ -1 +1 @@
-Search.setIndex({objects:{},terms:{all:1,concept:[],illustr:1,code:1,abil:1,follow:1,incas:1,send:1,program:1,larg:1,sent:1,on_messag:1,util:1,mechan:[],veri:1,did:1,helloworld:1,"try":1,prevent:[],direct:[0,1],slithi:1,second:1,pass:1,further:1,port:[],rath:1,even:1,what:[],repli:1,abl:1,"while":1,remote_sourc:1,method:1,honour:[],gener:1,here:1,bodi:1,let:1,address:1,modifi:1,valu:[],acceptor:1,convert:1,sender:1,queue:1,credit:1,chang:[],ourselv:1,via:[],incomingmessagehandl:1,wit:1,total:1,establish:1,twa:1,from:1,describ:[],would:1,commun:1,two:[],handler:1,call:1,msg:1,scope:[],tell:1,more:1,sort:[],desir:1,relat:[],particular:1,actual:1,given:1,cach:1,must:[],dictat:1,none:1,endpoint:1,work:1,can:1,def:1,control:1,want:[],process:1,accept:1,topic:1,explor:[],listent:[],occur:1,delai:1,rather:1,anoth:1,write:1,conn:1,simpl:1,after:1,befor:[],callback:1,associ:[],demonstr:1,alloc:1,issu:1,inform:[],incorpor:[],enter:1,volum:1,oper:1,least:1,over:1,remote_condit:1,becaus:1,throu
 gh:1,reconnect:1,still:1,dynam:1,paramet:[],conjunct:1,disconnect:1,link_flow:[],borogrov:1,helloworldsend:1,might:1,easier:1,them:1,"return":1,handl:1,"break":1,mention:[],flowcontrol:1,now:1,mome:1,strive:1,stopper:[],name:1,separ:[],reactiv:1,fulli:1,proton_util:[],gire:1,connect:1,our:1,helloworldreceiv:1,todo:1,event:1,special:1,out:1,accomplish:[],req:1,content:0,laid:1,print:1,earlier:1,differ:1,reason:1,recv:1,shortest:1,care:[],could:1,timer:[],messagingcontext:1,first:1,origin:1,rang:1,notifi:1,directli:1,upper:1,onc:1,number:[],restrict:1,instruct:[],done:[],messag:1,open:1,brillig:1,tove:1,construct:1,too:1,interfac:[],"final":1,listen:1,option:1,specifi:1,provid:1,part:1,than:1,whenev:[],remot:1,structur:1,were:1,deliveri:[],ani:1,have:1,need:1,requisit:[],min:1,self:1,client:1,note:1,also:1,without:1,build:[],which:1,singl:1,uppercas:1,gymbl:1,allow:1,though:1,object:1,react:1,on_disconnect:1,"class":1,tradit:1,don:1,url:1,later:[],flow:1,doe:1,runtim:[],gracefulli:[],
 recipi:1,show:1,particularli:1,involv:1,onli:1,configur:1,should:[],queu:1,local:[],variou:1,get:1,stop:1,outgoingmessagehandl:1,"new":[],requir:1,enabl:1,cleanli:[],common:1,contain:[],where:1,on_connection_remote_open:1,respond:1,set:1,see:1,respons:[0,1],close:1,kei:[],pattern:1,written:1,won:1,"import":1,inabl:[],extend:[],style:1,last:1,howev:1,against:[],instanc:1,context:1,logic:[],simpli:1,schedul:1,arriv:[],proton:[0,1],shutdown:[],respect:[],on_link_remote_open:1,coupl:1,connectionhandl:[],due:1,trigger:1,interest:[],basic:[0,1],next_request:1,togeth:1,backoff:[],"case":1,look:1,servic:1,wabe:1,aim:1,defin:1,invok:1,error:1,on_tim:1,loop:1,outgrab:1,helper:1,readi:1,toolkit:1,worri:1,destin:[],senderhandl:[],incom:1,"__init__":1,receiv:1,make:1,same:1,mimsi:1,finish:[],receiverhandl:[],hang:[],temporari:1,implement:1,appropri:1,keyboardinterrupt:1,well:1,exampl:[0,1],thi:1,everyth:1,explan:1,protocol:1,just:1,obtain:1,except:1,littl:1,add:1,other:[],els:1,match:1,take:1,ap
 plic:1,on_link_remote_clos:1,pop:1,world:[0,1],specif:[],server:1,necessari:1,either:1,lose:1,often:1,acknowledg:1,eventloop:1,some:[0,1],back:1,handshak:1,confirm:1,avoid:1,definit:1,outgo:[],exit:[],localhost:1,refer:1,run:1,on_link_flow:1,power:[],is_receiv:1,broker:1,on_accept:1,host:1,peer:1,about:1,send_msg:1,socket:[],most:[],constructor:1,own:1,within:1,automat:[],drain:1,down:1,ensur:1,your:[],wai:[],aren:1,support:1,start:1,much:[],on_connection_remote_clos:1,includ:1,suit:1,"function":1,creation:1,offer:1,link:1,line:1,"true":1,count:[],made:1,possibl:1,whether:[],until:1,limit:[],similar:1,expect:1,creat:1,request:[0,1],doesn:[],unauthent:[],amqp:1,when:1,detail:1,proton_ev:1,"default":1,cleanup:1,test:1,you:1,intend:[],sequenc:1,consid:[],reliabl:1,rule:1,ignor:[],fact:[],time:1,reply_to:1,hello:[0,1]},objtypes:{},titles:["Some Proton Examples","Hello World!"],objnames:{},filenames:["index","tutorial"]})
\ No newline at end of file
+Search.setIndex({objects:{},terms:{all:1,concept:[],illustr:1,code:1,abil:1,follow:1,incas:1,send:1,program:1,larg:1,sent:1,on_messag:1,util:[],mechan:1,veri:1,relev:1,did:1,helloworld:1,"try":1,prevent:[],direct:[0,1],slithi:1,second:1,pass:1,further:1,port:[],rath:1,even:[],what:[],repli:1,abl:1,"while":1,remote_sourc:1,method:1,honour:[],gener:[],here:1,bodi:1,let:1,address:1,modifi:1,valu:[],acceptor:1,convert:1,sender:1,queue:1,credit:1,chang:[],ourselv:1,via:[],incomingmessagehandl:1,wit:1,total:1,establish:[],on_connection_open:1,twa:1,from:1,describ:[],would:1,commun:1,two:[],handler:1,call:1,msg:1,scope:[],type:1,tell:1,more:1,sort:[],desir:1,relat:[],relai:1,particular:1,actual:[],given:[],cach:1,must:[],dictat:1,none:1,endpoint:[],work:1,can:1,def:1,control:1,want:[],process:1,accept:1,topic:1,explor:[],listent:[],occur:1,delai:[],thing:1,rather:1,anoth:1,write:1,conn:1,simpl:1,after:1,befor:[],callback:[],mai:1,data:1,demonstr:1,alloc:1,third:1,correspond:1,issu:1,inform
 :1,incorpor:[],enter:1,volum:1,oper:[],least:1,over:1,remote_condit:[],becaus:1,through:1,reconnect:1,still:1,dynam:1,paramet:[],conjunct:1,disconnect:[],link_flow:[],borogrov:1,helloworldsend:[],might:1,easier:[],them:1,"return":1,handl:1,"break":[],mention:[],flowcontrol:1,now:1,mome:1,strive:1,stopper:[],name:1,separ:[],reactiv:1,fulli:[],proton_util:[],gire:1,connect:1,our:1,helloworldreceiv:1,todo:1,event:1,special:1,out:1,remote_offered_cap:1,accomplish:[],req:1,publish:1,content:0,laid:1,print:1,earlier:[],differ:1,reason:[],base:1,recv:1,shortest:1,care:[],could:1,timer:[],messagingcontext:[],first:1,origin:1,rang:[],notifi:1,directli:1,upper:1,onc:1,number:[],restrict:1,instruct:[],done:[],messag:1,open:1,brillig:1,associ:[],tove:1,construct:1,too:1,interfac:[],"final":1,listen:1,option:1,specifi:1,provid:1,part:1,create_send:1,than:1,whenev:1,remot:[],structur:1,were:1,deliveri:[],ani:1,manner:1,have:1,need:1,requisit:[],on_link_open:1,min:[],self:1,client:1,note:1,also:1,
 without:1,build:[],which:1,singl:1,uppercas:1,gymbl:1,allow:1,though:1,object:[],on_credit:1,react:[],on_disconnect:1,"class":1,tradit:1,don:1,url:1,later:[],flow:1,doe:1,runtim:[],determin:1,gracefulli:[],drain:[],recipi:1,show:1,particularli:1,involv:1,onli:1,configur:[],should:[],queu:[],local:[],variou:[],get:1,stop:[],outgoingmessagehandl:[],"new":[],requir:1,enabl:[],cleanli:[],common:1,contain:[],where:1,on_connection_remote_open:[],respond:1,set:1,see:1,respons:[0,1],close:1,kei:[],pattern:1,written:[],won:1,"import":1,inabl:[],extend:[],style:[],last:1,howev:1,against:[],instanc:1,context:[],logic:[],among:1,simpli:1,point:1,schedul:[],arriv:1,pop:1,shutdown:[],respect:[],assum:1,on_link_remote_open:1,coupl:1,connectionhandl:[],due:[],been:1,trigger:1,interest:1,basic:[0,1],next_request:1,togeth:[],backoff:[],"case":1,look:1,servic:1,wabe:1,aim:1,defin:1,invok:1,error:[],anonym:1,on_tim:[],loop:1,outgrab:1,helper:[],readi:1,toolkit:1,worri:1,destin:[],senderhandl:[],incom:1
 ,"__init__":1,receiv:1,make:[],same:1,mimsi:1,finish:[],receiverhandl:[],hang:[],driven:1,temporari:1,implement:[],appropri:1,keyboardinterrupt:1,well:1,exampl:[0,1],thi:1,everyth:[],rout:1,explan:1,protocol:1,just:1,obtain:[],except:1,littl:[],add:1,other:1,els:1,match:[],take:1,applic:1,on_link_remote_clos:[],proton:[0,1],world:[0,1],like:1,specif:[],server:1,necessari:[],either:[],lose:[],often:1,acknowledg:[],eventloop:1,some:[0,1],back:1,handshak:1,confirm:1,avoid:[],definit:[],outgo:[],exit:1,localhost:1,refer:[],run:1,on_link_flow:[],power:[],is_receiv:[],broker:1,on_accept:1,host:1,peer:1,about:1,send_msg:1,socket:1,most:[],constructor:1,own:1,on_connection_clos:1,within:1,automat:[],three:1,down:1,ensur:1,your:[],wai:[],aren:1,support:1,start:1,much:[],on_connection_remote_clos:[],includ:[],suit:[],"function":1,creation:[],offer:[],create_receiv:1,link:1,line:1,"true":1,count:[],made:[],possibl:1,whether:[],until:[],limit:[],similar:1,expect:1,creat:1,request:[0,1],doesn:[]
 ,unauthent:[],amqp:1,when:1,detail:1,proton_ev:1,"default":1,cleanup:1,test:1,you:1,intend:1,sequenc:1,consid:[],clienthandl:1,reliabl:1,rule:1,ignor:[],fact:[],time:[],reply_to:1,hello:[0,1]},objtypes:{},titles:["Some Proton Examples","Hello World!"],objnames:{},filenames:["index","tutorial"]})
\ No newline at end of file


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


[16/50] [abbrv] qpid-proton git commit: PROTON-715: subtract 1 when setting delivery-count header based on JMSXDeliveryCount during outbound Native transformation

Posted by gs...@apache.org.
PROTON-715: subtract 1 when setting delivery-count header based on JMSXDeliveryCount during outbound Native transformation

git-svn-id: https://svn.apache.org/repos/asf/qpid/proton/trunk@1632091 13f79535-47bb-0310-9956-ffa450edef68


Project: http://git-wip-us.apache.org/repos/asf/qpid-proton/repo
Commit: http://git-wip-us.apache.org/repos/asf/qpid-proton/commit/07554b96
Tree: http://git-wip-us.apache.org/repos/asf/qpid-proton/tree/07554b96
Diff: http://git-wip-us.apache.org/repos/asf/qpid-proton/diff/07554b96

Branch: refs/heads/examples
Commit: 07554b96cc81828e7903371ebd7f99bfd2747514
Parents: e843420
Author: Robert Gemmell <ro...@apache.org>
Authored: Wed Oct 15 15:31:18 2014 +0000
Committer: Robert Gemmell <ro...@apache.org>
Committed: Wed Oct 15 15:31:18 2014 +0000

----------------------------------------------------------------------
 .../apache/qpid/proton/jms/AMQPNativeOutboundTransformer.java    | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/07554b96/contrib/proton-jms/src/main/java/org/apache/qpid/proton/jms/AMQPNativeOutboundTransformer.java
----------------------------------------------------------------------
diff --git a/contrib/proton-jms/src/main/java/org/apache/qpid/proton/jms/AMQPNativeOutboundTransformer.java b/contrib/proton-jms/src/main/java/org/apache/qpid/proton/jms/AMQPNativeOutboundTransformer.java
index 66ff0b1..8245fb8 100644
--- a/contrib/proton-jms/src/main/java/org/apache/qpid/proton/jms/AMQPNativeOutboundTransformer.java
+++ b/contrib/proton-jms/src/main/java/org/apache/qpid/proton/jms/AMQPNativeOutboundTransformer.java
@@ -81,7 +81,9 @@ public class AMQPNativeOutboundTransformer extends OutboundTransformer {
                 }
 
                 // Update the DeliveryCount header...
-                amqp.getHeader().setDeliveryCount(new UnsignedInteger(count));
+                // The AMQP delivery-count field only includes prior failed delivery attempts,
+                // whereas JMSXDeliveryCount includes the first/current delivery attempt. Subtract 1.
+                amqp.getHeader().setDeliveryCount(new UnsignedInteger(count - 1));
 
                 // Re-encode...
                 ByteBuffer buffer = ByteBuffer.wrap(new byte[1024*4]);


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


[02/50] [abbrv] qpid-proton git commit: NO-JIRA: Fix broken CMake initialisation of BUILD_WITH_CXX

Posted by gs...@apache.org.
NO-JIRA: Fix broken CMake initialisation of BUILD_WITH_CXX

git-svn-id: https://svn.apache.org/repos/asf/qpid/proton/trunk@1628523 13f79535-47bb-0310-9956-ffa450edef68


Project: http://git-wip-us.apache.org/repos/asf/qpid-proton/repo
Commit: http://git-wip-us.apache.org/repos/asf/qpid-proton/commit/8cc810a8
Tree: http://git-wip-us.apache.org/repos/asf/qpid-proton/tree/8cc810a8
Diff: http://git-wip-us.apache.org/repos/asf/qpid-proton/diff/8cc810a8

Branch: refs/heads/examples
Commit: 8cc810a8c2382cc0b6ce9e75170eaf3f7a77d619
Parents: 5d32449
Author: Andrew Stitcher <as...@apache.org>
Authored: Tue Sep 30 19:46:27 2014 +0000
Committer: Andrew Stitcher <as...@apache.org>
Committed: Tue Sep 30 19:46:27 2014 +0000

----------------------------------------------------------------------
 CMakeLists.txt | 9 +++++----
 1 file changed, 5 insertions(+), 4 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/8cc810a8/CMakeLists.txt
----------------------------------------------------------------------
diff --git a/CMakeLists.txt b/CMakeLists.txt
index d7b081f..7d1fba7 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -26,11 +26,12 @@ if (CMAKE_BUILD_TYPE MATCHES "Deb")
 endif (CMAKE_BUILD_TYPE MATCHES "Deb")
 message(STATUS "Build type is \"${CMAKE_BUILD_TYPE}\"${has_debug_symbols}")
 
-option(BUILD_WITH_CXX "Compile Proton using C++" OFF)
-if ("${CMAKE_GENERATOR}" MATCHES "^Visual Studio")
+
+if (MSVC)
   # No C99 capability, use C++
-  set(BUILD_WITH_CXX ON)
-endif ("${CMAKE_GENERATOR}" MATCHES "^Visual Studio")
+  set(DEFAULT_BUILD_WITH_CXX ON)
+endif (MSVC)
+option(BUILD_WITH_CXX "Compile Proton using C++" ${DEFAULT_BUILD_WITH_CXX})
 
 if (BUILD_WITH_CXX)
   project (Proton C CXX)


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


[09/50] [abbrv] qpid-proton git commit: added engine examples for proton-j

Posted by gs...@apache.org.
added engine examples for proton-j

git-svn-id: https://svn.apache.org/repos/asf/qpid/proton/trunk@1631544 13f79535-47bb-0310-9956-ffa450edef68


Project: http://git-wip-us.apache.org/repos/asf/qpid-proton/repo
Commit: http://git-wip-us.apache.org/repos/asf/qpid-proton/commit/6ca98f5b
Tree: http://git-wip-us.apache.org/repos/asf/qpid-proton/tree/6ca98f5b
Diff: http://git-wip-us.apache.org/repos/asf/qpid-proton/diff/6ca98f5b

Branch: refs/heads/examples
Commit: 6ca98f5bb98138a0c562b2f0303e0f7cabc8591c
Parents: 2c89949
Author: Rafael H. Schloming <rh...@apache.org>
Authored: Mon Oct 13 20:51:05 2014 +0000
Committer: Rafael H. Schloming <rh...@apache.org>
Committed: Mon Oct 13 20:51:05 2014 +0000

----------------------------------------------------------------------
 examples/engine/java/LICENSE                    | 201 ++++++++++++++
 examples/engine/java/drain                      |   2 +
 examples/engine/java/pom.xml                    |  40 +++
 examples/engine/java/server                     |   2 +
 examples/engine/java/spout                      |   2 +
 .../org/apache/qpid/proton/examples/Drain.java  | 128 +++++++++
 .../org/apache/qpid/proton/examples/Driver.java | 262 +++++++++++++++++++
 .../qpid/proton/examples/FlowController.java    |  80 ++++++
 .../apache/qpid/proton/examples/Handshaker.java |  88 +++++++
 .../apache/qpid/proton/examples/Message.java    |  83 ++++++
 .../org/apache/qpid/proton/examples/Pool.java   | 153 +++++++++++
 .../org/apache/qpid/proton/examples/Router.java | 191 ++++++++++++++
 .../org/apache/qpid/proton/examples/Server.java | 179 +++++++++++++
 .../org/apache/qpid/proton/examples/Spout.java  | 116 ++++++++
 14 files changed, 1527 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/6ca98f5b/examples/engine/java/LICENSE
----------------------------------------------------------------------
diff --git a/examples/engine/java/LICENSE b/examples/engine/java/LICENSE
new file mode 100644
index 0000000..ad410e1
--- /dev/null
+++ b/examples/engine/java/LICENSE
@@ -0,0 +1,201 @@
+Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "{}"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright {yyyy} {name of copyright owner}
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/6ca98f5b/examples/engine/java/drain
----------------------------------------------------------------------
diff --git a/examples/engine/java/drain b/examples/engine/java/drain
new file mode 100755
index 0000000..7c54787
--- /dev/null
+++ b/examples/engine/java/drain
@@ -0,0 +1,2 @@
+#!/bin/bash
+mvn -q -e exec:java -Dexec.mainClass=org.apache.qpid.proton.examples.Drain -Dexec.args="$@"

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/6ca98f5b/examples/engine/java/pom.xml
----------------------------------------------------------------------
diff --git a/examples/engine/java/pom.xml b/examples/engine/java/pom.xml
new file mode 100644
index 0000000..3fc355d
--- /dev/null
+++ b/examples/engine/java/pom.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+  
+  http://www.apache.org/licenses/LICENSE-2.0
+  
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+  <parent>
+    <groupId>org.apache.qpid</groupId>
+    <artifactId>proton-project</artifactId>
+    <version>1.0-SNAPSHOT</version>
+  </parent>
+  <modelVersion>4.0.0</modelVersion>
+
+  <artifactId>proton-j-demo</artifactId>
+  <name>proton-j-demo</name>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.qpid</groupId>
+      <artifactId>proton-j</artifactId>
+      <version>${project.parent.version}</version>
+    </dependency>
+  </dependencies>
+
+  <scm>
+    <url>http://svn.apache.org/viewvc/qpid/proton/</url>
+  </scm>
+</project>

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/6ca98f5b/examples/engine/java/server
----------------------------------------------------------------------
diff --git a/examples/engine/java/server b/examples/engine/java/server
new file mode 100755
index 0000000..37a9aa4
--- /dev/null
+++ b/examples/engine/java/server
@@ -0,0 +1,2 @@
+#!/bin/bash
+mvn -q -e exec:java -Dexec.mainClass=org.apache.qpid.proton.examples.Server -Dexec.args="$@"

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/6ca98f5b/examples/engine/java/spout
----------------------------------------------------------------------
diff --git a/examples/engine/java/spout b/examples/engine/java/spout
new file mode 100755
index 0000000..bd83842
--- /dev/null
+++ b/examples/engine/java/spout
@@ -0,0 +1,2 @@
+#!/bin/bash
+mvn -q -e exec:java -Dexec.mainClass=org.apache.qpid.proton.examples.Spout -Dexec.args="$@"

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/6ca98f5b/examples/engine/java/src/main/java/org/apache/qpid/proton/examples/Drain.java
----------------------------------------------------------------------
diff --git a/examples/engine/java/src/main/java/org/apache/qpid/proton/examples/Drain.java b/examples/engine/java/src/main/java/org/apache/qpid/proton/examples/Drain.java
new file mode 100644
index 0000000..0bdc76f
--- /dev/null
+++ b/examples/engine/java/src/main/java/org/apache/qpid/proton/examples/Drain.java
@@ -0,0 +1,128 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.proton.examples;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.qpid.proton.engine.BaseHandler;
+import org.apache.qpid.proton.engine.Collector;
+import org.apache.qpid.proton.engine.Connection;
+import org.apache.qpid.proton.engine.Delivery;
+import org.apache.qpid.proton.engine.Event;
+import org.apache.qpid.proton.engine.Link;
+import org.apache.qpid.proton.engine.Receiver;
+
+public class Drain extends BaseHandler {
+
+    private int count;
+    private boolean block;
+    private int received;
+    private boolean quiet;
+
+    public Drain(int count, boolean block, boolean quiet) {
+        this.count = count;
+        this.block = block;
+        this.quiet = quiet;
+    }
+
+    @Override
+    public void onLinkLocalOpen(Event evt) {
+        Link link = evt.getLink();
+        if (link instanceof Receiver) {
+            Receiver receiver = (Receiver) link;
+
+            if (block) {
+                receiver.flow(count);
+            } else {
+                receiver.drain(count);
+            }
+        }
+    }
+
+    @Override
+    public void onLinkFlow(Event evt) {
+        Link link = evt.getLink();
+        if (link instanceof Receiver) {
+            Receiver receiver = (Receiver) link;
+
+            if (!receiver.draining()) {
+                receiver.getSession().getConnection().close();
+            }
+        }
+    }
+
+    @Override
+    public void onDelivery(Event evt) {
+        Delivery dlv = evt.getDelivery();
+        if (dlv.getLink() instanceof Receiver) {
+            Receiver receiver = (Receiver) dlv.getLink();
+
+            if (!dlv.isPartial()) {
+                byte[] bytes = new byte[dlv.pending()];
+                receiver.recv(bytes, 0, bytes.length);
+                Message msg = new Message(bytes);
+
+                if (!quiet) {
+                    System.out.println(String.format("Got message: %s", msg));
+                }
+                received++;
+                dlv.settle();
+            }
+
+            if ((received >= count) || (!block && !receiver.draining())) {
+                receiver.getSession().getConnection().close();
+            }
+        }
+    }
+
+    @Override
+    public void onConnectionRemoteClose(Event evt) {
+        System.out.println(String.format("Got %s messages", received));
+    }
+
+    public static void main(String[] argv) throws Exception {
+        List<String> switches = new ArrayList<String>();
+        List<String> args = new ArrayList<String>();
+        for (String s : argv) {
+            if (s.startsWith("-")) {
+                switches.add(s);
+            } else {
+                args.add(s);
+            }
+        }
+
+        boolean quiet = switches.contains("-q");
+        String address = args.isEmpty() || !args.get(0).startsWith("/") ? "//localhost" : args.remove(0);
+        int count = args.isEmpty() ? 1 : Integer.parseInt(args.remove(0));
+        boolean block = switches.contains("-b");
+
+        Collector collector = Collector.Factory.create();
+
+        Drain drain = new Drain(count, block, quiet);
+        Driver driver = new Driver(collector, drain);
+
+        Pool pool = new Pool(collector);
+        pool.incoming(address, null);
+
+        driver.run();
+    }
+}

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/6ca98f5b/examples/engine/java/src/main/java/org/apache/qpid/proton/examples/Driver.java
----------------------------------------------------------------------
diff --git a/examples/engine/java/src/main/java/org/apache/qpid/proton/examples/Driver.java b/examples/engine/java/src/main/java/org/apache/qpid/proton/examples/Driver.java
new file mode 100644
index 0000000..8b4bcf0
--- /dev/null
+++ b/examples/engine/java/src/main/java/org/apache/qpid/proton/examples/Driver.java
@@ -0,0 +1,262 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.proton.examples;
+
+import org.apache.qpid.proton.engine.BaseHandler;
+import org.apache.qpid.proton.engine.Connection;
+import org.apache.qpid.proton.engine.Collector;
+import org.apache.qpid.proton.engine.EndpointState;
+import org.apache.qpid.proton.engine.Event;
+import org.apache.qpid.proton.engine.Handler;
+import org.apache.qpid.proton.engine.Sasl;
+import org.apache.qpid.proton.engine.Transport;
+import org.apache.qpid.proton.engine.TransportException;
+
+import java.io.IOException;
+import java.net.InetSocketAddress;
+import java.net.StandardSocketOptions;
+import java.nio.ByteBuffer;
+import java.nio.channels.Selector;
+import java.nio.channels.SelectionKey;
+import java.nio.channels.ServerSocketChannel;
+import java.nio.channels.SocketChannel;
+
+
+/**
+ * Driver
+ *
+ */
+
+public class Driver extends BaseHandler
+{
+
+    final private Collector collector;
+    final private Handler[] handlers;
+    final private Selector selector;
+
+    public Driver(Collector collector, Handler ... handlers) throws IOException {
+        this.collector = collector;
+        this.handlers = handlers;
+        this.selector = Selector.open();
+    }
+
+    public void listen(String host, int port) throws IOException {
+        new Acceptor(host, port);
+    }
+
+    public void run() throws IOException {
+        while (true) {
+            processEvents();
+
+            // I don't know if there is a better way to do this, but
+            // the only way canceled selection keys are removed from
+            // the key set is via a select operation, so we do this
+            // first to figure out whether we should exit. Without
+            // this we would block indefinitely when there are only
+            // cancelled keys remaining.
+            selector.selectNow();
+            if (selector.keys().isEmpty()) {
+                selector.close();
+                return;
+            }
+
+            selector.selectedKeys().clear();
+            selector.select();
+
+            for (SelectionKey key : selector.selectedKeys()) {
+                Selectable selectable = (Selectable) key.attachment();
+                selectable.selected();
+            }
+        }
+    }
+
+    public void processEvents() {
+        while (true) {
+            Event ev = collector.peek();
+            if (ev == null) break;
+            ev.dispatch(this);
+            for (Handler h : handlers) {
+                ev.dispatch(h);
+            }
+            collector.pop();
+        }
+    }
+
+    @Override
+    public void onTransport(Event evt) {
+        Transport transport = evt.getTransport();
+        ChannelHandler ch = (ChannelHandler) transport.getContext();
+        ch.selected();
+    }
+
+    @Override
+    public void onConnectionLocalOpen(Event evt) {
+        Connection conn = evt.getConnection();
+        if (conn.getRemoteState() == EndpointState.UNINITIALIZED) {
+            try {
+                new Connector(conn);
+            } catch (IOException e) {
+                throw new RuntimeException(e);
+            }
+        }
+    }
+
+    private interface Selectable {
+        void selected() throws IOException;
+    }
+
+    private class Acceptor implements Selectable {
+
+        final private ServerSocketChannel socket;
+        final private SelectionKey key;
+
+        Acceptor(String host, int port) throws IOException {
+            socket = ServerSocketChannel.open();
+            socket.configureBlocking(false);
+            socket.bind(new InetSocketAddress(host, port));
+            socket.setOption(StandardSocketOptions.SO_REUSEADDR, true);
+            key = socket.register(selector, SelectionKey.OP_ACCEPT, this);
+        }
+
+        public void selected() throws IOException {
+            SocketChannel sock = socket.accept();
+            System.out.println("ACCEPTED: " + sock);
+            Connection conn = Connection.Factory.create();
+            conn.collect(collector);
+            Transport transport = Transport.Factory.create();
+            Sasl sasl = transport.sasl();
+            sasl.setMechanisms("ANONYMOUS");
+            sasl.server();
+            sasl.done(Sasl.PN_SASL_OK);
+            transport.bind(conn);
+            new ChannelHandler(sock, SelectionKey.OP_READ, transport);
+        }
+    }
+
+    private class ChannelHandler implements Selectable {
+
+        final SocketChannel socket;
+        final SelectionKey key;
+        final Transport transport;
+
+        ChannelHandler(SocketChannel socket, int ops, Transport transport) throws IOException {
+            this.socket = socket;
+            socket.configureBlocking(false);
+            key = socket.register(selector, ops, this);
+            this.transport = transport;
+            transport.setContext(this);
+        }
+
+        boolean update() {
+            if (socket.isConnected()) {
+                int c = transport.capacity();
+                int p = transport.pending();
+                if (key.isValid()) {
+                    key.interestOps((c != 0 ? SelectionKey.OP_READ : 0) |
+                                    (p > 0 ? SelectionKey.OP_WRITE : 0));
+                }
+                if (c < 0 && p < 0) {
+                    return true;
+                } else {
+                    return false;
+                }
+            } else {
+                return false;
+            }
+        }
+
+        public void selected() {
+            if (!key.isValid()) { return; }
+
+            try {
+                if (key.isConnectable()) {
+                    System.out.println("CONNECTED: " + socket);
+                    socket.finishConnect();
+                }
+
+                if (key.isReadable()) {
+                    int c = transport.capacity();
+                    if (c > 0) {
+                        ByteBuffer tail = transport.tail();
+                        int n = socket.read(tail);
+                        if (n > 0) {
+                            try {
+                                transport.process();
+                            } catch (TransportException e) {
+                                e.printStackTrace();
+                            }
+                        } else if (n < 0) {
+                            transport.close_tail();
+                        }
+                    }
+                }
+
+                if (key.isWritable()) {
+                    int p = transport.pending();
+                    if (p > 0) {
+                        ByteBuffer head = transport.head();
+                        int n = socket.write(head);
+                        if (n > 0) {
+                            transport.pop(n);
+                        } else if (n < 0) {
+                            transport.close_head();
+                        }
+                    }
+                }
+
+                if (update()) {
+                    transport.unbind();
+                    System.out.println("CLOSING: " + socket);
+                    socket.close();
+                }
+            } catch (IOException e) {
+                transport.unbind();
+                System.out.println(String.format("CLOSING(%s): %s", e, socket));
+                try {
+                    socket.close();
+                } catch (IOException e2) {
+                    throw new RuntimeException(e2);
+                }
+            }
+
+        }
+
+    }
+
+    private static Transport makeTransport(Connection conn) {
+        Transport transport = Transport.Factory.create();
+        Sasl sasl = transport.sasl();
+        sasl.setMechanisms("ANONYMOUS");
+        sasl.client();
+        transport.bind(conn);
+        return transport;
+    }
+
+    private class Connector extends ChannelHandler {
+
+        Connector(Connection conn) throws IOException {
+            super(SocketChannel.open(), SelectionKey.OP_CONNECT, makeTransport(conn));
+            System.out.println("CONNECTING: " + conn.getHostname());
+            socket.connect(new InetSocketAddress(conn.getHostname(), 5672));
+        }
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/6ca98f5b/examples/engine/java/src/main/java/org/apache/qpid/proton/examples/FlowController.java
----------------------------------------------------------------------
diff --git a/examples/engine/java/src/main/java/org/apache/qpid/proton/examples/FlowController.java b/examples/engine/java/src/main/java/org/apache/qpid/proton/examples/FlowController.java
new file mode 100644
index 0000000..d22a637
--- /dev/null
+++ b/examples/engine/java/src/main/java/org/apache/qpid/proton/examples/FlowController.java
@@ -0,0 +1,80 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.proton.examples;
+
+import org.apache.qpid.proton.engine.BaseHandler;
+import org.apache.qpid.proton.engine.Delivery;
+import org.apache.qpid.proton.engine.Event;
+import org.apache.qpid.proton.engine.Link;
+import org.apache.qpid.proton.engine.Receiver;
+
+/**
+ * FlowController
+ *
+ */
+
+public class FlowController extends BaseHandler
+{
+
+    final private int window;
+
+    public FlowController(int window) {
+        this.window = window;
+    }
+
+    private void topUp(Receiver rcv) {
+        int delta = window - rcv.getCredit();
+        rcv.flow(delta);
+    }
+
+    @Override
+    public void onLinkLocalOpen(Event evt) {
+        Link link = evt.getLink();
+        if (link instanceof Receiver) {
+            topUp((Receiver) link);
+        }
+    }
+
+    @Override
+    public void onLinkRemoteOpen(Event evt) {
+        Link link = evt.getLink();
+        if (link instanceof Receiver) {
+            topUp((Receiver) link);
+        }
+    }
+
+    @Override
+    public void onLinkFlow(Event evt) {
+        Link link = evt.getLink();
+        if (link instanceof Receiver) {
+            topUp((Receiver) link);
+        }
+    }
+
+    @Override
+    public void onDelivery(Event evt) {
+        Link link = evt.getLink();
+        if (link instanceof Receiver) {
+            topUp((Receiver) link);
+        }
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/6ca98f5b/examples/engine/java/src/main/java/org/apache/qpid/proton/examples/Handshaker.java
----------------------------------------------------------------------
diff --git a/examples/engine/java/src/main/java/org/apache/qpid/proton/examples/Handshaker.java b/examples/engine/java/src/main/java/org/apache/qpid/proton/examples/Handshaker.java
new file mode 100644
index 0000000..c53d0f8
--- /dev/null
+++ b/examples/engine/java/src/main/java/org/apache/qpid/proton/examples/Handshaker.java
@@ -0,0 +1,88 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.proton.examples;
+
+import org.apache.qpid.proton.engine.BaseHandler;
+import org.apache.qpid.proton.engine.Connection;
+import org.apache.qpid.proton.engine.EndpointState;
+import org.apache.qpid.proton.engine.Event;
+import org.apache.qpid.proton.engine.Link;
+import org.apache.qpid.proton.engine.Session;
+
+/**
+ * Handshaker
+ *
+ */
+
+public class Handshaker extends BaseHandler
+{
+
+    @Override
+    public void onConnectionRemoteOpen(Event evt) {
+        Connection conn = evt.getConnection();
+        if (conn.getLocalState() == EndpointState.UNINITIALIZED) {
+            conn.open();
+        }
+    }
+
+    @Override
+    public void onSessionRemoteOpen(Event evt) {
+        Session ssn = evt.getSession();
+        if (ssn.getLocalState() == EndpointState.UNINITIALIZED) {
+            ssn.open();
+        }
+    }
+
+    @Override
+    public void onLinkRemoteOpen(Event evt) {
+        Link link = evt.getLink();
+        if (link.getLocalState() == EndpointState.UNINITIALIZED) {
+            link.setSource(link.getRemoteSource());
+            link.setTarget(link.getRemoteTarget());
+            link.open();
+        }
+    }
+
+    @Override
+    public void onConnectionRemoteClose(Event evt) {
+        Connection conn = evt.getConnection();
+        if (conn.getLocalState() != EndpointState.CLOSED) {
+            conn.close();
+        }
+    }
+
+    @Override
+    public void onSessionRemoteClose(Event evt) {
+        Session ssn = evt.getSession();
+        if (ssn.getLocalState() != EndpointState.CLOSED) {
+            ssn.close();
+        }
+    }
+
+    @Override
+    public void onLinkRemoteClose(Event evt) {
+        Link link = evt.getLink();
+        if (link.getLocalState() != EndpointState.CLOSED) {
+            link.close();
+        }
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/6ca98f5b/examples/engine/java/src/main/java/org/apache/qpid/proton/examples/Message.java
----------------------------------------------------------------------
diff --git a/examples/engine/java/src/main/java/org/apache/qpid/proton/examples/Message.java b/examples/engine/java/src/main/java/org/apache/qpid/proton/examples/Message.java
new file mode 100644
index 0000000..b439f69
--- /dev/null
+++ b/examples/engine/java/src/main/java/org/apache/qpid/proton/examples/Message.java
@@ -0,0 +1,83 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.proton.examples;
+
+import java.nio.ByteBuffer;
+import java.util.Arrays;
+
+
+/**
+ * Message
+ *
+ */
+
+public class Message
+{
+    private final byte[] bytes;
+
+    /**
+     * These bytes are expected to be AMQP encoded.
+     */
+    public Message(byte[] bytes) {
+        this.bytes = bytes;
+    }
+
+    private static final byte[] PREFIX = {(byte)0x00, (byte)0x53, (byte)0x77, (byte)0xb1};
+
+    private static byte[] encodeString(String string) {
+        byte[] utf8 = string.getBytes();
+        byte[] result = new byte[PREFIX.length + 4 + utf8.length];
+        ByteBuffer bbuf = ByteBuffer.wrap(result);
+        bbuf.put(PREFIX);
+        bbuf.putInt(utf8.length);
+        bbuf.put(utf8);
+        return result;
+    }
+
+    public Message(String string) {
+        // XXX: special case string encoding for now
+        this(encodeString(string));
+    }
+
+    public byte[] getBytes() {
+        return bytes;
+    }
+
+    public String toString() {
+        StringBuilder bld = new StringBuilder();
+        bld.append("Message(");
+        for (byte b : bytes) {
+            if (b >= 32 && b < 127) {
+                bld.append((char) b);
+            } else {
+                bld.append("\\x");
+                String hex = Integer.toHexString(0xFF & b);
+                if (hex.length() < 2) {
+                    bld.append("0");
+                }
+                bld.append(hex);
+            }
+        }
+        bld.append(')');
+        return bld.toString();
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/6ca98f5b/examples/engine/java/src/main/java/org/apache/qpid/proton/examples/Pool.java
----------------------------------------------------------------------
diff --git a/examples/engine/java/src/main/java/org/apache/qpid/proton/examples/Pool.java b/examples/engine/java/src/main/java/org/apache/qpid/proton/examples/Pool.java
new file mode 100644
index 0000000..bb5bf86
--- /dev/null
+++ b/examples/engine/java/src/main/java/org/apache/qpid/proton/examples/Pool.java
@@ -0,0 +1,153 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.proton.examples;
+
+import org.apache.qpid.proton.engine.Collector;
+import org.apache.qpid.proton.engine.Connection;
+import org.apache.qpid.proton.engine.Event;
+import org.apache.qpid.proton.engine.Session;
+import org.apache.qpid.proton.engine.Link;
+import org.apache.qpid.proton.engine.Sender;
+import org.apache.qpid.proton.engine.Receiver;
+
+import org.apache.qpid.proton.amqp.messaging.Source;
+import org.apache.qpid.proton.amqp.messaging.Target;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * Pool
+ *
+ */
+
+public class Pool
+{
+
+    final private Collector collector;
+    final private Map<String,Connection> connections;
+
+    final private LinkConstructor<Sender> outgoingConstructor = new LinkConstructor<Sender> () {
+        public Sender create(Session ssn, String remote, String local) {
+            return newOutgoing(ssn, remote, local);
+        }
+    };
+    final private LinkConstructor<Receiver> incomingConstructor = new LinkConstructor<Receiver> () {
+        public Receiver create(Session ssn, String remote, String local) {
+            return newIncoming(ssn, remote, local);
+        }
+    };
+
+    final private LinkResolver<Sender> outgoingResolver;
+    final private LinkResolver<Receiver> incomingResolver;
+
+    public Pool(Collector collector, final Router router) {
+        this.collector = collector;
+        connections = new HashMap<String,Connection>();
+
+        if (router != null) {
+            outgoingResolver = new LinkResolver<Sender>() {
+                public Sender resolve(String address) {
+                    return router.getOutgoing(address).choose();
+                }
+            };
+            incomingResolver = new LinkResolver<Receiver>() {
+                public Receiver resolve(String address) {
+                    return router.getIncoming(address).choose();
+                }
+            };
+        } else {
+            outgoingResolver = new LinkResolver<Sender>() {
+                public Sender resolve(String address) { return null; }
+            };
+            incomingResolver = new LinkResolver<Receiver>() {
+                public Receiver resolve(String address) { return null; }
+            };
+        }
+    }
+
+    public Pool(Collector collector) {
+        this(collector, null);
+    }
+
+    private <T extends Link> T resolve(String remote, String local,
+                                       LinkResolver<T> resolver,
+                                       LinkConstructor<T> constructor) {
+        String host = remote.substring(2).split("/", 2)[0];
+        T link = resolver.resolve(remote);
+        if (link == null) {
+            Connection conn = connections.get(host);
+            if (conn == null) {
+                conn = Connection.Factory.create();
+                conn.collect(collector);
+                conn.setHostname(host);
+                conn.open();
+                connections.put(host, conn);
+            }
+
+            Session ssn = conn.session();
+            ssn.open();
+
+            link = constructor.create(ssn, remote, local);
+            link.open();
+        }
+        return link;
+    }
+
+    public Sender outgoing(String target, String source) {
+        return resolve(target, source, outgoingResolver, outgoingConstructor);
+    }
+
+    public Receiver incoming(String source, String target) {
+        return resolve(source, target, incomingResolver, incomingConstructor);
+    }
+
+    public Sender newOutgoing(Session ssn, String remote, String local) {
+        Sender snd = ssn.sender(String.format("%s-%s", local, remote));
+        Source src = new Source();
+        src.setAddress(local);
+        snd.setSource(src);
+        Target tgt = new Target();
+        tgt.setAddress(remote);
+        snd.setTarget(tgt);
+        return snd;
+    }
+
+    public Receiver newIncoming(Session ssn, String remote, String local) {
+        Receiver rcv = ssn.receiver(String.format("%s-%s", remote, local));
+        Source src = new Source();
+        src.setAddress(remote);
+        rcv.setSource(src);
+        Target tgt = new Target();
+        tgt.setAddress(remote);
+        rcv.setTarget(tgt);
+        return rcv;
+    }
+
+    public static interface LinkConstructor<T extends Link> {
+        T create(Session session, String remote, String local);
+    }
+
+    public static interface LinkResolver<T extends Link> {
+        T resolve(String remote);
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/6ca98f5b/examples/engine/java/src/main/java/org/apache/qpid/proton/examples/Router.java
----------------------------------------------------------------------
diff --git a/examples/engine/java/src/main/java/org/apache/qpid/proton/examples/Router.java b/examples/engine/java/src/main/java/org/apache/qpid/proton/examples/Router.java
new file mode 100644
index 0000000..873f16c
--- /dev/null
+++ b/examples/engine/java/src/main/java/org/apache/qpid/proton/examples/Router.java
@@ -0,0 +1,191 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.proton.examples;
+
+import org.apache.qpid.proton.amqp.transport.Source;
+import org.apache.qpid.proton.amqp.transport.Target;
+import org.apache.qpid.proton.engine.BaseHandler;
+import org.apache.qpid.proton.engine.Event;
+import org.apache.qpid.proton.engine.Link;
+import org.apache.qpid.proton.engine.Receiver;
+import org.apache.qpid.proton.engine.Sender;
+
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.ThreadLocalRandom;
+
+
+/**
+ * Router
+ *
+ */
+
+public class Router extends BaseHandler
+{
+
+    public static class Routes<T extends Link> {
+
+        List<T> routes = new ArrayList<T>();
+
+        void add(T route) {
+            routes.add(route);
+        }
+
+        void remove(T route) {
+            routes.remove(route);
+        }
+
+        int size() {
+            return routes.size();
+        }
+
+        public T choose() {
+            if (routes.isEmpty()) { return null; }
+            ThreadLocalRandom rand = ThreadLocalRandom.current();
+            int idx = rand.nextInt(0, routes.size());
+            return routes.get(idx);
+        }
+
+    }
+
+    private static final Routes<Sender> EMPTY_OUT = new Routes<Sender>();
+    private static final Routes<Receiver> EMPTY_IN = new Routes<Receiver>();
+
+    final private Map<String,Routes<Sender>> outgoing = new HashMap<String,Routes<Sender>>();
+    final private Map<String,Routes<Receiver>> incoming = new HashMap<String,Routes<Receiver>>();
+
+    public Router() {}
+
+    private String getAddress(Source source) {
+        if (source == null) {
+            return null;
+        } else {
+            return source.getAddress();
+        }
+    }
+
+    private String getAddress(Target target) {
+        if (target == null) {
+            return null;
+        } else {
+            return target.getAddress();
+        }
+    }
+
+    public String getAddress(Sender snd) {
+        String source = getAddress(snd.getSource());
+        String target = getAddress(snd.getTarget());
+        return source != null ? source : target;
+    }
+
+    public String getAddress(Receiver rcv) {
+        return getAddress(rcv.getTarget());
+    }
+
+    public Routes<Sender> getOutgoing(String address) {
+        Routes<Sender> routes = outgoing.get(address);
+        if (routes == null) { return EMPTY_OUT; }
+        return routes;
+    }
+
+    public Routes<Receiver> getIncoming(String address) {
+        Routes<Receiver> routes = incoming.get(address);
+        if (routes == null) { return EMPTY_IN; }
+        return routes;
+    }
+
+    private void add(Sender snd) {
+        String address = getAddress(snd);
+        Routes<Sender> routes = outgoing.get(address);
+        if (routes == null) {
+            routes = new Routes<Sender>();
+            outgoing.put(address, routes);
+        }
+        routes.add(snd);
+    }
+
+    private void remove(Sender snd) {
+        String address = getAddress(snd);
+        Routes<Sender> routes = outgoing.get(address);
+        if (routes != null) {
+            routes.remove(snd);
+            if (routes.size() == 0) {
+                outgoing.remove(address);
+            }
+        }
+    }
+
+    private void add(Receiver rcv) {
+        String address = getAddress(rcv);
+        Routes<Receiver> routes = incoming.get(address);
+        if (routes == null) {
+            routes = new Routes<Receiver>();
+            incoming.put(address, routes);
+        }
+        routes.add(rcv);
+    }
+
+    private void remove(Receiver rcv) {
+        String address = getAddress(rcv);
+        Routes<Receiver> routes = incoming.get(address);
+        if (routes != null) {
+            routes.remove(rcv);
+            if (routes.size() == 0) {
+                incoming.remove(address);
+            }
+        }
+    }
+
+    private void add(Link link) {
+        if (link instanceof Sender) {
+            add((Sender) link);
+        } else {
+            add((Receiver) link);
+        }
+    }
+
+    private void remove(Link link) {
+        if (link instanceof Sender) {
+            remove((Sender) link);
+        } else {
+            remove((Receiver) link);
+        }
+    }
+
+    @Override
+    public void onLinkLocalOpen(Event evt) {
+        add(evt.getLink());
+    }
+
+    @Override
+    public void onLinkLocalClose(Event evt) {
+        remove(evt.getLink());
+    }
+
+    @Override
+    public void onLinkFinal(Event evt) {
+        remove(evt.getLink());
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/6ca98f5b/examples/engine/java/src/main/java/org/apache/qpid/proton/examples/Server.java
----------------------------------------------------------------------
diff --git a/examples/engine/java/src/main/java/org/apache/qpid/proton/examples/Server.java b/examples/engine/java/src/main/java/org/apache/qpid/proton/examples/Server.java
new file mode 100644
index 0000000..3e00bd5
--- /dev/null
+++ b/examples/engine/java/src/main/java/org/apache/qpid/proton/examples/Server.java
@@ -0,0 +1,179 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.proton.examples;
+
+import org.apache.qpid.proton.amqp.messaging.Accepted;
+import org.apache.qpid.proton.engine.BaseHandler;
+import org.apache.qpid.proton.engine.Collector;
+import org.apache.qpid.proton.engine.Delivery;
+import org.apache.qpid.proton.engine.Event;
+import org.apache.qpid.proton.engine.Link;
+import org.apache.qpid.proton.engine.Receiver;
+import org.apache.qpid.proton.engine.Sender;
+
+import java.io.IOException;
+
+import java.util.ArrayDeque;
+import java.util.ArrayList;
+import java.util.Deque;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Server
+ *
+ */
+
+public class Server extends BaseHandler
+{
+
+    private class MessageStore {
+
+        Map<String,Deque<Message>> messages = new HashMap<String,Deque<Message>>();
+
+        void put(String address, Message message) {
+            Deque<Message> queue = messages.get(address);
+            if (queue == null) {
+                queue = new ArrayDeque<Message>();
+                messages.put(address, queue);
+            }
+            queue.add(message);
+        }
+
+        Message get(String address) {
+            Deque<Message> queue = messages.get(address);
+            if (queue == null) { return null; }
+            Message msg = queue.remove();
+            if (queue.isEmpty()) {
+                messages.remove(address);
+            }
+            return msg;
+        }
+
+    }
+
+    final private MessageStore messages = new MessageStore();
+    final private Router router;
+    private boolean quiet;
+    private int tag = 0;
+
+    public Server(Router router, boolean quiet) {
+        this.router = router;
+        this.quiet = quiet;
+    }
+
+    private byte[] nextTag() {
+        return String.format("%s", tag++).getBytes();
+    }
+
+    private int send(String address) {
+        return send(address, null);
+    }
+
+    private int send(String address, Sender snd) {
+        if (snd == null) {
+            Router.Routes<Sender> routes = router.getOutgoing(address);
+            snd = routes.choose();
+            if (snd == null) {
+                return 0;
+            }
+        }
+
+        int count = 0;
+        while (snd.getCredit() > 0 && snd.getQueued() < 1024) {
+            Message msg = messages.get(address);
+            if (msg == null) {
+                snd.drained();
+                return count;
+            }
+            Delivery dlv = snd.delivery(nextTag());
+            byte[] bytes = msg.getBytes();
+            snd.send(bytes, 0, bytes.length);
+            dlv.settle();
+            count++;
+            if (!quiet) {
+                System.out.println(String.format("Sent message(%s): %s", address, msg));
+            }
+        }
+
+        return count;
+    }
+
+    @Override
+    public void onLinkFlow(Event evt) {
+        Link link = evt.getLink();
+        if (link instanceof Sender) {
+            Sender snd = (Sender) link;
+            send(router.getAddress(snd), snd);
+        }
+    }
+
+    @Override
+    public void onDelivery(Event evt) {
+        Delivery dlv = evt.getDelivery();
+        Link link = dlv.getLink();
+        if (link instanceof Sender) {
+            dlv.settle();
+        } else {
+            Receiver rcv = (Receiver) link;
+            if (!dlv.isPartial()) {
+                byte[] bytes = new byte[dlv.pending()];
+                rcv.recv(bytes, 0, bytes.length);
+                String address = router.getAddress(rcv);
+                Message message = new Message(bytes);
+                messages.put(address, message);
+                dlv.disposition(Accepted.getInstance());
+                dlv.settle();
+                if (!quiet) {
+                    System.out.println(String.format("Got message(%s): %s", address, message));
+                }
+                send(address);
+            }
+        }
+    }
+
+    public static final void main(String[] argv) throws IOException {
+        List<String> switches = new ArrayList<String>();
+        List<String> args = new ArrayList<String>();
+        for (String s : argv) {
+            if (s.startsWith("-")) {
+                switches.add(s);
+            } else {
+                args.add(s);
+            }
+        }
+
+        boolean quiet = switches.contains("-q");
+        String host = !args.isEmpty() && !Character.isDigit(args.get(0).charAt(0)) ?
+            args.remove(0) : "localhost";
+        int port = !args.isEmpty() ? Integer.parseInt(args.remove(0)) : 5672;
+
+        Collector collector = Collector.Factory.create();
+        Router router = new Router();
+        Driver driver = new Driver(collector, new Handshaker(),
+                                   new FlowController(1024), router,
+                                   new Server(router, quiet));
+        driver.listen(host, port);
+        driver.run();
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/6ca98f5b/examples/engine/java/src/main/java/org/apache/qpid/proton/examples/Spout.java
----------------------------------------------------------------------
diff --git a/examples/engine/java/src/main/java/org/apache/qpid/proton/examples/Spout.java b/examples/engine/java/src/main/java/org/apache/qpid/proton/examples/Spout.java
new file mode 100644
index 0000000..1d70aca
--- /dev/null
+++ b/examples/engine/java/src/main/java/org/apache/qpid/proton/examples/Spout.java
@@ -0,0 +1,116 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.proton.examples;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.qpid.proton.engine.BaseHandler;
+import org.apache.qpid.proton.engine.Collector;
+import org.apache.qpid.proton.engine.Connection;
+import org.apache.qpid.proton.engine.Delivery;
+import org.apache.qpid.proton.engine.Event;
+import org.apache.qpid.proton.engine.Link;
+import org.apache.qpid.proton.engine.Sender;
+
+public class Spout extends BaseHandler
+{
+    private int count;
+    private int sent;
+    private int settled;
+    private boolean quiet;
+
+    public Spout(int count, boolean quiet) {
+        this.count = count;
+        this.quiet = quiet;
+    }
+
+    @Override
+    public void onLinkFlow(Event evt) {
+        Link link = evt.getLink();
+        if (link instanceof Sender) {
+            Sender sender = (Sender) link;
+            while ((sent < count) && sender.getCredit() > 0) {
+                Delivery dlv = sender.delivery(String.format("spout-%s", sent).getBytes());
+
+                Message msg = new Message(String.format("Hello World! [%s]", sent));
+                byte[] bytes = msg.getBytes();
+                sender.send(bytes, 0, bytes.length);
+                sender.advance();
+
+                if (!quiet) {
+                    System.out.println(String.format("Sent %s to %s: %s", new String(dlv.getTag()),
+                                                     sender.getTarget().getAddress(), msg));
+                }
+                sent++;
+            }
+        }
+    }
+
+    @Override
+    public void onDelivery(Event evt) {
+        Delivery dlv = evt.getDelivery();
+        if (dlv.remotelySettled()) {
+            if (!quiet) {
+                System.out.println(String.format("Settled %s: %s", new String(dlv.getTag()), dlv.getRemoteState()));
+            }
+            dlv.settle();
+            settled++;
+        }
+
+        if (settled >= count) {
+            dlv.getLink().getSession().getConnection().close();
+        }
+    }
+
+    @Override
+    public void onConnectionRemoteClose(Event evt) {
+        System.out.println("settled: " + settled);
+    }
+
+    public static void main(String[] argv) throws Exception {
+        List<String> switches = new ArrayList<String>();
+        List<String> args = new ArrayList<String>();
+        for (String s : argv) {
+            if (s.startsWith("-")) {
+                switches.add(s);
+            } else {
+                args.add(s);
+            }
+        }
+
+        boolean quiet = switches.contains("-q");
+        String address = !args.isEmpty() && args.get(0).startsWith("/") ?
+            args.remove(0) : "//localhost";
+        int count = !args.isEmpty() ? Integer.parseInt(args.remove(0)) : 1;
+
+        Collector collector = Collector.Factory.create();
+
+        Spout spout = new Spout(count, quiet);
+
+        Driver driver = new Driver(collector, spout);
+
+        Pool pool = new Pool(collector);
+        pool.outgoing(address, null);
+
+        driver.run();
+    }
+}


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


[06/50] [abbrv] qpid-proton git commit: PROTON-465: Make FindPerlLibs work properly without Perl devel files

Posted by gs...@apache.org.
PROTON-465: Make FindPerlLibs work properly without Perl devel files

First, fixed the build environment to only use the Proton Perl CMake
module when the standard fails.

Second, fixed the Proton CMake module to spout an info message that the
Perl bindings won't be built when the development files aren't found.

git-svn-id: https://svn.apache.org/repos/asf/qpid/proton/trunk@1630545 13f79535-47bb-0310-9956-ffa450edef68


Project: http://git-wip-us.apache.org/repos/asf/qpid-proton/repo
Commit: http://git-wip-us.apache.org/repos/asf/qpid-proton/commit/a4ad5219
Tree: http://git-wip-us.apache.org/repos/asf/qpid-proton/tree/a4ad5219
Diff: http://git-wip-us.apache.org/repos/asf/qpid-proton/diff/a4ad5219

Branch: refs/heads/examples
Commit: a4ad5219d98b0e056a218c400e144159b27ec849
Parents: c575aed
Author: mcpierce <mc...@unknown>
Authored: Thu Oct 9 18:08:18 2014 +0000
Committer: mcpierce <mc...@unknown>
Committed: Thu Oct 9 18:08:18 2014 +0000

----------------------------------------------------------------------
 proton-c/bindings/CMakeLists.txt         |  3 +-
 tools/cmake/Modules/FindPerlLibs.cmake   | 73 ------------------------
 tools/cmake/Modules/ProtonFindPerl.cmake | 81 +++++++++++++++++++++++++++
 3 files changed, 82 insertions(+), 75 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/a4ad5219/proton-c/bindings/CMakeLists.txt
----------------------------------------------------------------------
diff --git a/proton-c/bindings/CMakeLists.txt b/proton-c/bindings/CMakeLists.txt
index b5e6fba..e996282 100644
--- a/proton-c/bindings/CMakeLists.txt
+++ b/proton-c/bindings/CMakeLists.txt
@@ -82,8 +82,7 @@ endif (PHP_CONFIG_EXE)
 mark_as_advanced (PHP_CONFIG_EXE)
 
 # Prerequisites for Perl:
-include(FindPerl)
-include(FindPerlLibs)
+include(ProtonFindPerl)
 if (PERLLIBS_FOUND)
   set (DEFAULT_PERL ON)
 endif (PERLLIBS_FOUND)

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/a4ad5219/tools/cmake/Modules/FindPerlLibs.cmake
----------------------------------------------------------------------
diff --git a/tools/cmake/Modules/FindPerlLibs.cmake b/tools/cmake/Modules/FindPerlLibs.cmake
deleted file mode 100644
index 0a1a061..0000000
--- a/tools/cmake/Modules/FindPerlLibs.cmake
+++ /dev/null
@@ -1,73 +0,0 @@
-# - Find Perl Libraries
-# This module searches for Perl libraries in the event that those files aren't
-# found by the default Cmake module.
-
-# include(${CMAKE_CURRENT_LIST_DIR}/FindPerlLibs.cmake)
-
-if(NOT PERLLIBS_FOUND)
-  MESSAGE ( STATUS "Trying alternative search for Perl" )
-
-  # taken from Cmake 2.8 FindPerlLibs.cmake
-  EXECUTE_PROCESS ( COMMAND ${PERL_EXECUTABLE}
-                     -V:installarchlib
-                     OUTPUT_VARIABLE PERL_ARCHLIB_OUTPUT_VARIABLE
-                     RESULT_VARIABLE PERL_ARCHLIB_RESULT_VARIABLE )
-
-  if (NOT PERL_ARCHLIB_RESULT_VARIABLE)
-    string(REGEX REPLACE "install[a-z]+='([^']+)'.*" "\\1" PERL_ARCHLIB ${PERL_ARCHLIB_OUTPUT_VARIABLE})
-    file(TO_CMAKE_PATH "${PERL_ARCHLIB}" PERL_ARCHLIB)
-  endif ( NOT PERL_ARCHLIB_RESULT_VARIABLE )
-
-  EXECUTE_PROCESS ( COMMAND ${PERL_EXECUTABLE}
-                    -MConfig -e "print \$Config{archlibexp}"
-                    OUTPUT_VARIABLE PERL_OUTPUT
-                    RESULT_VARIABLE PERL_RETURN_VALUE )
-
-  IF ( NOT PERL_RETURN_VALUE )
-    FIND_PATH ( PERL_INCLUDE_PATH perl.h ${PERL_OUTPUT}/CORE )
-  ENDIF ( NOT PERL_RETURN_VALUE )
-
-  # if either the library path is not found not set at all
-  # then do our own search
-  if ( NOT PERL_LIBRARY )
-    EXECUTE_PROCESS( COMMAND ${PERL_EXECUTABLE} -V:libperl
-                     OUTPUT_VARIABLE PERL_LIBRARY_OUTPUT
-                     RESULT_VARIABLE PERL_LIBRARY_RESULT )
-
-    IF ( NOT PERL_LIBRARY_RESULT )
-      string(REGEX REPLACE "libperl='([^']+)'.*" "\\1" PERL_POSSIBLE_LIBRARIES ${PERL_LIBRARY_OUTPUT})
-    ENDIF ( NOT PERL_LIBRARY_RESULT )
-
-    MESSAGE ( STATUS  "Looking for ${PERL_POSSIBLE_LIBRARIES}" )
-
-    find_file(PERL_LIBRARY
-      NAMES ${PERL_POSSIBLE_LIBRARIES}
-      PATHS /usr/lib
-            ${PERL_ARCHLIB}/CORE
-      )
-
-  endif ( NOT PERL_LIBRARY )
-
-  IF ( PERL_LIBRARY MATCHES .*-NOTFOUND OR NOT PERL_LIBRARY )
-      EXECUTE_PROCESS ( COMMAND ${PERL_EXECUTABLE}
-                        -MConfig -e "print \$Config{libperl}"
-                        OUTPUT_VARIABLE PERL_OUTPUT
-                        RESULT_VARIABLE PERL_RETURN_VALUE )
-
-      IF ( NOT PERL_RETURN_VALUE )
-        FIND_LIBRARY ( PERL_LIBRARY NAMES ${PERL_OUTPUT}
-                                    PATHS ${PERL_INCLUDE_PATH} )
-
-      ENDIF ( NOT PERL_RETURN_VALUE )
-  ENDIF ( PERL_LIBRARY MATCHES .*-NOTFOUND OR NOT PERL_LIBRARY )
-
-  IF ( PERL_LIBRARY )
-    MESSAGE ( STATUS "Found PerlLibs: ${PERL_LIBRARY}" )
-  ELSE()
-    MESSAGE ( STATUS "PerlLibs Not Found" )
-  ENDIF ( PERL_LIBRARY )
-
-  if (PERL_LIBRARY)
-    set (DEFAULT_PERL ON)
-  endif (PERL_LIBRARY)
-endif(NOT PERLLIBS_FOUND)

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/a4ad5219/tools/cmake/Modules/ProtonFindPerl.cmake
----------------------------------------------------------------------
diff --git a/tools/cmake/Modules/ProtonFindPerl.cmake b/tools/cmake/Modules/ProtonFindPerl.cmake
new file mode 100644
index 0000000..e2f3fef
--- /dev/null
+++ b/tools/cmake/Modules/ProtonFindPerl.cmake
@@ -0,0 +1,81 @@
+# - Find Perl Libraries
+# This module searches for Perl libraries in the event that those files aren't
+# found by the default Cmake module.
+
+# include(${CMAKE_CURRENT_LIST_DIR}/FindPerlLibs.cmake)
+
+include(FindPerl)
+include(FindPerlLibs)
+
+if(NOT PERLLIBS_FOUND)
+  MESSAGE ( STATUS "Trying alternative search for Perl" )
+
+  # taken from Cmake 2.8 FindPerlLibs.cmake
+  EXECUTE_PROCESS ( COMMAND ${PERL_EXECUTABLE}
+                     -V:installarchlib
+                     OUTPUT_VARIABLE PERL_ARCHLIB_OUTPUT_VARIABLE
+                     RESULT_VARIABLE PERL_ARCHLIB_RESULT_VARIABLE )
+
+  if (NOT PERL_ARCHLIB_RESULT_VARIABLE)
+    string(REGEX REPLACE "install[a-z]+='([^']+)'.*" "\\1" PERL_ARCHLIB ${PERL_ARCHLIB_OUTPUT_VARIABLE})
+    file(TO_CMAKE_PATH "${PERL_ARCHLIB}" PERL_ARCHLIB)
+  endif ( NOT PERL_ARCHLIB_RESULT_VARIABLE )
+
+  EXECUTE_PROCESS ( COMMAND ${PERL_EXECUTABLE}
+                    -MConfig -e "print \$Config{archlibexp}"
+                    OUTPUT_VARIABLE PERL_OUTPUT
+                    RESULT_VARIABLE PERL_RETURN_VALUE )
+
+  IF ( NOT PERL_RETURN_VALUE )
+    FIND_PATH ( PERL_INCLUDE_PATH perl.h ${PERL_OUTPUT}/CORE )
+
+    IF (PERL_INCLUDE_PATH MATCHES .*-NOTFOUND OR NOT PERL_INCLUDE_PATH)
+        MESSAGE(STATUS "Could not find perl.h")
+    ENDIF ()
+
+  ENDIF ( NOT PERL_RETURN_VALUE )
+
+  # if either the library path is not found not set at all
+  # then do our own search
+  if ( NOT PERL_LIBRARY )
+    EXECUTE_PROCESS( COMMAND ${PERL_EXECUTABLE} -V:libperl
+                     OUTPUT_VARIABLE PERL_LIBRARY_OUTPUT
+                     RESULT_VARIABLE PERL_LIBRARY_RESULT )
+
+    IF ( NOT PERL_LIBRARY_RESULT )
+      string(REGEX REPLACE "libperl='([^']+)'.*" "\\1" PERL_POSSIBLE_LIBRARIES ${PERL_LIBRARY_OUTPUT})
+    ENDIF ( NOT PERL_LIBRARY_RESULT )
+
+    MESSAGE ( STATUS  "Looking for ${PERL_POSSIBLE_LIBRARIES}" )
+
+    find_file(PERL_LIBRARY
+      NAMES ${PERL_POSSIBLE_LIBRARIES}
+      PATHS /usr/lib
+            ${PERL_ARCHLIB}/CORE
+      )
+
+  endif ( NOT PERL_LIBRARY )
+
+  IF ( PERL_LIBRARY MATCHES .*-NOTFOUND OR NOT PERL_LIBRARY )
+      EXECUTE_PROCESS ( COMMAND ${PERL_EXECUTABLE}
+                        -MConfig -e "print \$Config{libperl}"
+                        OUTPUT_VARIABLE PERL_OUTPUT
+                        RESULT_VARIABLE PERL_RETURN_VALUE )
+
+      IF ( NOT PERL_RETURN_VALUE )
+        FIND_LIBRARY ( PERL_LIBRARY NAMES ${PERL_OUTPUT}
+                                    PATHS ${PERL_INCLUDE_PATH} )
+
+      ENDIF ( NOT PERL_RETURN_VALUE )
+  ENDIF ( PERL_LIBRARY MATCHES .*-NOTFOUND OR NOT PERL_LIBRARY )
+
+  IF(PERL_LIBRARY MATCHES .*-NOTFOUND OR NOT PERL_LIBRARY OR
+     PERL_INCLUDE_PATH MATCHES .*-NOTFOUND OR NOT PERL_INCLUDE_PATH)
+    MESSAGE (STATUS "No Perl devel environment found - skipping Perl bindings")
+    SET (DEFAULT_PERL OFF)
+  ELSE()
+    MESSAGE ( STATUS "Found PerlLibs: ${PERL_LIBRARY}" )
+    SET (DEFAULT_PERL ON)
+  ENDIF()
+
+endif(NOT PERLLIBS_FOUND)


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