You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by ac...@apache.org on 2015/07/10 00:11:41 UTC

[01/50] qpid-proton git commit: PROTON-921: remove redundant definitions

Repository: qpid-proton
Updated Branches:
  refs/heads/cjansen-cpp-client 9d5bf7d77 -> 6498cf6d0


PROTON-921: remove redundant definitions


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

Branch: refs/heads/cjansen-cpp-client
Commit: f6460791a17853e3f2fc2f0dfd1b2aa2141fc3d1
Parents: ee43cbb
Author: Chuck Rolke <cr...@redhat.com>
Authored: Wed Jun 24 14:19:30 2015 -0400
Committer: Chuck Rolke <cr...@redhat.com>
Committed: Wed Jun 24 14:19:30 2015 -0400

----------------------------------------------------------------------
 proton-c/src/windows/io.c             | 1 -
 proton-c/src/windows/iocp.c           | 1 -
 proton-c/src/windows/selector.c       | 1 -
 proton-c/src/windows/write_pipeline.c | 1 -
 4 files changed, 4 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/f6460791/proton-c/src/windows/io.c
----------------------------------------------------------------------
diff --git a/proton-c/src/windows/io.c b/proton-c/src/windows/io.c
index ec7f95b..f912a27 100644
--- a/proton-c/src/windows/io.c
+++ b/proton-c/src/windows/io.c
@@ -29,7 +29,6 @@
 #include <winsock2.h>
 #include <mswsock.h>
 #include <Ws2tcpip.h>
-#define PN_WINAPI
 
 #include "platform.h"
 #include <proton/io.h>

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/f6460791/proton-c/src/windows/iocp.c
----------------------------------------------------------------------
diff --git a/proton-c/src/windows/iocp.c b/proton-c/src/windows/iocp.c
index 9cedd34..88ae973 100644
--- a/proton-c/src/windows/iocp.c
+++ b/proton-c/src/windows/iocp.c
@@ -28,7 +28,6 @@
 #include <winsock2.h>
 #include <mswsock.h>
 #include <Ws2tcpip.h>
-#define PN_WINAPI
 
 #include "platform.h"
 #include <proton/object.h>

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/f6460791/proton-c/src/windows/selector.c
----------------------------------------------------------------------
diff --git a/proton-c/src/windows/selector.c b/proton-c/src/windows/selector.c
index e22c428..f139aec 100644
--- a/proton-c/src/windows/selector.c
+++ b/proton-c/src/windows/selector.c
@@ -27,7 +27,6 @@
 #endif
 #include <winsock2.h>
 #include <Ws2tcpip.h>
-#define PN_WINAPI
 
 #include "platform.h"
 #include <proton/object.h>

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/f6460791/proton-c/src/windows/write_pipeline.c
----------------------------------------------------------------------
diff --git a/proton-c/src/windows/write_pipeline.c b/proton-c/src/windows/write_pipeline.c
index 438ba88..e14e714 100644
--- a/proton-c/src/windows/write_pipeline.c
+++ b/proton-c/src/windows/write_pipeline.c
@@ -35,7 +35,6 @@
 #endif
 #include <winsock2.h>
 #include <Ws2tcpip.h>
-#define PN_WINAPI
 
 #include "platform.h"
 #include <proton/object.h>


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


[30/50] qpid-proton git commit: wired in allowSkip

Posted by ac...@apache.org.
wired in allowSkip


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

Branch: refs/heads/cjansen-cpp-client
Commit: 940d843f36cb4cceb7f2a6bde8c5b78247392384
Parents: 1d8a0a4
Author: Rafael Schloming <rh...@alum.mit.edu>
Authored: Mon Jul 6 11:19:30 2015 -0400
Committer: Rafael Schloming <rh...@alum.mit.edu>
Committed: Mon Jul 6 11:19:30 2015 -0400

----------------------------------------------------------------------
 .../main/java/org/apache/qpid/proton/engine/impl/SaslImpl.java | 6 +++---
 proton-j/src/main/resources/csasl.py                           | 2 +-
 2 files changed, 4 insertions(+), 4 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/940d843f/proton-j/src/main/java/org/apache/qpid/proton/engine/impl/SaslImpl.java
----------------------------------------------------------------------
diff --git a/proton-j/src/main/java/org/apache/qpid/proton/engine/impl/SaslImpl.java b/proton-j/src/main/java/org/apache/qpid/proton/engine/impl/SaslImpl.java
index 6efb140..dc731dc 100644
--- a/proton-j/src/main/java/org/apache/qpid/proton/engine/impl/SaslImpl.java
+++ b/proton-j/src/main/java/org/apache/qpid/proton/engine/impl/SaslImpl.java
@@ -83,6 +83,7 @@ public class SaslImpl implements Sasl, SaslFrameBody.SaslFrameBodyHandler<Void>,
     private Symbol _chosenMechanism;
 
     private Role _role;
+    private boolean _allowSkip = true;
 
     /**
      * @param maxFrameSize the size of the input and output buffers
@@ -479,8 +480,7 @@ public class SaslImpl implements Sasl, SaslFrameBody.SaslFrameBodyHandler<Void>,
     @Override
     public void allowSkip(boolean allowSkip)
     {
-        //TODO: implement
-        throw new ProtonUnsupportedOperationException();
+        _allowSkip = allowSkip;
     }
 
     public TransportWrapper wrap(final TransportInput input, final TransportOutput output)
@@ -488,7 +488,7 @@ public class SaslImpl implements Sasl, SaslFrameBody.SaslFrameBodyHandler<Void>,
         return new SaslSniffer(new SaslTransportWrapper(input, output),
                                new PlainTransportWrapper(output, input)) {
             protected boolean isDeterminationMade() {
-                if (_role == Role.SERVER) {
+                if (_role == Role.SERVER && _allowSkip) {
                     return super.isDeterminationMade();
                 } else {
                     _selectedTransportWrapper = _wrapper1;

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/940d843f/proton-j/src/main/resources/csasl.py
----------------------------------------------------------------------
diff --git a/proton-j/src/main/resources/csasl.py b/proton-j/src/main/resources/csasl.py
index 5188f11..a5fe0a6 100644
--- a/proton-j/src/main/resources/csasl.py
+++ b/proton-j/src/main/resources/csasl.py
@@ -60,7 +60,7 @@ SASL_OUTCOMES_J2P = {
 }
 
 def pn_transport_require_auth(transport, require):
-  transport.impl.sasl().allowSkip(not require)
+  raise Skipped('Not supported in Proton-J')
 
 # TODO: Placeholders
 def pn_transport_is_authenticated(transport):


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


[11/50] qpid-proton git commit: PROTON-925: old line of code was initializing remote_channel_max to zero.

Posted by ac...@apache.org.
PROTON-925: old line of code was initializing remote_channel_max to zero.


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

Branch: refs/heads/cjansen-cpp-client
Commit: c78392f1901a9a4fa2a44005f78a085840b160b3
Parents: 2c383aa
Author: mgoulish <mi...@redhat.com>
Authored: Wed Jul 1 02:15:16 2015 -0400
Committer: mgoulish <mi...@redhat.com>
Committed: Wed Jul 1 02:15:16 2015 -0400

----------------------------------------------------------------------
 proton-c/src/transport/transport.c | 1 -
 1 file changed, 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/c78392f1/proton-c/src/transport/transport.c
----------------------------------------------------------------------
diff --git a/proton-c/src/transport/transport.c b/proton-c/src/transport/transport.c
index 4cf935b..2271f27 100644
--- a/proton-c/src/transport/transport.c
+++ b/proton-c/src/transport/transport.c
@@ -414,7 +414,6 @@ static void pn_transport_initialize(void *object)
   transport->local_channel_max  = PN_IMPL_CHANNEL_MAX;
   transport->channel_max        = transport->local_channel_max;
 
-  transport->remote_channel_max = 0;
   transport->local_idle_timeout = 0;
   transport->dead_remote_deadline = 0;
   transport->last_bytes_input = 0;


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


[24/50] qpid-proton git commit: PROTON-881: Tidy up proton-j reactor examples

Posted by ac...@apache.org.
PROTON-881: Tidy up proton-j reactor examples

Tidy up comments and more closely mirror the Python examples.


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

Branch: refs/heads/cjansen-cpp-client
Commit: 149725943f980241445b53ef9d6a6e97754af3fd
Parents: 2f8728a
Author: Adrian Preston <pr...@uk.ibm.com>
Authored: Wed Jul 1 01:22:55 2015 +0100
Committer: Rafael Schloming <rh...@alum.mit.edu>
Committed: Sun Jul 5 19:57:39 2015 -0400

----------------------------------------------------------------------
 .../apache/qpid/proton/example/reactor/Cat.java | 10 +++--
 .../proton/example/reactor/CountRandomly.java   |  1 +
 .../qpid/proton/example/reactor/Counter.java    |  7 +++-
 .../qpid/proton/example/reactor/Echo.java       | 14 +++++--
 .../proton/example/reactor/GlobalLogger.java    | 39 --------------------
 .../proton/example/reactor/GoodbyeWorld.java    |  6 +--
 .../qpid/proton/example/reactor/HelloWorld.java |  3 +-
 .../qpid/proton/example/reactor/README.md       | 31 ++++++++++++++++
 .../proton/example/reactor/ReactorLogger.java   | 34 -----------------
 .../qpid/proton/example/reactor/Recv.java       |  4 +-
 .../qpid/proton/example/reactor/Scheduling.java | 11 ++++++
 11 files changed, 71 insertions(+), 89 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/14972594/examples/java/reactor/src/main/java/org/apache/qpid/proton/example/reactor/Cat.java
----------------------------------------------------------------------
diff --git a/examples/java/reactor/src/main/java/org/apache/qpid/proton/example/reactor/Cat.java b/examples/java/reactor/src/main/java/org/apache/qpid/proton/example/reactor/Cat.java
index 7cc1df3..cb8ceca 100644
--- a/examples/java/reactor/src/main/java/org/apache/qpid/proton/example/reactor/Cat.java
+++ b/examples/java/reactor/src/main/java/org/apache/qpid/proton/example/reactor/Cat.java
@@ -38,14 +38,19 @@ public class Cat extends BaseHandler {
         @Override
         public void onSelectableInit(Event event) {
             Selectable selectable = event.getSelectable();
-            Reactor reactor = event.getReactor();
+            // We can configure a selectable with any SelectableChannel we want.
+            selectable.setChannel(channel);
+            // Ask to be notified when the channel is readable
             selectable.setReading(true);
-            reactor.update(selectable);
+            event.getReactor().update(selectable);
         }
 
         @Override
         public void onSelectableReadable(Event event) {
             Selectable selectable = event.getSelectable();
+
+            // The onSelectableReadable event tells us that there is data
+            // to be read, or the end of stream has been reached.
             SourceChannel channel = (SourceChannel)selectable.getChannel();
             ByteBuffer buffer = ByteBuffer.allocate(1024);
             try {
@@ -77,7 +82,6 @@ public class Cat extends BaseHandler {
     public void onReactorInit(Event event) {
         Reactor reactor = event.getReactor();
         Selectable selectable = reactor.selectable();
-        selectable.setChannel(channel);
         setHandler(selectable, new EchoHandler());
         reactor.update(selectable);
     }

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/14972594/examples/java/reactor/src/main/java/org/apache/qpid/proton/example/reactor/CountRandomly.java
----------------------------------------------------------------------
diff --git a/examples/java/reactor/src/main/java/org/apache/qpid/proton/example/reactor/CountRandomly.java b/examples/java/reactor/src/main/java/org/apache/qpid/proton/example/reactor/CountRandomly.java
index 0dcdf4a..9a5a0b4 100644
--- a/examples/java/reactor/src/main/java/org/apache/qpid/proton/example/reactor/CountRandomly.java
+++ b/examples/java/reactor/src/main/java/org/apache/qpid/proton/example/reactor/CountRandomly.java
@@ -55,6 +55,7 @@ public class CountRandomly extends BaseHandler {
             }
         }
 
+        // Provide a method to check for doneness
         private boolean done() {
             return count >= limit;
         }

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/14972594/examples/java/reactor/src/main/java/org/apache/qpid/proton/example/reactor/Counter.java
----------------------------------------------------------------------
diff --git a/examples/java/reactor/src/main/java/org/apache/qpid/proton/example/reactor/Counter.java b/examples/java/reactor/src/main/java/org/apache/qpid/proton/example/reactor/Counter.java
index a34038e..b05685a 100644
--- a/examples/java/reactor/src/main/java/org/apache/qpid/proton/example/reactor/Counter.java
+++ b/examples/java/reactor/src/main/java/org/apache/qpid/proton/example/reactor/Counter.java
@@ -45,6 +45,8 @@ public class Counter extends BaseHandler {
             count += 1;
             System.out.println(count);
             if (count < limit) {
+                // A recurring task can be accomplished by just scheduling
+                // another event.
                 event.getReactor().schedule(250, this);
             }
         }
@@ -57,8 +59,9 @@ public class Counter extends BaseHandler {
 
         // Note that unlike the previous scheduling example, we pass in
         // a separate object for the handler. This means that the timer
-        // event we just scheduled will not be seen by Program as it is
-        // being handled by the Counter instance we create.
+        // event we just scheduled will not be seen by the Counter
+        // implementation of BaseHandler as it is being handled by the
+        // CounterHandler instance we create.
         event.getReactor().schedule(250, new CounterHandler(10));
     }
 

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/14972594/examples/java/reactor/src/main/java/org/apache/qpid/proton/example/reactor/Echo.java
----------------------------------------------------------------------
diff --git a/examples/java/reactor/src/main/java/org/apache/qpid/proton/example/reactor/Echo.java b/examples/java/reactor/src/main/java/org/apache/qpid/proton/example/reactor/Echo.java
index e2b0807..852bf8e 100644
--- a/examples/java/reactor/src/main/java/org/apache/qpid/proton/example/reactor/Echo.java
+++ b/examples/java/reactor/src/main/java/org/apache/qpid/proton/example/reactor/Echo.java
@@ -37,14 +37,19 @@ public class Echo extends BaseHandler {
         @Override
         public void onSelectableInit(Event event) {
             Selectable selectable = event.getSelectable();
-            Reactor reactor = event.getReactor();
+            // We can configure a selectable with any SelectableChannel we want.
+            selectable.setChannel(channel);
+            // Ask to be notified when the channel is readable
             selectable.setReading(true);
-            reactor.update(selectable);
+            event.getReactor().update(selectable);
         }
 
         @Override
         public void onSelectableReadable(Event event) {
             Selectable selectable = event.getSelectable();
+
+            // The onSelectableReadable event tells us that there is data
+            // to be read, or the end of stream has been reached.
             SourceChannel channel = (SourceChannel)selectable.getChannel();
             ByteBuffer buffer = ByteBuffer.allocate(1024);
             try {
@@ -74,10 +79,13 @@ public class Echo extends BaseHandler {
 
     @Override
     public void onReactorInit(Event event) {
+        // Every selectable is a possible source of future events. Our
+        // selectable stays alive until it reads the end of stream
+        // marker. This will keep the whole reactor running until we
+        // type Control-D.
         System.out.println("Type whatever you want and then use Control-D to exit:");
         Reactor reactor = event.getReactor();
         Selectable selectable = reactor.selectable();
-        selectable.setChannel(channel);
         setHandler(selectable, new EchoHandler());
         reactor.update(selectable);
     }

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/14972594/examples/java/reactor/src/main/java/org/apache/qpid/proton/example/reactor/GlobalLogger.java
----------------------------------------------------------------------
diff --git a/examples/java/reactor/src/main/java/org/apache/qpid/proton/example/reactor/GlobalLogger.java b/examples/java/reactor/src/main/java/org/apache/qpid/proton/example/reactor/GlobalLogger.java
index 1bb3d3e..ec56bd5 100644
--- a/examples/java/reactor/src/main/java/org/apache/qpid/proton/example/reactor/GlobalLogger.java
+++ b/examples/java/reactor/src/main/java/org/apache/qpid/proton/example/reactor/GlobalLogger.java
@@ -28,45 +28,6 @@ import org.apache.qpid.proton.engine.BaseHandler;
 import org.apache.qpid.proton.engine.Event;
 import org.apache.qpid.proton.reactor.Reactor;
 
-/*
-# Not every event goes to the reactor's event handler. If we have a
-# separate handler for something like a scheduled task, then those
-# events aren't logged by the logger associated with the reactor's
-# handler. Sometimes this is useful if you don't want to see them, but
-# sometimes you want the global picture.
-
-class Logger:
-
-    def on_unhandled(self, name, event):
-        print "LOG:", name, event
-
-class Task:
-
-    def on_timer_task(self, event):
-        print "Mission accomplished!"
-
-class Program:
-
-    def on_reactor_init(self, event):
-        print "Hello, World!"
-        event.reactor.schedule(0, Task())
-
-    def on_reactor_final(self, event):
-        print "Goodbye, World!"
-
-r = Reactor(Program())
-
-# In addition to having a regular handler, the reactor also has a
-# global handler that sees every event. By adding the Logger to the
-# global handler instead of the regular handler, we can log every
-# single event that occurs in the system regardless of whether or not
-# there are specific handlers associated with the objects that are the
-# target of those events.
-r.global_handler.add(Logger())
-r.run()
-
- */
-
 // Not every event goes to the reactor's event handler. If we have a
 // separate handler for something like a scheduled task, then those
 // events aren't logged by the logger associated with the reactor's

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/14972594/examples/java/reactor/src/main/java/org/apache/qpid/proton/example/reactor/GoodbyeWorld.java
----------------------------------------------------------------------
diff --git a/examples/java/reactor/src/main/java/org/apache/qpid/proton/example/reactor/GoodbyeWorld.java b/examples/java/reactor/src/main/java/org/apache/qpid/proton/example/reactor/GoodbyeWorld.java
index b04273b..6a69ba1 100644
--- a/examples/java/reactor/src/main/java/org/apache/qpid/proton/example/reactor/GoodbyeWorld.java
+++ b/examples/java/reactor/src/main/java/org/apache/qpid/proton/example/reactor/GoodbyeWorld.java
@@ -28,13 +28,11 @@ import org.apache.qpid.proton.engine.BaseHandler;
 import org.apache.qpid.proton.engine.Event;
 import org.apache.qpid.proton.reactor.Reactor;
 
-// TODO: sort out docs!
 // So far the reactive hello-world doesn't look too different from a
-// regular old non-reactive hello-world. The on_reactor_init method can
+// regular old non-reactive hello-world. The onReactorInit method can
 // be used roughly as a 'main' method would. A program that only uses
 // that one event, however, isn't going to be very reactive. By using
 // other events, we can write a fully reactive program.
-
 public class GoodbyeWorld extends BaseHandler {
 
     // As before we handle the reactor init event.
@@ -46,7 +44,7 @@ public class GoodbyeWorld extends BaseHandler {
     // In addition to an initial event, the reactor also produces an
     // event when it is about to exit. This may not behave much
     // differently than just putting the goodbye print statement inside
-    // on_reactor_init, but as we grow our program, this piece of it
+    // onReactorInit, but as we grow our program, this piece of it
     // will always be what happens last, and will always happen
     // regardless of what other paths the main logic of our program
     // might take.

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/14972594/examples/java/reactor/src/main/java/org/apache/qpid/proton/example/reactor/HelloWorld.java
----------------------------------------------------------------------
diff --git a/examples/java/reactor/src/main/java/org/apache/qpid/proton/example/reactor/HelloWorld.java b/examples/java/reactor/src/main/java/org/apache/qpid/proton/example/reactor/HelloWorld.java
index 055d6df..39a36fb 100644
--- a/examples/java/reactor/src/main/java/org/apache/qpid/proton/example/reactor/HelloWorld.java
+++ b/examples/java/reactor/src/main/java/org/apache/qpid/proton/example/reactor/HelloWorld.java
@@ -28,7 +28,6 @@ import org.apache.qpid.proton.engine.BaseHandler;
 import org.apache.qpid.proton.engine.Event;
 import org.apache.qpid.proton.reactor.Reactor;
 
-// TODO: sort out docs!
 /*
  * The proton reactor provides a general purpose event processing
  * library for writing reactive programs. A reactive program is defined
@@ -49,7 +48,7 @@ public class HelloWorld extends BaseHandler {
     public static void main(String[] args) throws IOException {
 
         // When you construct a reactor, you can give it a handler that
-        // is used, by default.
+        // is used, by default, to receive events generated by the reactor.
         Reactor reactor = Proton.reactor(new HelloWorld());
 
         // When you call run, the reactor will process events. The reactor init

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/14972594/examples/java/reactor/src/main/java/org/apache/qpid/proton/example/reactor/README.md
----------------------------------------------------------------------
diff --git a/examples/java/reactor/src/main/java/org/apache/qpid/proton/example/reactor/README.md b/examples/java/reactor/src/main/java/org/apache/qpid/proton/example/reactor/README.md
new file mode 100644
index 0000000..73fbb87
--- /dev/null
+++ b/examples/java/reactor/src/main/java/org/apache/qpid/proton/example/reactor/README.md
@@ -0,0 +1,31 @@
+The examples in this directory provide a basic introduction to the
+proton reactor API and are best viewed in the order presented below.
+
+The examples contain comments that explain things in a tutorial-style
+manner. At some point soon this content will be pulled out into a
+proper tutorial that references the relevant code snippets from these
+examples. Until then please bear with this clumsy style of
+presentation.
+
+This API is present in Java and Python as well.  Most of these examples will
+transliterate into C in a fairly straightforward way.
+
+  - HelloWorld.java
+  - GoodbyeWorld.java
+
+  - Scheduling.java
+  - Counter.java
+  - CountRandomly.java
+
+  - Unhandled.java
+  - ReactorLogger.java
+  - GlobalLogger.java
+  - Delegates.java
+
+  - Handlers.java
+
+  - Echo.java
+  - Cat.java
+
+  - Send.java
+  - Recv.java

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/14972594/examples/java/reactor/src/main/java/org/apache/qpid/proton/example/reactor/ReactorLogger.java
----------------------------------------------------------------------
diff --git a/examples/java/reactor/src/main/java/org/apache/qpid/proton/example/reactor/ReactorLogger.java b/examples/java/reactor/src/main/java/org/apache/qpid/proton/example/reactor/ReactorLogger.java
index b4a8cba..31c7511 100644
--- a/examples/java/reactor/src/main/java/org/apache/qpid/proton/example/reactor/ReactorLogger.java
+++ b/examples/java/reactor/src/main/java/org/apache/qpid/proton/example/reactor/ReactorLogger.java
@@ -28,40 +28,6 @@ import org.apache.qpid.proton.engine.BaseHandler;
 import org.apache.qpid.proton.engine.Event;
 import org.apache.qpid.proton.reactor.Reactor;
 
-/*
-class Logger:
-
-    def on_unhandled(self, name, event):
-        print "LOG:", name, event
-
-class Program:
-
-    def on_reactor_init(self, event):
-        print "Hello, World!"
-
-    def on_reactor_final(self, event):
-        print "Goodbye, World!"
-
-# You can pass multiple handlers to a reactor when you construct it.
-# Each of these handlers will see every event the reactor sees. By
-# combining this with on_unhandled, you can log each event that goes
-# to the reactor.
-r = Reactor(Program(), Logger())
-r.run()
-
-# Note that if you wanted to add the logger later, you could also
-# write the above as below. All arguments to the reactor are just
-# added to the default handler for the reactor.
-
-def logging_enabled():
-    return False
-
-r = Reactor(Program())
-if logging_enabled():
-    r.handler.add(Logger())
-r.run()
-
- */
 public class ReactorLogger extends BaseHandler {
 
     public static class Logger extends BaseHandler {

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/14972594/examples/java/reactor/src/main/java/org/apache/qpid/proton/example/reactor/Recv.java
----------------------------------------------------------------------
diff --git a/examples/java/reactor/src/main/java/org/apache/qpid/proton/example/reactor/Recv.java b/examples/java/reactor/src/main/java/org/apache/qpid/proton/example/reactor/Recv.java
index a5c6291..96a348a 100644
--- a/examples/java/reactor/src/main/java/org/apache/qpid/proton/example/reactor/Recv.java
+++ b/examples/java/reactor/src/main/java/org/apache/qpid/proton/example/reactor/Recv.java
@@ -50,9 +50,9 @@ public class Recv extends BaseHandler {
             // There is an optional third argument to the Reactor.acceptor
             // call. Using it, we could supply a handler here that would
             // become the handler for all accepted connections. If we omit
-            // it, the reactor simply inherets all the connection events.
+            // it, the reactor simply inherits all the connection events.
         } catch(IOException ioException) {
-            ioException.printStackTrace();    // TODO: what is the right answer?
+            ioException.printStackTrace();
         }
     }
 

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/14972594/examples/java/reactor/src/main/java/org/apache/qpid/proton/example/reactor/Scheduling.java
----------------------------------------------------------------------
diff --git a/examples/java/reactor/src/main/java/org/apache/qpid/proton/example/reactor/Scheduling.java b/examples/java/reactor/src/main/java/org/apache/qpid/proton/example/reactor/Scheduling.java
index f304b74..3aed27a 100644
--- a/examples/java/reactor/src/main/java/org/apache/qpid/proton/example/reactor/Scheduling.java
+++ b/examples/java/reactor/src/main/java/org/apache/qpid/proton/example/reactor/Scheduling.java
@@ -37,7 +37,18 @@ public class Scheduling extends BaseHandler {
     public void onReactorInit(Event event) {
         startTime = System.currentTimeMillis();
         System.out.println("Hello, World!");
+
+        // We can schedule a task event for some point in the future.
+        // This will cause the reactor to stick around until it has a
+        // chance to process the event.
+
+        // The first argument is the delay. The second argument is the
+        // handler for the event. We are just using self for now, but
+        // we could pass in another object if we wanted.
         Task task = event.getReactor().schedule(1000, this);
+
+        // We can ignore the task if we want to, but we can also use it
+        // to pass stuff to the handler.
         task.attachments().set("key", String.class, "Yay");
     }
 


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


[20/50] qpid-proton git commit: PROTON-932: SSL platform notes

Posted by ac...@apache.org.
PROTON-932: SSL platform notes


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

Branch: refs/heads/cjansen-cpp-client
Commit: e4c99b936d776b16b482aa5ef1c2e34f3177620d
Parents: dcc09f1
Author: Clifford Jansen <cl...@apache.org>
Authored: Fri Jul 3 12:29:13 2015 -0700
Committer: Clifford Jansen <cl...@apache.org>
Committed: Fri Jul 3 12:29:13 2015 -0700

----------------------------------------------------------------------
 proton-c/src/ssl/PLATFORM_NOTES.md | 82 +++++++++++++++++++++++++++++++++
 1 file changed, 82 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/e4c99b93/proton-c/src/ssl/PLATFORM_NOTES.md
----------------------------------------------------------------------
diff --git a/proton-c/src/ssl/PLATFORM_NOTES.md b/proton-c/src/ssl/PLATFORM_NOTES.md
new file mode 100644
index 0000000..1c4c517
--- /dev/null
+++ b/proton-c/src/ssl/PLATFORM_NOTES.md
@@ -0,0 +1,82 @@
+Proton SSL/TLS implementations have platform dependent formats for specifying
+private and public key information.
+
+OpenSSL
+=======
+
+On OpenSSL (POSIX) based systems, certificates and their private keys are
+specified separately in two files: the public X509 certificate in PEM format
+and the password protected PKCS#8 encoded private key.
+
+  `pn_ssl_domain_set_credentials(path_to_public_x509.pem,  
+                path_to_private_pkcs8.pem, password_for_pkcs8)`
+
+
+A database of trusted Certificate Authority certificates may be specified as a
+path to a file or a directory.  In the former case, the file consists of one
+or more X509 certificates in PEM format concatenated together.  In the latter
+case, the directory contains a file for each X509 certificate in PEM format
+and indexed by (i.e. the file name is derived from) the X509 `-subject_hash`
+of the certificate's name.  See
+[here](https://www.openssl.org/docs/ssl/SSL_CTX_load_verify_locations.htm)
+for more details.
+
+
+SChannel
+========
+
+On SChannel (Windows) based systems, trust and identity certificates are
+stored in certificate stores, which may be file based or system/registry
+based.  The former are in PKCS#12 format and the latter are typically managed
+by the Microsoft graphical management console.  The public and private keys
+are stored together, except in the case of trusted authority certificates
+which only contain the public key information.
+
+To specify a certificate:
+
+  `pn_ssl_domain_set_credentials(store, certificate_friendly_name,  
+                 password_for_store)`
+
+File based stores are specified by their relative or absolute path names.
+Registry stores are specified by their names (which are case insensitive)
+preceded by "ss:" for "Current User" system stores or "lmss:" for "Local
+Machine" system stores.  Examples:
+
+  "ss:Personal" specifies the Personal store for the Current User.
+
+  "lmss:AMQP" specifies a registry store called "AMQP" for the Local Machine
+  context.
+
+  "ss:Root" specifies the Trusted Root Certificate Authorities store for the
+  Current User.
+
+If a store contains a single certificate, the friendly name is optional.  The
+password may be null in the case of a registry store that is not password
+protected.
+
+Trusted root certificates must be placed in a store that is not password
+protected.
+
+In the special case that the peer certificate chain being verified requires
+revocation checking, the trusted root certificate must be present in both the
+trust store specified to Proton and also in the Windows "Trusted Root
+Certificate Authorities" system store.  Such certificate chains are usually
+managed by a central corporate network administrator or by a recognized
+certificate authority in which case the trusted root is often already present
+in the system store.  This requirement can be worked around by creating a
+special purpose CA database for Proton that includes the target peer's
+certificate (making it trusted, with the caution that you must consider the
+security implications of bypassing the revocation check).
+
+Existing OpenSSL keys (say `xx_x509.pem` and `xx_private_key.pem`) can be
+converted to PKCS#12 by the command:
+
+  `openssl pkcs12 -export -out xx_windows.p12 -passin pass:password \  
+          -passout pass:password -inkey xx_private_key.pem -in xx_x509.pem \  
+          -name xx_friendlyname`
+
+To create a PKCS#12 trust store from a Certificate Authority's public X509
+certificate with an empty password:
+
+  `openssl pkcs12 -export -out trust_store.p12 -in ca-certificate.pem \  
+          -name ca-certificate -nokeys -passout pass:`


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


[26/50] qpid-proton git commit: PROTON-881: Make connect a non-blocking operation

Posted by ac...@apache.org.
PROTON-881: Make connect a non-blocking operation

Previously connecting was a blocking operation which meant that if the server
being connected to took a long time to accept the connection this blocked all
other work in an instance of the Reactor.

This commit makes connect a non-blocking operation, allowing the reactor to
continue processing other work while the connection is established (or not).

Unfortunately, I've not found a satisfactory way to test this behavior in the
test suite - because Java never blocks during connect if it is using the
loopback adapter.  Instead, to test the non-blocking connect code path, I had
to configure firewall rules to drop all packets sent to a particular port.


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

Branch: refs/heads/cjansen-cpp-client
Commit: e2d23691541b09f4efc59a32705a5306b179a0b0
Parents: 46edaeb
Author: Adrian Preston <pr...@uk.ibm.com>
Authored: Fri Jun 26 23:58:21 2015 +0100
Committer: Rafael Schloming <rh...@alum.mit.edu>
Committed: Sun Jul 5 19:57:39 2015 -0400

----------------------------------------------------------------------
 .../qpid/proton/reactor/impl/IOHandler.java     |  1 +
 .../qpid/proton/reactor/impl/SelectorImpl.java  | 70 ++++++++++++++++----
 .../apache/qpid/proton/reactor/ReactorTest.java | 30 +++++++++
 3 files changed, 89 insertions(+), 12 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/e2d23691/proton-j/src/main/java/org/apache/qpid/proton/reactor/impl/IOHandler.java
----------------------------------------------------------------------
diff --git a/proton-j/src/main/java/org/apache/qpid/proton/reactor/impl/IOHandler.java b/proton-j/src/main/java/org/apache/qpid/proton/reactor/impl/IOHandler.java
index f810742..39d840e 100644
--- a/proton-j/src/main/java/org/apache/qpid/proton/reactor/impl/IOHandler.java
+++ b/proton-j/src/main/java/org/apache/qpid/proton/reactor/impl/IOHandler.java
@@ -103,6 +103,7 @@ public class IOHandler extends BaseHandler {
         Socket socket = null;   // In this case, 'null' is the proton-j equivalent of PN_INVALID_SOCKET
         try {
             SocketChannel socketChannel = ((ReactorImpl)reactor).getIO().socketChannel();
+            socketChannel.configureBlocking(false);
             socketChannel.connect(new InetSocketAddress(hostname, port));
             socket = socketChannel.socket();
         } catch(IOException ioException) {

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/e2d23691/proton-j/src/main/java/org/apache/qpid/proton/reactor/impl/SelectorImpl.java
----------------------------------------------------------------------
diff --git a/proton-j/src/main/java/org/apache/qpid/proton/reactor/impl/SelectorImpl.java b/proton-j/src/main/java/org/apache/qpid/proton/reactor/impl/SelectorImpl.java
index 1145158..5ef74e7 100644
--- a/proton-j/src/main/java/org/apache/qpid/proton/reactor/impl/SelectorImpl.java
+++ b/proton-j/src/main/java/org/apache/qpid/proton/reactor/impl/SelectorImpl.java
@@ -24,9 +24,13 @@ package org.apache.qpid.proton.reactor.impl;
 import java.io.IOException;
 import java.nio.channels.SelectionKey;
 import java.nio.channels.ServerSocketChannel;
+import java.nio.channels.SocketChannel;
 import java.util.HashSet;
 import java.util.Iterator;
 
+import org.apache.qpid.proton.amqp.Symbol;
+import org.apache.qpid.proton.amqp.transport.ErrorCondition;
+import org.apache.qpid.proton.engine.Transport;
 import org.apache.qpid.proton.reactor.Selectable;
 import org.apache.qpid.proton.reactor.Selector;
 
@@ -59,14 +63,19 @@ class SelectorImpl implements Selector {
     public void update(Selectable selectable) {
         if (selectable.getChannel() != null) {
             int interestedOps = 0;
-            if (selectable.isReading()) {
-                if (selectable.getChannel() instanceof ServerSocketChannel) {
-                    interestedOps |= SelectionKey.OP_ACCEPT;
-                } else {
-                    interestedOps |= SelectionKey.OP_READ;
+            if (selectable.getChannel() instanceof SocketChannel &&
+                    ((SocketChannel)selectable.getChannel()).isConnectionPending()) {
+                interestedOps |= SelectionKey.OP_CONNECT;
+            } else {
+                if (selectable.isReading()) {
+                    if (selectable.getChannel() instanceof ServerSocketChannel) {
+                        interestedOps |= SelectionKey.OP_ACCEPT;
+                    } else {
+                        interestedOps |= SelectionKey.OP_READ;
+                    }
                 }
+                if (selectable.isWriting()) interestedOps |= SelectionKey.OP_WRITE;
             }
-            if (selectable.isWriting()) interestedOps |= SelectionKey.OP_WRITE;
             SelectionKey key = selectable.getChannel().keyFor(selector);
             key.interestOps(interestedOps);
         }
@@ -76,14 +85,18 @@ class SelectorImpl implements Selector {
     public void remove(Selectable selectable) {
         if (selectable.getChannel() != null) {
             SelectionKey key = selectable.getChannel().keyFor(selector);
-            key.cancel();
-            key.attach(null);
+            if (key != null) {
+                key.cancel();
+                key.attach(null);
+            }
         }
         selectables.remove(selectable);
     }
 
     @Override
     public void select(long timeout) throws IOException {
+
+        long now = System.currentTimeMillis();
         if (timeout > 0) {
             long deadline = 0;
             for (Selectable selectable : selectables) {    // TODO: this differs from the C code which requires a call to update() to make deadline changes take affect
@@ -94,7 +107,6 @@ class SelectorImpl implements Selector {
             }
 
             if (deadline > 0) {
-                long now = System.currentTimeMillis();
                 long delta = deadline - now;
                 if (delta < 0) {
                     timeout = 0;
@@ -104,17 +116,51 @@ class SelectorImpl implements Selector {
             }
         }
 
+        error.clear();
+
+        long awoken = 0;
         if (timeout > 0) {
-            selector.select(timeout);
+            long remainingTimeout = timeout;
+            while(remainingTimeout > 0) {
+                selector.select(remainingTimeout);
+                awoken = System.currentTimeMillis();
+
+                for (Iterator<SelectionKey> iterator = selector.selectedKeys().iterator(); iterator.hasNext();) {
+                    SelectionKey key = iterator.next();
+                    if (key.isConnectable()) {
+                        try {
+                            ((SocketChannel)key.channel()).finishConnect();
+                            update((Selectable)key.attachment());
+                        } catch(IOException ioException) {
+                            Selectable selectable = (Selectable)key.attachment();
+                            ErrorCondition condition = new ErrorCondition();
+                            condition.setCondition(Symbol.getSymbol("proton:io"));
+                            condition.setDescription(ioException.getMessage());
+                            Transport transport = selectable.getTransport();
+                            if (transport != null) {
+                                transport.setCondition(condition);
+                                transport.close_tail();
+                                transport.close_head();
+                                transport.pop(transport.pending());
+                            }
+                            error.add(selectable);
+                        }
+                        iterator.remove();
+                    }
+                }
+                if (!selector.selectedKeys().isEmpty()) {
+                    break;
+                }
+                remainingTimeout = remainingTimeout - (awoken - now);
+            }
         } else {
             selector.selectNow();
+            awoken = System.currentTimeMillis();
         }
-        long awoken = System.currentTimeMillis();
 
         readable.clear();
         writeable.clear();
         expired.clear();
-        error.clear();  // TODO: nothing ever gets put in here...
         for (SelectionKey key : selector.selectedKeys()) {
             Selectable selectable = (Selectable)key.attachment();
             if (key.isReadable()) readable.add(selectable);

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/e2d23691/proton-j/src/test/java/org/apache/qpid/proton/reactor/ReactorTest.java
----------------------------------------------------------------------
diff --git a/proton-j/src/test/java/org/apache/qpid/proton/reactor/ReactorTest.java b/proton-j/src/test/java/org/apache/qpid/proton/reactor/ReactorTest.java
index 61e2761..2d81666 100644
--- a/proton-j/src/test/java/org/apache/qpid/proton/reactor/ReactorTest.java
+++ b/proton-j/src/test/java/org/apache/qpid/proton/reactor/ReactorTest.java
@@ -29,6 +29,7 @@ import static org.junit.Assert.assertSame;
 import static org.junit.Assert.assertTrue;
 
 import java.io.IOException;
+import java.net.ServerSocket;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
@@ -563,4 +564,33 @@ public class ReactorTest {
         assertReactorRunBarfsOnHandler(reactor, expectedBarf, expectedHandler);
         reactor.free();
     }
+
+    @Test
+    public void connectionRefused() throws IOException {
+        final ServerSocket serverSocket = new ServerSocket(0, 0);
+
+        class ConnectionHandler extends TestHandler {
+            @Override
+            public void onConnectionInit(Event event) {
+                super.onConnectionInit(event);
+                Connection connection = event.getConnection();
+                connection.setHostname("127.0.0.1:" + serverSocket.getLocalPort());
+                connection.open();
+                try {
+                    serverSocket.close();
+                } catch(IOException e) {
+                    AssertionFailedError afe = new AssertionFailedError();
+                    afe.initCause(e);
+                    throw afe;
+                }
+            }
+        }
+        TestHandler connectionHandler = new ConnectionHandler();
+        reactor.connection(connectionHandler);
+        reactor.run();
+        reactor.free();
+        serverSocket.close();
+        connectionHandler.assertEvents(Type.CONNECTION_INIT, Type.CONNECTION_LOCAL_OPEN, Type.CONNECTION_BOUND, Type.TRANSPORT_ERROR, Type.TRANSPORT_TAIL_CLOSED,
+                Type.TRANSPORT_HEAD_CLOSED, Type.TRANSPORT_CLOSED, Type.CONNECTION_UNBOUND, Type.TRANSPORT);
+    }
 }


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


[34/50] qpid-proton git commit: NO-JIRA: Add missing CLASSPATH needed to run python tests in proton-c/CMakeLists.txt

Posted by ac...@apache.org.
NO-JIRA: Add missing CLASSPATH needed to run python tests in proton-c/CMakeLists.txt


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

Branch: refs/heads/cjansen-cpp-client
Commit: 89fca58f484ffbcb3e8baa8ef9d82964672d111f
Parents: d98868c
Author: Alan Conway <ac...@redhat.com>
Authored: Mon Jul 6 13:20:07 2015 -0400
Committer: Alan Conway <ac...@redhat.com>
Committed: Mon Jul 6 13:20:07 2015 -0400

----------------------------------------------------------------------
 proton-c/CMakeLists.txt | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/89fca58f/proton-c/CMakeLists.txt
----------------------------------------------------------------------
diff --git a/proton-c/CMakeLists.txt b/proton-c/CMakeLists.txt
index a3a98c2..72f8d6a 100644
--- a/proton-c/CMakeLists.txt
+++ b/proton-c/CMakeLists.txt
@@ -494,8 +494,10 @@ if (BUILD_PYTHON)
   to_native_path ("${py_pythonpath}" py_pythonpath)
   add_test (NAME python-test
             COMMAND ${env_py}
-	             "PATH=${py_path}" "PYTHONPATH=${py_pythonpath}" "PKG_CONFIG_PATH=${pn_c_root}" ${VALGRIND_ENV}
-                    ${PYTHON_EXECUTABLE} "${py_root}/proton-test")
+	    "PATH=${py_path}" "PYTHONPATH=${py_pythonpath}" "PKG_CONFIG_PATH=${pn_c_root}"
+            "CLASSPATH=${CMAKE_BINARY_DIR}/proton-j/proton-j.jar"
+            ${VALGRIND_ENV}
+            ${PYTHON_EXECUTABLE} "${py_root}/proton-test")
   set_tests_properties(python-test PROPERTIES PASS_REGULAR_EXPRESSION "Totals: .* 0 failed")
   else (NOT OLD_ADD_TEST_COMMAND)
   list (APPEND py_path "${Proton_BINARY_DIR}/tests/tools/apps/c")


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


[21/50] qpid-proton git commit: Merge branch 'proton-j-reactor'

Posted by ac...@apache.org.
Merge branch 'proton-j-reactor'


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

Branch: refs/heads/cjansen-cpp-client
Commit: 92eb75e8d53726642c5cfcde90f3a6b9e6e1c402
Parents: e4c99b9 cd42324
Author: Rafael Schloming <rh...@alum.mit.edu>
Authored: Sun Jul 5 19:32:49 2015 -0400
Committer: Rafael Schloming <rh...@alum.mit.edu>
Committed: Sun Jul 5 19:32:49 2015 -0400

----------------------------------------------------------------------
 examples/java/reactor/.gitignore                |   1 +
 examples/java/reactor/README.md                 |  55 ++
 examples/java/reactor/pom.xml                   |  41 ++
 examples/java/reactor/run                       |   4 +
 .../apache/qpid/proton/example/reactor/Cat.java |  95 ++++
 .../proton/example/reactor/CountRandomly.java   | 104 ++++
 .../qpid/proton/example/reactor/Counter.java    |  81 +++
 .../qpid/proton/example/reactor/Delegates.java  |  68 +++
 .../qpid/proton/example/reactor/Echo.java       |  90 +++
 .../example/reactor/EchoInputStreamWrapper.java |  76 +++
 .../proton/example/reactor/GlobalLogger.java    | 114 ++++
 .../proton/example/reactor/GoodbyeWorld.java    |  62 ++
 .../qpid/proton/example/reactor/HelloWorld.java |  60 ++
 .../proton/example/reactor/ReactorLogger.java   | 103 ++++
 .../qpid/proton/example/reactor/Recv.java       |  79 +++
 .../qpid/proton/example/reactor/Scheduling.java |  60 ++
 .../qpid/proton/example/reactor/Send.java       | 142 +++++
 .../qpid/proton/example/reactor/Unhandled.java  |  46 ++
 pom.xml                                         |   1 +
 proton-c/src/reactor/connection.c               |   2 +
 proton-c/src/tests/reactor.c                    |   8 +-
 proton-j/CMakeLists.txt                         |   2 +-
 .../java/org/apache/qpid/proton/Proton.java     |  20 +-
 .../apache/qpid/proton/engine/BaseHandler.java  |  45 ++
 .../apache/qpid/proton/engine/Collector.java    |   1 +
 .../apache/qpid/proton/engine/Connection.java   |   9 +-
 .../org/apache/qpid/proton/engine/Delivery.java |   2 +-
 .../org/apache/qpid/proton/engine/Endpoint.java |   3 +-
 .../org/apache/qpid/proton/engine/Event.java    |  14 +-
 .../apache/qpid/proton/engine/Extendable.java   |  34 ++
 .../org/apache/qpid/proton/engine/Handler.java  |  18 +
 .../qpid/proton/engine/HandlerException.java    |  39 ++
 .../org/apache/qpid/proton/engine/Link.java     |   2 +-
 .../org/apache/qpid/proton/engine/Record.java   |  36 ++
 .../qpid/proton/engine/impl/CollectorImpl.java  |  10 +-
 .../qpid/proton/engine/impl/ConnectionImpl.java |  32 +-
 .../qpid/proton/engine/impl/DeliveryImpl.java   |   7 +
 .../qpid/proton/engine/impl/EndpointImpl.java   |   7 +
 .../qpid/proton/engine/impl/EventImpl.java      | 296 +++++++---
 .../qpid/proton/engine/impl/LinkImpl.java       |  26 +-
 .../qpid/proton/engine/impl/RecordImpl.java     |  54 ++
 .../qpid/proton/engine/impl/SessionImpl.java    |  12 +-
 .../qpid/proton/engine/impl/TransportImpl.java  |  33 +-
 .../qpid/proton/message/impl/MessageImpl.java   |  20 +
 .../apache/qpid/proton/reactor/Acceptor.java    |  30 +
 .../qpid/proton/reactor/FlowController.java     |  72 +++
 .../apache/qpid/proton/reactor/Handshaker.java  |  72 +++
 .../org/apache/qpid/proton/reactor/Reactor.java |  96 ++++
 .../qpid/proton/reactor/ReactorChild.java       |  28 +
 .../apache/qpid/proton/reactor/Selectable.java  |  97 ++++
 .../apache/qpid/proton/reactor/Selector.java    |  43 ++
 .../org/apache/qpid/proton/reactor/Task.java    |  32 ++
 .../qpid/proton/reactor/impl/AcceptorImpl.java  | 138 +++++
 .../org/apache/qpid/proton/reactor/impl/IO.java |  44 ++
 .../qpid/proton/reactor/impl/IOHandler.java     | 342 +++++++++++
 .../apache/qpid/proton/reactor/impl/IOImpl.java |  52 ++
 .../qpid/proton/reactor/impl/ReactorImpl.java   | 427 ++++++++++++++
 .../reactor/impl/ReactorInternalException.java  |  44 ++
 .../proton/reactor/impl/SelectableImpl.java     | 252 +++++++++
 .../qpid/proton/reactor/impl/SelectorImpl.java  | 161 ++++++
 .../qpid/proton/reactor/impl/TaskImpl.java      |  76 +++
 .../apache/qpid/proton/reactor/impl/Timer.java  |  70 +++
 proton-j/src/main/resources/ccodec.py           |   2 +-
 proton-j/src/main/resources/cengine.py          |  27 +-
 proton-j/src/main/resources/chandlers.py        |  21 +-
 proton-j/src/main/resources/cmessage.py         |   3 +
 proton-j/src/main/resources/cobject.py          |  36 +-
 proton-j/src/main/resources/compat.py           |   8 +
 proton-j/src/main/resources/cproton.py          |   1 +
 proton-j/src/main/resources/creactor.py         |  68 ++-
 proton-j/src/main/resources/csasl.py            |   2 +-
 proton-j/src/main/resources/ctypes.py           |  21 +
 .../apache/qpid/proton/reactor/ReactorTest.java | 566 +++++++++++++++++++
 .../proton/reactor/impl/AcceptorImplTest.java   |  87 +++
 .../proton/reactor/impl/LeakTestReactor.java    | 118 ++++
 .../org/apache/qpid/proton/ProtonJInterop.java  | 203 +++++++
 tests/java/pythonTests.ignore                   |   1 +
 tests/python/proton_tests/__init__.py           |   1 +
 tests/python/proton_tests/reactor_interop.py    | 163 ++++++
 79 files changed, 5279 insertions(+), 139 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/92eb75e8/proton-j/src/main/java/org/apache/qpid/proton/engine/Link.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/92eb75e8/proton-j/src/main/java/org/apache/qpid/proton/engine/impl/LinkImpl.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/92eb75e8/proton-j/src/main/java/org/apache/qpid/proton/engine/impl/TransportImpl.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/92eb75e8/proton-j/src/main/resources/cengine.py
----------------------------------------------------------------------
diff --cc proton-j/src/main/resources/cengine.py
index 2d82bc4,5ecaaad..1e89220
--- a/proton-j/src/main/resources/cengine.py
+++ b/proton-j/src/main/resources/cengine.py
@@@ -868,11 -865,8 +865,11 @@@ class pn_transport_wrapper
  def pn_transport():
    return wrap(Proton.transport(), pn_transport_wrapper)
  
 +def pn_transport_get_pytracer(trans):
 +  raise Skipped()
 +
  def pn_transport_attachments(trans):
-   return trans.attachments
+   return trans.impl.attachments()
  
  def pn_transport_set_server(trans):
    trans.server = True;

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/92eb75e8/proton-j/src/main/resources/cmessage.py
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/92eb75e8/proton-j/src/main/resources/csasl.py
----------------------------------------------------------------------


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


[29/50] qpid-proton git commit: add the jython shim to the class path in the JythonTest launcher

Posted by ac...@apache.org.
add the jython shim to the class path in the JythonTest launcher


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

Branch: refs/heads/cjansen-cpp-client
Commit: 1d8a0a41ba0f0812808fcb3780a3aa59db4120ad
Parents: 23a4e3b
Author: Rafael Schloming <rh...@alum.mit.edu>
Authored: Mon Jul 6 08:47:06 2015 -0400
Committer: Rafael Schloming <rh...@alum.mit.edu>
Committed: Mon Jul 6 08:47:32 2015 -0400

----------------------------------------------------------------------
 tests/java/org/apache/qpid/proton/JythonTest.java | 14 ++++++++++++++
 tests/pom.xml                                     |  1 +
 2 files changed, 15 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/1d8a0a41/tests/java/org/apache/qpid/proton/JythonTest.java
----------------------------------------------------------------------
diff --git a/tests/java/org/apache/qpid/proton/JythonTest.java b/tests/java/org/apache/qpid/proton/JythonTest.java
index 9b979eb..ee9157e 100644
--- a/tests/java/org/apache/qpid/proton/JythonTest.java
+++ b/tests/java/org/apache/qpid/proton/JythonTest.java
@@ -46,6 +46,7 @@ public class JythonTest
 
     /* System properties expected to be defined in test/pom.xml */
     private static final String PROTON_JYTHON_BINDING = "protonJythonBinding";
+    private static final String PROTON_JYTHON_SHIM = "protonJythonShim";
     private static final String PROTON_JYTHON_TEST_ROOT = "protonJythonTestRoot";
     private static final String PROTON_JYTHON_TEST_SCRIPT = "protonJythonTestScript";
     private static final String PROTON_JYTHON_TESTS_XML_OUTPUT_DIRECTORY = "protonJythonTestXmlOutputDirectory";
@@ -67,12 +68,14 @@ public class JythonTest
     {
         String testScript = getJythonTestScript();
         String binding = getJythonBinding();
+        String shim = getJythonShim();
         String testRoot = getJythonTestRoot();
         String xmlReportFile = getOptionalXmlReportFilename();
         String ignoreFile = getOptionalIgnoreFile();
 
         PythonInterpreter interp = createInterpreterWithArgs(xmlReportFile, ignoreFile);
         interp.getSystemState().path.insert(0, new PyString(binding));
+        interp.getSystemState().path.insert(0, new PyString(shim));
         interp.getSystemState().path.insert(0, new PyString(testRoot));
 
         LOGGER.info("About to call Jython test script: '" + testScript
@@ -180,6 +183,17 @@ public class JythonTest
         return file.getAbsolutePath();
     }
 
+    private String getJythonShim() throws FileNotFoundException
+    {
+        String str = getNonNullSystemProperty(PROTON_JYTHON_SHIM, "System property '%s' must provide the location of the jythin shim");
+        File file = new File(str);
+        if (!file.isDirectory())
+        {
+            throw new FileNotFoundException("Shim location '" + file + "' should be a directory.");
+        }
+        return file.getAbsolutePath();
+    }
+
 
     private String getJythonTestRoot() throws FileNotFoundException
     {

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/1d8a0a41/tests/pom.xml
----------------------------------------------------------------------
diff --git a/tests/pom.xml b/tests/pom.xml
index 395f18c..11eba60 100644
--- a/tests/pom.xml
+++ b/tests/pom.xml
@@ -69,6 +69,7 @@ directory &lt;basedir&gt;/build/proton-c.</description>
             <protonJythonIgnoreFile>${basedir}/java/pythonTests.ignore</protonJythonIgnoreFile>
             <protonJythonTestRoot>${basedir}/python</protonJythonTestRoot>
             <protonJythonBinding>${basedir}/../proton-c/bindings/python</protonJythonBinding>
+            <protonJythonShim>${basedir}/../proton-j/src/main/resources</protonJythonShim>
             <protonJythonTestScript>${basedir}/python/proton-test</protonJythonTestScript>
             <protonJythonTestXmlOutputDirectory>${testReportOutputDirectory}</protonJythonTestXmlOutputDirectory>
             <java.util.logging.config.file>${project.build.outputDirectory}/logging.properties</java.util.logging.config.file>


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


[12/50] qpid-proton git commit: PROTON-911: Implemented encryption/decryption functionality for Cyrus SASL

Posted by ac...@apache.org.
PROTON-911: Implemented encryption/decryption functionality for Cyrus 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/395b23f5
Tree: http://git-wip-us.apache.org/repos/asf/qpid-proton/tree/395b23f5
Diff: http://git-wip-us.apache.org/repos/asf/qpid-proton/diff/395b23f5

Branch: refs/heads/cjansen-cpp-client
Commit: 395b23f5fee57d55ed7395723f560eefe3747c07
Parents: c78392f
Author: Andrew Stitcher <as...@apache.org>
Authored: Tue Jun 30 13:09:51 2015 -0400
Committer: Andrew Stitcher <as...@apache.org>
Committed: Wed Jul 1 14:29:46 2015 -0400

----------------------------------------------------------------------
 proton-c/src/config.h              |  8 ++-
 proton-c/src/sasl/cyrus_sasl.c     | 91 +++++++++++++++++++++++++++------
 proton-c/src/sasl/none_sasl.c      | 11 ++--
 proton-c/src/sasl/sasl-internal.h  |  6 ++-
 proton-c/src/sasl/sasl.c           | 57 +++++++++++++++++----
 proton-c/src/transport/transport.c |  2 +-
 6 files changed, 141 insertions(+), 34 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/395b23f5/proton-c/src/config.h
----------------------------------------------------------------------
diff --git a/proton-c/src/config.h b/proton-c/src/config.h
index 9bc5b27..5a2e7bc 100644
--- a/proton-c/src/config.h
+++ b/proton-c/src/config.h
@@ -21,6 +21,12 @@
 #ifndef  _PROTON_SRC_CONFIG_H 
 #define  _PROTON_SRC_CONFIG_H 
 
-#define TRANSPORT_INITIAL_FRAME_SIZE    (512) /* bytes */
+#ifndef PN_TRANSPORT_INITIAL_FRAME_SIZE
+# define PN_TRANSPORT_INITIAL_FRAME_SIZE (512) /* bytes */
+#endif
+
+#ifndef PN_SASL_MAX_BUFFSIZE
+# define PN_SASL_MAX_BUFFSIZE (32768) /* bytes */
+#endif
 
 #endif /*  _PROTON_SRC_CONFIG_H */

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/395b23f5/proton-c/src/sasl/cyrus_sasl.c
----------------------------------------------------------------------
diff --git a/proton-c/src/sasl/cyrus_sasl.c b/proton-c/src/sasl/cyrus_sasl.c
index cdcd0bf..b71a435 100644
--- a/proton-c/src/sasl/cyrus_sasl.c
+++ b/proton-c/src/sasl/cyrus_sasl.c
@@ -19,6 +19,7 @@
  *
  */
 
+#include "config.h"
 #include "sasl-internal.h"
 
 #include "engine/engine-internal.h"
@@ -125,7 +126,10 @@ bool pni_init_client(pn_transport_t* transport) {
     sasl_security_properties_t secprops = {0};
     secprops.security_flags =
     SASL_SEC_NOPLAINTEXT |
-    ( transport->auth_required ? SASL_SEC_NOANONYMOUS : 0 ) ;
+      ( transport->auth_required ? SASL_SEC_NOANONYMOUS : 0 ) ;
+    secprops.min_ssf = 0;
+    secprops.max_ssf = 2048;
+    secprops.maxbufsize = PN_SASL_MAX_BUFFSIZE;
 
     result = sasl_setprop(cyrus_conn, SASL_SEC_PROPS, &secprops);
     if (result!=SASL_OK) break;
@@ -256,6 +260,9 @@ bool pni_init_server(pn_transport_t* transport)
     secprops.security_flags =
       SASL_SEC_NOPLAINTEXT |
       ( transport->auth_required ? SASL_SEC_NOANONYMOUS : 0 ) ;
+    secprops.min_ssf = 0;
+    secprops.max_ssf = 2048;
+    secprops.maxbufsize = PN_SASL_MAX_BUFFSIZE;
 
     result = sasl_setprop(cyrus_conn, SASL_SEC_PROPS, &secprops);
     if (result!=SASL_OK) break;
@@ -369,31 +376,83 @@ void pni_process_response(pn_transport_t *transport, const pn_bytes_t *recv)
     pni_process_server_result(transport, result);
 }
 
-void pni_sasl_impl_free(pn_transport_t *transport)
+bool pni_sasl_impl_can_encrypt(pn_transport_t *transport)
 {
-    sasl_conn_t *cyrus_conn = (sasl_conn_t*)transport->sasl->impl_context;
-    sasl_dispose(&cyrus_conn);
-    transport->sasl->impl_context = cyrus_conn;
-    if (transport->sasl->client) {
-        sasl_client_done();
-    } else {
-        sasl_server_done();
-    }
+  if (!transport->sasl->impl_context) return false;
+
+  sasl_conn_t *cyrus_conn = (sasl_conn_t*)transport->sasl->impl_context;
+  // Get SSF to find out if we need to encrypt or not
+  const void* value;
+  int r = sasl_getprop(cyrus_conn, SASL_SSF, &value);
+  if (r != SASL_OK) {
+    // TODO: Should log an error here too, maybe assert here
+    return false;
+  }
+  int ssf = *(int *) value;
+  if (ssf > 0) {
+    pn_transport_logf(transport, "SASL Encryption enabled: ssf=%d", ssf);
+    return true;
+  }
+  return false;
 }
 
-bool pni_sasl_impl_can_encrypt(pn_transport_t *transport)
+ssize_t pni_sasl_impl_max_encrypt_size(pn_transport_t *transport)
 {
-  return false;
+  if (!transport->sasl->impl_context) return PN_ERR;
+
+  sasl_conn_t *cyrus_conn = (sasl_conn_t*)transport->sasl->impl_context;
+  const void* value;
+  int r = sasl_getprop(cyrus_conn, SASL_MAXOUTBUF, &value);
+  if (r != SASL_OK) {
+    // TODO: Should log an error here too, maybe assert here
+    return PN_ERR;
+  }
+  int outbuf_size = *(int *) value;
+  return outbuf_size;
+}
+
+ssize_t pni_sasl_impl_encode(pn_transport_t *transport, pn_bytes_t in, pn_bytes_t *out)
+{
+  if ( in.size==0 ) return 0;
+  sasl_conn_t *cyrus_conn = (sasl_conn_t*)transport->sasl->impl_context;
+  const char *output;
+  unsigned int outlen;
+  int r = sasl_encode(cyrus_conn, in.start, in.size, &output, &outlen);
+  if (outlen==0) return 0;
+  if ( r==SASL_OK ) {
+    *out = pn_bytes(outlen, output);
+    return outlen;
+  }
+  pn_transport_logf(transport, "SASL encode error: %s", sasl_errdetail(cyrus_conn));
+  return PN_ERR;
 }
 
-ssize_t pni_sasl_impl_encode(pn_transport_t *transport, pn_bytes_t in, pn_buffer_t *out)
+ssize_t pni_sasl_impl_decode(pn_transport_t *transport, pn_bytes_t in, pn_bytes_t *out)
 {
-  return 0;
+  if ( in.size==0 ) return 0;
+  sasl_conn_t *cyrus_conn = (sasl_conn_t*)transport->sasl->impl_context;
+  const char *output;
+  unsigned int outlen;
+  int r = sasl_decode(cyrus_conn, in.start, in.size, &output, &outlen);
+  if (outlen==0) return 0;
+  if ( r==SASL_OK ) {
+    *out = pn_bytes(outlen, output);
+    return outlen;
+  }
+  pn_transport_logf(transport, "SASL decode error: %s", sasl_errdetail(cyrus_conn));
+  return PN_ERR;
 }
 
-ssize_t pni_sasl_impl_decode(pn_transport_t *transport, pn_bytes_t in, pn_buffer_t *out)
+void pni_sasl_impl_free(pn_transport_t *transport)
 {
-  return 0;
+    sasl_conn_t *cyrus_conn = (sasl_conn_t*)transport->sasl->impl_context;
+    sasl_dispose(&cyrus_conn);
+    transport->sasl->impl_context = cyrus_conn;
+    if (transport->sasl->client) {
+        sasl_client_done();
+    } else {
+        sasl_server_done();
+    }
 }
 
 bool pn_sasl_extended(void)

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/395b23f5/proton-c/src/sasl/none_sasl.c
----------------------------------------------------------------------
diff --git a/proton-c/src/sasl/none_sasl.c b/proton-c/src/sasl/none_sasl.c
index ccb4818..7cbf8d4 100644
--- a/proton-c/src/sasl/none_sasl.c
+++ b/proton-c/src/sasl/none_sasl.c
@@ -174,15 +174,20 @@ void pni_process_response(pn_transport_t *transport, const pn_bytes_t *recv)
 
 bool pni_sasl_impl_can_encrypt(pn_transport_t *transport)
 {
-    return false;
+  return false;
+}
+
+ssize_t pni_sasl_impl_max_encrypt_size(pn_transport_t *transport)
+{
+  return 0;
 }
 
-ssize_t pni_sasl_impl_encode(pn_transport_t *transport, pn_bytes_t in, pn_buffer_t *out)
+ssize_t pni_sasl_impl_encode(pn_transport_t *transport, pn_bytes_t in, pn_bytes_t *out)
 {
   return 0;
 }
 
-ssize_t pni_sasl_impl_decode(pn_transport_t *transport, pn_bytes_t in, pn_buffer_t *out)
+ssize_t pni_sasl_impl_decode(pn_transport_t *transport, pn_bytes_t in, pn_bytes_t *out)
 {
   return 0;
 }

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/395b23f5/proton-c/src/sasl/sasl-internal.h
----------------------------------------------------------------------
diff --git a/proton-c/src/sasl/sasl-internal.h b/proton-c/src/sasl/sasl-internal.h
index fb40b9c..b81cf03 100644
--- a/proton-c/src/sasl/sasl-internal.h
+++ b/proton-c/src/sasl/sasl-internal.h
@@ -47,8 +47,9 @@ void pni_process_challenge(pn_transport_t *transport, const pn_bytes_t *recv);
 
 // Internal SASL security layer interface
 bool pni_sasl_impl_can_encrypt(pn_transport_t *transport);
-ssize_t pni_sasl_impl_encode(pn_transport_t *transport, pn_bytes_t in, pn_buffer_t *out);
-ssize_t pni_sasl_impl_decode(pn_transport_t *transport, pn_bytes_t in, pn_buffer_t *out);
+ssize_t pni_sasl_impl_max_encrypt_size(pn_transport_t *transport);
+ssize_t pni_sasl_impl_encode(pn_transport_t *transport, pn_bytes_t in, pn_bytes_t *out);
+ssize_t pni_sasl_impl_decode(pn_transport_t *transport, pn_bytes_t in, pn_bytes_t *out);
 
 
 // Shared SASL API used by the actual SASL authenticators
@@ -74,6 +75,7 @@ struct pni_sasl_t {
   const char *remote_fqdn;
   char *external_auth;
   int external_ssf;
+  size_t max_encrypt_size;
   pn_sasl_outcome_t outcome;
   pn_buffer_t* decoded_buffer;
   pn_buffer_t* encoded_buffer;

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/395b23f5/proton-c/src/sasl/sasl.c
----------------------------------------------------------------------
diff --git a/proton-c/src/sasl/sasl.c b/proton-c/src/sasl/sasl.c
index ac177c7..a7e02e8 100644
--- a/proton-c/src/sasl/sasl.c
+++ b/proton-c/src/sasl/sasl.c
@@ -281,10 +281,13 @@ static ssize_t pn_input_read_sasl(pn_transport_t* transport, unsigned int layer,
     return n;
   }
 
+  pni_sasl_t *sasl = transport->sasl;
   if (pni_sasl_impl_can_encrypt(transport)) {
     transport->io_layers[layer] = &sasl_encrypt_layer;
+    sasl->max_encrypt_size = pni_sasl_impl_max_encrypt_size(transport);
+    pn_transport_logf(transport, "SASL max buffer: %d", sasl->max_encrypt_size);
     return transport->io_layers[layer]->process_input(transport, layer, bytes, available);
-  } else if (transport->sasl->client) {
+  } else if (sasl->client) {
     transport->io_layers[layer] = &pni_passthru_layer;
   }
   return pni_passthru_layer.process_input(transport, layer, bytes, available );
@@ -293,11 +296,28 @@ static ssize_t pn_input_read_sasl(pn_transport_t* transport, unsigned int layer,
 static ssize_t pn_input_read_sasl_encrypt(pn_transport_t* transport, unsigned int layer, const char* bytes, size_t available)
 {
   pn_buffer_t *in = transport->sasl->decoded_buffer;
-  pni_sasl_impl_decode(transport, pn_bytes(available, bytes), in);
+  const size_t max_buffer = transport->sasl->max_encrypt_size;
+  for (size_t processed = 0; processed<available;) {
+    pn_bytes_t decoded = pn_bytes(0, NULL);
+    size_t decode_size = (available-processed)<=max_buffer?(available-processed):max_buffer;
+    ssize_t size = pni_sasl_impl_decode(transport, pn_bytes(decode_size, bytes+processed), &decoded);
+    if (size<0) return size;
+    if (size>0) {
+      size = pn_buffer_append(in, decoded.start, decoded.size);
+      if (size) return size;
+    }
+    processed += decode_size;
+  }
   pn_bytes_t decoded = pn_buffer_bytes(in);
-  ssize_t size = pni_passthru_layer.process_input(transport, layer, decoded.start, decoded.size );
-  pn_buffer_trim(in, size, 0);
-  return size;
+  size_t processed_size = 0;
+  while (processed_size < decoded.size) {
+    ssize_t size = pni_passthru_layer.process_input(transport, layer, decoded.start+processed_size, decoded.size-processed_size);
+    if (size==0) break;
+    if (size<0) return size;
+    pn_buffer_trim(in, size, 0);
+    processed_size += size;
+  }
+  return available;
 }
 
 static ssize_t pn_output_write_sasl_header(pn_transport_t *transport, unsigned int layer, char *bytes, size_t size)
@@ -316,26 +336,30 @@ static ssize_t pn_output_write_sasl_header(pn_transport_t *transport, unsigned i
 
 static ssize_t pn_output_write_sasl(pn_transport_t* transport, unsigned int layer, char* bytes, size_t available)
 {
+  pni_sasl_t *sasl = transport->sasl;
+
   // this accounts for when pn_do_error is invoked, e.g. by idle timeout
   if (!transport->close_sent) {
     pni_sasl_start_server_if_needed(transport);
 
     pni_post_sasl_frame(transport);
 
-    pni_sasl_t *sasl = transport->sasl;
     if (transport->available != 0 || !pni_sasl_is_final_output_state(sasl)) {
       return pn_dispatcher_output(transport, bytes, available);
     } else {
       if (sasl->outcome != PN_SASL_OK && pni_sasl_is_final_input_state(sasl)) {
         pn_transport_close_tail(transport);
+        return PN_EOS;
       }
     }
   }
 
   if (pni_sasl_impl_can_encrypt(transport)) {
     transport->io_layers[layer] = &sasl_encrypt_layer;
+    sasl->max_encrypt_size = pni_sasl_impl_max_encrypt_size(transport);
+    pn_transport_logf(transport, "SASL max buffer: %d", sasl->max_encrypt_size);
     return transport->io_layers[layer]->process_output(transport, layer, bytes, available);
-  } else if (!transport->sasl->client) {
+  } else if (!sasl->client) {
     transport->io_layers[layer] = &pni_passthru_layer;
   }
   return pni_passthru_layer.process_output(transport, layer, bytes, available );
@@ -343,12 +367,23 @@ static ssize_t pn_output_write_sasl(pn_transport_t* transport, unsigned int laye
 
 static ssize_t pn_output_write_sasl_encrypt(pn_transport_t* transport, unsigned int layer, char* bytes, size_t available)
 {
-  ssize_t size = pni_passthru_layer.process_output(transport, layer, bytes, available );
-  if (size<=0) return size;
+  ssize_t clear_size = pni_passthru_layer.process_output(transport, layer, bytes, available );
+  if (clear_size<0) return clear_size;
 
+  const ssize_t max_buffer = transport->sasl->max_encrypt_size;
   pn_buffer_t *out = transport->sasl->encoded_buffer;
-  pni_sasl_impl_encode(transport, pn_bytes(size, bytes), out);
-  size = pn_buffer_get(out, 0, available, bytes);
+  for (ssize_t processed = 0; processed<clear_size;) {
+    pn_bytes_t encoded = pn_bytes(0, NULL);
+    ssize_t encode_size = (clear_size-processed)<=max_buffer?(clear_size-processed):max_buffer;
+    size_t size = pni_sasl_impl_encode(transport, pn_bytes(encode_size, bytes+processed), &encoded);
+    if (size<0) return size;
+    if (size>0) {
+      size = pn_buffer_append(out, encoded.start, encoded.size);
+      if (size) return size;
+    }
+    processed += encode_size;
+  }
+  ssize_t size = pn_buffer_get(out, 0, available, bytes);
   pn_buffer_trim(out, size, 0);
   return size;
 }

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/395b23f5/proton-c/src/transport/transport.c
----------------------------------------------------------------------
diff --git a/proton-c/src/transport/transport.c b/proton-c/src/transport/transport.c
index 2271f27..a4b07c3 100644
--- a/proton-c/src/transport/transport.c
+++ b/proton-c/src/transport/transport.c
@@ -373,7 +373,7 @@ static void pn_transport_initialize(void *object)
   transport->scratch = pn_string(NULL);
   transport->args = pn_data(16);
   transport->output_args = pn_data(16);
-  transport->frame = pn_buffer(TRANSPORT_INITIAL_FRAME_SIZE);
+  transport->frame = pn_buffer(PN_TRANSPORT_INITIAL_FRAME_SIZE);
   transport->input_frames_ct = 0;
   transport->output_frames_ct = 0;
 


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


[03/50] qpid-proton git commit: PROTON-490: ensure new _compat.py is installed when using cmakes make install

Posted by ac...@apache.org.
PROTON-490: ensure new _compat.py is installed when using cmakes make install


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

Branch: refs/heads/cjansen-cpp-client
Commit: f2987949bbf409caf27996d7a8cb6242d7928bb0
Parents: 6e7e04d
Author: Gordon Sim <gs...@redhat.com>
Authored: Thu Jun 25 11:17:17 2015 +0100
Committer: Gordon Sim <gs...@redhat.com>
Committed: Thu Jun 25 11:17:17 2015 +0100

----------------------------------------------------------------------
 proton-c/bindings/python/CMakeLists.txt | 1 +
 1 file changed, 1 insertion(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/f2987949/proton-c/bindings/python/CMakeLists.txt
----------------------------------------------------------------------
diff --git a/proton-c/bindings/python/CMakeLists.txt b/proton-c/bindings/python/CMakeLists.txt
index 26fa171..83b393f 100644
--- a/proton-c/bindings/python/CMakeLists.txt
+++ b/proton-c/bindings/python/CMakeLists.txt
@@ -60,6 +60,7 @@ set (pysrc
     proton/reactor.py
     proton/utils.py
     proton/wrapper.py
+    proton/_compat.py
     )
 
 macro (py_compile directory files artifacts)


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


[44/50] qpid-proton git commit: Revert "PROTON-937: LinkImpl.localOpen() does not initialize source and target"

Posted by ac...@apache.org.
Revert "PROTON-937: LinkImpl.localOpen() does not initialize source and target"

This reverts commit f6d74a47d1f3f4ee3f4f3a444e239a209276f928.

back to the drawing board


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

Branch: refs/heads/cjansen-cpp-client
Commit: 32b00aec6aa4d963b71243f55410c10e08f2b121
Parents: 5f664ad
Author: Bozo Dragojevic <bo...@digiverse.si>
Authored: Thu Jul 9 13:20:40 2015 +0200
Committer: Bozo Dragojevic <bo...@digiverse.si>
Committed: Thu Jul 9 13:20:40 2015 +0200

----------------------------------------------------------------------
 .../qpid/proton/amqp/messaging/Source.java       | 19 -------------------
 .../qpid/proton/amqp/messaging/Target.java       | 12 ------------
 .../qpid/proton/amqp/messaging/Terminus.java     | 17 -----------------
 .../proton/amqp/transaction/Coordinator.java     |  5 -----
 .../qpid/proton/amqp/transport/Source.java       |  2 --
 .../qpid/proton/amqp/transport/Target.java       |  2 --
 .../apache/qpid/proton/engine/impl/LinkImpl.java |  4 ----
 7 files changed, 61 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/32b00aec/proton-j/src/main/java/org/apache/qpid/proton/amqp/messaging/Source.java
----------------------------------------------------------------------
diff --git a/proton-j/src/main/java/org/apache/qpid/proton/amqp/messaging/Source.java b/proton-j/src/main/java/org/apache/qpid/proton/amqp/messaging/Source.java
index e6fffef..5efc15a 100644
--- a/proton-j/src/main/java/org/apache/qpid/proton/amqp/messaging/Source.java
+++ b/proton-j/src/main/java/org/apache/qpid/proton/amqp/messaging/Source.java
@@ -21,9 +21,7 @@
 package org.apache.qpid.proton.amqp.messaging;
 
 import java.util.Arrays;
-import java.util.HashMap;
 import java.util.Map;
-
 import org.apache.qpid.proton.amqp.Symbol;
 
 public final class Source extends Terminus
@@ -34,18 +32,6 @@ public final class Source extends Terminus
     private Outcome _defaultOutcome;
     private Symbol[] _outcomes;
 
-    private Source(Source other) {
-        super(other);
-        _distributionMode = other._distributionMode;
-        if (other._filter != null)
-            _filter = new HashMap(other._filter);
-        _defaultOutcome = other._defaultOutcome;
-        if (other._outcomes != null)
-            _outcomes = other._outcomes.clone();
-    }
-    
-    public Source() {}
-
     public Symbol getDistributionMode()
     {
         return _distributionMode;
@@ -104,10 +90,5 @@ public final class Source extends Terminus
                ", capabilities=" + (getCapabilities() == null ? null : Arrays.asList(getCapabilities())) +
                '}';
     }
-
-    @Override
-    public org.apache.qpid.proton.amqp.transport.Source copy() {
-        return new Source(this);
-    }
 }
   
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/32b00aec/proton-j/src/main/java/org/apache/qpid/proton/amqp/messaging/Target.java
----------------------------------------------------------------------
diff --git a/proton-j/src/main/java/org/apache/qpid/proton/amqp/messaging/Target.java b/proton-j/src/main/java/org/apache/qpid/proton/amqp/messaging/Target.java
index 38678d1..1749d40 100644
--- a/proton-j/src/main/java/org/apache/qpid/proton/amqp/messaging/Target.java
+++ b/proton-j/src/main/java/org/apache/qpid/proton/amqp/messaging/Target.java
@@ -28,13 +28,6 @@ import java.util.Arrays;
 public final class Target extends Terminus
       implements org.apache.qpid.proton.amqp.transport.Target
 {
-    private Target(Target other) {
-        super(other);
-    }
-
-    public Target() {
-    }
-
     @Override
     public String toString()
     {
@@ -48,10 +41,5 @@ public final class Target extends Terminus
                ", capabilities=" + (getCapabilities() == null ? null : Arrays.asList(getCapabilities())) +
                '}';
     }
-
-    @Override
-    public org.apache.qpid.proton.amqp.transport.Target copy() {
-        return new Target(this);
-    }
 }
   
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/32b00aec/proton-j/src/main/java/org/apache/qpid/proton/amqp/messaging/Terminus.java
----------------------------------------------------------------------
diff --git a/proton-j/src/main/java/org/apache/qpid/proton/amqp/messaging/Terminus.java b/proton-j/src/main/java/org/apache/qpid/proton/amqp/messaging/Terminus.java
index ac28b32..be57957 100644
--- a/proton-j/src/main/java/org/apache/qpid/proton/amqp/messaging/Terminus.java
+++ b/proton-j/src/main/java/org/apache/qpid/proton/amqp/messaging/Terminus.java
@@ -20,9 +20,7 @@
  */
 package org.apache.qpid.proton.amqp.messaging;
 
-import java.util.HashMap;
 import java.util.Map;
-
 import org.apache.qpid.proton.amqp.Symbol;
 import org.apache.qpid.proton.amqp.UnsignedInteger;
 
@@ -39,21 +37,6 @@ public abstract class Terminus
     Terminus()
     {
     }
-    
-    protected Terminus(Terminus other) {
-        _address = other._address;
-        _durable = other._durable;
-        _expiryPolicy = other._expiryPolicy;
-        _timeout = other._timeout;
-        _dynamic = other._dynamic;
-        if (other._dynamicNodeProperties != null) {
-            // TODO: Do we need to copy or can we make a simple reference?
-            _dynamicNodeProperties = new HashMap(other._dynamicNodeProperties); // FIXME
-        }
-        if (other._capabilities != null) {
-            _capabilities = other._capabilities.clone(); // FIXME?
-        }
-    }
 
     public final String getAddress()
     {

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/32b00aec/proton-j/src/main/java/org/apache/qpid/proton/amqp/transaction/Coordinator.java
----------------------------------------------------------------------
diff --git a/proton-j/src/main/java/org/apache/qpid/proton/amqp/transaction/Coordinator.java b/proton-j/src/main/java/org/apache/qpid/proton/amqp/transaction/Coordinator.java
index 7ff000a..2af968d 100644
--- a/proton-j/src/main/java/org/apache/qpid/proton/amqp/transaction/Coordinator.java
+++ b/proton-j/src/main/java/org/apache/qpid/proton/amqp/transaction/Coordinator.java
@@ -55,10 +55,5 @@ public final class Coordinator
     {
         return null;
     }
-
-    @Override
-    public Target copy() {
-        return null;
-    }
 }
 

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/32b00aec/proton-j/src/main/java/org/apache/qpid/proton/amqp/transport/Source.java
----------------------------------------------------------------------
diff --git a/proton-j/src/main/java/org/apache/qpid/proton/amqp/transport/Source.java b/proton-j/src/main/java/org/apache/qpid/proton/amqp/transport/Source.java
index 2d6f3b2..93d71f7 100644
--- a/proton-j/src/main/java/org/apache/qpid/proton/amqp/transport/Source.java
+++ b/proton-j/src/main/java/org/apache/qpid/proton/amqp/transport/Source.java
@@ -23,6 +23,4 @@ package org.apache.qpid.proton.amqp.transport;
 public interface Source
 {
     public String getAddress();
-
-    public Source copy();
 }

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/32b00aec/proton-j/src/main/java/org/apache/qpid/proton/amqp/transport/Target.java
----------------------------------------------------------------------
diff --git a/proton-j/src/main/java/org/apache/qpid/proton/amqp/transport/Target.java b/proton-j/src/main/java/org/apache/qpid/proton/amqp/transport/Target.java
index c972c02..8b81f37 100644
--- a/proton-j/src/main/java/org/apache/qpid/proton/amqp/transport/Target.java
+++ b/proton-j/src/main/java/org/apache/qpid/proton/amqp/transport/Target.java
@@ -24,6 +24,4 @@ package org.apache.qpid.proton.amqp.transport;
 public interface Target
 {
     public String getAddress();
-
-    public Target copy();
 }

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/32b00aec/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 ca98096..6b63b9a 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
@@ -418,10 +418,6 @@ public abstract class LinkImpl extends EndpointImpl implements Link
     @Override
     void localOpen()
     {
-        if (_source == null)
-            _source = _remoteSource.copy();
-        if (_target == null)
-            _target = _remoteTarget.copy();
         getConnectionImpl().put(Event.Type.LINK_LOCAL_OPEN, this);
     }
 


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


[43/50] qpid-proton git commit: PROTON-928: proton-j: Add two missing reactor methods

Posted by ac...@apache.org.
PROTON-928: proton-j: Add two missing reactor methods


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

Branch: refs/heads/cjansen-cpp-client
Commit: 5f664ad57d8c42572f5c4e8c18d73fc5520224af
Parents: ca47d72
Author: Bozo Dragojevic <bo...@digiverse.si>
Authored: Mon Jun 29 12:54:16 2015 +0200
Committer: Bozo Dragojevic <bo...@digiverse.si>
Committed: Thu Jul 9 12:18:45 2015 +0200

----------------------------------------------------------------------
 proton-j/src/main/resources/creactor.py | 4 ++++
 1 file changed, 4 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/5f664ad5/proton-j/src/main/resources/creactor.py
----------------------------------------------------------------------
diff --git a/proton-j/src/main/resources/creactor.py b/proton-j/src/main/resources/creactor.py
index 1f8514e..9de7662 100644
--- a/proton-j/src/main/resources/creactor.py
+++ b/proton-j/src/main/resources/creactor.py
@@ -56,6 +56,10 @@ def pn_reactor_connection(r, h):
     return wrap(r.connection(h), pn_connection_wrapper)
 def pn_reactor_acceptor(r, host, port, handler):
     return r.acceptor(host, int(port), handler)
+def pn_reactor_mark(r):
+    return r.mark()
+def pn_reactor_wakeup(r):
+    return r.wakeup()
 
 def pn_handler_add(h, c):
     h.add(c)


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


[40/50] qpid-proton git commit: PROTON-935: drop Java 6 support and more to Java 7 by updating compiler source and target to 1.7

Posted by ac...@apache.org.
PROTON-935: drop Java 6 support and more to Java 7 by updating compiler source and target to 1.7


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

Branch: refs/heads/cjansen-cpp-client
Commit: 3989e3f8977f0bda1b024a7f4f4a2c1212a3d4fd
Parents: f6d74a4
Author: Robert Gemmell <ro...@apache.org>
Authored: Wed Jul 8 17:45:14 2015 +0100
Committer: Robert Gemmell <ro...@apache.org>
Committed: Wed Jul 8 17:45:14 2015 +0100

----------------------------------------------------------------------
 pom.xml | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/3989e3f8/pom.xml
----------------------------------------------------------------------
diff --git a/pom.xml b/pom.xml
index 91bca16..494658e 100644
--- a/pom.xml
+++ b/pom.xml
@@ -51,8 +51,8 @@
         <groupId>org.apache.maven.plugins</groupId>
         <artifactId>maven-compiler-plugin</artifactId>
         <configuration>
-          <source>1.6</source>
-          <target>1.6</target>
+          <source>1.7</source>
+          <target>1.7</target>
           <optimize>true</optimize>
           <showDeprecation>true</showDeprecation>
           <showWarnings>true</showWarnings>


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


[46/50] qpid-proton git commit: NO-JIRA: update jenkins & travis to run tox

Posted by ac...@apache.org.
NO-JIRA: update jenkins & travis to run tox

Add the new 'python-tox-test' ctest (that can be run to test the python
bindings against multiple interpreters, e.g., py2.7, py3.3 etc.) to
the CI jobs

Closes #44


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

Branch: refs/heads/cjansen-cpp-client
Commit: ed313672338e5e813cd9d9ba3b7f2dc3a9fab1fb
Parents: a02ad90
Author: Dominic Evans <do...@uk.ibm.com>
Authored: Thu Jul 9 14:24:28 2015 +0100
Committer: Dominic Evans <do...@uk.ibm.com>
Committed: Thu Jul 9 14:24:28 2015 +0100

----------------------------------------------------------------------
 .travis.yml                   | 15 ++++++++++++---
 bin/jenkins-proton-c-build.sh | 17 +++++++++++++++++
 2 files changed, 29 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/ed313672/.travis.yml
----------------------------------------------------------------------
diff --git a/.travis.yml b/.travis.yml
index 6d1a73e..baeb5d1 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -1,11 +1,20 @@
 ---
-language: c
+language: python
 install:
 - sudo apt-get update -qq
 - sudo apt-get install -y -qq bash cmake libssl-dev maven ruby ruby-dev
-    python python-dev php5 openjdk-7-jdk swig uuid-dev valgrind libsasl2-dev
-    sasl2-bin
+    python python-dev python3 python3-dev php5 openjdk-7-jdk swig uuid-dev
+    valgrind libsasl2-dev sasl2-bin
+- pip install tox
 - gem install rspec simplecov
+before_script:
+- export PATH=${HOME}/.local/bin:${PATH}
+- export PYTHON_PATHS=$(ls -d /opt/python/*)
+- echo PYTHON_PATHS=${PYTHON_PATHS}
+- for PYTHON_DIR in ${PYTHON_PATHS} ;
+    do export CMAKE_PREFIX_PATH=${CMAKE_PREFIX_PATH}:${PYTHON_DIR} ;
+  done
+- echo CMAKE_PREFIX_PATH=${CMAKE_PREFIX_PATH}
 script:
 - bin/jenkins-proton-c-build.sh
 os:

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/ed313672/bin/jenkins-proton-c-build.sh
----------------------------------------------------------------------
diff --git a/bin/jenkins-proton-c-build.sh b/bin/jenkins-proton-c-build.sh
index 8f0545f..51db562 100755
--- a/bin/jenkins-proton-c-build.sh
+++ b/bin/jenkins-proton-c-build.sh
@@ -20,6 +20,21 @@ echo =========================
 which python || exit 1
 which swig || exit 1
 
+# if python-pip is available, install the python tox test tool
+RUN_TOX=false
+PIP=$(type -p pip || true)
+if [ -n $PIP ] && [ -x "$PIP" ]; then
+    ldir=$(python -c 'import site; print("%s" % site.USER_BASE)')
+    PATH="$ldir/bin:$PATH"
+    echo "PATH=$PATH"
+    if [ $VIRTUAL_ENV ]; then
+      pip install -U tox
+    else
+      pip install --user -U tox
+    fi
+    RUN_TOX=true
+fi
+
 ls
 
 rm -rf build testresults >/dev/null 2>&1
@@ -32,6 +47,8 @@ cmake --build . --target install
 
 echo Running tests
 
+$RUN_TOX && ctest -V -R 'python-tox-test'
+
 source config.sh
 
 # proton-c tests via python


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


[23/50] qpid-proton git commit: implemented sasl sniffing for proton-j; this allows the reactor interop tests to pass

Posted by ac...@apache.org.
implemented sasl sniffing for proton-j; this allows the reactor interop tests to pass


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

Branch: refs/heads/cjansen-cpp-client
Commit: 46edaebeb92fa780120f17aa8ac0b54d2feaa8b9
Parents: bf81c44
Author: Rafael Schloming <rh...@alum.mit.edu>
Authored: Sun Jul 5 19:08:20 2015 -0400
Committer: Rafael Schloming <rh...@alum.mit.edu>
Committed: Sun Jul 5 19:33:45 2015 -0400

----------------------------------------------------------------------
 proton-c/bindings/python/proton/__init__.py     |   2 +-
 .../impl/HandshakeSniffingTransportWrapper.java | 182 +++++++++++++++++++
 .../qpid/proton/engine/impl/SaslImpl.java       |  12 +-
 .../qpid/proton/engine/impl/SaslSniffer.java    |  53 ++++++
 .../SslHandshakeSniffingTransportWrapper.java   | 170 +++--------------
 proton-j/src/main/resources/cengine.py          |  26 ++-
 6 files changed, 284 insertions(+), 161 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/46edaebe/proton-c/bindings/python/proton/__init__.py
----------------------------------------------------------------------
diff --git a/proton-c/bindings/python/proton/__init__.py b/proton-c/bindings/python/proton/__init__.py
index 1032edf..9c75800 100644
--- a/proton-c/bindings/python/proton/__init__.py
+++ b/proton-c/bindings/python/proton/__init__.py
@@ -3294,7 +3294,7 @@ A callback for trace logging. The callback is passed the transport and log messa
   def push(self, binary):
     n = self._check(pn_transport_push(self._impl, binary))
     if n != len(binary):
-      raise OverflowError("unable to process all bytes")
+      raise OverflowError("unable to process all bytes: %s, %s" % (n, len(binary)))
 
   def close_tail(self):
     self._check(pn_transport_close_tail(self._impl))

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/46edaebe/proton-j/src/main/java/org/apache/qpid/proton/engine/impl/HandshakeSniffingTransportWrapper.java
----------------------------------------------------------------------
diff --git a/proton-j/src/main/java/org/apache/qpid/proton/engine/impl/HandshakeSniffingTransportWrapper.java b/proton-j/src/main/java/org/apache/qpid/proton/engine/impl/HandshakeSniffingTransportWrapper.java
new file mode 100644
index 0000000..6a5aac5
--- /dev/null
+++ b/proton-j/src/main/java/org/apache/qpid/proton/engine/impl/HandshakeSniffingTransportWrapper.java
@@ -0,0 +1,182 @@
+/*
+ *
+ * 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.impl;
+
+import java.nio.ByteBuffer;
+
+import org.apache.qpid.proton.engine.Transport;
+import org.apache.qpid.proton.engine.TransportException;
+import org.apache.qpid.proton.engine.impl.TransportWrapper;
+
+public abstract class HandshakeSniffingTransportWrapper<T1 extends TransportWrapper, T2 extends TransportWrapper>
+    implements TransportWrapper
+{
+
+    protected final T1 _wrapper1;
+    protected final T2 _wrapper2;
+
+    private boolean _tail_closed = false;
+    private boolean _head_closed = false;
+    protected TransportWrapper _selectedTransportWrapper;
+
+    private final ByteBuffer _determinationBuffer;
+
+    protected HandshakeSniffingTransportWrapper
+        (T1 wrapper1,
+         T2 wrapper2)
+    {
+        _wrapper1 = wrapper1;
+        _wrapper2 = wrapper2;
+        _determinationBuffer = ByteBuffer.allocate(bufferSize());
+    }
+
+    @Override
+    public int capacity()
+    {
+        if (isDeterminationMade())
+        {
+            return _selectedTransportWrapper.capacity();
+        }
+        else
+        {
+            if (_tail_closed) { return Transport.END_OF_STREAM; }
+            return _determinationBuffer.remaining();
+        }
+    }
+
+    @Override
+    public int position()
+    {
+        if (isDeterminationMade())
+        {
+            return _selectedTransportWrapper.position();
+        }
+        else
+        {
+            if (_tail_closed) { return Transport.END_OF_STREAM; }
+            return _determinationBuffer.position();
+        }
+    }
+
+    @Override
+    public ByteBuffer tail()
+    {
+        if (isDeterminationMade())
+        {
+            return _selectedTransportWrapper.tail();
+        }
+        else
+        {
+            return _determinationBuffer;
+        }
+    }
+
+    protected abstract int bufferSize();
+
+    protected abstract void makeDetermination(byte[] bytes);
+
+    @Override
+    public void process() throws TransportException
+    {
+        if (isDeterminationMade())
+        {
+            _selectedTransportWrapper.process();
+        }
+        else if (_determinationBuffer.remaining() == 0)
+        {
+            _determinationBuffer.flip();
+            byte[] bytesInput = new byte[_determinationBuffer.remaining()];
+            _determinationBuffer.get(bytesInput);
+            makeDetermination(bytesInput);
+            _determinationBuffer.rewind();
+
+            // TODO what if the selected transport has insufficient capacity?? Maybe use pour, and then try to finish pouring next time round.
+            _selectedTransportWrapper.tail().put(_determinationBuffer);
+            _selectedTransportWrapper.process();
+        } else if (_tail_closed) {
+            throw new TransportException("connection aborted");
+        }
+    }
+
+    @Override
+    public void close_tail()
+    {
+        try {
+            if (isDeterminationMade())
+            {
+                _selectedTransportWrapper.close_tail();
+            }
+        } finally {
+            _tail_closed = true;
+        }
+    }
+
+    @Override
+    public int pending()
+    {
+        if (_head_closed) { return Transport.END_OF_STREAM; }
+
+        if (isDeterminationMade()) {
+            return _selectedTransportWrapper.pending();
+        } else {
+            return 0;
+        }
+
+    }
+
+    private static final ByteBuffer EMPTY = ByteBuffer.allocate(0);
+
+    @Override
+    public ByteBuffer head()
+    {
+        if (isDeterminationMade()) {
+            return _selectedTransportWrapper.head();
+        } else {
+            return EMPTY;
+        }
+    }
+
+    @Override
+    public void pop(int bytes)
+    {
+        if (isDeterminationMade()) {
+            _selectedTransportWrapper.pop(bytes);
+        } else if (bytes > 0) {
+            throw new IllegalStateException("no bytes have been read");
+        }
+    }
+
+    @Override
+    public void close_head()
+    {
+        if (isDeterminationMade()) {
+            _selectedTransportWrapper.close_head();
+        } else {
+            _head_closed = true;
+        }
+    }
+
+    protected boolean isDeterminationMade()
+    {
+        return _selectedTransportWrapper != null;
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/46edaebe/proton-j/src/main/java/org/apache/qpid/proton/engine/impl/SaslImpl.java
----------------------------------------------------------------------
diff --git a/proton-j/src/main/java/org/apache/qpid/proton/engine/impl/SaslImpl.java b/proton-j/src/main/java/org/apache/qpid/proton/engine/impl/SaslImpl.java
index 053c21f..6efb140 100644
--- a/proton-j/src/main/java/org/apache/qpid/proton/engine/impl/SaslImpl.java
+++ b/proton-j/src/main/java/org/apache/qpid/proton/engine/impl/SaslImpl.java
@@ -485,7 +485,17 @@ public class SaslImpl implements Sasl, SaslFrameBody.SaslFrameBodyHandler<Void>,
 
     public TransportWrapper wrap(final TransportInput input, final TransportOutput output)
     {
-        return new SaslTransportWrapper(input, output);
+        return new SaslSniffer(new SaslTransportWrapper(input, output),
+                               new PlainTransportWrapper(output, input)) {
+            protected boolean isDeterminationMade() {
+                if (_role == Role.SERVER) {
+                    return super.isDeterminationMade();
+                } else {
+                    _selectedTransportWrapper = _wrapper1;
+                    return true;
+                }
+            }
+        };
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/46edaebe/proton-j/src/main/java/org/apache/qpid/proton/engine/impl/SaslSniffer.java
----------------------------------------------------------------------
diff --git a/proton-j/src/main/java/org/apache/qpid/proton/engine/impl/SaslSniffer.java b/proton-j/src/main/java/org/apache/qpid/proton/engine/impl/SaslSniffer.java
new file mode 100644
index 0000000..2d92496
--- /dev/null
+++ b/proton-j/src/main/java/org/apache/qpid/proton/engine/impl/SaslSniffer.java
@@ -0,0 +1,53 @@
+/*
+ *
+ * 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.impl;
+
+
+/**
+ * SaslSniffer
+ *
+ */
+
+class SaslSniffer extends HandshakeSniffingTransportWrapper<TransportWrapper, TransportWrapper>
+{
+
+    SaslSniffer(TransportWrapper sasl, TransportWrapper other) {
+        super(sasl, other);
+    }
+
+    protected int bufferSize() { return AmqpHeader.SASL_HEADER.length; }
+
+    protected void makeDetermination(byte[] bytes) {
+        if (bytes.length < bufferSize()) {
+            throw new IllegalArgumentException("insufficient bytes");
+        }
+
+        for (int i = 0; i < AmqpHeader.SASL_HEADER.length; i++) {
+            if (bytes[i] != AmqpHeader.SASL_HEADER[i]) {
+                _selectedTransportWrapper = _wrapper2;
+                return;
+            }
+        }
+
+        _selectedTransportWrapper = _wrapper1;
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/46edaebe/proton-j/src/main/java/org/apache/qpid/proton/engine/impl/ssl/SslHandshakeSniffingTransportWrapper.java
----------------------------------------------------------------------
diff --git a/proton-j/src/main/java/org/apache/qpid/proton/engine/impl/ssl/SslHandshakeSniffingTransportWrapper.java b/proton-j/src/main/java/org/apache/qpid/proton/engine/impl/ssl/SslHandshakeSniffingTransportWrapper.java
index 1efc7a9..c678343 100644
--- a/proton-j/src/main/java/org/apache/qpid/proton/engine/impl/ssl/SslHandshakeSniffingTransportWrapper.java
+++ b/proton-j/src/main/java/org/apache/qpid/proton/engine/impl/ssl/SslHandshakeSniffingTransportWrapper.java
@@ -20,150 +20,21 @@
  */
 package org.apache.qpid.proton.engine.impl.ssl;
 
-import java.nio.ByteBuffer;
-
-import org.apache.qpid.proton.engine.Transport;
-import org.apache.qpid.proton.engine.TransportException;
+import org.apache.qpid.proton.engine.impl.HandshakeSniffingTransportWrapper;
 import org.apache.qpid.proton.engine.impl.TransportWrapper;
 
-public class SslHandshakeSniffingTransportWrapper implements SslTransportWrapper
-{
-    private static final int MINIMUM_LENGTH_FOR_DETERMINATION = 5;
-    private final SslTransportWrapper _secureTransportWrapper;
-    private final TransportWrapper _plainTransportWrapper;
-
-    private boolean _tail_closed = false;
-    private boolean _head_closed = false;
-    private TransportWrapper _selectedTransportWrapper;
-
-    private final ByteBuffer _determinationBuffer = ByteBuffer.allocate(MINIMUM_LENGTH_FOR_DETERMINATION);
-
-    SslHandshakeSniffingTransportWrapper
-        (SslTransportWrapper secureTransportWrapper,
-         TransportWrapper plainTransportWrapper)
-    {
-        _secureTransportWrapper = secureTransportWrapper;
-        _plainTransportWrapper = plainTransportWrapper;
-    }
-
-    @Override
-    public int capacity()
-    {
-        if (isDeterminationMade())
-        {
-            return _selectedTransportWrapper.capacity();
-        }
-        else
-        {
-            if (_tail_closed) { return Transport.END_OF_STREAM; }
-            return _determinationBuffer.remaining();
-        }
-    }
-
-    @Override
-    public int position()
-    {
-        if (isDeterminationMade())
-        {
-            return _selectedTransportWrapper.position();
-        }
-        else
-        {
-            if (_tail_closed) { return Transport.END_OF_STREAM; }
-            return _determinationBuffer.position();
-        }
-    }
-
-    @Override
-    public ByteBuffer tail()
-    {
-        if (isDeterminationMade())
-        {
-            return _selectedTransportWrapper.tail();
-        }
-        else
-        {
-            return _determinationBuffer;
-        }
-    }
-
-    @Override
-    public void process() throws TransportException
-    {
-        if (isDeterminationMade())
-        {
-            _selectedTransportWrapper.process();
-        }
-        else if (_determinationBuffer.remaining() == 0)
-        {
-            _determinationBuffer.flip();
-            byte[] bytesInput = new byte[_determinationBuffer.remaining()];
-            _determinationBuffer.get(bytesInput);
-            makeSslDetermination(bytesInput);
-            _determinationBuffer.rewind();
-
-            // TODO what if the selected transport has insufficient capacity?? Maybe use pour, and then try to finish pouring next time round.
-            _selectedTransportWrapper.tail().put(_determinationBuffer);
-            _selectedTransportWrapper.process();
-        } else if (_tail_closed) {
-            throw new TransportException("connection aborted");
-        }
-    }
-
-    @Override
-    public void close_tail()
-    {
-        try {
-            if (isDeterminationMade())
-            {
-                _selectedTransportWrapper.close_tail();
-            }
-        } finally {
-            _tail_closed = true;
-        }
-    }
-
-    @Override
-    public int pending()
-    {
-        if (_head_closed) { return Transport.END_OF_STREAM; }
-
-        if (isDeterminationMade()) {
-            return _selectedTransportWrapper.pending();
-        } else {
-            return 0;
-        }
-
-    }
 
-    @Override
-    public ByteBuffer head()
-    {
-        if (isDeterminationMade()) {
-            return _selectedTransportWrapper.head();
-        } else {
-            return null;
-        }
-    }
+/**
+ * SslHandshakeSniffingTransportWrapper
+ *
+ */
 
-    @Override
-    public void pop(int bytes)
-    {
-        if (isDeterminationMade()) {
-            _selectedTransportWrapper.pop(bytes);
-        } else if (bytes > 0) {
-            throw new IllegalStateException("no bytes have been read");
-        }
-    }
+public class SslHandshakeSniffingTransportWrapper extends HandshakeSniffingTransportWrapper<SslTransportWrapper, TransportWrapper>
+    implements SslTransportWrapper
+{
 
-    @Override
-    public void close_head()
-    {
-        if (isDeterminationMade()) {
-            _selectedTransportWrapper.close_head();
-        } else {
-            _head_closed = true;
-        }
+    SslHandshakeSniffingTransportWrapper(SslTransportWrapper ssl, TransportWrapper plain) {
+        super(ssl, plain);
     }
 
     @Override
@@ -171,7 +42,7 @@ public class SslHandshakeSniffingTransportWrapper implements SslTransportWrapper
     {
         if(isSecureWrapperSelected())
         {
-            return _secureTransportWrapper.getCipherName();
+            return _wrapper1.getCipherName();
         }
         else
         {
@@ -185,7 +56,7 @@ public class SslHandshakeSniffingTransportWrapper implements SslTransportWrapper
     {
         if (isSecureWrapperSelected())
         {
-            return _secureTransportWrapper.getProtocolName();
+            return _wrapper1.getProtocolName();
         }
         else
         {
@@ -195,32 +66,33 @@ public class SslHandshakeSniffingTransportWrapper implements SslTransportWrapper
 
     private boolean isSecureWrapperSelected()
     {
-        return _selectedTransportWrapper == _secureTransportWrapper;
+        return _selectedTransportWrapper == _wrapper1;
     }
 
-    private boolean isDeterminationMade()
-    {
-        return _selectedTransportWrapper != null;
+    protected int bufferSize() {
+        // minimum length for determination
+        return 5;
     }
 
-    private void makeSslDetermination(byte[] bytesInput)
+    protected void makeDetermination(byte[] bytesInput)
     {
         boolean isSecure = checkForSslHandshake(bytesInput);
         if (isSecure)
         {
-            _selectedTransportWrapper = _secureTransportWrapper;
+            _selectedTransportWrapper = _wrapper1;
         }
         else
         {
-            _selectedTransportWrapper = _plainTransportWrapper;
+            _selectedTransportWrapper = _wrapper2;
         }
     }
+
     // TODO perhaps the sniffer should save up the bytes from each
     // input call until it has sufficient bytes to make the determination
     // and only then pass them to the secure or plain wrapped transport?
     private boolean checkForSslHandshake(byte[] buf)
     {
-        if (buf.length >= MINIMUM_LENGTH_FOR_DETERMINATION)
+        if (buf.length >= bufferSize())
         {
             /*
              * SSLv2 Client Hello format

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/46edaebe/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 1e89220..c94d023 100644
--- a/proton-j/src/main/resources/cengine.py
+++ b/proton-j/src/main/resources/cengine.py
@@ -940,16 +940,22 @@ def pn_transport_capacity(trans):
   return trans.impl.capacity()
 
 def pn_transport_push(trans, input):
-  cap = pn_transport_capacity(trans)
-  if cap < 0:
-    return cap
-  elif len(input) > cap:
-    input = input[:cap]
-
-  bb = trans.impl.tail()
-  bb.put(array(input, 'b'))
-  trans.impl.process()
-  return len(input)
+  result = 0
+  while input:
+    cap = pn_transport_capacity(trans)
+    if cap < 0:
+      return cap
+    elif len(input) > cap:
+      trimmed = input[:cap]
+    else:
+      trimmed = input
+
+    bb = trans.impl.tail()
+    bb.put(array(trimmed, 'b'))
+    trans.impl.process()
+    input = input[cap:]
+    result += len(trimmed)
+  return result
 
 def pn_transport_close_head(trans):
   trans.impl.close_head()


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


[41/50] qpid-proton git commit: PROTON-939: allow pn_ssl_set_peer_hostname to override connection's hostname

Posted by ac...@apache.org.
PROTON-939: allow pn_ssl_set_peer_hostname to override connection's hostname


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

Branch: refs/heads/cjansen-cpp-client
Commit: e86cd22fc724add9e18f6150604ecd666ff4a4c9
Parents: 3989e3f
Author: Ken Giusti <kg...@apache.org>
Authored: Wed Jul 8 12:02:20 2015 -0400
Committer: Ken Giusti <kg...@apache.org>
Committed: Wed Jul 8 16:11:25 2015 -0400

----------------------------------------------------------------------
 proton-c/include/proton/ssl.h      |  4 +++
 proton-c/src/transport/transport.c | 20 +++++++++++----
 tests/python/proton_tests/ssl.py   | 45 +++++++++++++++++++++++++++++++--
 3 files changed, 62 insertions(+), 7 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/e86cd22f/proton-c/include/proton/ssl.h
----------------------------------------------------------------------
diff --git a/proton-c/include/proton/ssl.h b/proton-c/include/proton/ssl.h
index b250e6a..d8d4d1f 100644
--- a/proton-c/include/proton/ssl.h
+++ b/proton-c/include/proton/ssl.h
@@ -293,6 +293,10 @@ PN_EXTERN pn_ssl_resume_status_t pn_ssl_resume_status( pn_ssl_t *ssl );
 
 /** Set the expected identity of the remote peer.
  *
+ * By default, SSL will use the hostname associated with the connection that
+ * the transport is bound to (see ::pn_connection_set_hostname).  This method
+ * allows the caller to override that default.
+ *
  * The hostname is used for two purposes: 1) when set on an SSL client, it is sent to the
  * server during the handshake (if Server Name Indication is supported), and 2) it is used
  * to check against the identifying name provided in the peer's certificate. If the

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/e86cd22f/proton-c/src/transport/transport.c
----------------------------------------------------------------------
diff --git a/proton-c/src/transport/transport.c b/proton-c/src/transport/transport.c
index e5e8276..d2c3509 100644
--- a/proton-c/src/transport/transport.c
+++ b/proton-c/src/transport/transport.c
@@ -652,11 +652,21 @@ int pn_transport_bind(pn_transport_t *transport, pn_connection_t *connection)
     pn_sasl(transport);
     pni_sasl_set_user_password(transport, pn_string_get(connection->auth_user), pn_string_get(connection->auth_password));
   }
-  if (transport->sasl) {
-    pni_sasl_set_remote_hostname(transport, pn_string_get(connection->hostname));
-  }
-  if (transport->ssl) {
-    pn_ssl_set_peer_hostname((pn_ssl_t*) transport, pn_string_get(connection->hostname));
+
+  if (pn_string_size(connection->hostname)) {
+      if (transport->sasl) {
+          pni_sasl_set_remote_hostname(transport, pn_string_get(connection->hostname));
+      }
+
+      // be sure not to overwrite a hostname already set by the user via
+      // pn_ssl_set_peer_hostname() called before the bind
+      if (transport->ssl) {
+          size_t name_len = 0;
+          pn_ssl_get_peer_hostname((pn_ssl_t*) transport, NULL, &name_len);
+          if (name_len == 0) {
+              pn_ssl_set_peer_hostname((pn_ssl_t*) transport, pn_string_get(connection->hostname));
+          }
+      }
   }
 
   if (transport->open_rcvd) {

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/e86cd22f/tests/python/proton_tests/ssl.py
----------------------------------------------------------------------
diff --git a/tests/python/proton_tests/ssl.py b/tests/python/proton_tests/ssl.py
index f3c7f1f..8432797 100644
--- a/tests/python/proton_tests/ssl.py
+++ b/tests/python/proton_tests/ssl.py
@@ -53,7 +53,9 @@ class SslTest(common.Test):
     class SslTestConnection(object):
         """ Represents a single SSL connection.
         """
-        def __init__(self, domain=None, mode=Transport.CLIENT, session_details=None):
+        def __init__(self, domain=None, mode=Transport.CLIENT,
+                     session_details=None, conn_hostname=None,
+                     ssl_peername=None):
             if not common.isSSLPresent():
                 raise Skipped("No SSL libraries found.")
 
@@ -61,9 +63,14 @@ class SslTest(common.Test):
             self.domain = domain
             self.transport = Transport(mode)
             self.connection = Connection()
-            self.transport.bind(self.connection)
+            if conn_hostname:
+                self.connection.hostname = conn_hostname
             if domain:
                 self.ssl = SSL( self.transport, self.domain, session_details )
+                if ssl_peername:
+                    self.ssl.peer_hostname = ssl_peername
+            # bind last, after all configuration complete:
+            self.transport.bind(self.connection)
 
     def _pump(self, ssl_client, ssl_server, buffer_size=1024):
         pump(ssl_client.transport, ssl_server.transport, buffer_size)
@@ -691,6 +698,40 @@ class SslTest(common.Test):
         assert server.connection.state & Endpoint.REMOTE_UNINIT
         self.teardown()
 
+        # Pass: ensure that the user can give an alternate name that overrides
+        # the connection's configured hostname
+        self.setup()
+        self.server_domain.set_credentials(self._testpath("server-wc-certificate.pem"),
+                                    self._testpath("server-wc-private-key.pem"),
+                                    "server-password")
+        self.client_domain.set_trusted_ca_db(self._testpath("ca-certificate.pem"))
+        self.client_domain.set_peer_authentication( SSLDomain.VERIFY_PEER_NAME )
+
+        server = SslTest.SslTestConnection(self.server_domain, mode=Transport.SERVER)
+        client = SslTest.SslTestConnection(self.client_domain,
+                                           conn_hostname="This.Name.Does.not.Match",
+                                           ssl_peername="alternate.name.one.com")
+        self._do_handshake(client, server)
+        del client
+        del server
+        self.teardown()
+
+        # Pass: ensure that the hostname supplied by the connection is used if
+        # none has been specified for the SSL instanace
+        self.setup()
+        self.server_domain.set_credentials(self._testpath("server-certificate.pem"),
+                                    self._testpath("server-private-key.pem"),
+                                    "server-password")
+        self.client_domain.set_trusted_ca_db(self._testpath("ca-certificate.pem"))
+        self.client_domain.set_peer_authentication( SSLDomain.VERIFY_PEER_NAME )
+
+        server = SslTest.SslTestConnection(self.server_domain, mode=Transport.SERVER)
+        client = SslTest.SslTestConnection(self.client_domain,
+                                           conn_hostname="a1.good.server.domain.com")
+        self._do_handshake(client, server)
+        del client
+        del server
+        self.teardown()
 
     def test_defaults_messenger_app(self):
         """ Test an SSL connection using the Messenger apps (no certificates)


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


[16/50] qpid-proton git commit: NO-JIRA: Small tidy up

Posted by ac...@apache.org.
NO-JIRA: Small tidy up


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

Branch: refs/heads/cjansen-cpp-client
Commit: 7e3190306999da2d0d958a309d4105fddfb004f4
Parents: 5638c5a
Author: Andrew Stitcher <as...@apache.org>
Authored: Thu Jul 2 14:20:22 2015 -0400
Committer: Andrew Stitcher <as...@apache.org>
Committed: Thu Jul 2 14:20:22 2015 -0400

----------------------------------------------------------------------
 proton-c/src/sasl/sasl.c | 19 ++++++++++---------
 1 file changed, 10 insertions(+), 9 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/7e319030/proton-c/src/sasl/sasl.c
----------------------------------------------------------------------
diff --git a/proton-c/src/sasl/sasl.c b/proton-c/src/sasl/sasl.c
index a33256c..a436674 100644
--- a/proton-c/src/sasl/sasl.c
+++ b/proton-c/src/sasl/sasl.c
@@ -279,8 +279,7 @@ static ssize_t pn_input_read_sasl(pn_transport_t* transport, unsigned int layer,
 
   pni_sasl_start_server_if_needed(transport);
 
-  bool dummy = false;
-  ssize_t n = pn_dispatcher_input(transport, bytes, available, false, &dummy);
+  ssize_t n = pn_dispatcher_input(transport, bytes, available, false, &transport->halt);
 
   if (n!=0 || !pni_sasl_is_final_input_state(transport->sasl)) {
     return n;
@@ -288,14 +287,15 @@ static ssize_t pn_input_read_sasl(pn_transport_t* transport, unsigned int layer,
 
   pni_sasl_t *sasl = transport->sasl;
   if (pni_sasl_impl_can_encrypt(transport)) {
-    transport->io_layers[layer] = &sasl_encrypt_layer;
     sasl->max_encrypt_size = pni_sasl_impl_max_encrypt_size(transport);
     pn_transport_logf(transport, "SASL max buffer: %d", sasl->max_encrypt_size);
-    return transport->io_layers[layer]->process_input(transport, layer, bytes, available);
+    transport->io_layers[layer] = &sasl_encrypt_layer;
   } else if (sasl->client) {
     transport->io_layers[layer] = &pni_passthru_layer;
+  } else {
+    return pni_passthru_layer.process_input(transport, layer, bytes, available );
   }
-  return pni_passthru_layer.process_input(transport, layer, bytes, available );
+  return transport->io_layers[layer]->process_input(transport, layer, bytes, available);
 }
 
 static ssize_t pn_input_read_sasl_encrypt(pn_transport_t* transport, unsigned int layer, const char* bytes, size_t available)
@@ -360,14 +360,15 @@ static ssize_t pn_output_write_sasl(pn_transport_t* transport, unsigned int laye
   }
 
   if (pni_sasl_impl_can_encrypt(transport)) {
-    transport->io_layers[layer] = &sasl_encrypt_layer;
     sasl->max_encrypt_size = pni_sasl_impl_max_encrypt_size(transport);
     pn_transport_logf(transport, "SASL max buffer: %d", sasl->max_encrypt_size);
-    return transport->io_layers[layer]->process_output(transport, layer, bytes, available);
-  } else if (!sasl->client) {
+    transport->io_layers[layer] = &sasl_encrypt_layer;
+  } else if (sasl->client) {
+    return pni_passthru_layer.process_output(transport, layer, bytes, available );
+  } else {
     transport->io_layers[layer] = &pni_passthru_layer;
   }
-  return pni_passthru_layer.process_output(transport, layer, bytes, available );
+  return transport->io_layers[layer]->process_output(transport, layer, bytes, available);
 }
 
 static ssize_t pn_output_write_sasl_encrypt(pn_transport_t* transport, unsigned int layer, char* bytes, size_t available)


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


[06/50] qpid-proton git commit: NO-JIRA: fix ignore directive

Posted by ac...@apache.org.
NO-JIRA: fix ignore directive


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

Branch: refs/heads/cjansen-cpp-client
Commit: d82cd1a0e4dc6a6bb04480b77df743ba1ecf40e9
Parents: a2a4026
Author: Ken Giusti <kg...@apache.org>
Authored: Thu Jun 25 13:38:33 2015 -0400
Committer: Ken Giusti <kg...@apache.org>
Committed: Thu Jun 25 15:47:52 2015 -0400

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


http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/d82cd1a0/proton-c/bindings/python/cproton.i
----------------------------------------------------------------------
diff --git a/proton-c/bindings/python/cproton.i b/proton-c/bindings/python/cproton.i
index 80f679c..1eaabec 100644
--- a/proton-c/bindings/python/cproton.i
+++ b/proton-c/bindings/python/cproton.i
@@ -134,7 +134,7 @@ int pn_message_encode(pn_message_t *msg, char *BIN_OUT, size_t *BIN_SIZE);
 %ignore pn_message_encode;
 
 int pn_message_decode(pn_message_t *msg, const char *BIN_IN, size_t BIN_LEN);
-%ignore pn_message_encode;
+%ignore pn_message_decode;
 
 ssize_t pn_link_send(pn_link_t *transport, const char *BIN_IN, size_t BIN_LEN);
 %ignore pn_link_send;


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


[35/50] qpid-proton git commit: PROTON-933: Workaround for seeming bug in Cyrus SASL GSSAPI buffer size reporting

Posted by ac...@apache.org.
PROTON-933: Workaround for seeming bug in Cyrus SASL GSSAPI buffer size reporting


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

Branch: refs/heads/cjansen-cpp-client
Commit: c6499b687cce4102655db2d7012bc7cbc9bcd1fd
Parents: 89fca58
Author: Andrew Stitcher <as...@apache.org>
Authored: Mon Jul 6 15:15:16 2015 -0400
Committer: Andrew Stitcher <as...@apache.org>
Committed: Mon Jul 6 15:54:08 2015 -0400

----------------------------------------------------------------------
 proton-c/src/sasl/cyrus_sasl.c | 7 ++++++-
 1 file changed, 6 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/c6499b68/proton-c/src/sasl/cyrus_sasl.c
----------------------------------------------------------------------
diff --git a/proton-c/src/sasl/cyrus_sasl.c b/proton-c/src/sasl/cyrus_sasl.c
index b71a435..6100474 100644
--- a/proton-c/src/sasl/cyrus_sasl.c
+++ b/proton-c/src/sasl/cyrus_sasl.c
@@ -408,7 +408,12 @@ ssize_t pni_sasl_impl_max_encrypt_size(pn_transport_t *transport)
     return PN_ERR;
   }
   int outbuf_size = *(int *) value;
-  return outbuf_size;
+  return outbuf_size -
+    // XXX: this  is a clientside workaround/hack to make GSSAPI work as the Cyrus SASL
+    // GSSAPI plugin seems to return an incorrect value for the buffer size on the client
+    // side, which is greater than the value returned on the server side. Actually using
+    // the entire client side buffer will cause a server side error due to a buffer overrun.
+    (transport->sasl->client? 60 : 0);
 }
 
 ssize_t pni_sasl_impl_encode(pn_transport_t *transport, pn_bytes_t in, pn_bytes_t *out)


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


[36/50] qpid-proton git commit: NO-JIRA: fix python3 incompatible syntax

Posted by ac...@apache.org.
NO-JIRA: fix python3 incompatible syntax


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

Branch: refs/heads/cjansen-cpp-client
Commit: 898cc0a7dd03d4b4cc2de0a481060d3939189c01
Parents: c6499b6
Author: Ken Giusti <kg...@apache.org>
Authored: Tue Jul 7 09:12:26 2015 -0400
Committer: Ken Giusti <kg...@apache.org>
Committed: Tue Jul 7 09:12:26 2015 -0400

----------------------------------------------------------------------
 tests/python/proton_tests/reactor_interop.py | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/898cc0a7/tests/python/proton_tests/reactor_interop.py
----------------------------------------------------------------------
diff --git a/tests/python/proton_tests/reactor_interop.py b/tests/python/proton_tests/reactor_interop.py
index 56a284f..f95d8c2 100644
--- a/tests/python/proton_tests/reactor_interop.py
+++ b/tests/python/proton_tests/reactor_interop.py
@@ -17,8 +17,9 @@
 # specific language governing permissions and limitations
 # under the License.
 #
+from __future__ import absolute_import
 
-from common import Test, free_tcp_port
+from .common import Test, free_tcp_port
 from proton import Message
 from proton.handlers import CHandshaker, CFlowController
 from proton.reactor import Reactor


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


[08/50] qpid-proton git commit: PROTON-922: use pkg-config to find proton's headers and library

Posted by ac...@apache.org.
PROTON-922: use pkg-config to find proton's headers and library


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

Branch: refs/heads/cjansen-cpp-client
Commit: 70a463f0068b1ff365df53c5128e65e5eec4a271
Parents: 69cc9ec
Author: Ken Giusti <kg...@apache.org>
Authored: Thu Jun 25 16:11:00 2015 -0400
Committer: Ken Giusti <kg...@apache.org>
Committed: Fri Jun 26 13:02:45 2015 -0400

----------------------------------------------------------------------
 proton-c/bindings/python/setup.py           | 26 +++++++++-
 proton-c/bindings/python/setuputils/misc.py | 64 +++++++++++++++++-------
 2 files changed, 69 insertions(+), 21 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/70a463f0/proton-c/bindings/python/setup.py
----------------------------------------------------------------------
diff --git a/proton-c/bindings/python/setup.py b/proton-c/bindings/python/setup.py
index 1eb3e64..d4eb3ca 100755
--- a/proton-c/bindings/python/setup.py
+++ b/proton-c/bindings/python/setup.py
@@ -133,6 +133,10 @@ class Configure(build_ext):
         ext.swig_opts = []
 
     def bundle_libqpid_proton_extension(self):
+        """The proper version of libqpid-proton is not present on the system,
+        so attempt to retrieve the proper libqpid-proton sources and
+        build/install them locally.
+        """
         setup_path = os.path.dirname(os.path.realpath(__file__))
         base = self.get_finalized_command('build').build_base
         build_include = os.path.join(base, 'include')
@@ -142,6 +146,9 @@ class Configure(build_ext):
 
         log.info("Using bundled libqpid-proton")
 
+        # QPID_PROTON_SRC - (optional) pathname to the Proton C sources.  Can
+        # be used to override where this setup gets the Proton C sources from
+        # (see bundle.fetch_libqpid_proton())
         if 'QPID_PROTON_SRC' not in os.environ:
             if not os.path.exists(os.path.join(setup_path, 'tox.ini')):
                 bundledir = os.path.join(base, "bundled")
@@ -331,8 +338,21 @@ class Configure(build_ext):
 
     @property
     def bundle_proton(self):
-        """Bundled proton if the conditions below are met."""
-        return not self.check_qpid_proton_version()
+        """Need to bundle proton if the conditions below are met."""
+        return ('QPID_PROTON_SRC' in os.environ) or \
+            (not self.check_qpid_proton_version())
+
+    def use_installed_proton(self):
+        """The Proton development headers and library are installed, tell swig
+        and the extension where to find them.
+        """
+        _cproton = self.distribution.ext_modules[-1]
+        incs = misc.pkg_config_get_var('includedir')
+        for i in incs.split():
+            _cproton.swig_opts.append('-I%s' % i)
+            _cproton.include_dirs.append(i)
+        ldirs = misc.pkg_config_get_var('libdir')
+        _cproton.library_dirs.extend(ldirs.split())
 
     def run(self):
         # linux2 for python<2.7
@@ -340,6 +360,8 @@ class Configure(build_ext):
         if sys.platform in ['linux', 'linux2', 'linux4']:
             if self.bundle_proton:
                 self.bundle_libqpid_proton_extension()
+            else:
+                self.use_installed_proton()
 
             # Do this just on linux since it's the only
             # platform we support building the bundle for

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/70a463f0/proton-c/bindings/python/setuputils/misc.py
----------------------------------------------------------------------
diff --git a/proton-c/bindings/python/setuputils/misc.py b/proton-c/bindings/python/setuputils/misc.py
index 3a32165..b1864a0 100644
--- a/proton-c/bindings/python/setuputils/misc.py
+++ b/proton-c/bindings/python/setuputils/misc.py
@@ -19,6 +19,26 @@ import sys
 
 from . import log
 
+def _call_pkg_config(args):
+    """Spawn a subprocess running pkg-config with the given args.
+
+    :param args: list of strings to pass to pkg-config's command line.
+    Refer to pkg-config's documentation for more detail.
+
+    Return the Popen object, or None if the command failed
+    """
+    try:
+        return subprocess.Popen(['pkg-config'] + args,
+                                stdout=subprocess.PIPE, stderr=subprocess.PIPE,
+                                universal_newlines=True)
+    except OSError as e:
+        if e.errno == errno.ENOENT:
+            log.warn("command not found: pkg-config")
+        else:
+            log.warn("Running pkg-config failed - %s." % e)
+    return None
+
+
 
 def pkg_config_version(atleast=None, max_version=None, module='libqpid-proton'):
     """Check the qpid_proton version using pkg-config
@@ -32,25 +52,31 @@ def pkg_config_version(atleast=None, max_version=None, module='libqpid-proton'):
     """
 
     if atleast and max_version:
-        log.error('Specify either atleast or max_version')
+        log.fatal('Specify either atleast or max_version')
 
-    try:
-        cmd = ['pkg-config',
-               '--%s-version=%s' % (atleast and 'atleast' or 'max',
-                                    atleast or max_version),
-               module]
-        p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
-    except OSError as e:
-        if e.errno == errno.ENOENT:
-            log.info("pkg-config not found")
-        else:
-            log.warn("Running pkg-config failed - %s." % e)
-        return False
+    p = _call_pkg_config(['--%s-version=%s' % (atleast and 'atleast' or 'max',
+                                               atleast or max_version),
+                          module])
+    if p:
+        out,err = p.communicate()
+        if p.returncode:
+            log.info("Did not find %s via pkg-config: %s" % (module, err))
+            return False
+        log.info("Using %s (found via pkg-config)." % module)
+        return True
+    return False
 
-    if p.wait():
-        log.info("Did not find libqpid-proton via pkg-config:")
-        log.info(p.stderr.read().decode())
-        return False
 
-    log.info("Using %s (found via pkg-config)." % module)
-    return True
+def pkg_config_get_var(name, module='libqpid-proton'):
+    """Retrieve the value of the named module variable as a string
+    """
+    p = _call_pkg_config(['--variable=%s' % name, module])
+    if not p:
+        log.warn("pkg-config: var %s get failed, package %s", name, module)
+        return ""
+    out,err = p.communicate()
+    if p.returncode:
+        out = ""
+        log.warn(err)
+    return out
+


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


[45/50] qpid-proton git commit: PROTON-936: make the session outgoing window a fixed value, defaulted very large but configurable if needed

Posted by ac...@apache.org.
PROTON-936: make the session outgoing window a fixed value, defaulted very large but configurable if needed


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

Branch: refs/heads/cjansen-cpp-client
Commit: a02ad90cab9af446e8251157a1525e3413776934
Parents: 32b00ae
Author: Robert Gemmell <ro...@apache.org>
Authored: Thu Jul 9 12:20:24 2015 +0100
Committer: Robert Gemmell <ro...@apache.org>
Committed: Thu Jul 9 12:26:04 2015 +0100

----------------------------------------------------------------------
 proton-c/bindings/python/proton/__init__.py     |  8 ++++++++
 proton-c/include/proton/session.h               | 16 +++++++++++++++
 proton-c/src/engine/engine-internal.h           |  1 +
 proton-c/src/engine/engine.c                    | 13 ++++++++++++
 proton-c/src/transport/transport.c              | 11 +---------
 .../org/apache/qpid/proton/engine/Session.java  |  8 ++++++++
 .../qpid/proton/engine/impl/SessionImpl.java    | 18 +++++++++++++++++
 .../qpid/proton/engine/impl/TransportImpl.java  |  2 +-
 .../proton/engine/impl/TransportSession.java    | 21 ++------------------
 proton-j/src/main/resources/cengine.py          |  6 ++++++
 tests/python/proton_tests/engine.py             |  6 ++++++
 11 files changed, 80 insertions(+), 30 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/a02ad90c/proton-c/bindings/python/proton/__init__.py
----------------------------------------------------------------------
diff --git a/proton-c/bindings/python/proton/__init__.py b/proton-c/bindings/python/proton/__init__.py
index 9c75800..d5dcceb 100644
--- a/proton-c/bindings/python/proton/__init__.py
+++ b/proton-c/bindings/python/proton/__init__.py
@@ -2571,6 +2571,14 @@ class Session(Wrapper, Endpoint):
 
   incoming_capacity = property(_get_incoming_capacity, _set_incoming_capacity)
 
+  def _get_outgoing_window(self):
+    return pn_session_get_outgoing_window(self._impl)
+
+  def _set_outgoing_window(self, window):
+    pn_session_set_outgoing_window(self._impl, window)
+
+  outgoing_window = property(_get_outgoing_window, _set_outgoing_window)
+
   @property
   def outgoing_bytes(self):
     return pn_session_outgoing_bytes(self._impl)

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/a02ad90c/proton-c/include/proton/session.h
----------------------------------------------------------------------
diff --git a/proton-c/include/proton/session.h b/proton-c/include/proton/session.h
index 5dedb99..94d2869 100644
--- a/proton-c/include/proton/session.h
+++ b/proton-c/include/proton/session.h
@@ -216,6 +216,22 @@ PN_EXTERN size_t pn_session_get_incoming_capacity(pn_session_t *session);
 PN_EXTERN void pn_session_set_incoming_capacity(pn_session_t *session, size_t capacity);
 
 /**
+ * Get the outgoing window for a session object.
+ *
+ * @param[in] session the session object
+ * @return  the outgoing window for the session
+ */
+PN_EXTERN size_t pn_session_get_outgoing_window(pn_session_t *session);
+
+/**
+ * Set the outgoing window for a session object.
+ *
+ * @param[in] session the session object
+ * @param[in] window the outgoing window for the session
+ */
+PN_EXTERN void pn_session_set_outgoing_window(pn_session_t *session, size_t window);
+
+/**
  * Get the number of outgoing bytes currently buffered by a session.
  *
  * @param[in] session a session object

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/a02ad90c/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 c03a0a3..727f50d 100644
--- a/proton-c/src/engine/engine-internal.h
+++ b/proton-c/src/engine/engine-internal.h
@@ -246,6 +246,7 @@ struct pn_session_t {
   pn_sequence_t outgoing_bytes;
   pn_sequence_t incoming_deliveries;
   pn_sequence_t outgoing_deliveries;
+  pn_sequence_t outgoing_window;
   pn_session_state_t state;
 };
 

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/a02ad90c/proton-c/src/engine/engine.c
----------------------------------------------------------------------
diff --git a/proton-c/src/engine/engine.c b/proton-c/src/engine/engine.c
index fda719a..ffbdf95 100644
--- a/proton-c/src/engine/engine.c
+++ b/proton-c/src/engine/engine.c
@@ -991,6 +991,7 @@ pn_session_t *pn_session(pn_connection_t *conn)
   ssn->outgoing_bytes = 0;
   ssn->incoming_deliveries = 0;
   ssn->outgoing_deliveries = 0;
+  ssn->outgoing_window = 2147483647;
 
   // begin transport state
   memset(&ssn->state, 0, sizeof(ssn->state));
@@ -1043,6 +1044,18 @@ void pn_session_set_incoming_capacity(pn_session_t *ssn, size_t capacity)
   ssn->incoming_capacity = capacity;
 }
 
+size_t pn_session_get_outgoing_window(pn_session_t *ssn)
+{
+  assert(ssn);
+  return ssn->outgoing_window;
+}
+
+void pn_session_set_outgoing_window(pn_session_t *ssn, size_t window)
+{
+  assert(ssn);
+  ssn->outgoing_window = window;
+}
+
 size_t pn_session_outgoing_bytes(pn_session_t *ssn)
 {
   assert(ssn);

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/a02ad90c/proton-c/src/transport/transport.c
----------------------------------------------------------------------
diff --git a/proton-c/src/transport/transport.c b/proton-c/src/transport/transport.c
index d2c3509..9ce01bd 100644
--- a/proton-c/src/transport/transport.c
+++ b/proton-c/src/transport/transport.c
@@ -1909,16 +1909,7 @@ static uint16_t allocate_alias(pn_hash_t *aliases, uint32_t max_index, int * val
 
 static size_t pni_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);
-  }
+  return ssn->outgoing_window;
 }
 
 static size_t pni_session_incoming_window(pn_session_t *ssn)

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/a02ad90c/proton-j/src/main/java/org/apache/qpid/proton/engine/Session.java
----------------------------------------------------------------------
diff --git a/proton-j/src/main/java/org/apache/qpid/proton/engine/Session.java b/proton-j/src/main/java/org/apache/qpid/proton/engine/Session.java
index f2f048a..2179dda 100644
--- a/proton-j/src/main/java/org/apache/qpid/proton/engine/Session.java
+++ b/proton-j/src/main/java/org/apache/qpid/proton/engine/Session.java
@@ -52,4 +52,12 @@ public interface Session extends Endpoint
 
     public int getOutgoingBytes();
 
+    public long getOutgoingWindow();
+
+    /**
+     * Sets the outgoing window size.
+     *
+     * @param outgoingWindowSize the outgoing window size
+     */
+    public void setOutgoingWindow(long outgoingWindowSize);
 }

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/a02ad90c/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 3af1820..9e108e4 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
@@ -44,6 +44,7 @@ public class SessionImpl extends EndpointImpl implements ProtonJSession
     private int _outgoingBytes = 0;
     private int _incomingDeliveries = 0;
     private int _outgoingDeliveries = 0;
+    private long _outgoingWindow = Integer.MAX_VALUE;
 
     private LinkNode<SessionImpl> _node;
 
@@ -270,4 +271,21 @@ public class SessionImpl extends EndpointImpl implements ProtonJSession
     {
         getConnectionImpl().put(Event.Type.SESSION_LOCAL_CLOSE, this);
     }
+
+    @Override
+    public void setOutgoingWindow(long outgoingWindow) {
+        if(outgoingWindow < 0 || outgoingWindow > 0xFFFFFFFFL)
+        {
+            throw new IllegalArgumentException("Value '" + outgoingWindow + "' must be in the"
+                    + " range [0 - 2^32-1]");
+        }
+
+        _outgoingWindow = outgoingWindow;
+    }
+
+    @Override
+    public long getOutgoingWindow()
+    {
+        return _outgoingWindow;
+    }
 }

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/a02ad90c/proton-j/src/main/java/org/apache/qpid/proton/engine/impl/TransportImpl.java
----------------------------------------------------------------------
diff --git a/proton-j/src/main/java/org/apache/qpid/proton/engine/impl/TransportImpl.java b/proton-j/src/main/java/org/apache/qpid/proton/engine/impl/TransportImpl.java
index 595afd6..7d285b1 100644
--- a/proton-j/src/main/java/org/apache/qpid/proton/engine/impl/TransportImpl.java
+++ b/proton-j/src/main/java/org/apache/qpid/proton/engine/impl/TransportImpl.java
@@ -448,7 +448,7 @@ public class TransportImpl extends EndpointImpl
         Flow flow = new Flow();
         flow.setNextIncomingId(ssn.getNextIncomingId());
         flow.setNextOutgoingId(ssn.getNextOutgoingId());
-        ssn.updateWindows();
+        ssn.updateIncomingWindow();
         flow.setIncomingWindow(ssn.getIncomingWindowSize());
         flow.setOutgoingWindow(ssn.getOutgoingWindowSize());
         if (link != null) {

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/a02ad90c/proton-j/src/main/java/org/apache/qpid/proton/engine/impl/TransportSession.java
----------------------------------------------------------------------
diff --git a/proton-j/src/main/java/org/apache/qpid/proton/engine/impl/TransportSession.java b/proton-j/src/main/java/org/apache/qpid/proton/engine/impl/TransportSession.java
index 1f4a9f8..33c6cd0 100644
--- a/proton-j/src/main/java/org/apache/qpid/proton/engine/impl/TransportSession.java
+++ b/proton-j/src/main/java/org/apache/qpid/proton/engine/impl/TransportSession.java
@@ -70,6 +70,7 @@ class TransportSession
     {
         _transport = transport;
         _session = session;
+        _outgoingWindowSize = UnsignedInteger.valueOf(session.getOutgoingWindow());
     }
 
     void unbind()
@@ -175,32 +176,14 @@ class TransportSession
         return _incomingWindowSize;
     }
 
-    public void updateWindows()
+    void updateIncomingWindow()
     {
-        // incoming window
         int size = _transport.getMaxFrameSize();
         if (size <= 0) {
             _incomingWindowSize = UnsignedInteger.valueOf(2147483647); // biggest legal value
         } else {
             _incomingWindowSize = UnsignedInteger.valueOf((_session.getIncomingCapacity() - _session.getIncomingBytes())/size);
         }
-
-        // outgoing window
-        int outgoingDeliveries = _session.getOutgoingDeliveries();
-        if (size <= 0) {
-            _outgoingWindowSize = UnsignedInteger.valueOf(outgoingDeliveries);
-        } else {
-            int outgoingBytes = _session.getOutgoingBytes();
-            int frames = outgoingBytes/size;
-            if (outgoingBytes % size > 0) {
-                frames++;
-            }
-            if (frames > outgoingDeliveries) {
-                _outgoingWindowSize = UnsignedInteger.valueOf(frames);
-            } else {
-                _outgoingWindowSize = UnsignedInteger.valueOf(outgoingDeliveries);
-            }
-        }
     }
 
     public UnsignedInteger getOutgoingDeliveryId()

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/a02ad90c/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 c94d023..ee2226d 100644
--- a/proton-j/src/main/resources/cengine.py
+++ b/proton-j/src/main/resources/cengine.py
@@ -280,6 +280,12 @@ def pn_session_incoming_bytes(ssn):
 def pn_session_outgoing_bytes(ssn):
   return ssn.impl.getOutgoingBytes()
 
+def pn_session_get_outgoing_window(ssn):
+  return ssn.impl.getOutgoingWindow()
+
+def pn_session_set_outgoing_window(ssn, window):
+  ssn.impl.setOutgoingWindow(window)
+
 def pn_session_condition(ssn):
   return ssn.condition
 

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/a02ad90c/tests/python/proton_tests/engine.py
----------------------------------------------------------------------
diff --git a/tests/python/proton_tests/engine.py b/tests/python/proton_tests/engine.py
index 258665d..c18683f 100644
--- a/tests/python/proton_tests/engine.py
+++ b/tests/python/proton_tests/engine.py
@@ -506,6 +506,12 @@ class SessionTest(Test):
     assert snd.state == Endpoint.LOCAL_ACTIVE | Endpoint.REMOTE_ACTIVE
     assert rcv.state == Endpoint.LOCAL_ACTIVE | Endpoint.REMOTE_ACTIVE
 
+  def test_set_get_outgoing_window(self):
+    assert self.ssn.outgoing_window == 2147483647
+
+    self.ssn.outgoing_window = 1024
+    assert self.ssn.outgoing_window == 1024
+
 
 class LinkTest(Test):
 


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


[05/50] qpid-proton git commit: PROTON-334: include pni_init_server and pni_init_client function as in javascript binding

Posted by ac...@apache.org.
PROTON-334: include pni_init_server and pni_init_client function as in javascript binding


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

Branch: refs/heads/cjansen-cpp-client
Commit: a2a4026c06e9223ec216c0615088d9e8f4be5e08
Parents: f965610
Author: Gordon Sim <gs...@redhat.com>
Authored: Thu Jun 25 18:48:35 2015 +0100
Committer: Gordon Sim <gs...@redhat.com>
Committed: Thu Jun 25 18:48:44 2015 +0100

----------------------------------------------------------------------
 proton-c/bindings/javascript/CMakeLists.txt | 1 +
 1 file changed, 1 insertion(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/a2a4026c/proton-c/bindings/javascript/CMakeLists.txt
----------------------------------------------------------------------
diff --git a/proton-c/bindings/javascript/CMakeLists.txt b/proton-c/bindings/javascript/CMakeLists.txt
index 5a87baf..ea06e07 100644
--- a/proton-c/bindings/javascript/CMakeLists.txt
+++ b/proton-c/bindings/javascript/CMakeLists.txt
@@ -147,6 +147,7 @@ set(qpid-proton-core
   ${PN_PATH}/src/transport/transport.c
   ${PN_PATH}/src/message/message.c
   ${PN_PATH}/src/sasl/sasl.c
+  ${PN_PATH}/src/sasl/none_sasl.c
 
   ${PN_PATH}/src/messenger/messenger.c
   ${PN_PATH}/src/messenger/subscription.c


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


[25/50] qpid-proton git commit: PROTON-881: Tidy up and doc reactor interfaces

Posted by ac...@apache.org.
PROTON-881: Tidy up and doc reactor interfaces

Tidy up the Java interfaces for the proton-j reactor by removing a few
unnecessary setters.  Document the interfaces using Javadoc.


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

Branch: refs/heads/cjansen-cpp-client
Commit: 2f8728a85fbea23db73fe60e42038782f89a5517
Parents: 513f152
Author: Adrian Preston <pr...@uk.ibm.com>
Authored: Wed Jul 1 00:30:53 2015 +0100
Committer: Rafael Schloming <rh...@alum.mit.edu>
Committed: Sun Jul 5 19:57:39 2015 -0400

----------------------------------------------------------------------
 .../qpid/proton/example/reactor/HelloWorld.java |   2 +-
 .../apache/qpid/proton/reactor/Acceptor.java    |   9 +
 .../qpid/proton/reactor/FlowController.java     |   4 +
 .../apache/qpid/proton/reactor/Handshaker.java  |   7 +
 .../org/apache/qpid/proton/reactor/Reactor.java | 278 +++++++++++++++----
 .../qpid/proton/reactor/ReactorChild.java       |   5 +-
 .../apache/qpid/proton/reactor/Selectable.java  | 227 +++++++++++----
 .../apache/qpid/proton/reactor/Selector.java    |  80 +++++-
 .../org/apache/qpid/proton/reactor/Task.java    |  20 +-
 .../qpid/proton/reactor/impl/AcceptorImpl.java  |   2 +-
 .../qpid/proton/reactor/impl/IOHandler.java     |  21 +-
 .../qpid/proton/reactor/impl/ReactorImpl.java   |  18 +-
 .../proton/reactor/impl/SelectableImpl.java     |   9 +-
 .../qpid/proton/reactor/impl/SelectorImpl.java  |   2 +-
 .../qpid/proton/reactor/impl/TaskImpl.java      |   3 +-
 15 files changed, 552 insertions(+), 135 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/2f8728a8/examples/java/reactor/src/main/java/org/apache/qpid/proton/example/reactor/HelloWorld.java
----------------------------------------------------------------------
diff --git a/examples/java/reactor/src/main/java/org/apache/qpid/proton/example/reactor/HelloWorld.java b/examples/java/reactor/src/main/java/org/apache/qpid/proton/example/reactor/HelloWorld.java
index 745004e..055d6df 100644
--- a/examples/java/reactor/src/main/java/org/apache/qpid/proton/example/reactor/HelloWorld.java
+++ b/examples/java/reactor/src/main/java/org/apache/qpid/proton/example/reactor/HelloWorld.java
@@ -33,7 +33,7 @@ import org.apache.qpid.proton.reactor.Reactor;
  * The proton reactor provides a general purpose event processing
  * library for writing reactive programs. A reactive program is defined
  * by a set of event handlers. An event handler is just any class or
- * object that extends the Handler interface. For convinience, a class
+ * object that extends the Handler interface. For convenience, a class
  * can extend BaseHandler and only handle the events that it cares to
  * implement methods for.
  */

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/2f8728a8/proton-j/src/main/java/org/apache/qpid/proton/reactor/Acceptor.java
----------------------------------------------------------------------
diff --git a/proton-j/src/main/java/org/apache/qpid/proton/reactor/Acceptor.java b/proton-j/src/main/java/org/apache/qpid/proton/reactor/Acceptor.java
index 744f4cb..222ce40 100644
--- a/proton-j/src/main/java/org/apache/qpid/proton/reactor/Acceptor.java
+++ b/proton-j/src/main/java/org/apache/qpid/proton/reactor/Acceptor.java
@@ -23,8 +23,17 @@ package org.apache.qpid.proton.reactor;
 
 import org.apache.qpid.proton.engine.Extendable;
 
+/**
+ * Acceptors are children of a {@link Reactor} that accept in-bound network
+ * connections.
+ */
 public interface Acceptor extends ReactorChild, Extendable {
 
+    /**
+     * Closes the acceptor, stopping it accepting any further in-bound
+     * connections.  Already accepted connections continue to be processed by
+     * the associated reactor.
+     */
     void close();
 
 }

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/2f8728a8/proton-j/src/main/java/org/apache/qpid/proton/reactor/FlowController.java
----------------------------------------------------------------------
diff --git a/proton-j/src/main/java/org/apache/qpid/proton/reactor/FlowController.java b/proton-j/src/main/java/org/apache/qpid/proton/reactor/FlowController.java
index c8b999b..716b2a7 100644
--- a/proton-j/src/main/java/org/apache/qpid/proton/reactor/FlowController.java
+++ b/proton-j/src/main/java/org/apache/qpid/proton/reactor/FlowController.java
@@ -26,6 +26,10 @@ import org.apache.qpid.proton.engine.Event;
 import org.apache.qpid.proton.engine.Link;
 import org.apache.qpid.proton.engine.Receiver;
 
+/**
+ * A handler that applies flow control to a connection.  This handler tops-up
+ * link credit each time credit is expended by the receipt of messages.
+ */
 public class FlowController extends BaseHandler {
 
     private int drained;

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/2f8728a8/proton-j/src/main/java/org/apache/qpid/proton/reactor/Handshaker.java
----------------------------------------------------------------------
diff --git a/proton-j/src/main/java/org/apache/qpid/proton/reactor/Handshaker.java b/proton-j/src/main/java/org/apache/qpid/proton/reactor/Handshaker.java
index f9b670a..cbd496e 100644
--- a/proton-j/src/main/java/org/apache/qpid/proton/reactor/Handshaker.java
+++ b/proton-j/src/main/java/org/apache/qpid/proton/reactor/Handshaker.java
@@ -26,6 +26,13 @@ import org.apache.qpid.proton.engine.Endpoint;
 import org.apache.qpid.proton.engine.EndpointState;
 import org.apache.qpid.proton.engine.Event;
 
+/**
+ * A handler that mirrors the actions of the remote end of a connection.  This
+ * handler responds in kind when the remote end of the connection is opened and
+ * closed.  Likewise if the remote end of the connection opens or closes
+ * sessions and links, this handler responds by opening or closing the local end
+ * of the session or link.
+ */
 public class Handshaker extends BaseHandler {
 
     private void open(Endpoint endpoint) {

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/2f8728a8/proton-j/src/main/java/org/apache/qpid/proton/reactor/Reactor.java
----------------------------------------------------------------------
diff --git a/proton-j/src/main/java/org/apache/qpid/proton/reactor/Reactor.java b/proton-j/src/main/java/org/apache/qpid/proton/reactor/Reactor.java
index 3201c5a..f2a38a5 100644
--- a/proton-j/src/main/java/org/apache/qpid/proton/reactor/Reactor.java
+++ b/proton-j/src/main/java/org/apache/qpid/proton/reactor/Reactor.java
@@ -24,15 +24,26 @@ package org.apache.qpid.proton.reactor;
 import java.io.IOException;
 import java.util.Set;
 
+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.Event.Type;
 import org.apache.qpid.proton.engine.Handler;
 import org.apache.qpid.proton.engine.HandlerException;
 import org.apache.qpid.proton.engine.Record;
 import org.apache.qpid.proton.reactor.impl.ReactorImpl;
 
-
-
+/**
+ * The proton reactor provides a general purpose event processing
+ * library for writing reactive programs. A reactive program is defined
+ * by a set of event handlers. An event handler is just any class or
+ * object that extends the Handler interface. For convenience, a class
+ * can extend {@link BaseHandler} and only handle the events that it cares to
+ * implement methods for.
+ * <p>
+ * This class is not thread safe (with the exception of the {@link #wakeup()}
+ * method) and should only be used by a single thread at any given time.
+ */
 public interface Reactor {
 
     public static final class Factory
@@ -42,55 +53,228 @@ public interface Reactor {
         }
     }
 
-    public long mark();
-    public long now();
-    public Record attachments();
-    public long getTimeout();
-
-    public void setTimeout(long timeout);
-
-    public Handler getGlobalHandler();
-
-    public void setGlobalHandler(Handler handler);
-
-    public Handler getHandler();
-
-    public void setHandler(Handler handler);
-
-    public Set<ReactorChild> children();
-
-    public Collector collector();
-
-
-    public Selectable selectable();
-
-
-
-    public void update(Selectable selectable);
-
-
+    /**
+     * Updates the last time that the reactor's state has changed, potentially
+     * resulting in events being generated.
+     * @return the current time in milliseconds
+     *         {@link System#currentTimeMillis()}.
+     */
+    long mark();
+
+    /** @return the last time that {@link #mark()} was called. */
+    long now();
+
+    /** @return an instance of {@link Record} that can be used to associate
+     *          other objects (attachments) with this instance of the
+     *          Reactor class.
+     */
+    Record attachments();
+
+    /**
+     * @param timeout a timeout value, to associate with this instance of
+     *        the reactor.  This can be retrieved using the
+     *        {@link #getTimeout()} method.
+     */
+    void setTimeout(long timeout);
+
+    /**
+     * @return the value previously set using {@link #setTimeout(long)} or
+     *         0 if no previous value has been set.
+     */
+    long getTimeout();
+
+    /**
+     * @return the global handler for this reactor.  Every event the reactor
+     *         sees is dispatched to the global handler.  To receive every
+     *         event generated by the reactor, associate a child handler
+     *         with the global handler.  For example:
+     *         <pre>
+     *            getGlobalHandler().add(yourHandler);
+     *         </pre>
+     */
+    Handler getGlobalHandler();
+
+    /**
+     * Sets a new global handler.  You probably don't want to do this and
+     * would be better adding a handler to the value returned by the
+     * {{@link #getGlobalHandler()} method.
+     * @param handler the new global handler.
+     */
+    void setGlobalHandler(Handler handler);
+
+    /**
+     * @return the handler for this reactor.  Every event the reactor sees,
+     *         which is not handled by a child of the reactor (such as a
+     *         timer, connection, acceptor, or selector) is passed to this
+     *         handler.  To receive these events, it is recommend that you
+     *         associate a child handler with the handler returned by this
+     *         method.  For example:
+     *         <pre>
+     *           getHandler().add(yourHandler);
+     *         </pre>
+     */
+    Handler getHandler();
+
+    /**
+     * Sets a new handler, that will receive any events not handled by a child
+     * of the reactor.  Note that setting a handler via this method replaces
+     * the previous handler, and will result in no further events being
+     * dispatched to the child handlers associated with the previous handler.
+     * For this reason it is recommended that you do not use this method and
+     * instead add child handlers to the value returned by the
+     * {@link #getHandler()} method.
+     * @param handler the new handler for this reactor.
+     */
+    void setHandler(Handler handler);
+
+    /**
+     * @return a set containing the child objects associated wit this reactor.
+     *         This will contain any active instances of: {@link Task} - created
+     *         using the {@link #schedule(int, Handler)} method,
+     *         {@link Connection} - created using the
+     *         {@link #connection(Handler)} method, {@link Acceptor} -
+     *         created using the {@link #acceptor(String, int)} method.
+     *         {@link #acceptor(String, int, Handler)} method, or
+     *         {@link Selectable} - created using the {@link #selectable()}
+     *         method.
+     */
+    Set<ReactorChild> children();
+
+    /**
+     * @return the Collector used to gather events generated by this reactor.
+     */
+    Collector collector();
+
+    /**
+     * Creates a new <code>Selectable</code> as a child of this reactor.
+     * @return the newly created <code>Selectable</code>.
+     */
+    Selectable selectable();
+
+    /**
+     * Updates the specified <code>Selectable</code> either emitting a
+     * {@link Type#SELECTABLE_UPDATED} event if the selectable is not terminal,
+     * or {@link Type#SELECTABLE_FINAL} if the selectable is terminal and has
+     * not already emitted a {@link Type#SELECTABLE_FINAL} event.
+     * @param selectable
+     */
+    void update(Selectable selectable);
+
+    /**
+     * Yields, causing the next call to {@link #process()} to return
+     * successfully - without processing any events.  If multiple calls
+     * can be made to <code>yield</code> and only the next invocation of
+     * {@link #process()} will be affected.
+     */
     void yield() ;
 
-    public boolean quiesced();
-
-    public boolean process() throws HandlerException;
-
-    public void wakeup() throws IOException;
-
-    public void start() ;
-
-    public void stop() throws HandlerException;
-
-    public void run() throws HandlerException;
-
-    // pn_reactor_schedule from reactor.c
-    public Task schedule(int delay, Handler handler);
-
+    /**
+     * @return <code>true</code> if the reactor is in quiesced state (e.g. has
+     *         no events to process).  <code>false</code> is returned otherwise.
+     */
+    boolean quiesced();
+
+    /**
+     * Process any events pending for this reactor.  Events are dispatched to
+     * the handlers registered with the reactor, or child objects associated
+     * with the reactor.  This method blocks until the reactor has no more work
+     * to do (and no more work pending, in terms of scheduled tasks or open
+     * selectors to process).
+     * @return <code>true</code> if the reactor may have more events in the
+     *         future.  For example: if there are scheduled tasks, or open
+     *         selectors.  <code>false</code> is returned if the reactor has
+     *         (and will have) no more events to process.
+     * @throws HandlerException if an unchecked exception is thrown by one of
+     *         the handlers - it will be re-thrown attached to an instance of
+     *         <code>HandlerException</code>.
+     */
+    boolean process() throws HandlerException;
+
+    /**
+     * Wakes up the thread (if any) blocked in the {@link #process()} method.
+     * This is the only method of this class that is thread safe, in that it
+     * can be used at the same time as another thread is using the reactor.
+     */
+    void wakeup();
+
+    /**
+     * Starts the reactor.  This method should be invoked before the first call
+     * to {@link #process()}.
+     */
+    void start();
+
+    /**
+     * Stops the reactor.  This method should be invoked after the last call to
+     * {@link #process()}.
+     * @throws HandlerException
+     */
+    void stop() throws HandlerException;
+
+    /**
+     * Simplifies the use of the reactor by wrapping the use of
+     * <code>start</code>, <code>run</code>, and <code>stop</code> method
+     * calls.
+     * <p>
+     * Logically the implementation of this method is:
+     * <pre>
+     *   start();
+     *   while(process()) {}
+     *   stop();
+     * </pre>
+     * @throws HandlerException if an unchecked exception is thrown by one of
+     *         the handlers - it will be re-thrown attached to an instance of
+     *         <code>HandlerException</code>.
+     */
+    void run() throws HandlerException;
+
+    /**
+     * Schedules execution of a task to take place at some point in the future.
+     * @param delay the number of milliseconds, in the future, to schedule the
+     *              task for.
+     * @param handler a handler to associate with the task.  This is notified
+     *                when the deadline for the task is reached.
+     * @return an object representing the task that has been scheduled.
+     */
+    Task schedule(int delay, Handler handler);
+
+    /**
+     * Creates a new out-bound connection.
+     * @param handler a handler that is notified when events occur for the
+     *                connection.  Typically the host and port to connect to
+     *                would be supplied to the connection object inside the
+     *                logic which handles the {@link Type#CONNECTION_INIT}
+     *                event.
+     * @return the newly created connection object.
+     */
     Connection connection(Handler handler);
 
+    /**
+     * Creates a new acceptor.  This is equivalent to calling:
+     * <pre>
+     *   acceptor(host, port, null);
+     * </pre>
+     * @param host
+     * @param port
+     * @return the newly created acceptor object.
+     * @throws IOException
+     */
     Acceptor acceptor(String host, int port) throws IOException;
-    Acceptor acceptor(String host, int port, Handler handler) throws IOException;
 
-    // This also frees any children that the reactor has!
-    public void free();
+    /**
+     * Creates a new acceptor.  This acceptor listens for in-bound connections.
+     * @param host the host name or address of the NIC to listen on.
+     * @param port the port number to listen on.
+     * @param handler if non-<code>null</code> this handler is registered with
+     *                each new connection accepted by the acceptor.
+     * @return the newly created acceptor object.
+     * @throws IOException
+     */
+    Acceptor acceptor(String host, int port, Handler handler)
+            throws IOException;
+
+    /**
+     * Frees any resources (such as sockets and selectors) held by the reactor
+     * or its children.
+     */
+    void free();
 }

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/2f8728a8/proton-j/src/main/java/org/apache/qpid/proton/reactor/ReactorChild.java
----------------------------------------------------------------------
diff --git a/proton-j/src/main/java/org/apache/qpid/proton/reactor/ReactorChild.java b/proton-j/src/main/java/org/apache/qpid/proton/reactor/ReactorChild.java
index c39bdd9..146ee09 100644
--- a/proton-j/src/main/java/org/apache/qpid/proton/reactor/ReactorChild.java
+++ b/proton-j/src/main/java/org/apache/qpid/proton/reactor/ReactorChild.java
@@ -21,8 +21,11 @@
 
 package org.apache.qpid.proton.reactor;
 
-// Interface used to identify classes that can be a child of a reactor.
+/**
+ * Interface used to identify classes that can be a child of a reactor.
+ */
 public interface ReactorChild {
 
+    /** Frees any resources associated with this child. */
     void free();
 }

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/2f8728a8/proton-j/src/main/java/org/apache/qpid/proton/reactor/Selectable.java
----------------------------------------------------------------------
diff --git a/proton-j/src/main/java/org/apache/qpid/proton/reactor/Selectable.java b/proton-j/src/main/java/org/apache/qpid/proton/reactor/Selectable.java
index fa459d1..e91a0ee 100644
--- a/proton-j/src/main/java/org/apache/qpid/proton/reactor/Selectable.java
+++ b/proton-j/src/main/java/org/apache/qpid/proton/reactor/Selectable.java
@@ -25,72 +25,197 @@ import java.nio.channels.SelectableChannel;
 
 import org.apache.qpid.proton.engine.Collector;
 import org.apache.qpid.proton.engine.Extendable;
-import org.apache.qpid.proton.engine.Transport;
 
+/**
+ * An entity that can be multiplexed using a {@link Selector}.
+ * <p>
+ * Every selectable is associated with exactly one {@link SelectableChannel}.
+ * Selectables may be interested in three kinds of events: read events, write
+ * events, and timer events. A selectable will express its interest in these
+ * events through the {@link #isReading()}, {@link #isWriting()}, and
+ * {@link #getDeadline()} methods.
+ * <p>
+ * When a read, write, or timer event occurs, the selectable must be notified by
+ * calling {@link #readable()}, {@link #writeable()}, or {@link #expired()} as
+ * appropriate.
+ *
+ * Once a selectable reaches a terminal state (see {@link #isTerminal()}, it
+ * will never be interested in events of any kind. When this occurs it should be
+ * removed from the Selector and discarded using {@link #free()}.
+ */
 public interface Selectable extends ReactorChild, Extendable {
 
-    public interface Callback {
+    /**
+     * A callback that can be passed to the various "on" methods of the
+     * selectable - to allow code to be run when the selectable becomes ready
+     * for the associated operation.
+     */
+    interface Callback {
         void run(Selectable selectable);
     }
 
-    public boolean isReading();
-
+    /**
+     * @return <code>true</code> if the selectable is interested in receiving
+     *         notification (via the {@link #readable()} method that indicate
+     *         that the associated {@link SelectableChannel} has data ready
+     *         to be read from it.
+     */
+    boolean isReading();
+
+    /**
+     * @return <code>true</code> if the selectable is interested in receiving
+     *         notifications (via the {@link #writeable()} method that indicate
+     *         that the associated {@link SelectableChannel} is ready to be
+     *         written to.
+     */
     boolean isWriting();
 
-    long getDeadline() ;
-
-    void setReading(boolean reading) ;
-
+    /**
+     * @return a deadline after which this selectable can expect to receive
+     *         a notification (via the {@link #expired()} method that indicates
+     *         that the deadline has past.  The deadline is expressed in the
+     *         same format as {@link System#currentTimeMillis()}.  Returning
+     *         a deadline of zero (or a negative number) indicates that the
+     *         selectable does not wish to be notified of expiry.
+     */
+    long getDeadline();
+
+    /**
+     * Sets the value that will be returned by {@link #isReading()}.
+     * @param reading
+     */
+    void setReading(boolean reading);
+
+    /**
+     * Sets the value that will be returned by {@link #isWriting()}.
+     * @param writing
+     */
     void setWriting(boolean writing);
 
-    void setDeadline(long deadline) ;
-
-    public void onReadable(Callback runnable) ;
-
-    public void onWritable(Callback runnable);
-
-    public void onExpired(Callback runnable);
-
-    public void onError(Callback runnable);
-
-    public void onRelease(Callback runnable);
-
-    public void onFree(Callback runnable);
-
-    void readable() ;
-
-    void writeable() ;
-
-    void expired() ;
-
+    /**
+     * Sets the value that will be returned by {@link #getDeadline()}.
+     * @param deadline
+     */
+    void setDeadline(long deadline);
+
+    /**
+     * Registers a callback that will be run when the selectable becomes ready
+     * for reading.
+     * @param runnable the callback to register.  Any previously registered
+     *                 callback will be replaced.
+     */
+    void onReadable(Callback runnable);
+
+    /**
+     * Registers a callback that will be run when the selectable becomes ready
+     * for writing.
+     * @param runnable the callback to register.  Any previously registered
+     *                 callback will be replaced.
+     */
+    void onWritable(Callback runnable);
+
+    /**
+     * Registers a callback that will be run when the selectable expires.
+     * @param runnable the callback to register.  Any previously registered
+     *                 callback will be replaced.
+     */
+    void onExpired(Callback runnable);
+
+    /**
+     * Registers a callback that will be run when the selectable is notified of
+     * an error.
+     * @param runnable the callback to register.  Any previously registered
+     *                 callback will be replaced.
+     */
+    void onError(Callback runnable);
+
+    /**
+     * Registers a callback that will be run when the selectable is notified
+     * that it has been released.
+     * @param runnable the callback to register.  Any previously registered
+     *                 callback will be replaced.
+     */
+    void onRelease(Callback runnable);
+
+    /**
+     * Registers a callback that will be run when the selectable is notified
+     * that it has been free'd.
+     * @param runnable the callback to register.  Any previously registered
+     *                 callback will be replaced.
+     */
+    void onFree(Callback runnable);
+
+    /**
+     * Notify the selectable that the underlying {@link SelectableChannel} is
+     * ready for a read operation.
+     */
+    void readable();
+
+    /**
+     * Notify the selectable that the underlying {@link SelectableChannel} is
+     * ready for a write operation.
+     */
+    void writeable();
+
+    /** Notify the selectable that it has expired. */
+    void expired();
+
+    /** Notify the selectable that an error has occurred. */
     void error();
 
-    void release() ;
+    /** Notify the selectable that it has been released. */
+    void release();
 
+    /** Notify the selectable that it has been free'd. */
     @Override
-    void free() ;
-
-    // These are equivalent to the C code's set/get file descriptor functions.
-    void setChannel(SelectableChannel channel) ;
-
-    public SelectableChannel getChannel() ;
-
-    boolean isRegistered() ;
-
-    void setRegistered(boolean registered) ;
-
-    void setCollector(final Collector collector) ;
-
-    public Reactor getReactor() ;
-
+    void free();
+
+    /**
+     * Associates a {@link SelectableChannel} with this selector.
+     * @param channel
+     */
+    void setChannel(SelectableChannel channel); // This is the equivalent to pn_selectable_set_fd(...)
+
+    /** @return the {@link SelectableChannel} associated with this selector. */
+    SelectableChannel getChannel(); // This is the equivalent to pn_selectable_get_fd(...)
+
+    /**
+     * Check if a selectable is registered.  This can be used for tracking
+     * whether a given selectable has been registerd with an external event
+     * loop.
+     * <p>
+     * <em>Note:</em> the reactor code, currently, does not use this flag.
+     * @return <code>true</code>if the selectable is registered.
+     */
+    boolean isRegistered();  // XXX: unused in C reactor code
+
+    /**
+     * Set the registered flag for a selectable.
+     * <p>
+     * <em>Note:</em> the reactor code, currently, does not use this flag.
+     * @param registered the value returned by {@link #isRegistered()}
+     */
+    void setRegistered(boolean registered); // XXX: unused in C reactor code
+
+    /**
+     * Configure a selectable with a set of callbacks that emit readable,
+     * writable, and expired events into the supplied collector.
+     * @param collector
+     */
+    void setCollector(final Collector collector);
+
+    /** @return the reactor to which this selectable is a child. */
+    Reactor getReactor() ;
+
+    /**
+     * Terminates the selectable.  Once a selectable reaches a terminal state
+     * it will never be interested in events of any kind.
+     */
     public void terminate() ;
 
-    public boolean isTerminal();
-
-    public Transport getTransport() ;
-
-    public void setTransport(Transport transport) ;
-
-    public void setReactor(Reactor reactor) ;
+    /**
+     * @return <code>true</code> if the selectable has reached a terminal state.
+     */
+    boolean isTerminal();
 
 }

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/2f8728a8/proton-j/src/main/java/org/apache/qpid/proton/reactor/Selector.java
----------------------------------------------------------------------
diff --git a/proton-j/src/main/java/org/apache/qpid/proton/reactor/Selector.java b/proton-j/src/main/java/org/apache/qpid/proton/reactor/Selector.java
index 592e32a..4228a8d 100644
--- a/proton-j/src/main/java/org/apache/qpid/proton/reactor/Selector.java
+++ b/proton-j/src/main/java/org/apache/qpid/proton/reactor/Selector.java
@@ -24,20 +24,88 @@ package org.apache.qpid.proton.reactor;
 import java.io.IOException;
 import java.util.Iterator;
 
+/**
+ * A multiplexor of instances of {@link Selectable}.
+ * <p>
+ * Many instances of <code>Selectable</code> can be added to a selector, and
+ * the {@link #select(long)} method used to block the calling thread until
+ * one of the <code>Selectables</code> becomes read to perform an operation.
+ * <p>
+ * This class is not thread safe, so only one thread should be manipulating the
+ * contents of the selector, or running the {@link #select(long)} method at
+ * any given time.
+ */
 public interface Selector {
 
-    void add(Selectable selectable) throws IOException ;
+    /**
+     * Adds a selectable to the selector.
+     * @param selectable
+     * @throws IOException
+     */
+    void add(Selectable selectable) throws IOException;
 
+    /**
+     * Updates the selector to reflect any changes interest by the specified
+     * selectable.  This is achieved by calling the
+     * {@link Selectable#isReading()} and {@link Selectable#isWriting()}
+     * methods.
+     * @param selectable
+     */
     void update(Selectable selectable);
 
-    void remove(Selectable selectable) ;
+    /**
+     * Removes a selectable from the selector.
+     * @param selectable
+     */
+    void remove(Selectable selectable);
+
+    /**
+     * Waits for the specified timeout period for one or more selectables to
+     * become ready for an operation.  Selectables that become ready are
+     * returned by the {@link #readable()}, {@link #writeable()},
+     * {@link #expired()}, or {@link #error()} methods.
+     *
+     * @param timeout the maximum number of milliseconds to block the calling
+     *                thread waiting for a selectable to become ready for an
+     *                operation.  The value zero is interpreted as check but
+     *                don't block.
+     * @throws IOException
+     */
+    void select(long timeout) throws IOException;
+
+    /**
+     * @return the selectables that have become readable since the last call
+     *         to {@link #select(long)}.  Calling <code>select</code> clears
+     *         any previous values in this set before adding new values
+     *         corresponding to those selectables that have become readable.
+     */
+    Iterator<Selectable> readable();
+
+    /**
+     * @return the selectables that have become writable since the last call
+     *         to {@link #select(long)}.  Calling <code>select</code> clears
+     *         any previous values in this set before adding new values
+     *         corresponding to those selectables that have become writable.
+     */
+    Iterator<Selectable> writeable();
 
-    void select(long timeout) throws IOException ;
+    /**
+     * @return the selectables that have expired since the last call
+     *         to {@link #select(long)}.  Calling <code>select</code> clears
+     *         any previous values in this set before adding new values
+     *         corresponding to those selectables that have now expired.
+     */
+    Iterator<Selectable> expired();
 
-    Iterator<Selectable> readable() ;
-    Iterator<Selectable> writeable() ;
-    Iterator<Selectable> expired() ;
+    /**
+     * @return the selectables that have encountered an error since the last
+     *         call to {@link #select(long)}.  Calling <code>select</code>
+     *         clears any previous values in this set before adding new values
+     *         corresponding to those selectables that have encountered an
+     *         error.
+     */
     Iterator<Selectable> error() ;
 
+    /** Frees the resources used by this selector. */
     void free();
 }

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/2f8728a8/proton-j/src/main/java/org/apache/qpid/proton/reactor/Task.java
----------------------------------------------------------------------
diff --git a/proton-j/src/main/java/org/apache/qpid/proton/reactor/Task.java b/proton-j/src/main/java/org/apache/qpid/proton/reactor/Task.java
index 9d2557c..69701ab 100644
--- a/proton-j/src/main/java/org/apache/qpid/proton/reactor/Task.java
+++ b/proton-j/src/main/java/org/apache/qpid/proton/reactor/Task.java
@@ -21,12 +21,26 @@
 
 package org.apache.qpid.proton.reactor;
 
+import org.apache.qpid.proton.engine.Event.Type;
 import org.apache.qpid.proton.engine.Extendable;
+import org.apache.qpid.proton.engine.Handler;
 
+/**
+ * Represents work scheduled with a {@link Reactor} for execution at
+ * some point in the future.
+ * <p>
+ * Tasks are created using the {@link Reactor#schedule(int, Handler)}
+ * method.
+ */
 public interface Task extends Extendable {
 
-    public long deadline();
-    public void setReactor(Reactor reactor);
-    public Reactor getReactor();
+    /**
+     * @return the deadline at which the handler associated with the scheduled
+     *         task should be delivered a {@link Type#TIMER_TASK} event.
+     */
+    long deadline();
+
+    /** @return the reactor that created this task. */
+    Reactor getReactor();
 
 }

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/2f8728a8/proton-j/src/main/java/org/apache/qpid/proton/reactor/impl/AcceptorImpl.java
----------------------------------------------------------------------
diff --git a/proton-j/src/main/java/org/apache/qpid/proton/reactor/impl/AcceptorImpl.java b/proton-j/src/main/java/org/apache/qpid/proton/reactor/impl/AcceptorImpl.java
index 7fe97af..431b745 100644
--- a/proton-j/src/main/java/org/apache/qpid/proton/reactor/impl/AcceptorImpl.java
+++ b/proton-j/src/main/java/org/apache/qpid/proton/reactor/impl/AcceptorImpl.java
@@ -43,7 +43,7 @@ import org.apache.qpid.proton.reactor.Selectable.Callback;
 public class AcceptorImpl implements Acceptor {
 
     private Record attachments = new RecordImpl();
-    private final Selectable sel;
+    private final SelectableImpl sel;
 
     private class AcceptorReadable implements Callback {
         @Override

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/2f8728a8/proton-j/src/main/java/org/apache/qpid/proton/reactor/impl/IOHandler.java
----------------------------------------------------------------------
diff --git a/proton-j/src/main/java/org/apache/qpid/proton/reactor/impl/IOHandler.java b/proton-j/src/main/java/org/apache/qpid/proton/reactor/impl/IOHandler.java
index fa807e4..40eddac 100644
--- a/proton-j/src/main/java/org/apache/qpid/proton/reactor/impl/IOHandler.java
+++ b/proton-j/src/main/java/org/apache/qpid/proton/reactor/impl/IOHandler.java
@@ -124,7 +124,7 @@ public class IOHandler extends BaseHandler {
 
     // pni_connection_capacity from connection.c
     private static int capacity(Selectable selectable) {
-        Transport transport = selectable.getTransport();
+        Transport transport = ((SelectableImpl)selectable).getTransport();
         int capacity = transport.capacity();
         if (capacity < 0) {
             if (transport.isClosed()) {
@@ -136,7 +136,7 @@ public class IOHandler extends BaseHandler {
 
     // pni_connection_pending from connection.c
     private static int pending(Selectable selectable) {
-        Transport transport = selectable.getTransport();
+        Transport transport = ((SelectableImpl)selectable).getTransport();
         int pending = transport.pending();
         if (pending < 0) {
             if (transport.isClosed()) {
@@ -147,7 +147,7 @@ public class IOHandler extends BaseHandler {
     }
 
     // pni_connection_deadline from connection.c
-    private static long deadline(Selectable selectable) {
+    private static long deadline(SelectableImpl selectable) {
         Reactor reactor = selectable.getReactor();
         Transport transport = selectable.getTransport();
         long deadline = transport.tick(reactor.now());
@@ -156,11 +156,12 @@ public class IOHandler extends BaseHandler {
 
     // pni_connection_update from connection.c
     private static void update(Selectable selectable) {
-        int c = capacity(selectable);
-        int p = pending(selectable);
+        SelectableImpl selectableImpl = (SelectableImpl)selectable;
+        int c = capacity(selectableImpl);
+        int p = pending(selectableImpl);
         selectable.setReading(c > 0);
         selectable.setWriting(p > 0);
-        selectable.setDeadline(deadline(selectable));
+        selectable.setDeadline(deadline(selectableImpl));
     }
 
     // pni_connection_readable from connection.c
@@ -168,7 +169,7 @@ public class IOHandler extends BaseHandler {
         @Override
         public void run(Selectable selectable) {
             Reactor reactor = selectable.getReactor();
-            Transport transport = selectable.getTransport();
+            Transport transport = ((SelectableImpl)selectable).getTransport();
             int capacity = transport.capacity();
             if (capacity > 0) {
                 SocketChannel socketChannel = (SocketChannel)selectable.getChannel();
@@ -200,7 +201,7 @@ public class IOHandler extends BaseHandler {
         @Override
         public void run(Selectable selectable) {
             Reactor reactor = selectable.getReactor();
-            Transport transport = selectable.getTransport();
+            Transport transport = ((SelectableImpl)selectable).getTransport();
             int pending = transport.pending();
             if (pending > 0) {
                 SocketChannel channel = (SocketChannel)selectable.getChannel();
@@ -243,7 +244,7 @@ public class IOHandler extends BaseHandler {
         @Override
         public void run(Selectable selectable) {
             Reactor reactor = selectable.getReactor();
-            Transport transport = selectable.getTransport();
+            Transport transport = ((SelectableImpl)selectable).getTransport();
             long deadline = transport.tick(reactor.now());
             selectable.setDeadline(deadline);
             int c = capacity(selectable);
@@ -278,7 +279,7 @@ public class IOHandler extends BaseHandler {
         selectable.onError(connectionError);
         selectable.onExpired(connectionExpired);
         selectable.onFree(connectionFree);
-        selectable.setTransport(transport);
+        ((SelectableImpl)selectable).setTransport(transport);
         ((TransportImpl)transport).setSelectable(selectable);
         ((TransportImpl)transport).setReactor(reactor);
         update(selectable);

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/2f8728a8/proton-j/src/main/java/org/apache/qpid/proton/reactor/impl/ReactorImpl.java
----------------------------------------------------------------------
diff --git a/proton-j/src/main/java/org/apache/qpid/proton/reactor/impl/ReactorImpl.java b/proton-j/src/main/java/org/apache/qpid/proton/reactor/impl/ReactorImpl.java
index 45f9d4b..5fc451d 100644
--- a/proton-j/src/main/java/org/apache/qpid/proton/reactor/impl/ReactorImpl.java
+++ b/proton-j/src/main/java/org/apache/qpid/proton/reactor/impl/ReactorImpl.java
@@ -23,6 +23,7 @@ package org.apache.qpid.proton.reactor.impl;
 
 import java.io.IOException;
 import java.nio.ByteBuffer;
+import java.nio.channels.ClosedChannelException;
 import java.nio.channels.Pipe;
 import java.util.HashSet;
 import java.util.Set;
@@ -186,8 +187,8 @@ public class ReactorImpl implements Reactor, Extendable {
         return selectable(null);
     }
 
-    public Selectable selectable(ReactorChild child) {
-        Selectable result = new SelectableImpl();
+    public SelectableImpl selectable(ReactorChild child) {
+        SelectableImpl result = new SelectableImpl();
         result.setCollector(collector);
         collector.put(Type.SELECTABLE_INIT, result);
         result.setReactor(this);
@@ -295,10 +296,15 @@ public class ReactorImpl implements Reactor, Extendable {
         }
     }
 
-
     @Override
-    public void wakeup() throws IOException {
-        wakeup.sink().write(ByteBuffer.allocate(1));
+    public void wakeup() {
+        try {
+            wakeup.sink().write(ByteBuffer.allocate(1));
+        } catch(ClosedChannelException channelClosedException) {
+            // Ignore - pipe already closed by reactor being shutdown.
+        } catch(IOException ioException) {
+            throw new ReactorInternalException(ioException);
+        }
     }
 
     @Override
@@ -331,7 +337,7 @@ public class ReactorImpl implements Reactor, Extendable {
     @Override
     public Task schedule(int delay, Handler handler) {
         Task task = timer.schedule(now + delay);
-        task.setReactor(this);
+        ((TaskImpl)task).setReactor(this);
         BaseHandler.setHandler(task, handler);
         if (selectable != null) {
             selectable.setDeadline(timer.deadline());

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/2f8728a8/proton-j/src/main/java/org/apache/qpid/proton/reactor/impl/SelectableImpl.java
----------------------------------------------------------------------
diff --git a/proton-j/src/main/java/org/apache/qpid/proton/reactor/impl/SelectableImpl.java b/proton-j/src/main/java/org/apache/qpid/proton/reactor/impl/SelectableImpl.java
index 5ab0176..df4e6cc 100644
--- a/proton-j/src/main/java/org/apache/qpid/proton/reactor/impl/SelectableImpl.java
+++ b/proton-j/src/main/java/org/apache/qpid/proton/reactor/impl/SelectableImpl.java
@@ -219,18 +219,15 @@ public class SelectableImpl implements Selectable {
         return terminal;
     }
 
-    @Override
-    public Transport getTransport() {
+    protected Transport getTransport() {
         return transport;
     }
 
-    @Override
-    public void setTransport(Transport transport) {
+    protected void setTransport(Transport transport) {
         this.transport = transport;
     }
 
-    @Override
-    public void setReactor(Reactor reactor) {
+    protected void setReactor(Reactor reactor) {
         this.reactor = reactor;
     }
 

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/2f8728a8/proton-j/src/main/java/org/apache/qpid/proton/reactor/impl/SelectorImpl.java
----------------------------------------------------------------------
diff --git a/proton-j/src/main/java/org/apache/qpid/proton/reactor/impl/SelectorImpl.java b/proton-j/src/main/java/org/apache/qpid/proton/reactor/impl/SelectorImpl.java
index ed4ad69..4c2f1ed 100644
--- a/proton-j/src/main/java/org/apache/qpid/proton/reactor/impl/SelectorImpl.java
+++ b/proton-j/src/main/java/org/apache/qpid/proton/reactor/impl/SelectorImpl.java
@@ -133,7 +133,7 @@ class SelectorImpl implements Selector {
                             ((SocketChannel)key.channel()).finishConnect();
                             update((Selectable)key.attachment());
                         } catch(IOException ioException) {
-                            Selectable selectable = (Selectable)key.attachment();
+                            SelectableImpl selectable = (SelectableImpl)key.attachment();
                             ErrorCondition condition = new ErrorCondition();
                             condition.setCondition(Symbol.getSymbol("proton:io"));
                             condition.setDescription(ioException.getMessage());

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/2f8728a8/proton-j/src/main/java/org/apache/qpid/proton/reactor/impl/TaskImpl.java
----------------------------------------------------------------------
diff --git a/proton-j/src/main/java/org/apache/qpid/proton/reactor/impl/TaskImpl.java b/proton-j/src/main/java/org/apache/qpid/proton/reactor/impl/TaskImpl.java
index 5311059..00c9a84 100644
--- a/proton-j/src/main/java/org/apache/qpid/proton/reactor/impl/TaskImpl.java
+++ b/proton-j/src/main/java/org/apache/qpid/proton/reactor/impl/TaskImpl.java
@@ -33,6 +33,7 @@ public class TaskImpl implements Task, Comparable<TaskImpl> {
     private final int counter;
     private final AtomicInteger count = new AtomicInteger();
     private Record attachments = new RecordImpl();
+    private Reactor reactor;
 
     public TaskImpl(long deadline) {
         this.deadline = deadline;
@@ -57,8 +58,6 @@ public class TaskImpl implements Task, Comparable<TaskImpl> {
         return deadline;
     }
 
-    private Reactor reactor;
-    @Override
     public void setReactor(Reactor reactor) {
         this.reactor = reactor;
     }


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


[49/50] qpid-proton git commit: PROTON-865: Revert error check in array code.

Posted by ac...@apache.org.
PROTON-865: Revert error check in array code.

Removed an error check in proton array encoder to ensure elements in an array have the right type.
This check was added to aid debugging but causes several test failures.


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

Branch: refs/heads/cjansen-cpp-client
Commit: 377fd55032a0e99664e774999e858bf804d4b6e4
Parents: 9d5bf7d
Author: Alan Conway <ac...@redhat.com>
Authored: Thu Jul 9 15:50:38 2015 -0400
Committer: Alan Conway <ac...@redhat.com>
Committed: Thu Jul 9 15:50:38 2015 -0400

----------------------------------------------------------------------
 proton-c/src/codec/encoder.c | 10 +++++-----
 1 file changed, 5 insertions(+), 5 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/377fd550/proton-c/src/codec/encoder.c
----------------------------------------------------------------------
diff --git a/proton-c/src/codec/encoder.c b/proton-c/src/codec/encoder.c
index b6651fc..082bb21 100644
--- a/proton-c/src/codec/encoder.c
+++ b/proton-c/src/codec/encoder.c
@@ -250,17 +250,17 @@ static int pni_encoder_enter(void *ctx, pn_data_t *data, pni_node_t *node)
   pn_encoder_t *encoder = (pn_encoder_t *) ctx;
   pni_node_t *parent = pn_data_node(data, node->parent);
   pn_atom_t *atom = &node->atom;
-  uint8_t code = pn_node2code(encoder, node);
+  uint8_t code;
   conv_t c;
 
   /** In an array we don't write the code before each element, only the first. */
   if (pn_is_in_array(data, parent, node)) {
-    uint8_t array_code = pn_type2code(encoder, parent->type);
-    if (code != array_code)
-        return pn_error_format(data->error, PN_ERR, "array element type mismatch");
-    if (pn_is_first_in_array(data, parent, node))
+    code = pn_type2code(encoder, parent->type);
+    if (pn_is_first_in_array(data, parent, node)) {
       pn_encoder_writef8(encoder, code);
+    }
   } else {
+    code = pn_node2code(encoder, node);
     pn_encoder_writef8(encoder, code);
   }
 


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


[27/50] qpid-proton git commit: PROTON-881: Tidy up TODOs in proton-j reactor code

Posted by ac...@apache.org.
PROTON-881: Tidy up TODOs in proton-j reactor code

About half the TODOs were me being overly paranoid.  The rest generally
required some tidy-up.  One decision I made was to swallow IOExceptions
thrown from closing something - because there was no other cleanup action
that could be taken - and rethrowing as an unchecked exception seemed
a little heavy-handed.


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

Branch: refs/heads/cjansen-cpp-client
Commit: 513f1525608312cbd5cf92d68c93f715189478b9
Parents: e2d2369
Author: Adrian Preston <pr...@uk.ibm.com>
Authored: Sat Jun 27 20:48:37 2015 +0100
Committer: Rafael Schloming <rh...@alum.mit.edu>
Committed: Sun Jul 5 19:57:39 2015 -0400

----------------------------------------------------------------------
 .../apache/qpid/proton/reactor/Selectable.java  |  1 -
 .../qpid/proton/reactor/impl/AcceptorImpl.java  | 16 +++----
 .../qpid/proton/reactor/impl/IOHandler.java     | 45 +++++++++++---------
 .../qpid/proton/reactor/impl/ReactorImpl.java   | 25 +++++------
 .../proton/reactor/impl/SelectableImpl.java     |  5 +--
 .../qpid/proton/reactor/impl/SelectorImpl.java  |  6 ++-
 6 files changed, 47 insertions(+), 51 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/513f1525/proton-j/src/main/java/org/apache/qpid/proton/reactor/Selectable.java
----------------------------------------------------------------------
diff --git a/proton-j/src/main/java/org/apache/qpid/proton/reactor/Selectable.java b/proton-j/src/main/java/org/apache/qpid/proton/reactor/Selectable.java
index 73bc3b8..fa459d1 100644
--- a/proton-j/src/main/java/org/apache/qpid/proton/reactor/Selectable.java
+++ b/proton-j/src/main/java/org/apache/qpid/proton/reactor/Selectable.java
@@ -25,7 +25,6 @@ import java.nio.channels.SelectableChannel;
 
 import org.apache.qpid.proton.engine.Collector;
 import org.apache.qpid.proton.engine.Extendable;
-import org.apache.qpid.proton.engine.Handler;
 import org.apache.qpid.proton.engine.Transport;
 
 public interface Selectable extends ReactorChild, Extendable {

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/513f1525/proton-j/src/main/java/org/apache/qpid/proton/reactor/impl/AcceptorImpl.java
----------------------------------------------------------------------
diff --git a/proton-j/src/main/java/org/apache/qpid/proton/reactor/impl/AcceptorImpl.java b/proton-j/src/main/java/org/apache/qpid/proton/reactor/impl/AcceptorImpl.java
index 12006ad..7fe97af 100644
--- a/proton-j/src/main/java/org/apache/qpid/proton/reactor/impl/AcceptorImpl.java
+++ b/proton-j/src/main/java/org/apache/qpid/proton/reactor/impl/AcceptorImpl.java
@@ -43,6 +43,7 @@ import org.apache.qpid.proton.reactor.Selectable.Callback;
 public class AcceptorImpl implements Acceptor {
 
     private Record attachments = new RecordImpl();
+    private final Selectable sel;
 
     private class AcceptorReadable implements Callback {
         @Override
@@ -55,19 +56,16 @@ public class AcceptorImpl implements Acceptor {
                 }
                 Handler handler = BaseHandler.getHandler(AcceptorImpl.this);
                 if (handler == null) {
-                    // TODO: set selectable.getAttachment() to null?
                     handler = reactor.getHandler();
                 }
                 Connection conn = reactor.connection(handler);
                 Transport trans = Proton.transport();
-                // TODO: the C code calls pn_transport_set_server(trans) - is there a Java equivalent we need to worry about?
                 Sasl sasl = trans.sasl();
-                sasl.server();  // TODO: it would be nice if SASL was more pluggable than this (but this is what the C API currently does...)
-                //sasl.allowSkip(true); // TODO: this in in the C code - but the proton-j code throws a ProtonUnsupportedOperationException (as it is not implemented)
+                sasl.server();
                 sasl.setMechanisms("ANONYMOUS");
                 sasl.done(SaslOutcome.PN_SASL_OK);
                 trans.bind(conn);
-                IOHandler.selectableTransport(reactor, socketChannel.socket(), trans);  // TODO: could we pass in a channel object instead of doing socketChannel.socket()?
+                IOHandler.selectableTransport(reactor, socketChannel.socket(), trans);
             } catch(IOException ioException) {
                 sel.error();
             }
@@ -82,14 +80,11 @@ public class AcceptorImpl implements Acceptor {
                     selectable.getChannel().close();
                 }
             } catch(IOException ioException) {
-                ioException.printStackTrace();
-                // TODO: what now?
+                // Ignore - as we can't make the channel any more closed...
             }
         }
     }
 
-    private final Selectable sel;
-
     protected AcceptorImpl(Reactor reactor, String host, int port, Handler handler) throws IOException {
         ServerSocketChannel ssc = ((ReactorImpl)reactor).getIO().serverSocketChannel();
         ssc.bind(new InetSocketAddress(host, port));
@@ -110,8 +105,7 @@ public class AcceptorImpl implements Acceptor {
             try {
                 sel.getChannel().close();
             } catch(IOException ioException) {
-                ioException.printStackTrace();
-                // TODO: what now?
+                // Ignore.
             }
             sel.setChannel(null);
             sel.terminate();

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/513f1525/proton-j/src/main/java/org/apache/qpid/proton/reactor/impl/IOHandler.java
----------------------------------------------------------------------
diff --git a/proton-j/src/main/java/org/apache/qpid/proton/reactor/impl/IOHandler.java b/proton-j/src/main/java/org/apache/qpid/proton/reactor/impl/IOHandler.java
index 39d840e..fa807e4 100644
--- a/proton-j/src/main/java/org/apache/qpid/proton/reactor/impl/IOHandler.java
+++ b/proton-j/src/main/java/org/apache/qpid/proton/reactor/impl/IOHandler.java
@@ -95,7 +95,11 @@ public class IOHandler extends BaseHandler {
         int colonIndex = hostname.indexOf(':');
         int port = 5672;
         if (colonIndex >= 0) {
-            port = Integer.parseInt(hostname.substring(colonIndex+1));  // TODO: this can throw NumberFormatException on malformed input!
+            try {
+                port = Integer.parseInt(hostname.substring(colonIndex+1));
+            } catch(NumberFormatException nfe) {
+                throw new IllegalArgumentException("Not a valid host: " + hostname, nfe);
+            }
             hostname = hostname.substring(0, colonIndex);
         }
 
@@ -160,7 +164,7 @@ public class IOHandler extends BaseHandler {
     }
 
     // pni_connection_readable from connection.c
-    private static class ConnectionReadable implements Callback {
+    private static Callback connectionReadable = new Callback() {
         @Override
         public void run(Selectable selectable) {
             Reactor reactor = selectable.getReactor();
@@ -189,10 +193,10 @@ public class IOHandler extends BaseHandler {
             update(selectable);
             reactor.update(selectable);
         }
-    }
+    };
 
     // pni_connection_writable from connection.c
-    private static class ConnectionWritable implements Callback {
+    private static Callback connectionWritable = new Callback() {
         @Override
         public void run(Selectable selectable) {
             Reactor reactor = selectable.getReactor();
@@ -222,21 +226,20 @@ public class IOHandler extends BaseHandler {
                 reactor.update(selectable);
             }
         }
-    }
+    };
 
     // pni_connection_error from connection.c
-    private static class ConnectionError implements Callback {
+    private static Callback connectionError = new Callback() {
         @Override
         public void run(Selectable selectable) {
             Reactor reactor = selectable.getReactor();
             selectable.terminate();
             reactor.update(selectable);
         }
-
-    }
+    };
 
     // pni_connection_expired from connection.c
-    private static class ConnectionExpired implements Callback {
+    private static Callback connectionExpired = new Callback() {
         @Override
         public void run(Selectable selectable) {
             Reactor reactor = selectable.getReactor();
@@ -249,9 +252,9 @@ public class IOHandler extends BaseHandler {
             selectable.setWriting(p > 0);
             reactor.update(selectable);
         }
-    }
+    };
 
-    private static class ConnectionFree implements Callback {
+    private static Callback connectionFree = new Callback() {
         @Override
         public void run(Selectable selectable) {
             Channel channel = selectable.getChannel();
@@ -259,22 +262,22 @@ public class IOHandler extends BaseHandler {
                 try {
                     channel.close();
                 } catch(IOException ioException) {
-                    throw new RuntimeException(ioException);
+                    // Ignore
                 }
             }
         }
-    }
+    };
 
     // pn_reactor_selectable_transport
     // Note the socket argument can, validly be 'null' this is the equivalent of proton-c's PN_INVALID_SOCKET
     protected static Selectable selectableTransport(Reactor reactor, Socket socket, Transport transport) {
         Selectable selectable = reactor.selectable();
         selectable.setChannel(socket != null ? socket.getChannel() : null);
-        selectable.onReadable(new ConnectionReadable());    // TODO: *IF* these callbacks are stateless, do we more than one instance of them?
-        selectable.onWritable(new ConnectionWritable());
-        selectable.onError(new ConnectionError());
-        selectable.onExpired(new ConnectionExpired());
-        selectable.onFree(new ConnectionFree());
+        selectable.onReadable(connectionReadable);
+        selectable.onWritable(connectionWritable);
+        selectable.onError(connectionError);
+        selectable.onExpired(connectionExpired);
+        selectable.onFree(connectionFree);
         selectable.setTransport(transport);
         ((TransportImpl)transport).setSelectable(selectable);
         ((TransportImpl)transport).setReactor(reactor);
@@ -335,9 +338,9 @@ public class IOHandler extends BaseHandler {
             default:
                 break;
             }
-        } catch(IOException e) {
-            e.printStackTrace();
-            // TODO: not clear what to do with this!
+        } catch(IOException ioException) {
+            // XXX: Might not be the right exception type, but at least the exception isn't being swallowed
+            throw new ReactorInternalException(ioException);
         }
     }
 }

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/513f1525/proton-j/src/main/java/org/apache/qpid/proton/reactor/impl/ReactorImpl.java
----------------------------------------------------------------------
diff --git a/proton-j/src/main/java/org/apache/qpid/proton/reactor/impl/ReactorImpl.java b/proton-j/src/main/java/org/apache/qpid/proton/reactor/impl/ReactorImpl.java
index 94d3595..45f9d4b 100644
--- a/proton-j/src/main/java/org/apache/qpid/proton/reactor/impl/ReactorImpl.java
+++ b/proton-j/src/main/java/org/apache/qpid/proton/reactor/impl/ReactorImpl.java
@@ -264,12 +264,11 @@ public class ReactorImpl implements Reactor, Extendable {
                     yield = false;
                     return true;
                 }
-                yield = false;  // TODO: is this required?
                 Handler handler = eventHandler(event);
                 event.dispatch(handler);
                 event.dispatch(global);
 
-                if (event.getType() == Type.CONNECTION_FINAL) { // TODO: this should be the same as the pni_reactor_dispatch_post logic...
+                if (event.getType() == Type.CONNECTION_FINAL) {
                     children.remove(event.getConnection());
                 }
                 this.previous = event.getType();
@@ -299,7 +298,7 @@ public class ReactorImpl implements Reactor, Extendable {
 
     @Override
     public void wakeup() throws IOException {
-        wakeup.sink().write(ByteBuffer.allocate(1));    // TODO: c version returns a value!
+        wakeup.sink().write(ByteBuffer.allocate(1));
     }
 
     @Override
@@ -341,6 +340,13 @@ public class ReactorImpl implements Reactor, Extendable {
         return task;
     }
 
+    private void expireSelectable(Selectable selectable) {
+        ReactorImpl reactor = (ReactorImpl) selectable.getReactor();
+        reactor.timer.tick(reactor.now);
+        selectable.setDeadline(reactor.timer.deadline());
+        reactor.update(selectable);
+    }
+
     private class TimerReadable implements Callback {
 
         @Override
@@ -350,8 +356,7 @@ public class ReactorImpl implements Reactor, Extendable {
             } catch (IOException e) {
                 throw new RuntimeException(e);
             }
-            // TODO: this could be more elegant...
-            new TimerExpired().run(selectable);
+            expireSelectable(selectable);
         }
 
     }
@@ -359,10 +364,7 @@ public class ReactorImpl implements Reactor, Extendable {
     private class TimerExpired implements Callback {
         @Override
         public void run(Selectable selectable) {
-            ReactorImpl reactor = (ReactorImpl) selectable.getReactor();
-            reactor.timer.tick(reactor.now);
-            selectable.setDeadline(reactor.timer.deadline());
-            reactor.update(selectable);
+            expireSelectable(selectable);
         }
     }
 
@@ -373,9 +375,8 @@ public class ReactorImpl implements Reactor, Extendable {
         public void run(Selectable selectable) {
             try {
                 selectable.getChannel().close();
-            } catch(IOException e) {
-                e.printStackTrace();
-                // TODO: what to do here...
+            } catch(IOException ioException) {
+                // Ignore
             }
         }
     }

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/513f1525/proton-j/src/main/java/org/apache/qpid/proton/reactor/impl/SelectableImpl.java
----------------------------------------------------------------------
diff --git a/proton-j/src/main/java/org/apache/qpid/proton/reactor/impl/SelectableImpl.java b/proton-j/src/main/java/org/apache/qpid/proton/reactor/impl/SelectableImpl.java
index 2e053ef..5ab0176 100644
--- a/proton-j/src/main/java/org/apache/qpid/proton/reactor/impl/SelectableImpl.java
+++ b/proton-j/src/main/java/org/apache/qpid/proton/reactor/impl/SelectableImpl.java
@@ -23,10 +23,8 @@ package org.apache.qpid.proton.reactor.impl;
 
 import java.nio.channels.SelectableChannel;
 
-import org.apache.qpid.proton.engine.BaseHandler;
 import org.apache.qpid.proton.engine.Collector;
 import org.apache.qpid.proton.engine.Event.Type;
-import org.apache.qpid.proton.engine.Handler;
 import org.apache.qpid.proton.engine.Record;
 import org.apache.qpid.proton.engine.Transport;
 import org.apache.qpid.proton.engine.impl.CollectorImpl;
@@ -156,7 +154,6 @@ public class SelectableImpl implements Selectable {
         }
     }
 
-    // These are equivalent to the C code's set/get file descritor functions.
     @Override
     public void setChannel(SelectableChannel channel) {
         this.channel = channel;
@@ -208,7 +205,7 @@ public class SelectableImpl implements Selectable {
     }
 
     @Override
-    public Reactor getReactor() {  // TODO: the C version uses set/getContext for this - should we do the same?
+    public Reactor getReactor() {
         return reactor;
     }
 

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/513f1525/proton-j/src/main/java/org/apache/qpid/proton/reactor/impl/SelectorImpl.java
----------------------------------------------------------------------
diff --git a/proton-j/src/main/java/org/apache/qpid/proton/reactor/impl/SelectorImpl.java b/proton-j/src/main/java/org/apache/qpid/proton/reactor/impl/SelectorImpl.java
index 5ef74e7..ed4ad69 100644
--- a/proton-j/src/main/java/org/apache/qpid/proton/reactor/impl/SelectorImpl.java
+++ b/proton-j/src/main/java/org/apache/qpid/proton/reactor/impl/SelectorImpl.java
@@ -99,7 +99,8 @@ class SelectorImpl implements Selector {
         long now = System.currentTimeMillis();
         if (timeout > 0) {
             long deadline = 0;
-            for (Selectable selectable : selectables) {    // TODO: this differs from the C code which requires a call to update() to make deadline changes take affect
+            // XXX: Note: this differs from the C code which requires a call to update() to make deadline changes take affect
+            for (Selectable selectable : selectables) {
                 long d = selectable.getDeadline();
                 if (d > 0) {
                     deadline = (deadline == 0) ? d : Math.min(deadline,  d);
@@ -168,7 +169,8 @@ class SelectorImpl implements Selector {
             if (key.isWritable()) writeable.add(selectable);
         }
         selector.selectedKeys().clear();
-        for (Selectable selectable : selectables) {    // TODO: this is different to the C code which evaluates expiry at the point the selectable is iterated over.
+        // XXX: Note: this is different to the C code which evaluates expiry at the point the selectable is iterated over.
+        for (Selectable selectable : selectables) {
             long deadline = selectable.getDeadline();
             if (deadline > 0 && awoken >= deadline) {
                 expired.add(selectable);


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


[42/50] qpid-proton git commit: PROTON-928: add more task cancellation tests

Posted by ac...@apache.org.
PROTON-928: add more task cancellation tests


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

Branch: refs/heads/cjansen-cpp-client
Commit: ca47d7260da1052e26cc8cac0997c6a1e491d5ef
Parents: e86cd22
Author: Bozo Dragojevic <bo...@digiverse.si>
Authored: Thu Jul 9 11:43:51 2015 +0200
Committer: Bozo Dragojevic <bo...@digiverse.si>
Committed: Thu Jul 9 11:43:51 2015 +0200

----------------------------------------------------------------------
 tests/python/proton_tests/reactor.py | 69 +++++++++++++++++++++++++++++--
 1 file changed, 66 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/ca47d726/tests/python/proton_tests/reactor.py
----------------------------------------------------------------------
diff --git a/tests/python/proton_tests/reactor.py b/tests/python/proton_tests/reactor.py
index 067c5c0..5734582 100644
--- a/tests/python/proton_tests/reactor.py
+++ b/tests/python/proton_tests/reactor.py
@@ -172,16 +172,79 @@ class ExceptionTest(Test):
         except Barf:
             pass
 
+    def test_schedule_many_nothings(self):
+        class Nothing:
+            results = []
+            def on_timer_task(self, event):
+                self.results.append(None)
+        num = 12345
+        for a in range(num):
+            self.reactor.schedule(0, Nothing())
+        self.reactor.run()
+        assert len(Nothing.results) == num
+
+    def test_schedule_many_nothing_refs(self):
+        class Nothing:
+            results = []
+            def on_timer_task(self, event):
+                self.results.append(None)
+        num = 12345
+        tasks = []
+        for a in range(num):
+            tasks.append(self.reactor.schedule(0, Nothing()))
+        self.reactor.run()
+        assert len(Nothing.results) == num
+
+    def test_schedule_many_nothing_refs_cancel_before_run(self):
+        class Nothing:
+            results = []
+            def on_timer_task(self, event):
+                self.results.append(None)
+        num = 12345
+        tasks = []
+        for a in range(num):
+            tasks.append(self.reactor.schedule(0, Nothing()))
+        for task in tasks:
+            task.cancel()
+        self.reactor.run()
+        assert len(Nothing.results) == 0
+
     def test_schedule_cancel(self):
         barf = self.reactor.schedule(10, BarfOnTask())
         class CancelBarf:
+            def __init__(self, barf):
+                self.barf = barf
             def on_timer_task(self, event):
-                barf.cancel()
-        self.reactor.schedule(0, CancelBarf())
+                self.barf.cancel()
+                pass
+        self.reactor.schedule(0, CancelBarf(barf))
+        now = self.reactor.mark()
+        try:
+            self.reactor.run()
+            elapsed = self.reactor.mark() - now
+            assert elapsed < 10, "expected cancelled task to not delay the reactor by %s" % elapsed
+        except Barf:
+            assert False, "expected barf to be cancelled"
+
+    def test_schedule_cancel_many(self):
+        num = 12345
+        barfs = set()
+        for a in range(num):
+            barf = self.reactor.schedule(10*(a+1), BarfOnTask())
+            class CancelBarf:
+                def __init__(self, barf):
+                    self.barf = barf
+                def on_timer_task(self, event):
+                    self.barf.cancel()
+                    barfs.discard(self.barf)
+                    pass
+            self.reactor.schedule(0, CancelBarf(barf))
+            barfs.add(barf)
         now = self.reactor.mark()
         try:
             self.reactor.run()
             elapsed = self.reactor.mark() - now
-            assert elapsed < 10, "expected cancelled task to not delay the reactor by " + elapsed
+            assert elapsed < num, "expected cancelled task to not delay the reactor by %s" % elapsed
+            assert not barfs, "expected all barfs to be discarded"
         except Barf:
             assert False, "expected barf to be cancelled"


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


[33/50] qpid-proton git commit: NO-JIRA: Don't run ruby tests if BUILD_RUBY is OFF.

Posted by ac...@apache.org.
NO-JIRA: Don't run ruby tests if BUILD_RUBY is OFF.


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

Branch: refs/heads/cjansen-cpp-client
Commit: 6ba050afee4de25fb0c08fe7c57e0e21fd1bed42
Parents: 3c14a0d
Author: Alan Conway <ac...@redhat.com>
Authored: Mon Jun 22 15:16:11 2015 -0400
Committer: Alan Conway <ac...@redhat.com>
Committed: Mon Jul 6 12:17:33 2015 -0400

----------------------------------------------------------------------
 proton-c/CMakeLists.txt | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/6ba050af/proton-c/CMakeLists.txt
----------------------------------------------------------------------
diff --git a/proton-c/CMakeLists.txt b/proton-c/CMakeLists.txt
index a1cf0e4..a3a98c2 100644
--- a/proton-c/CMakeLists.txt
+++ b/proton-c/CMakeLists.txt
@@ -535,7 +535,7 @@ if (BUILD_PYTHON)
 endif (BUILD_PYTHON)
 
 find_program(RUBY_EXE "ruby")
-if (RUBY_EXE)
+if (RUBY_EXE AND BUILD_RUBY)
   # ruby unit tests:  tests/ruby/proton-test
   # only enable the tests if the Ruby gem dependencies were found
   if (DEFAULT_RUBY_TESTING)
@@ -569,7 +569,7 @@ if (RUBY_EXE)
   endif (DEFAULT_RUBY_TESTING)
 else (RUBY_EXE)
   message (STATUS "Cannot find ruby, skipping ruby tests")
-endif (RUBY_EXE)
+endif()
 
 mark_as_advanced (RUBY_EXE RSPEC_EXE)
 


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


[31/50] qpid-proton git commit: PROTON-925: use of UINT32_MAX is breaking some builds. Getting better constants will be part of PROTON-930

Posted by ac...@apache.org.
PROTON-925: use of UINT32_MAX is breaking some builds.  Getting better
constants will be part of PROTON-930


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

Branch: refs/heads/cjansen-cpp-client
Commit: 3c14a0d1cf89b988529b98dc10c8f2c17abcdcf3
Parents: 940d843
Author: mgoulish <mi...@redhat.com>
Authored: Mon Jul 6 11:37:00 2015 -0400
Committer: mgoulish <mi...@redhat.com>
Committed: Mon Jul 6 11:41:18 2015 -0400

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


http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/3c14a0d1/proton-c/src/transport/transport.c
----------------------------------------------------------------------
diff --git a/proton-c/src/transport/transport.c b/proton-c/src/transport/transport.c
index 36eeb00..e5e8276 100644
--- a/proton-c/src/transport/transport.c
+++ b/proton-c/src/transport/transport.c
@@ -396,7 +396,7 @@ static void pn_transport_initialize(void *object)
   transport->remote_container = NULL;
   transport->remote_hostname = NULL;
   transport->local_max_frame = PN_DEFAULT_MAX_FRAME_SIZE;
-  transport->remote_max_frame = UINT32_MAX;
+  transport->remote_max_frame = (uint32_t) 0xffffffff;
 
   /*
    * We set the local limit on channels to 2^15, because 


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


[47/50] qpid-proton git commit: PROTON-940: calculate the incoming window before sending the Begin frame to ensure it is initialised, which supresses the need for a subsequent Flow as seen previously

Posted by ac...@apache.org.
PROTON-940: calculate the incoming window before sending the Begin frame to ensure it is initialised, which supresses the need for a subsequent Flow as seen previously


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

Branch: refs/heads/cjansen-cpp-client
Commit: 2b41931dbb49730ddba92c42e40113899371c2d7
Parents: ed31367
Author: Robert Gemmell <ro...@apache.org>
Authored: Thu Jul 9 14:25:02 2015 +0100
Committer: Robert Gemmell <ro...@apache.org>
Committed: Thu Jul 9 14:38:50 2015 +0100

----------------------------------------------------------------------
 .../java/org/apache/qpid/proton/engine/impl/TransportImpl.java    | 3 +++
 1 file changed, 3 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/2b41931d/proton-j/src/main/java/org/apache/qpid/proton/engine/impl/TransportImpl.java
----------------------------------------------------------------------
diff --git a/proton-j/src/main/java/org/apache/qpid/proton/engine/impl/TransportImpl.java b/proton-j/src/main/java/org/apache/qpid/proton/engine/impl/TransportImpl.java
index 7d285b1..9cc73ce 100644
--- a/proton-j/src/main/java/org/apache/qpid/proton/engine/impl/TransportImpl.java
+++ b/proton-j/src/main/java/org/apache/qpid/proton/engine/impl/TransportImpl.java
@@ -841,6 +841,9 @@ public class TransportImpl extends EndpointImpl
                         {
                             begin.setRemoteChannel(UnsignedShort.valueOf((short) transportSession.getRemoteChannel()));
                         }
+
+                        transportSession.updateIncomingWindow();
+
                         begin.setHandleMax(transportSession.getHandleMax());
                         begin.setIncomingWindow(transportSession.getIncomingWindowSize());
                         begin.setOutgoingWindow(transportSession.getOutgoingWindowSize());


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


[19/50] qpid-proton git commit: PROTON-931: proton-j expose detached state of Link

Posted by ac...@apache.org.
PROTON-931: proton-j expose detached state of Link

The Link detached state is required to assess when a
LINK_REMOTE_DETACHED event is received as to whether or not it was as a
result of a local detach or the remote end detaching or closing the
link.


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

Branch: refs/heads/cjansen-cpp-client
Commit: dcc09f153e0f02b8f9895d76e652b0adf6bb5f76
Parents: 57b0f34
Author: Dominic Evans <do...@uk.ibm.com>
Authored: Fri Jul 3 16:24:36 2015 +0100
Committer: Dominic Evans <do...@uk.ibm.com>
Committed: Fri Jul 3 16:32:01 2015 +0100

----------------------------------------------------------------------
 proton-j/src/main/java/org/apache/qpid/proton/engine/Link.java     | 1 +
 .../src/main/java/org/apache/qpid/proton/engine/impl/LinkImpl.java | 2 +-
 2 files changed, 2 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/dcc09f15/proton-j/src/main/java/org/apache/qpid/proton/engine/Link.java
----------------------------------------------------------------------
diff --git a/proton-j/src/main/java/org/apache/qpid/proton/engine/Link.java b/proton-j/src/main/java/org/apache/qpid/proton/engine/Link.java
index c965a29..752a4c8 100644
--- a/proton-j/src/main/java/org/apache/qpid/proton/engine/Link.java
+++ b/proton-j/src/main/java/org/apache/qpid/proton/engine/Link.java
@@ -186,5 +186,6 @@ public interface Link extends Endpoint
     public boolean getDrain();
 
     public void detach();
+    public boolean detached();
 
 }

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/dcc09f15/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 9966526..70841f1 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
@@ -413,7 +413,7 @@ public abstract class LinkImpl extends EndpointImpl implements Link
         modified();
     }
 
-    boolean detached()
+    public boolean detached()
     {
         return _detached;
     }


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


[10/50] qpid-proton git commit: PROTON-911: Create SASL encryption layer, and logic which switches it on - Currently no encryption is implemented - Simplify SASL state a little too

Posted by ac...@apache.org.
PROTON-911: Create SASL encryption layer, and logic which switches it on
- Currently no encryption is implemented
- Simplify SASL state a little too


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

Branch: refs/heads/cjansen-cpp-client
Commit: 2c383aaa83dc1b0dff7c473762cd49d7ce207c74
Parents: 37730cc
Author: Andrew Stitcher <as...@apache.org>
Authored: Fri Jun 19 17:39:02 2015 -0400
Committer: Andrew Stitcher <as...@apache.org>
Committed: Tue Jun 30 13:33:08 2015 -0400

----------------------------------------------------------------------
 proton-c/src/sasl/cyrus_sasl.c    | 15 ++++++
 proton-c/src/sasl/none_sasl.c     | 15 ++++++
 proton-c/src/sasl/sasl-internal.h | 21 +++++---
 proton-c/src/sasl/sasl.c          | 91 +++++++++++++++++++++++-----------
 4 files changed, 108 insertions(+), 34 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/2c383aaa/proton-c/src/sasl/cyrus_sasl.c
----------------------------------------------------------------------
diff --git a/proton-c/src/sasl/cyrus_sasl.c b/proton-c/src/sasl/cyrus_sasl.c
index c84d0af..cdcd0bf 100644
--- a/proton-c/src/sasl/cyrus_sasl.c
+++ b/proton-c/src/sasl/cyrus_sasl.c
@@ -381,6 +381,21 @@ void pni_sasl_impl_free(pn_transport_t *transport)
     }
 }
 
+bool pni_sasl_impl_can_encrypt(pn_transport_t *transport)
+{
+  return false;
+}
+
+ssize_t pni_sasl_impl_encode(pn_transport_t *transport, pn_bytes_t in, pn_buffer_t *out)
+{
+  return 0;
+}
+
+ssize_t pni_sasl_impl_decode(pn_transport_t *transport, pn_bytes_t in, pn_buffer_t *out)
+{
+  return 0;
+}
+
 bool pn_sasl_extended(void)
 {
   return true;

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/2c383aaa/proton-c/src/sasl/none_sasl.c
----------------------------------------------------------------------
diff --git a/proton-c/src/sasl/none_sasl.c b/proton-c/src/sasl/none_sasl.c
index be27871..ccb4818 100644
--- a/proton-c/src/sasl/none_sasl.c
+++ b/proton-c/src/sasl/none_sasl.c
@@ -172,6 +172,21 @@ void pni_process_response(pn_transport_t *transport, const pn_bytes_t *recv)
 {
 }
 
+bool pni_sasl_impl_can_encrypt(pn_transport_t *transport)
+{
+    return false;
+}
+
+ssize_t pni_sasl_impl_encode(pn_transport_t *transport, pn_bytes_t in, pn_buffer_t *out)
+{
+  return 0;
+}
+
+ssize_t pni_sasl_impl_decode(pn_transport_t *transport, pn_bytes_t in, pn_buffer_t *out)
+{
+  return 0;
+}
+
 bool pn_sasl_extended(void)
 {
   return false;

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/2c383aaa/proton-c/src/sasl/sasl-internal.h
----------------------------------------------------------------------
diff --git a/proton-c/src/sasl/sasl-internal.h b/proton-c/src/sasl/sasl-internal.h
index 71205f5..fb40b9c 100644
--- a/proton-c/src/sasl/sasl-internal.h
+++ b/proton-c/src/sasl/sasl-internal.h
@@ -22,9 +22,12 @@
 #ifndef PROTON_SASL_INTERNAL_H
 #define PROTON_SASL_INTERNAL_H 1
 
+#include "buffer.h"
 #include "proton/types.h"
 #include "proton/sasl.h"
 
+#include "engine/engine-internal.h"
+
 // SASL APIs used by transport code
 void pn_sasl_free(pn_transport_t *transport);
 void pni_sasl_set_user_password(pn_transport_t *transport, const char *user, const char *password);
@@ -33,15 +36,21 @@ void pni_sasl_set_external_security(pn_transport_t *transport, int ssf, const ch
 
 // Internal SASL authenticator interface
 void pni_sasl_impl_free(pn_transport_t *transport);
-int pni_sasl_impl_list_mechs(pn_transport_t* transport, char** mechlist);
-bool pni_init_server(pn_transport_t* transport);
+int  pni_sasl_impl_list_mechs(pn_transport_t *transport, char **mechlist);
+bool pni_init_server(pn_transport_t *transport);
 void pni_process_init(pn_transport_t *transport, const char *mechanism, const pn_bytes_t *recv);
 void pni_process_response(pn_transport_t *transport, const pn_bytes_t *recv);
 
-bool pni_init_client(pn_transport_t* transport);
+bool pni_init_client(pn_transport_t *transport);
 bool pni_process_mechanisms(pn_transport_t *transport, const char *mechs);
 void pni_process_challenge(pn_transport_t *transport, const pn_bytes_t *recv);
 
+// Internal SASL security layer interface
+bool pni_sasl_impl_can_encrypt(pn_transport_t *transport);
+ssize_t pni_sasl_impl_encode(pn_transport_t *transport, pn_bytes_t in, pn_buffer_t *out);
+ssize_t pni_sasl_impl_decode(pn_transport_t *transport, pn_bytes_t in, pn_buffer_t *out);
+
+
 // Shared SASL API used by the actual SASL authenticators
 enum pni_sasl_state {
   SASL_NONE,
@@ -56,7 +65,6 @@ enum pni_sasl_state {
 
 struct pni_sasl_t {
   void *impl_context;
-  // Client selected mechanism
   char *selected_mechanism;
   char *included_mechanisms;
   const char *username;
@@ -67,14 +75,15 @@ struct pni_sasl_t {
   char *external_auth;
   int external_ssf;
   pn_sasl_outcome_t outcome;
+  pn_buffer_t* decoded_buffer;
+  pn_buffer_t* encoded_buffer;
   pn_bytes_t bytes_out;
   enum pni_sasl_state desired_state;
   enum pni_sasl_state last_state;
   bool client;
-  bool input_bypass;
-  bool output_bypass;
 };
 
+// Shared Utility used by sasl implementations
 void pni_split_mechs(char *mechlist, const char* included_mechs, char *mechs[], int *count);
 bool pni_included_mech(const char *included_mech_list, pn_bytes_t s);
 void pni_sasl_set_desired_state(pn_transport_t *transport, enum pni_sasl_state desired_state);

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/2c383aaa/proton-c/src/sasl/sasl.c
----------------------------------------------------------------------
diff --git a/proton-c/src/sasl/sasl.c b/proton-c/src/sasl/sasl.c
index 4ef9e99..ac177c7 100644
--- a/proton-c/src/sasl/sasl.c
+++ b/proton-c/src/sasl/sasl.c
@@ -25,6 +25,7 @@
 #include "engine/engine-internal.h"
 #include "protocol.h"
 #include "proton/ssl.h"
+#include "proton/types.h"
 #include "util.h"
 #include "transport/autodetect.h"
 
@@ -44,8 +45,10 @@ static inline pni_sasl_t *get_sasl_internal(pn_sasl_t *sasl)
 
 static ssize_t pn_input_read_sasl_header(pn_transport_t* transport, unsigned int layer, const char* bytes, size_t available);
 static ssize_t pn_input_read_sasl(pn_transport_t *transport, unsigned int layer, const char *bytes, size_t available);
+static ssize_t pn_input_read_sasl_encrypt(pn_transport_t *transport, unsigned int layer, const char *bytes, size_t available);
 static ssize_t pn_output_write_sasl_header(pn_transport_t* transport, unsigned int layer, char* bytes, size_t size);
 static ssize_t pn_output_write_sasl(pn_transport_t *transport, unsigned int layer, char *bytes, size_t available);
+static ssize_t pn_output_write_sasl_encrypt(pn_transport_t *transport, unsigned int layer, char *bytes, size_t available);
 
 const pn_io_layer_t sasl_header_layer = {
     pn_input_read_sasl_header,
@@ -75,6 +78,13 @@ const pn_io_layer_t sasl_layer = {
     NULL
 };
 
+const pn_io_layer_t sasl_encrypt_layer = {
+    pn_input_read_sasl_encrypt,
+    pn_output_write_sasl_encrypt,
+    NULL,
+    NULL
+};
+
 #define SASL_HEADER ("AMQP\x03\x01\x00\x00")
 #define SASL_HEADER_LEN 8
 
@@ -262,23 +272,34 @@ static ssize_t pn_input_read_sasl(pn_transport_t* transport, unsigned int layer,
     return PN_EOS;
   }
 
-  if (!transport->sasl->input_bypass) {
-    pni_sasl_start_server_if_needed(transport);
+  pni_sasl_start_server_if_needed(transport);
 
-    bool dummy = false;
-    ssize_t n = pn_dispatcher_input(transport, bytes, available, false, &dummy);
+  bool dummy = false;
+  ssize_t n = pn_dispatcher_input(transport, bytes, available, false, &dummy);
 
-    if (n!=0 || !pni_sasl_is_final_input_state(transport->sasl)) {
-      return n;
-    }
+  if (n!=0 || !pni_sasl_is_final_input_state(transport->sasl)) {
+    return n;
+  }
 
-    transport->sasl->input_bypass = true;
-    if (transport->sasl->output_bypass)
-        transport->io_layers[layer] = &pni_passthru_layer;
+  if (pni_sasl_impl_can_encrypt(transport)) {
+    transport->io_layers[layer] = &sasl_encrypt_layer;
+    return transport->io_layers[layer]->process_input(transport, layer, bytes, available);
+  } else if (transport->sasl->client) {
+    transport->io_layers[layer] = &pni_passthru_layer;
   }
   return pni_passthru_layer.process_input(transport, layer, bytes, available );
 }
 
+static ssize_t pn_input_read_sasl_encrypt(pn_transport_t* transport, unsigned int layer, const char* bytes, size_t available)
+{
+  pn_buffer_t *in = transport->sasl->decoded_buffer;
+  pni_sasl_impl_decode(transport, pn_bytes(available, bytes), in);
+  pn_bytes_t decoded = pn_buffer_bytes(in);
+  ssize_t size = pni_passthru_layer.process_input(transport, layer, decoded.start, decoded.size );
+  pn_buffer_trim(in, size, 0);
+  return size;
+}
+
 static ssize_t pn_output_write_sasl_header(pn_transport_t *transport, unsigned int layer, char *bytes, size_t size)
 {
   if (transport->trace & PN_TRACE_FRM)
@@ -295,30 +316,43 @@ static ssize_t pn_output_write_sasl_header(pn_transport_t *transport, unsigned i
 
 static ssize_t pn_output_write_sasl(pn_transport_t* transport, unsigned int layer, char* bytes, size_t available)
 {
-  if (!transport->sasl->output_bypass) {
-    // this accounts for when pn_do_error is invoked, e.g. by idle timeout
-    if (!transport->close_sent) {
-      pni_sasl_start_server_if_needed(transport);
+  // this accounts for when pn_do_error is invoked, e.g. by idle timeout
+  if (!transport->close_sent) {
+    pni_sasl_start_server_if_needed(transport);
 
-      pni_post_sasl_frame(transport);
+    pni_post_sasl_frame(transport);
 
-      pni_sasl_t *sasl = transport->sasl;
-      if (transport->available != 0 || !pni_sasl_is_final_output_state(sasl)) {
-        return pn_dispatcher_output(transport, bytes, available);
-      } else {
-        if (sasl->outcome != PN_SASL_OK && pni_sasl_is_final_input_state(sasl)) {
-          pn_transport_close_tail(transport);
-        }
+    pni_sasl_t *sasl = transport->sasl;
+    if (transport->available != 0 || !pni_sasl_is_final_output_state(sasl)) {
+      return pn_dispatcher_output(transport, bytes, available);
+    } else {
+      if (sasl->outcome != PN_SASL_OK && pni_sasl_is_final_input_state(sasl)) {
+        pn_transport_close_tail(transport);
       }
     }
+  }
 
-    transport->sasl->output_bypass = true;
-    if (transport->sasl->input_bypass)
-        transport->io_layers[layer] = &pni_passthru_layer;
+  if (pni_sasl_impl_can_encrypt(transport)) {
+    transport->io_layers[layer] = &sasl_encrypt_layer;
+    return transport->io_layers[layer]->process_output(transport, layer, bytes, available);
+  } else if (!transport->sasl->client) {
+    transport->io_layers[layer] = &pni_passthru_layer;
   }
   return pni_passthru_layer.process_output(transport, layer, bytes, available );
 }
 
+static ssize_t pn_output_write_sasl_encrypt(pn_transport_t* transport, unsigned int layer, char* bytes, size_t available)
+{
+  ssize_t size = pni_passthru_layer.process_output(transport, layer, bytes, available );
+  if (size<=0) return size;
+
+  pn_buffer_t *out = transport->sasl->encoded_buffer;
+  pni_sasl_impl_encode(transport, pn_bytes(size, bytes), out);
+  size = pn_buffer_get(out, 0, available, bytes);
+  pn_buffer_trim(out, size, 0);
+  return size;
+}
+
 // Look for symbol in the mech include list - not particlarly efficient,
 // but probably not used enough to matter.
 //
@@ -394,12 +428,12 @@ pn_sasl_t *pn_sasl(pn_transport_t *transport)
     sasl->external_ssf = 0;
     sasl->outcome = PN_SASL_NONE;
     sasl->impl_context = NULL;
+    sasl->decoded_buffer = pn_buffer(0);
+    sasl->encoded_buffer = pn_buffer(0);
     sasl->bytes_out.size = 0;
     sasl->bytes_out.start = NULL;
     sasl->desired_state = SASL_NONE;
     sasl->last_state = SASL_NONE;
-    sasl->input_bypass = false;
-    sasl->output_bypass = false;
 
     transport->sasl = sasl;
   }
@@ -424,7 +458,8 @@ void pn_sasl_free(pn_transport_t *transport)
       if (sasl->impl_context) {
           pni_sasl_impl_free(transport);
       }
-
+      pn_buffer_free(sasl->decoded_buffer);
+      pn_buffer_free(sasl->encoded_buffer);
       free(sasl);
     }
   }


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


[39/50] qpid-proton git commit: PROTON-937: LinkImpl.localOpen() does not initialize source and target

Posted by ac...@apache.org.
PROTON-937: LinkImpl.localOpen() does not initialize source and target


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

Branch: refs/heads/cjansen-cpp-client
Commit: f6d74a47d1f3f4ee3f4f3a444e239a209276f928
Parents: d4d22ee
Author: Bozo Dragojevic <bo...@digiverse.si>
Authored: Tue Jul 7 21:32:58 2015 +0200
Committer: Bozo Dragojevic <bo...@digiverse.si>
Committed: Tue Jul 7 21:49:44 2015 +0200

----------------------------------------------------------------------
 .../qpid/proton/amqp/messaging/Source.java       | 19 +++++++++++++++++++
 .../qpid/proton/amqp/messaging/Target.java       | 12 ++++++++++++
 .../qpid/proton/amqp/messaging/Terminus.java     | 17 +++++++++++++++++
 .../proton/amqp/transaction/Coordinator.java     |  5 +++++
 .../qpid/proton/amqp/transport/Source.java       |  2 ++
 .../qpid/proton/amqp/transport/Target.java       |  2 ++
 .../apache/qpid/proton/engine/impl/LinkImpl.java |  4 ++++
 7 files changed, 61 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/f6d74a47/proton-j/src/main/java/org/apache/qpid/proton/amqp/messaging/Source.java
----------------------------------------------------------------------
diff --git a/proton-j/src/main/java/org/apache/qpid/proton/amqp/messaging/Source.java b/proton-j/src/main/java/org/apache/qpid/proton/amqp/messaging/Source.java
index 5efc15a..e6fffef 100644
--- a/proton-j/src/main/java/org/apache/qpid/proton/amqp/messaging/Source.java
+++ b/proton-j/src/main/java/org/apache/qpid/proton/amqp/messaging/Source.java
@@ -21,7 +21,9 @@
 package org.apache.qpid.proton.amqp.messaging;
 
 import java.util.Arrays;
+import java.util.HashMap;
 import java.util.Map;
+
 import org.apache.qpid.proton.amqp.Symbol;
 
 public final class Source extends Terminus
@@ -32,6 +34,18 @@ public final class Source extends Terminus
     private Outcome _defaultOutcome;
     private Symbol[] _outcomes;
 
+    private Source(Source other) {
+        super(other);
+        _distributionMode = other._distributionMode;
+        if (other._filter != null)
+            _filter = new HashMap(other._filter);
+        _defaultOutcome = other._defaultOutcome;
+        if (other._outcomes != null)
+            _outcomes = other._outcomes.clone();
+    }
+    
+    public Source() {}
+
     public Symbol getDistributionMode()
     {
         return _distributionMode;
@@ -90,5 +104,10 @@ public final class Source extends Terminus
                ", capabilities=" + (getCapabilities() == null ? null : Arrays.asList(getCapabilities())) +
                '}';
     }
+
+    @Override
+    public org.apache.qpid.proton.amqp.transport.Source copy() {
+        return new Source(this);
+    }
 }
   
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/f6d74a47/proton-j/src/main/java/org/apache/qpid/proton/amqp/messaging/Target.java
----------------------------------------------------------------------
diff --git a/proton-j/src/main/java/org/apache/qpid/proton/amqp/messaging/Target.java b/proton-j/src/main/java/org/apache/qpid/proton/amqp/messaging/Target.java
index 1749d40..38678d1 100644
--- a/proton-j/src/main/java/org/apache/qpid/proton/amqp/messaging/Target.java
+++ b/proton-j/src/main/java/org/apache/qpid/proton/amqp/messaging/Target.java
@@ -28,6 +28,13 @@ import java.util.Arrays;
 public final class Target extends Terminus
       implements org.apache.qpid.proton.amqp.transport.Target
 {
+    private Target(Target other) {
+        super(other);
+    }
+
+    public Target() {
+    }
+
     @Override
     public String toString()
     {
@@ -41,5 +48,10 @@ public final class Target extends Terminus
                ", capabilities=" + (getCapabilities() == null ? null : Arrays.asList(getCapabilities())) +
                '}';
     }
+
+    @Override
+    public org.apache.qpid.proton.amqp.transport.Target copy() {
+        return new Target(this);
+    }
 }
   
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/f6d74a47/proton-j/src/main/java/org/apache/qpid/proton/amqp/messaging/Terminus.java
----------------------------------------------------------------------
diff --git a/proton-j/src/main/java/org/apache/qpid/proton/amqp/messaging/Terminus.java b/proton-j/src/main/java/org/apache/qpid/proton/amqp/messaging/Terminus.java
index be57957..ac28b32 100644
--- a/proton-j/src/main/java/org/apache/qpid/proton/amqp/messaging/Terminus.java
+++ b/proton-j/src/main/java/org/apache/qpid/proton/amqp/messaging/Terminus.java
@@ -20,7 +20,9 @@
  */
 package org.apache.qpid.proton.amqp.messaging;
 
+import java.util.HashMap;
 import java.util.Map;
+
 import org.apache.qpid.proton.amqp.Symbol;
 import org.apache.qpid.proton.amqp.UnsignedInteger;
 
@@ -37,6 +39,21 @@ public abstract class Terminus
     Terminus()
     {
     }
+    
+    protected Terminus(Terminus other) {
+        _address = other._address;
+        _durable = other._durable;
+        _expiryPolicy = other._expiryPolicy;
+        _timeout = other._timeout;
+        _dynamic = other._dynamic;
+        if (other._dynamicNodeProperties != null) {
+            // TODO: Do we need to copy or can we make a simple reference?
+            _dynamicNodeProperties = new HashMap(other._dynamicNodeProperties); // FIXME
+        }
+        if (other._capabilities != null) {
+            _capabilities = other._capabilities.clone(); // FIXME?
+        }
+    }
 
     public final String getAddress()
     {

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/f6d74a47/proton-j/src/main/java/org/apache/qpid/proton/amqp/transaction/Coordinator.java
----------------------------------------------------------------------
diff --git a/proton-j/src/main/java/org/apache/qpid/proton/amqp/transaction/Coordinator.java b/proton-j/src/main/java/org/apache/qpid/proton/amqp/transaction/Coordinator.java
index 2af968d..7ff000a 100644
--- a/proton-j/src/main/java/org/apache/qpid/proton/amqp/transaction/Coordinator.java
+++ b/proton-j/src/main/java/org/apache/qpid/proton/amqp/transaction/Coordinator.java
@@ -55,5 +55,10 @@ public final class Coordinator
     {
         return null;
     }
+
+    @Override
+    public Target copy() {
+        return null;
+    }
 }
 

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/f6d74a47/proton-j/src/main/java/org/apache/qpid/proton/amqp/transport/Source.java
----------------------------------------------------------------------
diff --git a/proton-j/src/main/java/org/apache/qpid/proton/amqp/transport/Source.java b/proton-j/src/main/java/org/apache/qpid/proton/amqp/transport/Source.java
index 93d71f7..2d6f3b2 100644
--- a/proton-j/src/main/java/org/apache/qpid/proton/amqp/transport/Source.java
+++ b/proton-j/src/main/java/org/apache/qpid/proton/amqp/transport/Source.java
@@ -23,4 +23,6 @@ package org.apache.qpid.proton.amqp.transport;
 public interface Source
 {
     public String getAddress();
+
+    public Source copy();
 }

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/f6d74a47/proton-j/src/main/java/org/apache/qpid/proton/amqp/transport/Target.java
----------------------------------------------------------------------
diff --git a/proton-j/src/main/java/org/apache/qpid/proton/amqp/transport/Target.java b/proton-j/src/main/java/org/apache/qpid/proton/amqp/transport/Target.java
index 8b81f37..c972c02 100644
--- a/proton-j/src/main/java/org/apache/qpid/proton/amqp/transport/Target.java
+++ b/proton-j/src/main/java/org/apache/qpid/proton/amqp/transport/Target.java
@@ -24,4 +24,6 @@ package org.apache.qpid.proton.amqp.transport;
 public interface Target
 {
     public String getAddress();
+
+    public Target copy();
 }

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/f6d74a47/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 6b63b9a..ca98096 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
@@ -418,6 +418,10 @@ public abstract class LinkImpl extends EndpointImpl implements Link
     @Override
     void localOpen()
     {
+        if (_source == null)
+            _source = _remoteSource.copy();
+        if (_target == null)
+            _target = _remoteTarget.copy();
         getConnectionImpl().put(Event.Type.LINK_LOCAL_OPEN, this);
     }
 


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


[04/50] qpid-proton git commit: NO-JIRA: Fix broken ruby build. Swig changes may require clean rebuild.

Posted by ac...@apache.org.
NO-JIRA: Fix broken ruby build. Swig changes may require clean rebuild.

- Finished incomplete namespace change.
- Fixed swig warnings about invalid class name.


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

Branch: refs/heads/cjansen-cpp-client
Commit: f965610ab88159f5c2cdf1547e5bc0e787161555
Parents: f298794
Author: Alan Conway <ac...@redhat.com>
Authored: Thu Jun 25 12:54:44 2015 -0400
Committer: Alan Conway <ac...@redhat.com>
Committed: Thu Jun 25 12:54:44 2015 -0400

----------------------------------------------------------------------
 proton-c/bindings/ruby/lib/codec/data.rb        | 16 ++---
 proton-c/bindings/ruby/lib/core/message.rb      |  6 +-
 proton-c/bindings/ruby/lib/core/url.rb          |  2 +-
 .../bindings/ruby/lib/messenger/messenger.rb    |  4 +-
 proton-c/bindings/ruby/lib/reactor/container.rb |  2 +-
 proton-c/bindings/ruby/lib/types/array.rb       | 10 ++--
 proton-c/bindings/ruby/lib/types/described.rb   |  2 +-
 proton-c/bindings/ruby/lib/types/hash.rb        |  4 +-
 proton-c/bindings/ruby/lib/util/wrapper.rb      | 12 ++--
 proton-c/bindings/ruby/ruby.i                   | 46 +++++++--------
 .../ruby/spec/qpid/proton/array_spec.rb         |  4 +-
 .../bindings/ruby/spec/qpid/proton/data_spec.rb | 12 ++--
 .../spec/qpid/proton/exception_handling_spec.rb |  2 +-
 .../bindings/ruby/spec/qpid/proton/hash_spec.rb |  2 +-
 .../ruby/spec/qpid/proton/message_spec.rb       |  8 +--
 .../ruby/spec/qpid/proton/messenger_spec.rb     |  8 +--
 proton-c/bindings/ruby/spec/spec_helper.rb      | 10 ++--
 tests/ruby/proton_tests/interop.rb              | 62 ++++++++++----------
 tests/ruby/proton_tests/smoke.rb                |  2 +-
 19 files changed, 107 insertions(+), 107 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/f965610a/proton-c/bindings/ruby/lib/codec/data.rb
----------------------------------------------------------------------
diff --git a/proton-c/bindings/ruby/lib/codec/data.rb b/proton-c/bindings/ruby/lib/codec/data.rb
index efefa99..010177d 100644
--- a/proton-c/bindings/ruby/lib/codec/data.rb
+++ b/proton-c/bindings/ruby/lib/codec/data.rb
@@ -234,7 +234,7 @@ module Qpid::Proton::Codec
     #
     # @example
     #
-    #   data = Qpid::Proton::Data.new
+    #   data = Qpid::Proton::Codec::Data.new
     #   data.put_list
     #   data.enter
     #   data.int = 1
@@ -271,7 +271,7 @@ module Qpid::Proton::Codec
     #
     # @example
     #
-    #   data = Qpid::Proton::Data.new
+    #   data = Qpid::Proton::Codec::Data.new
     #   data.put_map
     #   data.enter
     #   data.string = "key"
@@ -324,7 +324,7 @@ module Qpid::Proton::Codec
     # @example
     #
     #   # create an array of integer values
-    #   data = Qpid::Proton::Data.new
+    #   data = Qpid::Proton::Codec::Data.new
     #   data.put_array(false, INT)
     #   data.enter
     #   data.int = 1
@@ -387,7 +387,7 @@ module Qpid::Proton::Codec
     #
     # @example
     #
-    #   data = Qpid::Proton::Data.new
+    #   data = Qpid::Proton::Codec::Data.new
     #   data.put_described
     #   data.enter
     #   data.symbol = "value-descriptor"
@@ -409,7 +409,7 @@ module Qpid::Proton::Codec
       type = self.type
       value = type.get(self)
       self.exit
-      Described.new(descriptor, value)
+      Qpid::Proton::Types::Described.new(descriptor, value)
     end
 
     # Checks if the current node is a described value.
@@ -433,7 +433,7 @@ module Qpid::Proton::Codec
       check(Cproton.pn_data_put_null(@data))
     end
 
-    # Utility method for Qpid::Proton::Mapping
+    # Utility method for Qpid::Proton::Codec::Mapping
     #
     # @private
     #
@@ -772,7 +772,7 @@ module Qpid::Proton::Codec
     #   @data.uuid = 0 # sets to 00000000-0000-0000-0000-000000000000
     #
     def uuid=(value)
-      raise ArgumentError, "invalid uuid: #{value}" if value.nil?
+      raise ::ArgumentError, "invalid uuid: #{value}" if value.nil?
 
       # if the uuid that was submitted was numeric value, then translated
       # it into a hex string, otherwise assume it was a string represtation
@@ -780,7 +780,7 @@ module Qpid::Proton::Codec
       if value.is_a? Numeric
         value = "%032x" % value
       else
-        raise ArgumentError, "invalid uuid: #{value}" if !valid_uuid?(value)
+        raise ::ArgumentError, "invalid uuid: #{value}" if !valid_uuid?(value)
 
         value = (value[0, 8]  +
                  value[9, 4]  +

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/f965610a/proton-c/bindings/ruby/lib/core/message.rb
----------------------------------------------------------------------
diff --git a/proton-c/bindings/ruby/lib/core/message.rb b/proton-c/bindings/ruby/lib/core/message.rb
index 0b89016..53e7092 100644
--- a/proton-c/bindings/ruby/lib/core/message.rb
+++ b/proton-c/bindings/ruby/lib/core/message.rb
@@ -275,7 +275,7 @@ module Qpid::Proton
     # * count - the delivery count
     #
     def delivery_count=(count)
-      raise ArgumentError.new("invalid count: #{count}") if count.nil? || !([Float, Fixnum].include?(count.class))
+      raise ::ArgumentError.new("invalid count: #{count}") if count.nil? || !([Float, Fixnum].include?(count.class))
       raise RangeError.new("count out of range: #{count}") if count < 0
 
       Cproton.pn_message_set_delivery_count(@impl, count.floor)
@@ -465,7 +465,7 @@ module Qpid::Proton
     #
     def expires=(time)
       raise TypeError.new("invalid expiry time: #{time}") if time.nil?
-      raise ArgumentError.new("expiry time cannot be negative: #{time}") if time < 0
+      raise ::ArgumentError.new("expiry time cannot be negative: #{time}") if time < 0
       Cproton.pn_message_set_expiry_time(@impl, time)
     end
 
@@ -483,7 +483,7 @@ module Qpid::Proton
     #
     def creation_time=(time)
       raise TypeError.new("invalid time: #{time}") if time.nil?
-      raise ArgumentError.new("time cannot be negative") if time < 0
+      raise ::ArgumentError.new("time cannot be negative") if time < 0
       Cproton.pn_message_set_creation_time(@impl, time)
     end
 

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/f965610a/proton-c/bindings/ruby/lib/core/url.rb
----------------------------------------------------------------------
diff --git a/proton-c/bindings/ruby/lib/core/url.rb b/proton-c/bindings/ruby/lib/core/url.rb
index a68811a..1fa1222 100644
--- a/proton-c/bindings/ruby/lib/core/url.rb
+++ b/proton-c/bindings/ruby/lib/core/url.rb
@@ -34,7 +34,7 @@ module Qpid::Proton
       if url
         @url = Cproton.pn_url_parse(url)
         if @url.nil?
-          raise ArgumentError.new("invalid url: #{url}")
+          raise ::ArgumentError.new("invalid url: #{url}")
         end
       else
         @url = Cproton.pn_url

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/f965610a/proton-c/bindings/ruby/lib/messenger/messenger.rb
----------------------------------------------------------------------
diff --git a/proton-c/bindings/ruby/lib/messenger/messenger.rb b/proton-c/bindings/ruby/lib/messenger/messenger.rb
index f96a535..36bcf74 100644
--- a/proton-c/bindings/ruby/lib/messenger/messenger.rb
+++ b/proton-c/bindings/ruby/lib/messenger/messenger.rb
@@ -313,10 +313,10 @@ module Qpid::Proton::Messenger
     #
     def put(message)
       if message.nil?
-        raise Qpid::Proton::TypeError.new("invalid message: #{message}")
+        raise TypeError.new("invalid message: #{message}")
       end
       unless message.kind_of?(Qpid::Proton::Message)
-        raise Qpid::Proton::ArgumentError.new("invalid message type: #{message.class}")
+        raise ::ArgumentError.new("invalid message type: #{message.class}")
       end
       # encode the message first
       message.pre_encode

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/f965610a/proton-c/bindings/ruby/lib/reactor/container.rb
----------------------------------------------------------------------
diff --git a/proton-c/bindings/ruby/lib/reactor/container.rb b/proton-c/bindings/ruby/lib/reactor/container.rb
index 93b49bb..2a7a030 100644
--- a/proton-c/bindings/ruby/lib/reactor/container.rb
+++ b/proton-c/bindings/ruby/lib/reactor/container.rb
@@ -90,7 +90,7 @@ module Qpid::Proton::Reactor
       elsif !options[:address].nil?
         connector.address = URLs.new([Qpid::Proton::URL.new(options[:address])])
       else
-        raise ArgumentError.new("either :url or :urls or :address required")
+        raise ::ArgumentError.new("either :url or :urls or :address required")
       end
 
       connector.heartbeat = options[:heartbeat] if !options[:heartbeat].nil?

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/f965610a/proton-c/bindings/ruby/lib/types/array.rb
----------------------------------------------------------------------
diff --git a/proton-c/bindings/ruby/lib/types/array.rb b/proton-c/bindings/ruby/lib/types/array.rb
index 5677295..f5c6b50 100644
--- a/proton-c/bindings/ruby/lib/types/array.rb
+++ b/proton-c/bindings/ruby/lib/types/array.rb
@@ -57,7 +57,7 @@ class Array # :nodoc:
 
   # Used to declare an array as an AMQP array.
   #
-  # The value, if defined, is an instance of Qpid::Proton::ArrayHeader
+  # The value, if defined, is an instance of Qpid::Proton::Types::ArrayHeader
   attr_accessor :proton_array_header
 
   # Returns true if the array is the a Proton described type.
@@ -84,7 +84,7 @@ class Array # :nodoc:
     data.enter
     each do |element|
       # get the proton type for the element
-      mapping = Qpid::Proton::Mapping.for_class(element.class)
+      mapping = Qpid::Proton::Codec::Mapping.for_class(element.class)
       # add the element
       mapping.put(data, element)
     end
@@ -115,9 +115,9 @@ class Array # :nodoc:
 
       type = data.type
 
-      if type == Qpid::Proton::LIST
+      if type == Qpid::Proton::Codec::LIST
         result = proton_get_list(data)
-      elsif type == Qpid::Proton::ARRAY
+      elsif type == Qpid::Proton::Codec::ARRAY
         result = proton_get_array(data)
       else
         raise TypeError, "element is not a list and not an array"
@@ -153,7 +153,7 @@ class Array # :nodoc:
         descriptor = data.symbol
       end
 
-      elements.proton_array_header = Qpid::Proton::ArrayHeader.new(type, descriptor)
+      elements.proton_array_header = Qpid::Proton::Types::ArrayHeader.new(type, descriptor)
       (0...count).each do |which|
         if data.next
           etype = data.type

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/f965610a/proton-c/bindings/ruby/lib/types/described.rb
----------------------------------------------------------------------
diff --git a/proton-c/bindings/ruby/lib/types/described.rb b/proton-c/bindings/ruby/lib/types/described.rb
index ca9fa24..7c09d3f 100644
--- a/proton-c/bindings/ruby/lib/types/described.rb
+++ b/proton-c/bindings/ruby/lib/types/described.rb
@@ -49,7 +49,7 @@ module Qpid::Proton::Types
     end
 
     def ==(that) # :nodoc:
-      (that.is_a?(Qpid::Proton::Described) &&
+      (that.is_a?(Qpid::Proton::Types::Described) &&
        (self.descriptor == that.descriptor) &&
        (self.value == that.value))
     end

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/f965610a/proton-c/bindings/ruby/lib/types/hash.rb
----------------------------------------------------------------------
diff --git a/proton-c/bindings/ruby/lib/types/hash.rb b/proton-c/bindings/ruby/lib/types/hash.rb
index f2e6117..e6836d5 100644
--- a/proton-c/bindings/ruby/lib/types/hash.rb
+++ b/proton-c/bindings/ruby/lib/types/hash.rb
@@ -44,9 +44,9 @@ class Hash # :nodoc:
     data.enter
 
     each_pair do |key, value|
-      type = Qpid::Proton::Mapping.for_class(key.class)
+      type = Qpid::Proton::Codec::Mapping.for_class(key.class)
       type.put(data, key)
-      type = Qpid::Proton::Mapping.for_class(value.class)
+      type = Qpid::Proton::Codec::Mapping.for_class(value.class)
       type.put(data, value)
     end
 

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/f965610a/proton-c/bindings/ruby/lib/util/wrapper.rb
----------------------------------------------------------------------
diff --git a/proton-c/bindings/ruby/lib/util/wrapper.rb b/proton-c/bindings/ruby/lib/util/wrapper.rb
index a2df413..8db1c4e 100644
--- a/proton-c/bindings/ruby/lib/util/wrapper.rb
+++ b/proton-c/bindings/ruby/lib/util/wrapper.rb
@@ -69,11 +69,11 @@ module Qpid::Proton::Util
         registry_key = get_key(object.impl)
         unless attachment_method.nil?
           record = Cproton.__send__(attachment_method, object.impl)
-          rbkey = Cproton.pn_rbkey_new
-          Cproton.pn_rbkey_set_registry(rbkey, Cproton.pn_rb2void(Qpid::Proton::Util::Wrapper.registry))
-          Cproton.pn_rbkey_set_method(rbkey, "delete")
-          Cproton.pn_rbkey_set_key_value(rbkey, registry_key)
-          Cproton.pn_record_def(record, RBCTX, Cproton.pn_rbkey__class());
+          rbkey = Cproton.Pn_rbkey_new
+          Cproton.Pn_rbkey_set_registry(rbkey, Cproton.pn_rb2void(Qpid::Proton::Util::Wrapper.registry))
+          Cproton.Pn_rbkey_set_method(rbkey, "delete")
+          Cproton.Pn_rbkey_set_key_value(rbkey, registry_key)
+          Cproton.pn_record_def(record, RBCTX, Cproton.Pn_rbkey__class());
           Cproton.pn_record_set(record, RBCTX, rbkey)
         end
         Qpid::Proton::Util::Wrapper.registry[registry_key] = object
@@ -96,7 +96,7 @@ module Qpid::Proton::Util
           rbkey = Cproton.pni_void2rbkey(Cproton.pn_record_get(record, RBCTX))
           # if we don't have a key, then we don't have an object
           return nil if rbkey.nil?
-          registry_key = Cproton.pn_rbkey_get_key_value(rbkey)
+          registry_key = Cproton.Pn_rbkey_get_key_value(rbkey)
         else
           registry_key = get_key(impl)
         end

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/f965610a/proton-c/bindings/ruby/ruby.i
----------------------------------------------------------------------
diff --git a/proton-c/bindings/ruby/ruby.i b/proton-c/bindings/ruby/ruby.i
index 3d4090e..4b0bff4 100644
--- a/proton-c/bindings/ruby/ruby.i
+++ b/proton-c/bindings/ruby/ruby.i
@@ -467,22 +467,22 @@ bool pn_ssl_get_protocol_name(pn_ssl_t *ssl, char *OUTPUT, size_t MAX_OUTPUT_SIZ
 
 %inline %{
 
-#define CID_pn_rbkey CID_pn_void
+#define CID_Pn_rbkey CID_pn_void
 
 typedef struct {
   void *registry;
   char *method;
   char *key_value;
-} pn_rbkey_t;
+} Pn_rbkey_t;
 
-void pn_rbkey_initialize(pn_rbkey_t *rbkey) {
+void Pn_rbkey_initialize(Pn_rbkey_t *rbkey) {
   assert(rbkey);
   rbkey->registry = NULL;
   rbkey->method = NULL;
   rbkey->key_value = NULL;
 }
 
-void pn_rbkey_finalize(pn_rbkey_t *rbkey) {
+void Pn_rbkey_finalize(Pn_rbkey_t *rbkey) {
   if(rbkey && rbkey->registry && rbkey->method && rbkey->key_value) {
     rb_funcall((VALUE )rbkey->registry, rb_intern(rbkey->method), 1, rb_str_new2(rbkey->key_value));
   }
@@ -492,45 +492,45 @@ void pn_rbkey_finalize(pn_rbkey_t *rbkey) {
   }
 }
 
-#define pn_rbkey_inspect NULL
-#define pn_rbkey_compare NULL
-#define pn_rbkey_hashcode NULL
+#define Pn_rbkey_inspect NULL
+#define Pn_rbkey_compare NULL
+#define Pn_rbkey_hashcode NULL
 
-PN_CLASSDEF(pn_rbkey)
+PN_CLASSDEF(Pn_rbkey)
 
-void pn_rbkey_set_registry(pn_rbkey_t *rbkey, void *registry) {
+void Pn_rbkey_set_registry(Pn_rbkey_t *rbkey, void *registry) {
   assert(rbkey);
   rbkey->registry = registry;
 }
 
-void *pn_rbkey_get_registry(pn_rbkey_t *rbkey) {
+void *Pn_rbkey_get_registry(Pn_rbkey_t *rbkey) {
   assert(rbkey);
   return rbkey->registry;
 }
 
-void pn_rbkey_set_method(pn_rbkey_t *rbkey, char *method) {
+void Pn_rbkey_set_method(Pn_rbkey_t *rbkey, char *method) {
   assert(rbkey);
   rbkey->method = method;
 }
 
-char *pn_rbkey_get_method(pn_rbkey_t *rbkey) {
+char *Pn_rbkey_get_method(Pn_rbkey_t *rbkey) {
   assert(rbkey);
   return rbkey->method;
 }
 
-void pn_rbkey_set_key_value(pn_rbkey_t *rbkey, char *key_value) {
+void Pn_rbkey_set_key_value(Pn_rbkey_t *rbkey, char *key_value) {
   assert(rbkey);
   rbkey->key_value = malloc(strlen(key_value) + 1);
   strncpy(rbkey->key_value, key_value, strlen(key_value) + 1);
 }
 
-char *pn_rbkey_get_key_value(pn_rbkey_t *rbkey) {
+char *Pn_rbkey_get_key_value(Pn_rbkey_t *rbkey) {
   assert(rbkey);
   return rbkey->key_value;
 }
 
-pn_rbkey_t *pni_void2rbkey(void *object) {
-  return (pn_rbkey_t *)object;
+Pn_rbkey_t *pni_void2rbkey(void *object) {
+  return (Pn_rbkey_t *)object;
 }
 
 VALUE pn_void2rb(void *object) {
@@ -580,27 +580,27 @@ int pn_ssl_get_peer_hostname(pn_ssl_t *ssl, char *OUTPUT, size_t *OUTPUT_SIZE);
 
   typedef struct {
     VALUE handler_key;
-  } pni_rbhandler_t;
+  } Pni_rbhandler_t;
 
-  static pni_rbhandler_t *pni_rbhandler(pn_handler_t *handler) {
-    return (pni_rbhandler_t *) pn_handler_mem(handler);
+  static Pni_rbhandler_t *pni_rbhandler(pn_handler_t *handler) {
+    return (Pni_rbhandler_t *) pn_handler_mem(handler);
   }
 
   static void pni_rbdispatch(pn_handler_t *handler, pn_event_t *event, pn_event_type_t type) {
-    pni_rbhandler_t *rbh = pni_rbhandler(handler);
+    Pni_rbhandler_t *rbh = pni_rbhandler(handler);
     VALUE rbhandler = pni_ruby_get_from_registry(rbh->handler_key);
 
     rb_funcall(rbhandler, rb_intern("dispatch"), 2, SWIG_NewPointerObj(event, SWIGTYPE_p_pn_event_t, 0), INT2FIX(type));
   }
 
   static void pni_rbhandler_finalize(pn_handler_t *handler) {
-    pni_rbhandler_t *rbh = pni_rbhandler(handler);
+    Pni_rbhandler_t *rbh = pni_rbhandler(handler);
     pni_ruby_delete_from_registry(rbh->handler_key);
   }
 
   pn_handler_t *pn_rbhandler(VALUE handler) {
-    pn_handler_t *chandler = pn_handler_new(pni_rbdispatch, sizeof(pni_rbhandler_t), pni_rbhandler_finalize);
-    pni_rbhandler_t *rhy = pni_rbhandler(chandler);
+    pn_handler_t *chandler = pn_handler_new(pni_rbdispatch, sizeof(Pni_rbhandler_t), pni_rbhandler_finalize);
+    Pni_rbhandler_t *rhy = pni_rbhandler(chandler);
 
     VALUE ruby_key = rb_class_new_instance(0, NULL, rb_cObject);
     pni_ruby_add_to_registry(ruby_key, handler);

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/f965610a/proton-c/bindings/ruby/spec/qpid/proton/array_spec.rb
----------------------------------------------------------------------
diff --git a/proton-c/bindings/ruby/spec/qpid/proton/array_spec.rb b/proton-c/bindings/ruby/spec/qpid/proton/array_spec.rb
index 3af6907..2f26fdf 100644
--- a/proton-c/bindings/ruby/spec/qpid/proton/array_spec.rb
+++ b/proton-c/bindings/ruby/spec/qpid/proton/array_spec.rb
@@ -22,7 +22,7 @@ require "spec_helper"
 describe "The extended array type" do
 
   before :each do
-    @data        = Qpid::Proton::Data.new
+    @data        = Qpid::Proton::Codec::Data.new
     @list        = random_list(rand(100))
     @undescribed = random_array(rand(100))
     @description = random_string(128)
@@ -83,7 +83,7 @@ describe "The extended array type" do
 
   it "raises an error when the elements of an Array are dissimilar and is put into a Data object" do
     value = []
-    value.proton_array_header = Qpid::Proton::ArrayHeader.new(Qpid::Proton::INT)
+    value.proton_array_header = Qpid::Proton::Types::ArrayHeader.new(Qpid::Proton::Codec::INT)
     value << random_string(16)
 
     expect {

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/f965610a/proton-c/bindings/ruby/spec/qpid/proton/data_spec.rb
----------------------------------------------------------------------
diff --git a/proton-c/bindings/ruby/spec/qpid/proton/data_spec.rb b/proton-c/bindings/ruby/spec/qpid/proton/data_spec.rb
index 2e10b8a..c8c7d18 100644
--- a/proton-c/bindings/ruby/spec/qpid/proton/data_spec.rb
+++ b/proton-c/bindings/ruby/spec/qpid/proton/data_spec.rb
@@ -26,7 +26,7 @@ module Qpid
     describe "A data object" do
 
       before :each do
-        @data = Qpid::Proton::Data.new
+        @data = Qpid::Proton::Codec::Data.new
       end
 
       it "can be initialized" do
@@ -341,13 +341,13 @@ module Qpid
       it "raises an error on a null UUID" do
         expect {
           @data.uuid = nil
-        }.to raise_error(ArgumentError)
+        }.to raise_error(::ArgumentError)
       end
 
       it "raises an error on a malformed UUID" do
         expect {
           @data.uuid = random_string(36)
-        }.to raise_error(ArgumentError)
+        }.to raise_error(::ArgumentError)
       end
 
       it "can set a UUID from an integer value" do
@@ -416,7 +416,7 @@ module Qpid
       it "can hold an array" do
         values = []
         (1..(rand(100) + 5)).each { values << rand(2**16) }
-        @data.put_array false, Qpid::Proton::INT
+        @data.put_array false, Qpid::Proton::Codec::INT
         @data.enter
         values.each { |value| @data.int = value }
         @data.exit
@@ -432,13 +432,13 @@ module Qpid
         values = []
         (1..(rand(100) + 5)).each { values << random_string(64) }
         descriptor = random_string(32)
-        @data.put_array true, Qpid::Proton::STRING
+        @data.put_array true, Qpid::Proton::Codec::STRING
         @data.enter
         @data.symbol = descriptor
         values.each { |value| @data.string = value }
         @data.exit
 
-        expect(@data.array).to match_array([values.size, true, Qpid::Proton::STRING])
+        expect(@data.array).to match_array([values.size, true, Qpid::Proton::Codec::STRING])
         @data.enter
         @data.next
         expect(@data.symbol).to eq(descriptor)

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/f965610a/proton-c/bindings/ruby/spec/qpid/proton/exception_handling_spec.rb
----------------------------------------------------------------------
diff --git a/proton-c/bindings/ruby/spec/qpid/proton/exception_handling_spec.rb b/proton-c/bindings/ruby/spec/qpid/proton/exception_handling_spec.rb
index ccdf688..e296a69 100644
--- a/proton-c/bindings/ruby/spec/qpid/proton/exception_handling_spec.rb
+++ b/proton-c/bindings/ruby/spec/qpid/proton/exception_handling_spec.rb
@@ -22,7 +22,7 @@ module Qpid
   module Proton
 
     class ExceptionHandlingClass
-      include Qpid::Proton::ExceptionHandling
+      include Qpid::Proton::Util::ErrorHandler
 
       def error
         "This is a test error: #{Time.new}"

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/f965610a/proton-c/bindings/ruby/spec/qpid/proton/hash_spec.rb
----------------------------------------------------------------------
diff --git a/proton-c/bindings/ruby/spec/qpid/proton/hash_spec.rb b/proton-c/bindings/ruby/spec/qpid/proton/hash_spec.rb
index 8cf0c63..7568ac1 100644
--- a/proton-c/bindings/ruby/spec/qpid/proton/hash_spec.rb
+++ b/proton-c/bindings/ruby/spec/qpid/proton/hash_spec.rb
@@ -22,7 +22,7 @@ require "spec_helper"
 describe "The extended hash type" do
 
   before :each do
-    @data = Qpid::Proton::Data.new
+    @data = Qpid::Proton::Codec::Data.new
     @hash = random_hash(rand(128) + 64)
   end
 

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/f965610a/proton-c/bindings/ruby/spec/qpid/proton/message_spec.rb
----------------------------------------------------------------------
diff --git a/proton-c/bindings/ruby/spec/qpid/proton/message_spec.rb b/proton-c/bindings/ruby/spec/qpid/proton/message_spec.rb
index ba33a38..36e4695 100644
--- a/proton-c/bindings/ruby/spec/qpid/proton/message_spec.rb
+++ b/proton-c/bindings/ruby/spec/qpid/proton/message_spec.rb
@@ -143,7 +143,7 @@ module Qpid
       it "raises an error on a nil delivery count" do
         expect {
           @message.delivery_count = nil
-        }.to raise_error(ArgumentError)
+        }.to raise_error(::ArgumentError)
       end
 
       it "raises an error on a negative delivery count" do
@@ -155,7 +155,7 @@ module Qpid
       it "raises an error on a non-numeric delivery count" do
         expect {
           @message.delivery_count = "farkle"
-        }.to raise_error(ArgumentError)
+        }.to raise_error(::ArgumentError)
       end
 
       it "converts a floating point delivery count to its integer portion" do
@@ -272,7 +272,7 @@ module Qpid
       it "raises an error on a negative expiry time" do
         expect {
           @message.expires = (0-(rand(65535)))
-        }.to raise_error(ArgumentError)
+        }.to raise_error(::ArgumentError)
       end
 
       it "can have a zero expiry time" do
@@ -295,7 +295,7 @@ module Qpid
       it "raises an error on a negative creation time" do
         expect {
           @message.creation_time = (0 - rand(65535))
-        }.to raise_error(ArgumentError)
+        }.to raise_error(::ArgumentError)
       end
 
       it "can have a zero creation time" do

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/f965610a/proton-c/bindings/ruby/spec/qpid/proton/messenger_spec.rb
----------------------------------------------------------------------
diff --git a/proton-c/bindings/ruby/spec/qpid/proton/messenger_spec.rb b/proton-c/bindings/ruby/spec/qpid/proton/messenger_spec.rb
index ec60fdb..8e50331 100644
--- a/proton-c/bindings/ruby/spec/qpid/proton/messenger_spec.rb
+++ b/proton-c/bindings/ruby/spec/qpid/proton/messenger_spec.rb
@@ -26,7 +26,7 @@ module Qpid
     describe "A messenger" do
 
       before (:each) do
-        @messenger = Qpid::Proton::Messenger.new
+        @messenger = Qpid::Proton::Messenger::Messenger.new
       end
 
       after (:each) do
@@ -43,7 +43,7 @@ module Qpid
 
       it "will accept an assigned name" do
         name = random_string(16)
-        msgr = Qpid::Proton::Messenger.new(name)
+        msgr = Qpid::Proton::Messenger::Messenger.new(name)
         expect(msgr.name).to eq(name)
       end
 
@@ -263,7 +263,7 @@ module Qpid
           before (:each) do
             # create a receiver
             @port = 5700 + rand(1024)
-            @receiver = Qpid::Proton::Messenger.new("receiver")
+            @receiver = Qpid::Proton::Messenger::Messenger.new("receiver")
             @receiver.subscribe("amqp://~0.0.0.0:#{@port}")
             @messenger.timeout = 0
             @receiver.timeout = 0
@@ -299,7 +299,7 @@ module Qpid
           it "raises an error when queueing an invalid object" do
             expect {
               @messenger.put("This is not a message")
-            }.to raise_error(ArgumentError)
+            }.to raise_error(::ArgumentError)
           end
 
           it "can place a message in the outgoing queue" do

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/f965610a/proton-c/bindings/ruby/spec/spec_helper.rb
----------------------------------------------------------------------
diff --git a/proton-c/bindings/ruby/spec/spec_helper.rb b/proton-c/bindings/ruby/spec/spec_helper.rb
index aa1e346..346cb0e 100644
--- a/proton-c/bindings/ruby/spec/spec_helper.rb
+++ b/proton-c/bindings/ruby/spec/spec_helper.rb
@@ -110,13 +110,13 @@ def random_array(length, described = false, description = nil)
 
   # create the array header
   case
-    when type == 0 then type = Qpid::Proton::INT
-    when type == 1 then type = Qpid::Proton::STRING
-    when type == 2 then type = Qpid::Proton::FLOAT
-    when type == 3 then type = Qpid::Proton::UUID
+    when type == 0 then type = Qpid::Proton::Codec::INT
+    when type == 1 then type = Qpid::Proton::Codec::STRING
+    when type == 2 then type = Qpid::Proton::Codec::FLOAT
+    when type == 3 then type = Qpid::Proton::Codec::UUID
   end
 
-  result.proton_array_header = Qpid::Proton::ArrayHeader.new(type, description)
+  result.proton_array_header = Qpid::Proton::Types::ArrayHeader.new(type, description)
 
   return result
 end

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/f965610a/tests/ruby/proton_tests/interop.rb
----------------------------------------------------------------------
diff --git a/tests/ruby/proton_tests/interop.rb b/tests/ruby/proton_tests/interop.rb
index c1a201c..1d50483 100755
--- a/tests/ruby/proton_tests/interop.rb
+++ b/tests/ruby/proton_tests/interop.rb
@@ -13,7 +13,7 @@ if ((RUBY_VERSION.split(".").map {|x| x.to_i}  <=> [1, 9]) < 0)
 end
 
 class InteropTest < Test::Unit::TestCase
-  Data = Qpid::Proton::Data
+  Data = Qpid::Proton::Codec::Data
   Message = Qpid::Proton::Message
 
   def setup
@@ -59,49 +59,49 @@ class InteropTest < Test::Unit::TestCase
   end
 
   def assert_array_next(expected, header)
-    assert_next(Qpid::Proton::ARRAY, expected)
+    assert_next(Qpid::Proton::Codec::ARRAY, expected)
     result = @data.type.get(@data)
     assert_equal(result.proton_array_header, header)
   end
 
   def test_message
     decode_message_file("message")
-    assert_next(Qpid::Proton::STRING, "hello")
+    assert_next(Qpid::Proton::Codec::STRING, "hello")
     assert !@data.next
   end
 
   def test_primitives
     decode_data_file("primitives")
-    assert_next(Qpid::Proton::BOOL, true)
-    assert_next(Qpid::Proton::BOOL, false)
-    assert_next(Qpid::Proton::UBYTE, 42)
-    assert_next(Qpid::Proton::USHORT, 42)
-    assert_next(Qpid::Proton::SHORT, -42)
-    assert_next(Qpid::Proton::UINT, 12345)
-    assert_next(Qpid::Proton::INT, -12345)
-    assert_next(Qpid::Proton::ULONG, 12345)
-    assert_next(Qpid::Proton::LONG, -12345)
-    assert_next(Qpid::Proton::FLOAT, 0.125)
-    assert_next(Qpid::Proton::DOUBLE, 0.125)
+    assert_next(Qpid::Proton::Codec::BOOL, true)
+    assert_next(Qpid::Proton::Codec::BOOL, false)
+    assert_next(Qpid::Proton::Codec::UBYTE, 42)
+    assert_next(Qpid::Proton::Codec::USHORT, 42)
+    assert_next(Qpid::Proton::Codec::SHORT, -42)
+    assert_next(Qpid::Proton::Codec::UINT, 12345)
+    assert_next(Qpid::Proton::Codec::INT, -12345)
+    assert_next(Qpid::Proton::Codec::ULONG, 12345)
+    assert_next(Qpid::Proton::Codec::LONG, -12345)
+    assert_next(Qpid::Proton::Codec::FLOAT, 0.125)
+    assert_next(Qpid::Proton::Codec::DOUBLE, 0.125)
     assert !@data.next
   end
 
   def test_strings
     decode_data_file("strings")
-    assert_next(Qpid::Proton::BINARY, "abc\0defg")
-    assert_next(Qpid::Proton::STRING, "abcdefg")
-    assert_next(Qpid::Proton::SYMBOL, "abcdefg")
-    assert_next(Qpid::Proton::BINARY, "")
-    assert_next(Qpid::Proton::STRING, "")
-    assert_next(Qpid::Proton::SYMBOL, "")
+    assert_next(Qpid::Proton::Codec::BINARY, "abc\0defg")
+    assert_next(Qpid::Proton::Codec::STRING, "abcdefg")
+    assert_next(Qpid::Proton::Codec::SYMBOL, "abcdefg")
+    assert_next(Qpid::Proton::Codec::BINARY, "")
+    assert_next(Qpid::Proton::Codec::STRING, "")
+    assert_next(Qpid::Proton::Codec::SYMBOL, "")
     assert !@data.next
   end
 
   def test_described
     decode_data_file("described")
-    assert_next(Qpid::Proton::DESCRIBED, Qpid::Proton::Described.new("foo-descriptor", "foo-value"))
+    assert_next(Qpid::Proton::Codec::DESCRIBED, Qpid::Proton::Types::Described.new("foo-descriptor", "foo-value"))
     assert(@data.described?)
-    assert_next(Qpid::Proton::DESCRIBED, Qpid::Proton::Described.new(12, 13))
+    assert_next(Qpid::Proton::Codec::DESCRIBED, Qpid::Proton::Types::Described.new(12, 13))
     assert(@data.described?)
     assert !@data.next
   end
@@ -109,33 +109,33 @@ class InteropTest < Test::Unit::TestCase
   def test_described_array
     decode_data_file("described_array")
     assert_array_next((0...10).to_a,
-                       Qpid::Proton::ArrayHeader.new(Qpid::Proton::INT,
+                       Qpid::Proton::Types::ArrayHeader.new(Qpid::Proton::Codec::INT,
                                                      "int-array"))
   end
 
   def test_arrays
     decode_data_file("arrays")
     assert_array_next((0...100).to_a,
-                      Qpid::Proton::ArrayHeader.new(Qpid::Proton::INT))
+                      Qpid::Proton::Types::ArrayHeader.new(Qpid::Proton::Codec::INT))
     assert_array_next(["a", "b", "c"],
-                      Qpid::Proton::ArrayHeader.new(Qpid::Proton::STRING))
+                      Qpid::Proton::Types::ArrayHeader.new(Qpid::Proton::Codec::STRING))
     assert_array_next([],
-                      Qpid::Proton::ArrayHeader.new(Qpid::Proton::INT))
+                      Qpid::Proton::Types::ArrayHeader.new(Qpid::Proton::Codec::INT))
     assert !@data.next
   end
 
   def test_lists
     decode_data_file("lists")
-    assert_next(Qpid::Proton::LIST, [32, "foo", true])
-    assert_next(Qpid::Proton::LIST, [])
+    assert_next(Qpid::Proton::Codec::LIST, [32, "foo", true])
+    assert_next(Qpid::Proton::Codec::LIST, [])
     assert !@data.next
   end
 
   def test_maps
     decode_data_file("maps")
-    assert_next(Qpid::Proton::MAP, {"one" => 1, "two" => 2, "three" => 3 })
-    assert_next(Qpid::Proton::MAP, {1 => "one", 2 => "two", 3 => "three"})
-    assert_next(Qpid::Proton::MAP, {})
+    assert_next(Qpid::Proton::Codec::MAP, {"one" => 1, "two" => 2, "three" => 3 })
+    assert_next(Qpid::Proton::Codec::MAP, {1 => "one", 2 => "two", 3 => "three"})
+    assert_next(Qpid::Proton::Codec::MAP, {})
     assert !@data.next
   end
 end

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/f965610a/tests/ruby/proton_tests/smoke.rb
----------------------------------------------------------------------
diff --git a/tests/ruby/proton_tests/smoke.rb b/tests/ruby/proton_tests/smoke.rb
old mode 100644
new mode 100755
index b9265e8..5fc990a
--- a/tests/ruby/proton_tests/smoke.rb
+++ b/tests/ruby/proton_tests/smoke.rb
@@ -5,7 +5,7 @@ require 'qpid_proton'
 
 class SmokeTest < Test::Unit::TestCase
 
-  Messenger = Qpid::Proton::Messenger
+  Messenger = Qpid::Proton::Messenger::Messenger
   Message = Qpid::Proton::Message
 
   def setup


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


[28/50] qpid-proton git commit: PROTON-927: reverse previous change pending investigation into segfault on windows in the added test

Posted by ac...@apache.org.
PROTON-927: reverse previous change pending investigation into segfault on windows in the added test


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

Branch: refs/heads/cjansen-cpp-client
Commit: 23a4e3bbb77e14cff6366d7a87aa804f84baa7f6
Parents: 1497259
Author: Gordon Sim <gs...@redhat.com>
Authored: Mon Jul 6 11:22:28 2015 +0100
Committer: Gordon Sim <gs...@redhat.com>
Committed: Mon Jul 6 11:22:28 2015 +0100

----------------------------------------------------------------------
 proton-c/src/message/message.c       |  4 +---
 tests/python/proton_tests/message.py | 13 -------------
 2 files changed, 1 insertion(+), 16 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/23a4e3bb/proton-c/src/message/message.c
----------------------------------------------------------------------
diff --git a/proton-c/src/message/message.c b/proton-c/src/message/message.c
index 847c314..b24a994 100644
--- a/proton-c/src/message/message.c
+++ b/proton-c/src/message/message.c
@@ -792,7 +792,7 @@ int pn_message_data(pn_message_t *msg, pn_data_t *data)
     pn_data_exit(data);
   }
 
-  err = pn_data_fill(data, "DL[CzSSSCss?t?tSIS]", PROPERTIES,
+  err = pn_data_fill(data, "DL[CzSSSCssttSIS]", PROPERTIES,
                      msg->id,
                      pn_string_size(msg->user_id), pn_string_get(msg->user_id),
                      pn_string_get(msg->address),
@@ -802,8 +802,6 @@ int pn_message_data(pn_message_t *msg, pn_data_t *data)
                      pn_string_get(msg->content_type),
                      pn_string_get(msg->content_encoding),
                      msg->expiry_time,
-                     msg->expiry_time,
-                     msg->creation_time,
                      msg->creation_time,
                      pn_string_get(msg->group_id),
                      msg->group_sequence,

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/23a4e3bb/tests/python/proton_tests/message.py
----------------------------------------------------------------------
diff --git a/tests/python/proton_tests/message.py b/tests/python/proton_tests/message.py
index 899cbab..2f7cb4f 100644
--- a/tests/python/proton_tests/message.py
+++ b/tests/python/proton_tests/message.py
@@ -129,16 +129,3 @@ class CodecTest(Test):
     assert self.msg.address == msg2.address, (self.msg.address, msg2.address)
     assert self.msg.subject == msg2.subject, (self.msg.subject, msg2.subject)
     assert self.msg.body == msg2.body, (self.msg.body, msg2.body)
-
-  def testRoundTripWithTimes(self):
-    self.msg.expiry_time = 987654321;
-    self.msg.creation_time = 123456789;
-    self.msg.body = 'Hello World!'
-
-    data = self.msg.encode()
-
-    msg2 = Message()
-    msg2.decode(data)
-
-    assert self.msg.expiry_time == msg2.expiry_time, (self.msg.expiry_time, msg2.expiry_time)
-    assert self.msg.creation_time == msg2.creation_time, (self.msg.creation_time, msg2.creation_time)


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


[32/50] qpid-proton git commit: NO-JIRA: Fix bug in pn_data_point, saving point when parent = current = 0.

Posted by ac...@apache.org.
NO-JIRA: Fix bug in pn_data_point, saving point when parent = current = 0.


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

Branch: refs/heads/cjansen-cpp-client
Commit: d98868ccfb50a12fb8e8dca7e7059e1c7a6931d2
Parents: 6ba050a
Author: Alan Conway <ac...@redhat.com>
Authored: Wed Jun 10 17:43:25 2015 -0400
Committer: Alan Conway <ac...@redhat.com>
Committed: Mon Jul 6 12:17:33 2015 -0400

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


http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/d98868cc/proton-c/src/codec/codec.c
----------------------------------------------------------------------
diff --git a/proton-c/src/codec/codec.c b/proton-c/src/codec/codec.c
index c00e79a..573887e 100644
--- a/proton-c/src/codec/codec.c
+++ b/proton-c/src/codec/codec.c
@@ -1156,7 +1156,7 @@ pn_handle_t pn_data_point(pn_data_t *data)
 bool pn_data_restore(pn_data_t *data, pn_handle_t point)
 {
   pn_shandle_t spoint = (pn_shandle_t) point;
-  if (spoint < 0 && ((size_t) (-spoint)) <= data->size) {
+  if (spoint <= 0 && ((size_t) (-spoint)) <= data->size) {
     data->parent = -((pn_shandle_t) point);
     data->current = 0;
     return true;


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


[18/50] qpid-proton git commit: PROTON_927: only write out values for expiry and creation time if these are non-zero, which passes at present for a test that they have been set

Posted by ac...@apache.org.
PROTON_927: only write out values for expiry and creation time if these are non-zero, which passes at present for a test that they have been set


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

Branch: refs/heads/cjansen-cpp-client
Commit: 57b0f34ab9904209fdc67aa066c72e0f80b3e966
Parents: fc38e86
Author: Gordon Sim <gs...@redhat.com>
Authored: Wed Jul 1 18:31:08 2015 +0100
Committer: Gordon Sim <gs...@redhat.com>
Committed: Fri Jul 3 10:34:57 2015 +0100

----------------------------------------------------------------------
 proton-c/src/message/message.c       |  4 +++-
 tests/python/proton_tests/message.py | 13 +++++++++++++
 2 files changed, 16 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/57b0f34a/proton-c/src/message/message.c
----------------------------------------------------------------------
diff --git a/proton-c/src/message/message.c b/proton-c/src/message/message.c
index b24a994..847c314 100644
--- a/proton-c/src/message/message.c
+++ b/proton-c/src/message/message.c
@@ -792,7 +792,7 @@ int pn_message_data(pn_message_t *msg, pn_data_t *data)
     pn_data_exit(data);
   }
 
-  err = pn_data_fill(data, "DL[CzSSSCssttSIS]", PROPERTIES,
+  err = pn_data_fill(data, "DL[CzSSSCss?t?tSIS]", PROPERTIES,
                      msg->id,
                      pn_string_size(msg->user_id), pn_string_get(msg->user_id),
                      pn_string_get(msg->address),
@@ -802,6 +802,8 @@ int pn_message_data(pn_message_t *msg, pn_data_t *data)
                      pn_string_get(msg->content_type),
                      pn_string_get(msg->content_encoding),
                      msg->expiry_time,
+                     msg->expiry_time,
+                     msg->creation_time,
                      msg->creation_time,
                      pn_string_get(msg->group_id),
                      msg->group_sequence,

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/57b0f34a/tests/python/proton_tests/message.py
----------------------------------------------------------------------
diff --git a/tests/python/proton_tests/message.py b/tests/python/proton_tests/message.py
index 2f7cb4f..899cbab 100644
--- a/tests/python/proton_tests/message.py
+++ b/tests/python/proton_tests/message.py
@@ -129,3 +129,16 @@ class CodecTest(Test):
     assert self.msg.address == msg2.address, (self.msg.address, msg2.address)
     assert self.msg.subject == msg2.subject, (self.msg.subject, msg2.subject)
     assert self.msg.body == msg2.body, (self.msg.body, msg2.body)
+
+  def testRoundTripWithTimes(self):
+    self.msg.expiry_time = 987654321;
+    self.msg.creation_time = 123456789;
+    self.msg.body = 'Hello World!'
+
+    data = self.msg.encode()
+
+    msg2 = Message()
+    msg2.decode(data)
+
+    assert self.msg.expiry_time == msg2.expiry_time, (self.msg.expiry_time, msg2.expiry_time)
+    assert self.msg.creation_time == msg2.creation_time, (self.msg.creation_time, msg2.creation_time)


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


[14/50] qpid-proton git commit: PROTON-911: Signed/unsigned confusion fix - Fixes a warning picked up by the clang compiler.

Posted by ac...@apache.org.
PROTON-911: Signed/unsigned confusion fix
- Fixes a warning picked up by the clang compiler.


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

Branch: refs/heads/cjansen-cpp-client
Commit: c1a1df200dc1fe1e912930dac96f40f5c6ff3678
Parents: f99337f
Author: Andrew Stitcher <as...@apache.org>
Authored: Thu Jul 2 10:10:09 2015 -0400
Committer: Andrew Stitcher <as...@apache.org>
Committed: Thu Jul 2 10:10:09 2015 -0400

----------------------------------------------------------------------
 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/c1a1df20/proton-c/src/sasl/sasl.c
----------------------------------------------------------------------
diff --git a/proton-c/src/sasl/sasl.c b/proton-c/src/sasl/sasl.c
index f054e8f..a33256c 100644
--- a/proton-c/src/sasl/sasl.c
+++ b/proton-c/src/sasl/sasl.c
@@ -380,7 +380,7 @@ static ssize_t pn_output_write_sasl_encrypt(pn_transport_t* transport, unsigned
   for (ssize_t processed = 0; processed<clear_size;) {
     pn_bytes_t encoded = pn_bytes(0, NULL);
     ssize_t encode_size = (clear_size-processed)<=max_buffer?(clear_size-processed):max_buffer;
-    size_t size = pni_sasl_impl_encode(transport, pn_bytes(encode_size, bytes+processed), &encoded);
+    ssize_t size = pni_sasl_impl_encode(transport, pn_bytes(encode_size, bytes+processed), &encoded);
     if (size<0) return size;
     if (size>0) {
       size = pn_buffer_append(out, encoded.start, encoded.size);


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


[48/50] qpid-proton git commit: NO-JIRA: update developer documentation regarding Python support

Posted by ac...@apache.org.
NO-JIRA: update developer documentation regarding Python support


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

Branch: refs/heads/cjansen-cpp-client
Commit: 246007f488950b0ccbd734eadd194c690bd8a049
Parents: 2b41931
Author: Ken Giusti <kg...@apache.org>
Authored: Thu Jul 9 10:13:52 2015 -0400
Committer: Ken Giusti <kg...@apache.org>
Committed: Thu Jul 9 10:14:31 2015 -0400

----------------------------------------------------------------------
 DEVELOPERS.md | 26 ++++++++++++++++++++++++++
 1 file changed, 26 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/246007f4/DEVELOPERS.md
----------------------------------------------------------------------
diff --git a/DEVELOPERS.md b/DEVELOPERS.md
index d455ff5..3442671 100644
--- a/DEVELOPERS.md
+++ b/DEVELOPERS.md
@@ -42,11 +42,37 @@ module. Instead, you get the `cproton.py` that resides in the Java source tree
 under `proton-j/src/main/resources`.  This `cproton.py` and its dependent files
 serve as a shim that adapts between the Java API and the C API.
 
+
 ### Running tests
 
 To test Proton you should use the CMake build. By default this will invoke the
 maven tests as well, so the maven prerequisites will additionally be required.
 
+By default the unit tests are run using the system's default Python
+interpreter.  However, Proton's Python language bindings support both
+versions of the python language (Python 2.x and Python 3.x).  These
+bindings should be tested using both versions of the Python
+interpreter.  CMake makes this possible by automatically running the
+python unit tests under all versions of python installed on the
+system.
+
+Developers can ensure that Proton remains compatible with both
+versions of Python by installing the following prerequisites:
+
+_Note: currently CMake only supports multi-Python testing in **Linux**
+based environments.  Non-Linux developers may skip the following two
+steps._
+
+1. Installing both Python2.x and Python3.x and their associated
+development environments on your system.  Most modern Linux
+distributions support installing Python 2.x and Python 3.x in
+parallel.
+
+2. Install the **tox** Python testing tool, (e.g. for Fedora):
+
+   $ yum install python-tox
+
+
 To run the tests, cd into your build directory and use the following commands:
 
     # to run all the tests, summary mode


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


[13/50] qpid-proton git commit: PROTON-929: Fix for ANONYMOUS cut through - Previously client wasn't reading anything after the SASL interchange

Posted by ac...@apache.org.
PROTON-929: Fix for ANONYMOUS cut through
- Previously client wasn't reading anything after the SASL interchange


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

Branch: refs/heads/cjansen-cpp-client
Commit: f99337f1abf95fb1a2002d93b111a25b8f8f98d1
Parents: 395b23f
Author: Andrew Stitcher <as...@apache.org>
Authored: Wed Jul 1 17:14:10 2015 -0400
Committer: Andrew Stitcher <as...@apache.org>
Committed: Wed Jul 1 17:18:38 2015 -0400

----------------------------------------------------------------------
 proton-c/src/sasl/sasl.c          |  5 +++++
 tests/python/proton_tests/sasl.py | 20 ++++++++++++++++----
 2 files changed, 21 insertions(+), 4 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/f99337f1/proton-c/src/sasl/sasl.c
----------------------------------------------------------------------
diff --git a/proton-c/src/sasl/sasl.c b/proton-c/src/sasl/sasl.c
index a7e02e8..f054e8f 100644
--- a/proton-c/src/sasl/sasl.c
+++ b/proton-c/src/sasl/sasl.c
@@ -147,6 +147,11 @@ void pni_sasl_set_desired_state(pn_transport_t *transport, enum pni_sasl_state d
     if (sasl->last_state==desired_state && desired_state==SASL_POSTED_CHALLENGE) {
       sasl->last_state = SASL_POSTED_MECHANISMS;
     }
+    // If we already pretended to receive outcome and we actually received outcome
+    // we must set last_state here as we'vwe already stoped outputting from this layer
+    if (sasl->last_state==SASL_PRETEND_OUTCOME && desired_state==SASL_RECVED_OUTCOME ) {
+        sasl->last_state = SASL_RECVED_OUTCOME;
+    }
     sasl->desired_state = desired_state;
     pni_emit(transport);
   }

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/f99337f1/tests/python/proton_tests/sasl.py
----------------------------------------------------------------------
diff --git a/tests/python/proton_tests/sasl.py b/tests/python/proton_tests/sasl.py
index b5d30ab..a072150 100644
--- a/tests/python/proton_tests/sasl.py
+++ b/tests/python/proton_tests/sasl.py
@@ -34,6 +34,7 @@ def _sslCertpath(file):
 def _testSaslMech(self, mech, clientUser='user@proton', authUser='user@proton', encrypted=False, authenticated=True):
   self.s1.allowed_mechs(mech)
   self.c1.open()
+  self.c2.open()
 
   pump(self.t1, self.t2, 1024)
 
@@ -48,11 +49,15 @@ def _testSaslMech(self, mech, clientUser='user@proton', authUser='user@proton',
     assert self.s2.user == authUser
     assert self.s2.mech == mech.strip()
     assert self.s2.outcome == SASL.OK
+    assert self.c2.state & Endpoint.LOCAL_ACTIVE and self.c2.state & Endpoint.REMOTE_ACTIVE,\
+      "local_active=%s, remote_active=%s" % (self.c1.state & Endpoint.LOCAL_ACTIVE, self.c1.state & Endpoint.REMOTE_ACTIVE)
     # Client
     assert self.t1.user == clientUser
     assert self.s1.user == clientUser
     assert self.s1.mech == mech.strip()
     assert self.s1.outcome == SASL.OK
+    assert self.c1.state & Endpoint.LOCAL_ACTIVE and self.c1.state & Endpoint.REMOTE_ACTIVE,\
+      "local_active=%s, remote_active=%s" % (self.c1.state & Endpoint.LOCAL_ACTIVE, self.c1.state & Endpoint.REMOTE_ACTIVE)
   else:
     # Server
     assert self.t2.user == None
@@ -300,8 +305,11 @@ class CyrusSASLTest(Test):
     self.c1.password = 'password'
     self.c1.hostname = 'localhost'
 
+    self.c2 = Connection()
+
   def testMechANON(self):
     self.t1.bind(self.c1)
+    self.t2.bind(self.c2)
     _testSaslMech(self, 'ANONYMOUS', authUser='anonymous')
 
   def testMechCRAMMD5(self):
@@ -309,6 +317,7 @@ class CyrusSASLTest(Test):
       raise Skipped('Extended SASL not supported')
 
     self.t1.bind(self.c1)
+    self.t2.bind(self.c2)
     _testSaslMech(self, 'CRAM-MD5')
 
   def testMechDIGESTMD5(self):
@@ -316,6 +325,7 @@ class CyrusSASLTest(Test):
       raise Skipped('Extended SASL not supported')
 
     self.t1.bind(self.c1)
+    self.t2.bind(self.c2)
     _testSaslMech(self, 'DIGEST-MD5')
 
 # SCRAM not supported before Cyrus SASL 2.1.26
@@ -326,6 +336,7 @@ class CyrusSASLTest(Test):
 #      raise Skipped('Extended SASL not supported')
 #
 #    self.t1.bind(self.c1)
+#    self.t2.bind(self.c2)
 #    _testSaslMech(self, 'SCRAM-SHA-1')
 
 def _sslConnection(domain, transport, connection):
@@ -347,6 +358,7 @@ class SSLSASLTest(Test):
     self.s2 = SASL(self.t2)
 
     self.c1 = Connection()
+    self.c2 = Connection()
 
   def testSSLPlainSimple(self):
     if "java" in sys.platform:
@@ -362,7 +374,7 @@ class SSLSASLTest(Test):
     self.c1.hostname = 'localhost'
 
     ssl1 = _sslConnection(self.client_domain, self.t1, self.c1)
-    ssl2 = _sslConnection(self.server_domain, self.t2, Connection())
+    ssl2 = _sslConnection(self.server_domain, self.t2, self.c2)
 
     _testSaslMech(self, mech, encrypted=True)
 
@@ -380,7 +392,7 @@ class SSLSASLTest(Test):
     self.c1.hostname = 'localhost'
 
     ssl1 = _sslConnection(self.client_domain, self.t1, self.c1)
-    ssl2 = _sslConnection(self.server_domain, self.t2, Connection())
+    ssl2 = _sslConnection(self.server_domain, self.t2, self.c2)
 
     _testSaslMech(self, mech, clientUser='usr@proton', encrypted=True, authenticated=False)
 
@@ -404,7 +416,7 @@ class SSLSASLTest(Test):
     self.client_domain.set_peer_authentication(SSLDomain.VERIFY_PEER)
 
     ssl1 = _sslConnection(self.client_domain, self.t1, self.c1)
-    ssl2 = _sslConnection(self.server_domain, self.t2, Connection())
+    ssl2 = _sslConnection(self.server_domain, self.t2, self.c2)
 
     _testSaslMech(self, mech, clientUser=None, authUser=extUser, encrypted=True)
 
@@ -424,6 +436,6 @@ class SSLSASLTest(Test):
     self.client_domain.set_peer_authentication(SSLDomain.VERIFY_PEER)
 
     ssl1 = _sslConnection(self.client_domain, self.t1, self.c1)
-    ssl2 = _sslConnection(self.server_domain, self.t2, Connection())
+    ssl2 = _sslConnection(self.server_domain, self.t2, self.c2)
 
     _testSaslMech(self, mech, clientUser=None, authUser=None, encrypted=None, authenticated=False)


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


[09/50] qpid-proton git commit: NO-JIRA: Rearrange file order and small tidying changes

Posted by ac...@apache.org.
NO-JIRA: Rearrange file order and small tidying changes


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

Branch: refs/heads/cjansen-cpp-client
Commit: 37730cc83133b9424e8be261c98abf868638046e
Parents: 70a463f
Author: Andrew Stitcher <as...@apache.org>
Authored: Fri Jun 19 16:53:41 2015 -0400
Committer: Andrew Stitcher <as...@apache.org>
Committed: Tue Jun 30 13:23:22 2015 -0400

----------------------------------------------------------------------
 proton-c/src/sasl/sasl.c | 414 ++++++++++++++++++++----------------------
 1 file changed, 193 insertions(+), 221 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/37730cc8/proton-c/src/sasl/sasl.c
----------------------------------------------------------------------
diff --git a/proton-c/src/sasl/sasl.c b/proton-c/src/sasl/sasl.c
index 2e6be06..4ef9e99 100644
--- a/proton-c/src/sasl/sasl.c
+++ b/proton-c/src/sasl/sasl.c
@@ -32,12 +32,15 @@
 
 static inline pn_transport_t *get_transport_internal(pn_sasl_t *sasl)
 {
-    // The external pn_sasl_t is really a pointer to the internal pni_transport_t
-    return ((pn_transport_t *)sasl);
+  // The external pn_sasl_t is really a pointer to the internal pni_transport_t
+  return ((pn_transport_t *)sasl);
 }
 
-static ssize_t pn_sasl_input(pn_transport_t *transport, const char *bytes, size_t available);
-static ssize_t pn_sasl_output(pn_transport_t *transport, char *bytes, size_t size);
+static inline pni_sasl_t *get_sasl_internal(pn_sasl_t *sasl)
+{
+  // The external pn_sasl_t is really a pointer to the internal pni_transport_t
+  return sasl ? ((pn_transport_t *)sasl)->sasl : NULL;
+}
 
 static ssize_t pn_input_read_sasl_header(pn_transport_t* transport, unsigned int layer, const char* bytes, size_t available);
 static ssize_t pn_input_read_sasl(pn_transport_t *transport, unsigned int layer, const char *bytes, size_t available);
@@ -75,91 +78,6 @@ const pn_io_layer_t sasl_layer = {
 #define SASL_HEADER ("AMQP\x03\x01\x00\x00")
 #define SASL_HEADER_LEN 8
 
-static ssize_t pn_input_read_sasl_header(pn_transport_t* transport, unsigned int layer, const char* bytes, size_t available)
-{
-  bool eos = pn_transport_capacity(transport)==PN_EOS;
-  pni_protocol_type_t protocol = pni_sniff_header(bytes, available);
-  switch (protocol) {
-  case PNI_PROTOCOL_AMQP_SASL:
-    if (transport->io_layers[layer] == &sasl_read_header_layer) {
-        transport->io_layers[layer] = &sasl_layer;
-    } else {
-        transport->io_layers[layer] = &sasl_write_header_layer;
-    }
-    if (transport->trace & PN_TRACE_FRM)
-        pn_transport_logf(transport, "  <- %s", "SASL");
-    pni_sasl_set_external_security(transport, pn_ssl_get_ssf((pn_ssl_t*)transport), pn_ssl_get_remote_subject((pn_ssl_t*)transport));
-    return SASL_HEADER_LEN;
-  case PNI_PROTOCOL_INSUFFICIENT:
-    if (!eos) return 0;
-    /* Fallthru */
-  default:
-    break;
-  }
-  transport->close_sent = true;
-  char quoted[1024];
-  pn_quote_data(quoted, 1024, bytes, available);
-  pn_do_error(transport, "amqp:connection:framing-error",
-              "%s header mismatch: %s ['%s']%s", "SASL", pni_protocol_name(protocol), quoted,
-              !eos ? "" : " (connection aborted)");
-  pn_set_error_layer(transport);
-  return PN_EOS;
-}
-
-static ssize_t pn_input_read_sasl(pn_transport_t* transport, unsigned int layer, const char* bytes, size_t available)
-{
-  bool eos = pn_transport_capacity(transport)==PN_EOS;
-  if (eos) {
-    transport->close_sent = true;
-    pn_do_error(transport, "amqp:connection:framing-error", "connection aborted");
-    pn_set_error_layer(transport);
-    return PN_EOS;
-  }
-
-  if (!transport->sasl->input_bypass) {
-    ssize_t n = pn_sasl_input(transport, bytes, available);
-    if (n != PN_EOS) return n;
-
-    transport->sasl->input_bypass = true;
-    if (transport->sasl->output_bypass)
-        transport->io_layers[layer] = &pni_passthru_layer;
-  }
-  return pni_passthru_layer.process_input(transport, layer, bytes, available );
-}
-
-static ssize_t pn_output_write_sasl_header(pn_transport_t *transport, unsigned int layer, char *bytes, size_t size)
-{
-  if (transport->trace & PN_TRACE_FRM)
-    pn_transport_logf(transport, "  -> %s", "SASL");
-  assert(size >= SASL_HEADER_LEN);
-  memmove(bytes, SASL_HEADER, SASL_HEADER_LEN);
-  if (transport->io_layers[layer]==&sasl_write_header_layer) {
-      transport->io_layers[layer] = &sasl_layer;
-  } else {
-      transport->io_layers[layer] = &sasl_read_header_layer;
-  }
-  return SASL_HEADER_LEN;
-}
-
-static ssize_t pn_output_write_sasl(pn_transport_t* transport, unsigned int layer, char* bytes, size_t available)
-{
-  if (!transport->sasl->output_bypass) {
-    // this accounts for when pn_do_error is invoked, e.g. by idle timeout
-    ssize_t n;
-    if (transport->close_sent) {
-        n = PN_EOS;
-    } else {
-        n = pn_sasl_output(transport, bytes, available);
-    }
-    if (n != PN_EOS) return n;
-
-    transport->sasl->output_bypass = true;
-    if (transport->sasl->input_bypass)
-        transport->io_layers[layer] = &pni_passthru_layer;
-  }
-  return pni_passthru_layer.process_output(transport, layer, bytes, available );
-}
-
 static bool pni_sasl_is_server_state(enum pni_sasl_state state)
 {
   return state==SASL_NONE
@@ -193,12 +111,6 @@ static bool pni_sasl_is_final_output_state(pni_sasl_t *sasl)
       || last_state==SASL_POSTED_OUTCOME;
 }
 
-static inline pni_sasl_t *get_sasl_internal(pn_sasl_t *sasl)
-{
-    // The external pn_sasl_t is really a pointer to the internal pni_transport_t
-    return sasl ? ((pn_transport_t *)sasl)->sasl : NULL;
-}
-
 static void pni_emit(pn_transport_t *transport)
 {
   if (transport->connection && transport->connection->collector) {
@@ -207,61 +119,6 @@ static void pni_emit(pn_transport_t *transport)
   }
 }
 
-// Look for symbol in the mech include list - not particlarly efficient,
-// but probably not used enough to matter.
-//
-// Note that if there is no inclusion list then every mech is implicitly included.
-bool pni_included_mech(const char *included_mech_list, pn_bytes_t s)
-{
-  if (!included_mech_list) return true;
-
-  const char * end_list = included_mech_list+strlen(included_mech_list);
-  size_t len = s.size;
-  const char *c = included_mech_list;
-  while (c!=NULL) {
-    // If there are not enough chars left in the list no matches
-    if ((ptrdiff_t)len > end_list-c) return false;
-
-    // Is word equal with a space or end of string afterwards?
-    if (pn_strncasecmp(c, s.start, len)==0 && (c[len]==' ' || c[len]==0) ) return true;
-
-    c = strchr(c, ' ');
-    c = c ? c+1 : NULL;
-  }
-  return false;
-}
-
-// This takes a space separated list and zero terminates it in place
-// whilst adding pointers to the existing strings in a string array.
-// This means that you can't free the original storage until you have
-// finished with the resulting list.
-void pni_split_mechs(char *mechlist, const char* included_mechs, char *mechs[], int *count)
-{
-  char *start = mechlist;
-  char *end = start;
-
-  while (*end) {
-    if (*end == ' ') {
-      if (start != end) {
-        *end = '\0';
-        if (pni_included_mech(included_mechs, pn_bytes(end-start, start))) {
-          mechs[(*count)++] = start;
-        }
-      }
-      end++;
-      start = end;
-    } else {
-      end++;
-    }
-  }
-
-  if (start != end) {
-    if (pni_included_mech(included_mechs, pn_bytes(end-start, start))) {
-      mechs[(*count)++] = start;
-    }
-  }
-}
-
 void pni_sasl_set_desired_state(pn_transport_t *transport, enum pni_sasl_state desired_state)
 {
   pni_sasl_t *sasl = transport->sasl;
@@ -353,6 +210,170 @@ static void pni_post_sasl_frame(pn_transport_t *transport)
   }
 }
 
+static ssize_t pn_input_read_sasl_header(pn_transport_t* transport, unsigned int layer, const char* bytes, size_t available)
+{
+  bool eos = pn_transport_capacity(transport)==PN_EOS;
+  pni_protocol_type_t protocol = pni_sniff_header(bytes, available);
+  switch (protocol) {
+  case PNI_PROTOCOL_AMQP_SASL:
+    if (transport->io_layers[layer] == &sasl_read_header_layer) {
+        transport->io_layers[layer] = &sasl_layer;
+    } else {
+        transport->io_layers[layer] = &sasl_write_header_layer;
+    }
+    if (transport->trace & PN_TRACE_FRM)
+        pn_transport_logf(transport, "  <- %s", "SASL");
+    pni_sasl_set_external_security(transport, pn_ssl_get_ssf((pn_ssl_t*)transport), pn_ssl_get_remote_subject((pn_ssl_t*)transport));
+    return SASL_HEADER_LEN;
+  case PNI_PROTOCOL_INSUFFICIENT:
+    if (!eos) return 0;
+    /* Fallthru */
+  default:
+    break;
+  }
+  transport->close_sent = true;
+  char quoted[1024];
+  pn_quote_data(quoted, 1024, bytes, available);
+  pn_do_error(transport, "amqp:connection:framing-error",
+              "%s header mismatch: %s ['%s']%s", "SASL", pni_protocol_name(protocol), quoted,
+              !eos ? "" : " (connection aborted)");
+  pn_set_error_layer(transport);
+  return PN_EOS;
+}
+
+static void pni_sasl_start_server_if_needed(pn_transport_t *transport)
+{
+  pni_sasl_t *sasl = transport->sasl;
+  if (!sasl->client && sasl->desired_state<SASL_POSTED_MECHANISMS) {
+    if (!pni_init_server(transport)) return;
+
+    // Setup to send SASL mechanisms frame
+    pni_sasl_set_desired_state(transport, SASL_POSTED_MECHANISMS);
+  }
+}
+
+static ssize_t pn_input_read_sasl(pn_transport_t* transport, unsigned int layer, const char* bytes, size_t available)
+{
+  bool eos = pn_transport_capacity(transport)==PN_EOS;
+  if (eos) {
+    transport->close_sent = true;
+    pn_do_error(transport, "amqp:connection:framing-error", "connection aborted");
+    pn_set_error_layer(transport);
+    return PN_EOS;
+  }
+
+  if (!transport->sasl->input_bypass) {
+    pni_sasl_start_server_if_needed(transport);
+
+    bool dummy = false;
+    ssize_t n = pn_dispatcher_input(transport, bytes, available, false, &dummy);
+
+    if (n!=0 || !pni_sasl_is_final_input_state(transport->sasl)) {
+      return n;
+    }
+
+    transport->sasl->input_bypass = true;
+    if (transport->sasl->output_bypass)
+        transport->io_layers[layer] = &pni_passthru_layer;
+  }
+  return pni_passthru_layer.process_input(transport, layer, bytes, available );
+}
+
+static ssize_t pn_output_write_sasl_header(pn_transport_t *transport, unsigned int layer, char *bytes, size_t size)
+{
+  if (transport->trace & PN_TRACE_FRM)
+    pn_transport_logf(transport, "  -> %s", "SASL");
+  assert(size >= SASL_HEADER_LEN);
+  memmove(bytes, SASL_HEADER, SASL_HEADER_LEN);
+  if (transport->io_layers[layer]==&sasl_write_header_layer) {
+      transport->io_layers[layer] = &sasl_layer;
+  } else {
+      transport->io_layers[layer] = &sasl_read_header_layer;
+  }
+  return SASL_HEADER_LEN;
+}
+
+static ssize_t pn_output_write_sasl(pn_transport_t* transport, unsigned int layer, char* bytes, size_t available)
+{
+  if (!transport->sasl->output_bypass) {
+    // this accounts for when pn_do_error is invoked, e.g. by idle timeout
+    if (!transport->close_sent) {
+      pni_sasl_start_server_if_needed(transport);
+
+      pni_post_sasl_frame(transport);
+
+      pni_sasl_t *sasl = transport->sasl;
+      if (transport->available != 0 || !pni_sasl_is_final_output_state(sasl)) {
+        return pn_dispatcher_output(transport, bytes, available);
+      } else {
+        if (sasl->outcome != PN_SASL_OK && pni_sasl_is_final_input_state(sasl)) {
+          pn_transport_close_tail(transport);
+        }
+      }
+    }
+
+    transport->sasl->output_bypass = true;
+    if (transport->sasl->input_bypass)
+        transport->io_layers[layer] = &pni_passthru_layer;
+  }
+  return pni_passthru_layer.process_output(transport, layer, bytes, available );
+}
+
+// Look for symbol in the mech include list - not particlarly efficient,
+// but probably not used enough to matter.
+//
+// Note that if there is no inclusion list then every mech is implicitly included.
+bool pni_included_mech(const char *included_mech_list, pn_bytes_t s)
+{
+  if (!included_mech_list) return true;
+
+  const char * end_list = included_mech_list+strlen(included_mech_list);
+  size_t len = s.size;
+  const char *c = included_mech_list;
+  while (c!=NULL) {
+    // If there are not enough chars left in the list no matches
+    if ((ptrdiff_t)len > end_list-c) return false;
+
+    // Is word equal with a space or end of string afterwards?
+    if (pn_strncasecmp(c, s.start, len)==0 && (c[len]==' ' || c[len]==0) ) return true;
+
+    c = strchr(c, ' ');
+    c = c ? c+1 : NULL;
+  }
+  return false;
+}
+
+// This takes a space separated list and zero terminates it in place
+// whilst adding pointers to the existing strings in a string array.
+// This means that you can't free the original storage until you have
+// finished with the resulting list.
+void pni_split_mechs(char *mechlist, const char* included_mechs, char *mechs[], int *count)
+{
+  char *start = mechlist;
+  char *end = start;
+
+  while (*end) {
+    if (*end == ' ') {
+      if (start != end) {
+        *end = '\0';
+        if (pni_included_mech(included_mechs, pn_bytes(end-start, start))) {
+          mechs[(*count)++] = start;
+        }
+      }
+      end++;
+      start = end;
+    } else {
+      end++;
+    }
+  }
+
+  if (start != end) {
+    if (pni_included_mech(included_mechs, pn_bytes(end-start, start))) {
+      mechs[(*count)++] = start;
+    }
+  }
+}
+
 pn_sasl_t *pn_sasl(pn_transport_t *transport)
 {
   if (!transport->sasl) {
@@ -387,6 +408,28 @@ pn_sasl_t *pn_sasl(pn_transport_t *transport)
   return (pn_sasl_t *)transport;
 }
 
+void pn_sasl_free(pn_transport_t *transport)
+{
+  if (transport) {
+    pni_sasl_t *sasl = transport->sasl;
+    if (sasl) {
+      free(sasl->selected_mechanism);
+      free(sasl->included_mechanisms);
+      free(sasl->password);
+      free(sasl->config_name);
+      free(sasl->config_dir);
+      free(sasl->external_auth);
+
+      // CYRUS_SASL
+      if (sasl->impl_context) {
+          pni_sasl_impl_free(transport);
+      }
+
+      free(sasl);
+    }
+  }
+}
+
 // This is a hack to tell us that
 // no actual negotiation is going to happen and we can go
 // straight to the AMQP layer; it can only work on the client side
@@ -480,77 +523,6 @@ pn_sasl_outcome_t pn_sasl_outcome(pn_sasl_t *sasl0)
   return sasl ? sasl->outcome : PN_SASL_NONE;
 }
 
-void pn_sasl_free(pn_transport_t *transport)
-{
-  if (transport) {
-    pni_sasl_t *sasl = transport->sasl;
-    if (sasl) {
-      free(sasl->selected_mechanism);
-      free(sasl->included_mechanisms);
-      free(sasl->password);
-      free(sasl->config_name);
-      free(sasl->config_dir);
-      free(sasl->external_auth);
-
-      // CYRUS_SASL
-      if (sasl->impl_context) {
-          pni_sasl_impl_free(transport);
-      }
-
-      free(sasl);
-    }
-  }
-}
-
-static void pni_sasl_server_init(pn_transport_t *transport)
-{
-  if (!pni_init_server(transport)) return;
-
-  // Setup to send SASL mechanisms frame
-  pni_sasl_set_desired_state(transport, SASL_POSTED_MECHANISMS);
-}
-
-static void pn_sasl_process(pn_transport_t *transport)
-{
-  pni_sasl_t *sasl = transport->sasl;
-  if (!sasl->client) {
-    if (sasl->desired_state<SASL_POSTED_MECHANISMS) {
-      pni_sasl_server_init(transport);
-    }
-  }
-}
-
-ssize_t pn_sasl_input(pn_transport_t *transport, const char *bytes, size_t available)
-{
-  pn_sasl_process(transport);
-
-  pni_sasl_t *sasl = transport->sasl;
-  bool dummy = false;
-  ssize_t n = pn_dispatcher_input(transport, bytes, available, false, &dummy);
-
-  if (n==0 && pni_sasl_is_final_input_state(sasl)) {
-    return PN_EOS;
-  }
-  return n;
-}
-
-ssize_t pn_sasl_output(pn_transport_t *transport, char *bytes, size_t size)
-{
-  pn_sasl_process(transport);
-
-  pni_post_sasl_frame(transport);
-
-  pni_sasl_t *sasl = transport->sasl;
-  if (transport->available == 0 && pni_sasl_is_final_output_state(sasl)) {
-    if (sasl->outcome != PN_SASL_OK && pni_sasl_is_final_input_state(sasl)) {
-      pn_transport_close_tail(transport);
-    }
-    return PN_EOS;
-  } else {
-    return pn_dispatcher_output(transport, bytes, size);
-  }
-}
-
 // Received Server side
 int pn_do_init(pn_transport_t *transport, uint8_t frame_type, uint16_t channel, pn_data_t *args, const pn_bytes_t *payload)
 {


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


[07/50] qpid-proton git commit: NO-JIRA: fix syntax in swig file

Posted by ac...@apache.org.
NO-JIRA: fix syntax in swig file


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

Branch: refs/heads/cjansen-cpp-client
Commit: 69cc9ec8a2afd3d61339a5e5a1175a97722ae02b
Parents: d82cd1a
Author: Ken Giusti <kg...@apache.org>
Authored: Thu Jun 25 15:54:52 2015 -0400
Committer: Ken Giusti <kg...@apache.org>
Committed: Thu Jun 25 15:54:52 2015 -0400

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


http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/69cc9ec8/proton-c/bindings/python/cproton.i
----------------------------------------------------------------------
diff --git a/proton-c/bindings/python/cproton.i b/proton-c/bindings/python/cproton.i
index 1eaabec..0ead44d 100644
--- a/proton-c/bindings/python/cproton.i
+++ b/proton-c/bindings/python/cproton.i
@@ -354,7 +354,7 @@ bool pn_ssl_get_protocol_name(pn_ssl_t *ssl, char *OUTPUT, size_t MAX_OUTPUT_SIZ
     return chandler;
   }
 
-  PN_HANDLE(PNI_PYTRACER)
+  PN_HANDLE(PNI_PYTRACER);
 
   void pn_pytracer(pn_transport_t *transport, const char *message) {
     PyObject *pytracer = (PyObject *) pn_record_get(pn_transport_attachments(transport), PNI_PYTRACER);


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


[15/50] qpid-proton git commit: PROTON-907: check error status of connections selectable, and close transport if set

Posted by ac...@apache.org.
PROTON-907: check error status of connections selectable, and close transport if set


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

Branch: refs/heads/cjansen-cpp-client
Commit: 5638c5a86c4802e587d111ea888d0d3d3a0045b0
Parents: c1a1df2
Author: Gordon Sim <gs...@redhat.com>
Authored: Thu Jul 2 14:02:32 2015 +0100
Committer: Gordon Sim <gs...@redhat.com>
Committed: Thu Jul 2 15:17:39 2015 +0100

----------------------------------------------------------------------
 proton-c/src/messenger/messenger.c | 11 +++++++++++
 1 file changed, 11 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/5638c5a8/proton-c/src/messenger/messenger.c
----------------------------------------------------------------------
diff --git a/proton-c/src/messenger/messenger.c b/proton-c/src/messenger/messenger.c
index 9749bf5..4507a45 100644
--- a/proton-c/src/messenger/messenger.c
+++ b/proton-c/src/messenger/messenger.c
@@ -233,6 +233,13 @@ void pni_lnr_modified(pn_listener_ctx_t *lnr)
 
 int pn_messenger_process_events(pn_messenger_t *messenger);
 
+static void pni_connection_error(pn_selectable_t *sel)
+{
+  pn_transport_t *transport = pni_transport(sel);
+  pn_transport_close_tail(transport);
+  pn_transport_close_head(transport);
+}
+
 static void pni_connection_readable(pn_selectable_t *sel)
 {
   pn_connection_ctx_t *context = pni_context(sel);
@@ -444,6 +451,7 @@ static pn_connection_ctx_t *pn_connection_ctx(pn_messenger_t *messenger,
   ctx->connection = conn;
   pn_selectable_t *sel = pn_selectable();
   ctx->selectable = sel;
+  pn_selectable_on_error(sel, pni_connection_error);
   pn_selectable_on_readable(sel, pni_connection_readable);
   pn_selectable_on_writable(sel, pni_connection_writable);
   pn_selectable_on_expired(sel, pni_connection_expired);
@@ -1357,6 +1365,9 @@ int pn_messenger_process(pn_messenger_t *messenger)
     if (events & PN_EXPIRED) {
       pn_selectable_expired(sel);
     }
+    if (events & PN_ERROR) {
+      pn_selectable_error(sel);
+    }
   }
   // ensure timer events are processed. Cannot call this inside the while loop
   // as the timer events are not seen by the selector


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


[02/50] qpid-proton git commit: PROTON-920: checks for valid channel and handle

Posted by ac...@apache.org.
PROTON-920: checks for valid channel and handle


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

Branch: refs/heads/cjansen-cpp-client
Commit: 6e7e04d2e4d554ba5515aa07f3d05203edbfa3de
Parents: f646079
Author: Gordon Sim <gs...@redhat.com>
Authored: Wed Jun 24 19:25:19 2015 +0100
Committer: Gordon Sim <gs...@redhat.com>
Committed: Wed Jun 24 19:25:33 2015 +0100

----------------------------------------------------------------------
 proton-c/src/transport/transport.c | 23 +++++++++++++++++++++--
 1 file changed, 21 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/6e7e04d2/proton-c/src/transport/transport.c
----------------------------------------------------------------------
diff --git a/proton-c/src/transport/transport.c b/proton-c/src/transport/transport.c
index ff80e21..4cf935b 100644
--- a/proton-c/src/transport/transport.c
+++ b/proton-c/src/transport/transport.c
@@ -1279,7 +1279,7 @@ int pn_do_attach(pn_transport_t *transport, uint8_t frame_type, uint16_t channel
 
   pn_session_t *ssn = pni_channel_state(transport, channel);
   if (!ssn) {
-      pn_do_error(transport, "amqp:connection:no-session", "attach without a session");
+      pn_do_error(transport, "amqp:not-allowed", "no such channel: %u", channel);
       if (strheap) free(strheap);
       return PN_EOS;
   }
@@ -1395,12 +1395,18 @@ int pn_do_transfer(pn_transport_t *transport, uint8_t frame_type, uint16_t chann
                          &settled, &more, &has_type, &type, transport->disp_data);
   if (err) return err;
   pn_session_t *ssn = pni_channel_state(transport, channel);
+  if (!ssn) {
+    return pn_do_error(transport, "amqp:not-allowed", "no such channel: %u", channel);
+  }
 
   if (!ssn->state.incoming_window) {
     return pn_do_error(transport, "amqp:session:window-violation", "incoming session window exceeded");
   }
 
   pn_link_t *link = pni_handle_state(ssn, handle);
+  if (!link) {
+    return pn_do_error(transport, "amqp:invalid-field", "no such handle: %u", handle);
+  }
   pn_delivery_t *delivery;
   if (link->unsettled_tail && !link->unsettled_tail->done) {
     delivery = link->unsettled_tail;
@@ -1465,6 +1471,9 @@ int pn_do_flow(pn_transport_t *transport, uint8_t frame_type, uint16_t channel,
   if (err) return err;
 
   pn_session_t *ssn = pni_channel_state(transport, channel);
+  if (!ssn) {
+    return pn_do_error(transport, "amqp:not-allowed", "no such channel: %u", channel);
+  }
 
   if (inext_init) {
     ssn->state.remote_incoming_window = inext + iwin - ssn->state.outgoing_transfer_count;
@@ -1474,6 +1483,9 @@ int pn_do_flow(pn_transport_t *transport, uint8_t frame_type, uint16_t channel,
 
   if (handle_init) {
     pn_link_t *link = pni_handle_state(ssn, handle);
+    if (!link) {
+      return pn_do_error(transport, "amqp:invalid-field", "no such handle: %u", handle);
+    }
     if (link->endpoint.type == SENDER) {
       pn_sequence_t receiver_count;
       if (dcount_init) {
@@ -1535,6 +1547,10 @@ int pn_do_disposition(pn_transport_t *transport, uint8_t frame_type, uint16_t ch
   if (!last_init) last = first;
 
   pn_session_t *ssn = pni_channel_state(transport, channel);
+  if (!ssn) {
+    return pn_do_error(transport, "amqp:not-allowed", "no such channel: %u", channel);
+  }
+
   pn_delivery_map_t *deliveries;
   if (role) {
     deliveries = &ssn->state.outgoing;
@@ -1608,7 +1624,7 @@ int pn_do_detach(pn_transport_t *transport, uint8_t frame_type, uint16_t channel
 
   pn_session_t *ssn = pni_channel_state(transport, channel);
   if (!ssn) {
-    return pn_do_error(transport, "amqp:invalid-field", "no such channel: %u", channel);
+    return pn_do_error(transport, "amqp:not-allowed", "no such channel: %u", channel);
   }
   pn_link_t *link = pni_handle_state(ssn, handle);
   if (!link) {
@@ -1633,6 +1649,9 @@ int pn_do_detach(pn_transport_t *transport, uint8_t frame_type, uint16_t channel
 int pn_do_end(pn_transport_t *transport, uint8_t frame_type, uint16_t channel, pn_data_t *args, const pn_bytes_t *payload)
 {
   pn_session_t *ssn = pni_channel_state(transport, channel);
+  if (!ssn) {
+    return pn_do_error(transport, "amqp:not-allowed", "no such channel: %u", channel);
+  }
   int err = pn_scan_error(args, &ssn->endpoint.remote_condition, SCAN_ERROR_DEFAULT);
   if (err) return err;
   PN_SET_REMOTE(ssn->endpoint.state, PN_REMOTE_CLOSED);


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


[22/50] qpid-proton git commit: Revert "PROTON-877: workaround by forcing anonymous from the client"

Posted by ac...@apache.org.
Revert "PROTON-877: workaround by forcing anonymous from the client"

This reverts commit 20cdff183f7ce2c79012d5c7028eefc19a23ae28.


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

Branch: refs/heads/cjansen-cpp-client
Commit: bf81c44de4f1a8d949eba56d3fbaca13b3375325
Parents: 92eb75e
Author: Rafael Schloming <rh...@alum.mit.edu>
Authored: Sun Jul 5 15:57:53 2015 -0400
Committer: Rafael Schloming <rh...@alum.mit.edu>
Committed: Sun Jul 5 19:33:24 2015 -0400

----------------------------------------------------------------------
 proton-c/src/reactor/connection.c | 2 --
 proton-c/src/tests/reactor.c      | 8 +++-----
 2 files changed, 3 insertions(+), 7 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/bf81c44d/proton-c/src/reactor/connection.c
----------------------------------------------------------------------
diff --git a/proton-c/src/reactor/connection.c b/proton-c/src/reactor/connection.c
index 11789b3..4a57bfd 100644
--- a/proton-c/src/reactor/connection.c
+++ b/proton-c/src/reactor/connection.c
@@ -101,8 +101,6 @@ void pni_handle_open(pn_reactor_t *reactor, pn_event_t *event) {
   }
 
   pn_transport_t *transport = pn_transport();
-  pn_sasl_t *sasl = pn_sasl(transport);
-  pn_sasl_allowed_mechs(sasl, "ANONYMOUS");
   pn_transport_bind(transport, conn);
   pn_decref(transport);
 }

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/bf81c44d/proton-c/src/tests/reactor.c
----------------------------------------------------------------------
diff --git a/proton-c/src/tests/reactor.c b/proton-c/src/tests/reactor.c
index 4d4b648..fe6c769 100644
--- a/proton-c/src/tests/reactor.c
+++ b/proton-c/src/tests/reactor.c
@@ -19,7 +19,6 @@
  *
  */
 
-#include <proton/sasl.h>
 #include <proton/reactor.h>
 #include <proton/handlers.h>
 #include <proton/event.h>
@@ -289,8 +288,8 @@ static void test_reactor_connect(void) {
   pn_reactor_connection(reactor, ch);
   pn_reactor_run(reactor);
   expect(srv->events, PN_CONNECTION_INIT, PN_CONNECTION_BOUND,
-         PN_TRANSPORT, PN_CONNECTION_REMOTE_OPEN,
-         PN_TRANSPORT, PN_CONNECTION_LOCAL_OPEN, PN_TRANSPORT,
+         PN_CONNECTION_REMOTE_OPEN,
+         PN_CONNECTION_LOCAL_OPEN, PN_TRANSPORT,
          PN_CONNECTION_REMOTE_CLOSE, PN_TRANSPORT_TAIL_CLOSED,
          PN_CONNECTION_LOCAL_CLOSE, PN_TRANSPORT,
          PN_TRANSPORT_HEAD_CLOSED, PN_TRANSPORT_CLOSED,
@@ -299,8 +298,7 @@ static void test_reactor_connect(void) {
   pn_decref(sh);
   expect(cli->events, PN_CONNECTION_INIT, PN_CONNECTION_LOCAL_OPEN,
          PN_CONNECTION_BOUND,
-         PN_TRANSPORT, PN_CONNECTION_REMOTE_OPEN,
-         PN_CONNECTION_LOCAL_CLOSE,
+         PN_CONNECTION_REMOTE_OPEN, PN_CONNECTION_LOCAL_CLOSE,
          PN_TRANSPORT, PN_TRANSPORT_HEAD_CLOSED,
          PN_CONNECTION_REMOTE_CLOSE, PN_TRANSPORT_TAIL_CLOSED,
          PN_TRANSPORT_CLOSED, PN_CONNECTION_UNBOUND,


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


[38/50] qpid-proton git commit: PROTON-928: cancellable tasks

Posted by ac...@apache.org.
PROTON-928: cancellable tasks

A scheduled task can be cancelled.
A cancelled task does not prevent reactor from stopping running


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

Branch: refs/heads/cjansen-cpp-client
Commit: d4d22ee396163babcac19c48845b1f10ca3b5a48
Parents: 09af375
Author: Bozo Dragojevic <bo...@digiverse.si>
Authored: Tue Jul 7 10:17:40 2015 +0200
Committer: Bozo Dragojevic <bo...@digiverse.si>
Committed: Tue Jul 7 21:49:44 2015 +0200

----------------------------------------------------------------------
 proton-c/bindings/python/proton/reactor.py      |  5 +++-
 proton-c/include/proton/reactor.h               |  1 +
 proton-c/src/reactor/timer.c                    | 25 +++++++++++++++++++-
 proton-c/src/tests/reactor.c                    | 15 ++++++++++++
 .../org/apache/qpid/proton/reactor/Task.java    |  4 ++++
 .../qpid/proton/reactor/impl/TaskImpl.java      | 10 ++++++++
 .../apache/qpid/proton/reactor/impl/Timer.java  | 19 ++++++++++++---
 proton-j/src/main/resources/creactor.py         |  3 +++
 tests/python/proton_tests/reactor.py            | 14 +++++++++++
 9 files changed, 91 insertions(+), 5 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/d4d22ee3/proton-c/bindings/python/proton/reactor.py
----------------------------------------------------------------------
diff --git a/proton-c/bindings/python/proton/reactor.py b/proton-c/bindings/python/proton/reactor.py
index c66334b..d019554 100644
--- a/proton-c/bindings/python/proton/reactor.py
+++ b/proton-c/bindings/python/proton/reactor.py
@@ -53,6 +53,9 @@ class Task(Wrapper):
     def _init(self):
         pass
 
+    def cancel(self):
+        pn_task_cancel(self._impl)
+
 class Acceptor(Wrapper):
 
     def __init__(self, impl):
@@ -112,7 +115,7 @@ class Reactor(Wrapper):
         pn_reactor_yield(self._impl)
 
     def mark(self):
-        pn_reactor_mark(self._impl)
+        return pn_reactor_mark(self._impl)
 
     def _get_handler(self):
         return WrappedHandler.wrap(pn_reactor_get_handler(self._impl), self.on_error)

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/d4d22ee3/proton-c/include/proton/reactor.h
----------------------------------------------------------------------
diff --git a/proton-c/include/proton/reactor.h b/proton-c/include/proton/reactor.h
index 59b2282..6f52d22 100644
--- a/proton-c/include/proton/reactor.h
+++ b/proton-c/include/proton/reactor.h
@@ -96,6 +96,7 @@ PN_EXTERN pn_task_t *pn_timer_schedule(pn_timer_t *timer, pn_timestamp_t deadlin
 PN_EXTERN int pn_timer_tasks(pn_timer_t *timer);
 
 PN_EXTERN pn_record_t *pn_task_attachments(pn_task_t *task);
+PN_EXTERN void pn_task_cancel(pn_task_t *task);
 
 PN_EXTERN pn_reactor_t *pn_class_reactor(const pn_class_t *clazz, void *object);
 PN_EXTERN pn_reactor_t *pn_object_reactor(void *object);

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/d4d22ee3/proton-c/src/reactor/timer.c
----------------------------------------------------------------------
diff --git a/proton-c/src/reactor/timer.c b/proton-c/src/reactor/timer.c
index 1ad0821..61efd31 100644
--- a/proton-c/src/reactor/timer.c
+++ b/proton-c/src/reactor/timer.c
@@ -27,12 +27,14 @@ struct pn_task_t {
   pn_list_t *pool;
   pn_record_t *attachments;
   pn_timestamp_t deadline;
+  bool cancelled;
 };
 
 void pn_task_initialize(pn_task_t *task) {
   task->pool = NULL;
   task->attachments = pn_record();
   task->deadline = 0;
+  task->cancelled = false;
 }
 
 void pn_task_finalize(pn_task_t *task) {
@@ -68,6 +70,11 @@ pn_record_t *pn_task_attachments(pn_task_t *task) {
   return task->attachments;
 }
 
+void pn_task_cancel(pn_task_t *task) {
+    assert(task);
+    task->cancelled = true;
+}
+
 //
 // timer
 //
@@ -113,8 +120,22 @@ pn_task_t *pn_timer_schedule(pn_timer_t *timer,  pn_timestamp_t deadline) {
   return task;
 }
 
+void pni_timer_flush_cancelled(pn_timer_t *timer) {
+    while (pn_list_size(timer->tasks)) {
+        pn_task_t *task = (pn_task_t *) pn_list_get(timer->tasks, 0);
+        if (task->cancelled) {
+            pn_task_t *min = (pn_task_t *) pn_list_minpop(timer->tasks);
+            assert(min == task);
+            pn_decref(min);
+        } else {
+            break;
+        }
+    }
+}
+
 pn_timestamp_t pn_timer_deadline(pn_timer_t *timer) {
   assert(timer);
+  pni_timer_flush_cancelled(timer);
   if (pn_list_size(timer->tasks)) {
     pn_task_t *task = (pn_task_t *) pn_list_get(timer->tasks, 0);
     return task->deadline;
@@ -130,7 +151,8 @@ void pn_timer_tick(pn_timer_t *timer, pn_timestamp_t now) {
     if (now >= task->deadline) {
       pn_task_t *min = (pn_task_t *) pn_list_minpop(timer->tasks);
       assert(min == task);
-      pn_collector_put(timer->collector, PN_OBJECT, min, PN_TIMER_TASK);
+      if (!min->cancelled)
+          pn_collector_put(timer->collector, PN_OBJECT, min, PN_TIMER_TASK);
       pn_decref(min);
     } else {
       break;
@@ -140,5 +162,6 @@ void pn_timer_tick(pn_timer_t *timer, pn_timestamp_t now) {
 
 int pn_timer_tasks(pn_timer_t *timer) {
   assert(timer);
+  pni_timer_flush_cancelled(timer);
   return pn_list_size(timer->tasks);
 }

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/d4d22ee3/proton-c/src/tests/reactor.c
----------------------------------------------------------------------
diff --git a/proton-c/src/tests/reactor.c b/proton-c/src/tests/reactor.c
index fe6c769..059d099 100644
--- a/proton-c/src/tests/reactor.c
+++ b/proton-c/src/tests/reactor.c
@@ -440,6 +440,20 @@ static void test_reactor_schedule_handler(void) {
   pn_free(tevents);
 }
 
+static void test_reactor_schedule_cancel(void) {
+  pn_reactor_t *reactor = pn_reactor();
+  pn_handler_t *root = pn_reactor_get_handler(reactor);
+  pn_list_t *events = pn_list(PN_VOID, 0);
+  pn_handler_add(root, test_handler(reactor, events));
+  pn_task_t *task = pn_reactor_schedule(reactor, 0, NULL);
+  pn_task_cancel(task);
+  pn_reactor_run(reactor);
+  pn_reactor_free(reactor);
+  expect(events, PN_REACTOR_INIT, PN_SELECTABLE_INIT, PN_SELECTABLE_UPDATED,
+         PN_SELECTABLE_FINAL, PN_REACTOR_FINAL, END);
+  pn_free(events);
+}
+
 int main(int argc, char **argv)
 {
   test_reactor();
@@ -461,5 +475,6 @@ int main(int argc, char **argv)
   test_reactor_transfer(4*1024, 1024);
   test_reactor_schedule();
   test_reactor_schedule_handler();
+  test_reactor_schedule_cancel();
   return 0;
 }

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/d4d22ee3/proton-j/src/main/java/org/apache/qpid/proton/reactor/Task.java
----------------------------------------------------------------------
diff --git a/proton-j/src/main/java/org/apache/qpid/proton/reactor/Task.java b/proton-j/src/main/java/org/apache/qpid/proton/reactor/Task.java
index 69701ab..7fb5964 100644
--- a/proton-j/src/main/java/org/apache/qpid/proton/reactor/Task.java
+++ b/proton-j/src/main/java/org/apache/qpid/proton/reactor/Task.java
@@ -43,4 +43,8 @@ public interface Task extends Extendable {
     /** @return the reactor that created this task. */
     Reactor getReactor();
 
+    /**
+     * Cancel the execution of this task. No-op if invoked after the task was already executed.
+     */
+    void cancel();
 }

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/d4d22ee3/proton-j/src/main/java/org/apache/qpid/proton/reactor/impl/TaskImpl.java
----------------------------------------------------------------------
diff --git a/proton-j/src/main/java/org/apache/qpid/proton/reactor/impl/TaskImpl.java b/proton-j/src/main/java/org/apache/qpid/proton/reactor/impl/TaskImpl.java
index 00c9a84..11bb6b8 100644
--- a/proton-j/src/main/java/org/apache/qpid/proton/reactor/impl/TaskImpl.java
+++ b/proton-j/src/main/java/org/apache/qpid/proton/reactor/impl/TaskImpl.java
@@ -31,6 +31,7 @@ import org.apache.qpid.proton.reactor.Task;
 public class TaskImpl implements Task, Comparable<TaskImpl> {
     private final long deadline;
     private final int counter;
+    private boolean cancelled = false;
     private final AtomicInteger count = new AtomicInteger();
     private Record attachments = new RecordImpl();
     private Reactor reactor;
@@ -58,6 +59,15 @@ public class TaskImpl implements Task, Comparable<TaskImpl> {
         return deadline;
     }
 
+    public boolean isCancelled() {
+        return cancelled;
+    }
+
+    @Override
+    public void cancel() {
+        cancelled = true;
+    }
+
     public void setReactor(Reactor reactor) {
         this.reactor = reactor;
     }

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/d4d22ee3/proton-j/src/main/java/org/apache/qpid/proton/reactor/impl/Timer.java
----------------------------------------------------------------------
diff --git a/proton-j/src/main/java/org/apache/qpid/proton/reactor/impl/Timer.java b/proton-j/src/main/java/org/apache/qpid/proton/reactor/impl/Timer.java
index 32bb4f6..b8df19d 100644
--- a/proton-j/src/main/java/org/apache/qpid/proton/reactor/impl/Timer.java
+++ b/proton-j/src/main/java/org/apache/qpid/proton/reactor/impl/Timer.java
@@ -31,7 +31,7 @@ import org.apache.qpid.proton.reactor.Task;
 public class Timer {
 
     private CollectorImpl collector;
-    private PriorityQueue<Task> tasks = new PriorityQueue<Task>();
+    private PriorityQueue<TaskImpl> tasks = new PriorityQueue<TaskImpl>();
 
     public Timer(Collector collector) {
         this.collector = (CollectorImpl)collector;
@@ -44,6 +44,7 @@ public class Timer {
     }
 
     long deadline() {
+        flushCancelled();
         if (tasks.size() > 0) {
             Task task = tasks.peek();
             return task.deadline();
@@ -52,12 +53,23 @@ public class Timer {
         }
     }
 
+    private void flushCancelled() {
+        while (!tasks.isEmpty()) {
+            TaskImpl task = tasks.peek();
+            if (task.isCancelled())
+                tasks.poll();
+            else
+                break;
+        }
+    }
+
     void tick(long now) {
         while(!tasks.isEmpty()) {
-            Task task = tasks.peek();
+            TaskImpl task = tasks.peek();
             if (now >= task.deadline()) {
                 tasks.poll();
-                collector.put(Type.TIMER_TASK, task);
+                if (!task.isCancelled())
+                    collector.put(Type.TIMER_TASK, task);
             } else {
                 break;
             }
@@ -65,6 +77,7 @@ public class Timer {
     }
 
     int tasks() {
+        flushCancelled();
         return tasks.size();
     }
 }

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/d4d22ee3/proton-j/src/main/resources/creactor.py
----------------------------------------------------------------------
diff --git a/proton-j/src/main/resources/creactor.py b/proton-j/src/main/resources/creactor.py
index e179b23..1f8514e 100644
--- a/proton-j/src/main/resources/creactor.py
+++ b/proton-j/src/main/resources/creactor.py
@@ -78,6 +78,9 @@ def pn_selectable_set_fd(s, fd):
 def pn_acceptor_close(a):
     a.close()
 
+def pn_task_cancel(t):
+    t.cancel()
+
 def pn_object_reactor(o):
     if hasattr(o, "impl"):
         if hasattr(o.impl, "getSession"):

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/d4d22ee3/tests/python/proton_tests/reactor.py
----------------------------------------------------------------------
diff --git a/tests/python/proton_tests/reactor.py b/tests/python/proton_tests/reactor.py
index 6afee30..067c5c0 100644
--- a/tests/python/proton_tests/reactor.py
+++ b/tests/python/proton_tests/reactor.py
@@ -171,3 +171,17 @@ class ExceptionTest(Test):
             assert False, "expected to barf"
         except Barf:
             pass
+
+    def test_schedule_cancel(self):
+        barf = self.reactor.schedule(10, BarfOnTask())
+        class CancelBarf:
+            def on_timer_task(self, event):
+                barf.cancel()
+        self.reactor.schedule(0, CancelBarf())
+        now = self.reactor.mark()
+        try:
+            self.reactor.run()
+            elapsed = self.reactor.mark() - now
+            assert elapsed < 10, "expected cancelled task to not delay the reactor by " + elapsed
+        except Barf:
+            assert False, "expected barf to be cancelled"


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


[17/50] qpid-proton git commit: PROTON-925: use scanner right for remote_channel_max and remote_max_frame

Posted by ac...@apache.org.
PROTON-925: use scanner right for remote_channel_max and remote_max_frame


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

Branch: refs/heads/cjansen-cpp-client
Commit: fc38e86a6f5a1b265552708e674d3c8040c1985b
Parents: 7e31903
Author: mgoulish <mi...@redhat.com>
Authored: Thu Jul 2 16:43:45 2015 -0400
Committer: mgoulish <mi...@redhat.com>
Committed: Thu Jul 2 16:43:45 2015 -0400

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


http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/fc38e86a/proton-c/src/transport/transport.c
----------------------------------------------------------------------
diff --git a/proton-c/src/transport/transport.c b/proton-c/src/transport/transport.c
index a4b07c3..36eeb00 100644
--- a/proton-c/src/transport/transport.c
+++ b/proton-c/src/transport/transport.c
@@ -396,7 +396,7 @@ static void pn_transport_initialize(void *object)
   transport->remote_container = NULL;
   transport->remote_hostname = NULL;
   transport->local_max_frame = PN_DEFAULT_MAX_FRAME_SIZE;
-  transport->remote_max_frame = 0;
+  transport->remote_max_frame = UINT32_MAX;
 
   /*
    * We set the local limit on channels to 2^15, because 
@@ -1101,20 +1101,37 @@ static char *pn_bytes_strdup(pn_bytes_t str)
 int pn_do_open(pn_transport_t *transport, uint8_t frame_type, uint16_t channel, pn_data_t *args, const pn_bytes_t *payload)
 {
   pn_connection_t *conn = transport->connection;
-  bool container_q, hostname_q;
+  bool container_q, hostname_q, remote_channel_max_q, remote_max_frame_q;
+  uint16_t remote_channel_max;
+  uint32_t remote_max_frame;
   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_data_scan(args, "D.[?S?SIHI..CCC]", &container_q,
-                         &remote_container, &hostname_q, &remote_hostname,
-                         &transport->remote_max_frame,
-                         &transport->remote_channel_max,
+  int err = pn_data_scan(args, "D.[?S?S?I?HI..CCC]",
+                         &container_q, &remote_container,
+                         &hostname_q, &remote_hostname,
+                         &remote_max_frame_q, &remote_max_frame,
+                         &remote_channel_max_q, &remote_channel_max,
                          &transport->remote_idle_timeout,
                          transport->remote_offered_capabilities,
                          transport->remote_desired_capabilities,
                          transport->remote_properties);
   if (err) return err;
+  /*
+   * The default value is already stored in the variable.
+   * But the scanner zeroes out values if it does not
+   * find them in the args, so don't give the variable
+   * directly to the scanner.
+   */
+  if (remote_channel_max_q) {
+    transport->remote_channel_max = remote_channel_max;
+  }
+
+  if (remote_max_frame_q) {
+    transport->remote_max_frame = remote_max_frame;
+  }
+
   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",


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


[50/50] qpid-proton git commit: Merge branch 'master' into cjansen-cpp-client

Posted by ac...@apache.org.
Merge branch 'master' into cjansen-cpp-client


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

Branch: refs/heads/cjansen-cpp-client
Commit: 6498cf6d0836c80fe9fe0164f14f51f5338b5513
Parents: 377fd55 246007f
Author: Alan Conway <ac...@redhat.com>
Authored: Thu Jul 9 18:06:04 2015 -0400
Committer: Alan Conway <ac...@redhat.com>
Committed: Thu Jul 9 18:06:04 2015 -0400

----------------------------------------------------------------------
 .travis.yml                                     |  15 +-
 DEVELOPERS.md                                   |  26 +
 bin/jenkins-proton-c-build.sh                   |  17 +
 examples/java/reactor/.gitignore                |   1 +
 examples/java/reactor/README.md                 |  55 ++
 examples/java/reactor/pom.xml                   |  41 ++
 examples/java/reactor/run                       |   4 +
 .../apache/qpid/proton/example/reactor/Cat.java |  99 +++
 .../proton/example/reactor/CountRandomly.java   | 105 ++++
 .../qpid/proton/example/reactor/Counter.java    |  84 +++
 .../qpid/proton/example/reactor/Delegates.java  |  68 +++
 .../qpid/proton/example/reactor/Echo.java       |  98 +++
 .../example/reactor/EchoInputStreamWrapper.java |  76 +++
 .../proton/example/reactor/GlobalLogger.java    |  75 +++
 .../proton/example/reactor/GoodbyeWorld.java    |  60 ++
 .../qpid/proton/example/reactor/HelloWorld.java |  59 ++
 .../qpid/proton/example/reactor/README.md       |  31 +
 .../proton/example/reactor/ReactorLogger.java   |  69 +++
 .../qpid/proton/example/reactor/Recv.java       |  79 +++
 .../qpid/proton/example/reactor/Scheduling.java |  71 +++
 .../qpid/proton/example/reactor/Send.java       | 142 +++++
 .../qpid/proton/example/reactor/Unhandled.java  |  46 ++
 examples/python/abstract_server.py              |   3 +-
 examples/python/client.py                       |   3 +-
 examples/python/client_http.py                  |   3 +-
 examples/python/db_common.py                    |   6 +-
 examples/python/db_ctrl.py                      |   7 +-
 examples/python/db_recv.py                      |   3 +-
 examples/python/db_send.py                      |  18 +-
 examples/python/direct_recv.py                  |   3 +-
 examples/python/direct_send.py                  |   3 +-
 examples/python/helloworld.py                   |   5 +-
 examples/python/helloworld_blocking.py          |   5 +-
 examples/python/helloworld_direct.py            |   5 +-
 examples/python/helloworld_direct_tornado.py    |   5 +-
 examples/python/helloworld_tornado.py           |   5 +-
 examples/python/messenger/async.py              |   5 +-
 examples/python/messenger/client.py             |   7 +-
 examples/python/messenger/recv.py               |   7 +-
 examples/python/messenger/recv_async.py         |  11 +-
 examples/python/messenger/send.py               |   5 +-
 examples/python/messenger/send_async.py         |   9 +-
 examples/python/messenger/server.py             |   5 +-
 examples/python/proton_server.py                |   3 +-
 examples/python/queue_browser.py                |   3 +-
 examples/python/reactor/cat.py                  |   3 +-
 examples/python/reactor/count-randomly.py       |   9 +-
 examples/python/reactor/counter.py              |   7 +-
 examples/python/reactor/delegates.py            |   5 +-
 examples/python/reactor/echo.py                 |   5 +-
 examples/python/reactor/global-logger.py        |   9 +-
 examples/python/reactor/goodbye-world.py        |   5 +-
 examples/python/reactor/handlers.py             |   7 +-
 examples/python/reactor/hello-world.py          |   3 +-
 examples/python/reactor/reactor-logger.py       |   7 +-
 examples/python/reactor/recv.py                 |   3 +-
 examples/python/reactor/scheduling.py           |   7 +-
 examples/python/reactor/tornado-hello-world.py  |   3 +-
 examples/python/reactor/unhandled.py            |   3 +-
 examples/python/recurring_timer.py              |   5 +-
 examples/python/recurring_timer_tornado.py      |   5 +-
 examples/python/selected_recv.py                |   5 +-
 examples/python/server.py                       |   5 +-
 examples/python/server_direct.py                |   7 +-
 examples/python/server_tx.py                    |   5 +-
 examples/python/simple_recv.py                  |   3 +-
 examples/python/simple_send.py                  |   3 +-
 examples/python/sync_client.py                  |   3 +-
 examples/python/test_examples.py                |  55 +-
 examples/python/tx_recv.py                      |   3 +-
 examples/python/tx_recv_interactive.py          |  11 +-
 examples/python/tx_send.py                      |   3 +-
 pom.xml                                         |   5 +-
 proton-c/CMakeLists.txt                         |  23 +-
 proton-c/bindings/javascript/CMakeLists.txt     |   1 +
 proton-c/bindings/python/CMakeLists.txt         |   1 +
 proton-c/bindings/python/cproton.i              | 116 +++-
 proton-c/bindings/python/proton/__init__.py     | 127 ++--
 proton-c/bindings/python/proton/_compat.py      |  84 +++
 proton-c/bindings/python/proton/handlers.py     |   3 +-
 proton-c/bindings/python/proton/reactor.py      |  32 +-
 proton-c/bindings/python/proton/utils.py        |  14 +-
 proton-c/bindings/python/proton/wrapper.py      |  12 +-
 proton-c/bindings/python/setup.py               |  55 +-
 proton-c/bindings/python/setuputils/misc.py     |  64 +-
 proton-c/bindings/python/tox.ini                |  23 +-
 proton-c/bindings/ruby/lib/codec/data.rb        |  16 +-
 proton-c/bindings/ruby/lib/core/message.rb      |   6 +-
 proton-c/bindings/ruby/lib/core/url.rb          |   2 +-
 .../bindings/ruby/lib/messenger/messenger.rb    |   4 +-
 proton-c/bindings/ruby/lib/reactor/container.rb |   2 +-
 proton-c/bindings/ruby/lib/types/array.rb       |  10 +-
 proton-c/bindings/ruby/lib/types/described.rb   |   2 +-
 proton-c/bindings/ruby/lib/types/hash.rb        |   4 +-
 proton-c/bindings/ruby/lib/util/wrapper.rb      |  12 +-
 proton-c/bindings/ruby/ruby.i                   |  46 +-
 .../ruby/spec/qpid/proton/array_spec.rb         |   4 +-
 .../bindings/ruby/spec/qpid/proton/data_spec.rb |  12 +-
 .../spec/qpid/proton/exception_handling_spec.rb |   2 +-
 .../bindings/ruby/spec/qpid/proton/hash_spec.rb |   2 +-
 .../ruby/spec/qpid/proton/message_spec.rb       |   8 +-
 .../ruby/spec/qpid/proton/messenger_spec.rb     |   8 +-
 proton-c/bindings/ruby/spec/spec_helper.rb      |  10 +-
 proton-c/include/proton/reactor.h               |   1 +
 proton-c/include/proton/session.h               |  16 +
 proton-c/include/proton/ssl.h                   |   4 +
 proton-c/mllib/__init__.py                      |  40 +-
 proton-c/mllib/dom.py                           |  16 +-
 proton-c/mllib/parsers.py                       |  40 +-
 proton-c/mllib/transforms.py                    |   8 +-
 proton-c/src/codec/encodings.h.py               |  17 +-
 proton-c/src/config.h                           |   8 +-
 proton-c/src/engine/engine-internal.h           |   1 +
 proton-c/src/engine/engine.c                    |  21 +
 proton-c/src/messenger/messenger.c              |  11 +
 proton-c/src/protocol.h.py                      |  91 +--
 proton-c/src/reactor/timer.c                    |  25 +-
 proton-c/src/sasl/cyrus_sasl.c                  |  81 ++-
 proton-c/src/sasl/none_sasl.c                   |  20 +
 proton-c/src/sasl/sasl-internal.h               |  23 +-
 proton-c/src/sasl/sasl.c                        | 494 ++++++++-------
 proton-c/src/ssl/PLATFORM_NOTES.md              |  82 +++
 proton-c/src/tests/reactor.c                    |  15 +
 proton-c/src/transport/transport.c              |  86 ++-
 proton-c/src/windows/io.c                       |   1 -
 proton-c/src/windows/iocp.c                     |   1 -
 proton-c/src/windows/selector.c                 |   1 -
 proton-c/src/windows/write_pipeline.c           |   1 -
 proton-j/CMakeLists.txt                         |   2 +-
 .../java/org/apache/qpid/proton/Proton.java     |  20 +-
 .../apache/qpid/proton/engine/BaseHandler.java  |  45 ++
 .../apache/qpid/proton/engine/Collector.java    |   1 +
 .../apache/qpid/proton/engine/Connection.java   |   9 +-
 .../org/apache/qpid/proton/engine/Delivery.java |   2 +-
 .../org/apache/qpid/proton/engine/Endpoint.java |   3 +-
 .../org/apache/qpid/proton/engine/Event.java    |  14 +-
 .../apache/qpid/proton/engine/Extendable.java   |  34 ++
 .../org/apache/qpid/proton/engine/Handler.java  |  18 +
 .../qpid/proton/engine/HandlerException.java    |  39 ++
 .../org/apache/qpid/proton/engine/Link.java     |   3 +-
 .../org/apache/qpid/proton/engine/Record.java   |  36 ++
 .../org/apache/qpid/proton/engine/Session.java  |   8 +
 .../qpid/proton/engine/impl/CollectorImpl.java  |  10 +-
 .../qpid/proton/engine/impl/ConnectionImpl.java |  32 +-
 .../qpid/proton/engine/impl/DeliveryImpl.java   |   7 +
 .../qpid/proton/engine/impl/EndpointImpl.java   |   7 +
 .../qpid/proton/engine/impl/EventImpl.java      | 296 ++++++---
 .../impl/HandshakeSniffingTransportWrapper.java | 182 ++++++
 .../qpid/proton/engine/impl/LinkImpl.java       |  28 +-
 .../qpid/proton/engine/impl/RecordImpl.java     |  54 ++
 .../qpid/proton/engine/impl/SaslImpl.java       |  16 +-
 .../qpid/proton/engine/impl/SaslSniffer.java    |  53 ++
 .../qpid/proton/engine/impl/SessionImpl.java    |  30 +-
 .../qpid/proton/engine/impl/TransportImpl.java  |  57 +-
 .../proton/engine/impl/TransportSession.java    |  21 +-
 .../SslHandshakeSniffingTransportWrapper.java   | 170 +-----
 .../qpid/proton/message/impl/MessageImpl.java   |  20 +
 .../apache/qpid/proton/reactor/Acceptor.java    |  39 ++
 .../qpid/proton/reactor/FlowController.java     |  76 +++
 .../apache/qpid/proton/reactor/Handshaker.java  |  79 +++
 .../org/apache/qpid/proton/reactor/Reactor.java | 280 +++++++++
 .../qpid/proton/reactor/ReactorChild.java       |  31 +
 .../apache/qpid/proton/reactor/Selectable.java  | 221 +++++++
 .../apache/qpid/proton/reactor/Selector.java    | 111 ++++
 .../org/apache/qpid/proton/reactor/Task.java    |  50 ++
 .../qpid/proton/reactor/impl/AcceptorImpl.java  | 132 ++++
 .../org/apache/qpid/proton/reactor/impl/IO.java |  44 ++
 .../qpid/proton/reactor/impl/IOHandler.java     | 347 +++++++++++
 .../apache/qpid/proton/reactor/impl/IOImpl.java |  52 ++
 .../qpid/proton/reactor/impl/ReactorImpl.java   | 434 ++++++++++++++
 .../reactor/impl/ReactorInternalException.java  |  44 ++
 .../proton/reactor/impl/SelectableImpl.java     | 246 ++++++++
 .../qpid/proton/reactor/impl/SelectorImpl.java  | 209 +++++++
 .../qpid/proton/reactor/impl/TaskImpl.java      |  85 +++
 .../apache/qpid/proton/reactor/impl/Timer.java  |  83 +++
 proton-j/src/main/resources/ccodec.py           |   2 +-
 proton-j/src/main/resources/cengine.py          |  57 +-
 proton-j/src/main/resources/chandlers.py        |  21 +-
 proton-j/src/main/resources/cmessage.py         |   5 +-
 proton-j/src/main/resources/cobject.py          |  36 +-
 proton-j/src/main/resources/compat.py           |   8 +
 proton-j/src/main/resources/cproton.py          |   1 +
 proton-j/src/main/resources/creactor.py         |  75 ++-
 proton-j/src/main/resources/csasl.py            |   4 +-
 proton-j/src/main/resources/ctypes.py           |  21 +
 .../apache/qpid/proton/reactor/ReactorTest.java | 596 +++++++++++++++++++
 .../proton/reactor/impl/AcceptorImplTest.java   |  87 +++
 .../proton/reactor/impl/LeakTestReactor.java    | 118 ++++
 .../java/org/apache/qpid/proton/JythonTest.java |  14 +
 .../org/apache/qpid/proton/ProtonJInterop.java  | 203 +++++++
 tests/java/pythonTests.ignore                   |   1 +
 tests/pom.xml                                   |   1 +
 tests/python/proton-test                        |  32 +-
 tests/python/proton_tests/__init__.py           |   1 +
 tests/python/proton_tests/codec.py              |  32 +-
 tests/python/proton_tests/common.py             |  35 +-
 tests/python/proton_tests/engine.py             | 194 +++---
 tests/python/proton_tests/interop.py            |   8 +-
 tests/python/proton_tests/message.py            |   9 +-
 tests/python/proton_tests/messenger.py          |  15 +-
 tests/python/proton_tests/reactor.py            |  80 ++-
 tests/python/proton_tests/reactor_interop.py    | 164 +++++
 tests/python/proton_tests/sasl.py               |  39 +-
 tests/python/proton_tests/soak.py               |   3 +-
 tests/python/proton_tests/ssl.py                |  56 +-
 tests/python/proton_tests/transport.py          |  66 +-
 tests/python/proton_tests/url.py                |   3 +-
 tests/python/proton_tests/utils.py              |   2 +-
 tests/ruby/proton_tests/interop.rb              |  62 +-
 tests/ruby/proton_tests/smoke.rb                |   2 +-
 tests/smoke/recv.py                             |   3 +-
 tests/smoke/send.py                             |   5 +-
 tests/tools/apps/python/msgr-recv.py            |   6 +
 tests/tools/apps/python/msgr-send.py            |   6 +
 tests/tools/soak-check                          |   5 +-
 215 files changed, 8050 insertions(+), 1261 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/6498cf6d/proton-c/CMakeLists.txt
----------------------------------------------------------------------


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


[37/50] qpid-proton git commit: NO-JIRA: fix the search for proton-j in the interopt test

Posted by ac...@apache.org.
NO-JIRA: fix the search for proton-j in the interopt test


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

Branch: refs/heads/cjansen-cpp-client
Commit: 09af37524ee71951e27e4af883eaac2fdffc3f19
Parents: 898cc0a
Author: Ken Giusti <kg...@apache.org>
Authored: Tue Jul 7 10:16:03 2015 -0400
Committer: Ken Giusti <kg...@apache.org>
Committed: Tue Jul 7 10:16:03 2015 -0400

----------------------------------------------------------------------
 proton-c/CMakeLists.txt                      |  8 +++++---
 tests/python/proton_tests/reactor_interop.py | 12 ++++++------
 2 files changed, 11 insertions(+), 9 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/09af3752/proton-c/CMakeLists.txt
----------------------------------------------------------------------
diff --git a/proton-c/CMakeLists.txt b/proton-c/CMakeLists.txt
index 72f8d6a..93449a9 100644
--- a/proton-c/CMakeLists.txt
+++ b/proton-c/CMakeLists.txt
@@ -521,10 +521,12 @@ if (BUILD_PYTHON)
          to_native_path ("${py_path}" py_path)
          to_native_path ("${py_pythonpath}" py_pythonpath)
          add_test (NAME python-tox-test
+		   WORKING_DIRECTORY ${py_src}
                    COMMAND ${env_py}
-		   "PATH=${py_path}" "QPID_PROTON_SRC=${CMAKE_CURRENT_SOURCE_DIR}/../" ${VALGRIND_ENV}
-                   tox
-		   WORKING_DIRECTORY ${py_src})
+		   "PATH=${py_path}" "QPID_PROTON_SRC=${CMAKE_CURRENT_SOURCE_DIR}/../"
+                   "CLASSPATH=${CMAKE_BINARY_DIR}/proton-j/proton-j.jar"
+                   ${VALGRIND_ENV}
+                   tox)
          set_tests_properties(python-tox-test
                               PROPERTIES
                               PASS_REGULAR_EXPRESSION "Totals: .* ignored, 0 failed"

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/09af3752/tests/python/proton_tests/reactor_interop.py
----------------------------------------------------------------------
diff --git a/tests/python/proton_tests/reactor_interop.py b/tests/python/proton_tests/reactor_interop.py
index f95d8c2..50284fd 100644
--- a/tests/python/proton_tests/reactor_interop.py
+++ b/tests/python/proton_tests/reactor_interop.py
@@ -19,7 +19,7 @@
 #
 from __future__ import absolute_import
 
-from .common import Test, free_tcp_port
+from .common import Test, free_tcp_port, Skipped
 from proton import Message
 from proton.handlers import CHandshaker, CFlowController
 from proton.reactor import Reactor
@@ -101,14 +101,14 @@ class ReactorInteropTest(Test):
     classpath = ""
     if ('CLASSPATH' in os.environ):
       classpath = os.environ['CLASSPATH']
-    entries = classpath.split(os.sep)
-    self.proton_j_available = len(entries) > 0
+    entries = classpath.split(os.pathsep)
+    self.proton_j_available = False
     for entry in entries:
-      self.proton_j_available |= os.path.exists(entry)
+      self.proton_j_available |= entry != "" and os.path.exists(entry)
 
   def protonc_to_protonj(self, count):
     if (not self.proton_j_available):
-      raise Skip()
+      raise Skipped("ProtonJ not found")
 
     port = free_tcp_port()
     java_thread = JavaThread("recv", port, count)
@@ -126,7 +126,7 @@ class ReactorInteropTest(Test):
 
   def protonj_to_protonc(self, count):
     if (not self.proton_j_available):
-      raise Skip()
+      raise Skipped("ProtonJ not found")
 
     rh = ReceiveHandler(count)
     r = Reactor(rh)


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