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/06/18 23:58:19 UTC

[41/50] [abbrv] qpid-proton git commit: PROTON-865: Move types out of reactor namespace, clean up Message.

PROTON-865: Move types out of reactor namespace, clean up Message.

Move  AMQP types and general type manipulation, including Message, into proton namespace.
Keep proton::reactor namespace for reactive, event-driven API.

Message cleanup
- use Value and Values for complex AMQP types.
- drop get/set prefixes for attributes.


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

Branch: refs/heads/cjansen-cpp-client
Commit: 327f358e73a1bd3a9611032084b21d0e5b160690
Parents: 38f57e9
Author: Alan Conway <ac...@redhat.com>
Authored: Tue Jun 16 20:42:20 2015 -0400
Committer: Alan Conway <ac...@redhat.com>
Committed: Thu Jun 18 17:28:44 2015 -0400

----------------------------------------------------------------------
 examples/cpp/README.md                          |  18 +-
 examples/cpp/broker.cpp                         |   1 +
 examples/cpp/encode_decode.cpp                  |  14 +-
 examples/cpp/example_test.py                    |   5 +-
 examples/cpp/helloworld.cpp                     |   6 +-
 examples/cpp/helloworld_blocking.cpp            |   6 +-
 examples/cpp/helloworld_direct.cpp              |   6 +-
 examples/cpp/simple_recv.cpp                    |  11 +-
 examples/cpp/simple_send.cpp                    |  10 +-
 proton-c/bindings/cpp/CMakeLists.txt            |   1 +
 proton-c/bindings/cpp/README.md                 |  43 ++-
 .../bindings/cpp/include/proton/Acceptor.hpp    |   3 +-
 proton-c/bindings/cpp/include/proton/Acking.hpp |   2 +-
 .../cpp/include/proton/BlockingConnection.hpp   |   3 +-
 .../cpp/include/proton/BlockingLink.hpp         |   3 +-
 .../cpp/include/proton/BlockingSender.hpp       |   3 +-
 .../bindings/cpp/include/proton/Connection.hpp  |   3 +-
 .../bindings/cpp/include/proton/Container.hpp   |   2 +-
 proton-c/bindings/cpp/include/proton/Data.hpp   |  29 +-
 .../bindings/cpp/include/proton/Decoder.hpp     |  12 +-
 .../bindings/cpp/include/proton/Delivery.hpp    |   3 +-
 .../bindings/cpp/include/proton/Duration.hpp    |  33 +-
 .../bindings/cpp/include/proton/Encoder.hpp     |  16 +-
 .../bindings/cpp/include/proton/Endpoint.hpp    |   2 +-
 proton-c/bindings/cpp/include/proton/Error.hpp  |  42 +++
 proton-c/bindings/cpp/include/proton/Event.hpp  |   3 +-
 proton-c/bindings/cpp/include/proton/Handle.hpp |   4 +-
 .../bindings/cpp/include/proton/Handler.hpp     |   3 +-
 proton-c/bindings/cpp/include/proton/Link.hpp   |   3 +-
 .../bindings/cpp/include/proton/Message.hpp     | 112 +++---
 .../cpp/include/proton/MessagingAdapter.hpp     |   4 +-
 .../cpp/include/proton/MessagingEvent.hpp       |   3 +-
 .../cpp/include/proton/MessagingHandler.hpp     |   3 +-
 .../bindings/cpp/include/proton/ProtonEvent.hpp |   3 +-
 .../cpp/include/proton/ProtonHandle.hpp         |   4 +-
 .../cpp/include/proton/ProtonHandler.hpp        |   3 +-
 .../bindings/cpp/include/proton/Receiver.hpp    |   3 +-
 proton-c/bindings/cpp/include/proton/Sender.hpp |   2 +-
 .../bindings/cpp/include/proton/Session.hpp     |   3 +-
 .../bindings/cpp/include/proton/Terminus.hpp    |   2 +-
 .../bindings/cpp/include/proton/Transport.hpp   |   2 +-
 proton-c/bindings/cpp/include/proton/Value.hpp  |  24 +-
 proton-c/bindings/cpp/include/proton/Values.hpp |  13 +-
 .../cpp/include/proton/WaitCondition.hpp        |   2 +-
 .../bindings/cpp/include/proton/exceptions.hpp  |  49 ---
 proton-c/bindings/cpp/include/proton/types.hpp  |  10 +-
 proton-c/bindings/cpp/src/Acceptor.cpp          |   2 +-
 proton-c/bindings/cpp/src/Connection.cpp        |   2 +-
 proton-c/bindings/cpp/src/ConnectionImpl.cpp    |  12 +-
 proton-c/bindings/cpp/src/Container.cpp         |   2 +-
 proton-c/bindings/cpp/src/ContainerImpl.cpp     |  30 +-
 proton-c/bindings/cpp/src/Data.cpp              |  35 +-
 proton-c/bindings/cpp/src/Decoder.cpp           |  22 +-
 proton-c/bindings/cpp/src/Duration.cpp          |  26 +-
 proton-c/bindings/cpp/src/Encoder.cpp           |  11 +-
 proton-c/bindings/cpp/src/Error.cpp             |  30 ++
 proton-c/bindings/cpp/src/Event.cpp             |  16 +-
 proton-c/bindings/cpp/src/Link.cpp              |   2 +-
 proton-c/bindings/cpp/src/Message.cpp           | 361 ++++---------------
 proton-c/bindings/cpp/src/MessagingAdapter.cpp  |   4 +-
 proton-c/bindings/cpp/src/MessagingEvent.cpp    |  20 +-
 proton-c/bindings/cpp/src/ProtonEvent.cpp       |  12 +-
 proton-c/bindings/cpp/src/Receiver.cpp          |   4 +-
 proton-c/bindings/cpp/src/Sender.cpp            |   4 +-
 proton-c/bindings/cpp/src/Url.cpp               |   4 +-
 proton-c/bindings/cpp/src/Value.cpp             |   6 +-
 proton-c/bindings/cpp/src/Values.cpp            |   5 +-
 .../cpp/src/blocking/BlockingConnection.cpp     |   2 +-
 .../cpp/src/blocking/BlockingConnectionImpl.cpp |   8 +-
 .../bindings/cpp/src/blocking/BlockingLink.cpp  |   4 +-
 .../cpp/src/blocking/BlockingSender.cpp         |   4 +-
 proton-c/bindings/cpp/src/contexts.cpp          |   4 +-
 proton-c/bindings/cpp/src/interop_test.cpp      |  17 +-
 proton-c/bindings/cpp/src/proton_bits.cpp       |   2 +-
 proton-c/bindings/cpp/src/proton_bits.hpp       |   4 +-
 proton-c/bindings/cpp/src/types.cpp             |   5 +-
 76 files changed, 525 insertions(+), 667 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/327f358e/examples/cpp/README.md
----------------------------------------------------------------------
diff --git a/examples/cpp/README.md b/examples/cpp/README.md
index 867c671..52b73e7 100644
--- a/examples/cpp/README.md
+++ b/examples/cpp/README.md
@@ -1,10 +1,20 @@
 # C++ examples
 
+Many of the examples expect a broker to be running on the standard AMQP
+port. You can use any broker that supports AMQP 1.0, or you can use the simple
+example `broker` provided here. Run the broker in a separate window before
+running the other examples.
+
+If you use another broker you will need to create a queue named `examples`.
+
 ## broker.cpp
 
 A very simple "mini broker". You can use this to run other examples that reqiure
-an intermediary, or you can use a real AMQP 1.0 broker. It creates queues
-automatically when a client tries to send to or subscribe from a node.
+an intermediary, or you can use any AMQP 1.0 broker. This broker creates queues
+automatically when a client tries to send or subscribe.
+
+    $ ./broker
+    broker listening on :5672
 
 ## helloworld.cpp
 
@@ -40,3 +50,7 @@ an intermediary accessible on port 5672 on localhost.
 
 Subscribes to the 'examples' node on an intermediary accessible on port 5672 on
 localhost. Simply prints out the body of received messages.
+
+## encode_decode.cpp
+
+Shows how C++ data types can be converted to and from AMQP types.

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/327f358e/examples/cpp/broker.cpp
----------------------------------------------------------------------
diff --git a/examples/cpp/broker.cpp b/examples/cpp/broker.cpp
index ccecefa..468af48 100644
--- a/examples/cpp/broker.cpp
+++ b/examples/cpp/broker.cpp
@@ -29,6 +29,7 @@
 #include <stdlib.h>
 #include <string.h>
 
+using namespace proton;
 using namespace proton::reactor;
 
 std::string generateUuid(){

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/327f358e/examples/cpp/encode_decode.cpp
----------------------------------------------------------------------
diff --git a/examples/cpp/encode_decode.cpp b/examples/cpp/encode_decode.cpp
index bf1dba9..cad4c0e 100644
--- a/examples/cpp/encode_decode.cpp
+++ b/examples/cpp/encode_decode.cpp
@@ -28,7 +28,7 @@
 #include <vector>
 
 using namespace std;
-using namespace proton::reactor;
+using namespace proton;
 
 // Examples of how to use the Encoder and Decoder to create and examine AMQP values.
 //
@@ -49,7 +49,13 @@ void simple_insert_extract() {
     values.rewind();
     values >> i >> s >> b;
     cout << "Extracted: " << i << ", " << s << ", " << b << endl;
-    cout << "Encoded as AMQP in " << values.encode().size() << " bytes" << endl;
+    // Encode and decode as AMQP
+    string amqpData = values.encode();
+    cout << "Encoded as AMQP in " << amqpData.size() << " bytes" << endl;
+    Values values2;
+    values.decode(amqpData);
+    values >> i >> s >> b;
+    cout << "Decoded: " << i << ", " << s << ", " << b << endl;
 }
 
 // Inserting values as a specific AMQP type
@@ -71,12 +77,12 @@ void simple_insert_extract_exact_type() {
     values.rewind();            // Byte(1) << Long(2) << Symbol("bar");
     Long l;
     // Fails, extracting Byte as Long
-    try { values >> as<LONG>(l); throw logic_error("expected error"); } catch (Decoder::Error) {}
+    try { values >> as<LONG>(l); throw logic_error("expected error"); } catch (DecodeError) {}
     Byte b;
     values >> as<BYTE>(b) >> as<LONG>(l); // OK, extract Byte as Byte, Long as Long.
     std::string str;
     // Fails, extracting Symbol as String.
-    try { values >> as<STRING>(str); throw logic_error("expected error"); } catch (Decoder::Error) {}
+    try { values >> as<STRING>(str); throw logic_error("expected error"); } catch (DecodeError) {}
     values >> as<SYMBOL>(str);       // OK, extract Symbol as Symbol
     cout << "Extracted (exact) " << b << ", " << l << ", " << str << endl;
 }

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/327f358e/examples/cpp/example_test.py
----------------------------------------------------------------------
diff --git a/examples/cpp/example_test.py b/examples/cpp/example_test.py
index 3da1ddb..2e2d91c 100644
--- a/examples/cpp/example_test.py
+++ b/examples/cpp/example_test.py
@@ -17,6 +17,8 @@
 # under the License
 #
 
+# This is a test script to run the examples and verify that they behave as expected.
+
 import unittest
 import os, sys, socket, time
 from  random import randrange
@@ -86,7 +88,7 @@ class ExampleTest(unittest.TestCase):
         self.assertEqual("all messages confirmed\n", send)
         recv = check_output(["./simple_recv", "-a", b.addr, "-m", str(n)])
         recv_expect = "simple_recv listening on %s\n" % (b.addr)
-        recv_expect += "".join(['[%d]: b"some arbitrary binary data"\n' % (i+1) for i in range(n)])
+        recv_expect += "".join(['{"sequence"=%s}\n' % (i+1) for i in range(n)])
         self.assertEqual(recv_expect, recv)
 
         # FIXME aconway 2015-06-16: bug when receiver is started before sender, messages
@@ -117,6 +119,7 @@ class ExampleTest(unittest.TestCase):
 Values: int(42), string("foo"), bool(true)
 Extracted: 42, foo, 1
 Encoded as AMQP in 8 bytes
+Decoded: 42, foo, 1
 
 == Specific AMQP types: byte, long, symbol
 Values: byte(120), long(123456789123456789), symbol(:bar)

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/327f358e/examples/cpp/helloworld.cpp
----------------------------------------------------------------------
diff --git a/examples/cpp/helloworld.cpp b/examples/cpp/helloworld.cpp
index 5ac73da..9546218 100644
--- a/examples/cpp/helloworld.cpp
+++ b/examples/cpp/helloworld.cpp
@@ -25,6 +25,7 @@
 #include <iostream>
 
 
+using namespace proton;
 using namespace proton::reactor;
 
 class HelloWorld : public MessagingHandler {
@@ -43,14 +44,13 @@ class HelloWorld : public MessagingHandler {
 
     void onSendable(Event &e) {
         Message m;
-        m.setBody("Hello World!");
+        m.body("Hello World!");
         e.getSender().send(m);
         e.getSender().close();
     }
 
     void onMessage(Event &e) {
-        std::string body = e.getMessage().getBody();
-        std::cout << body << std::endl;
+        std::cout << e.getMessage().body().get<String>() << std::endl;
         e.getConnection().close();
     }
 

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/327f358e/examples/cpp/helloworld_blocking.cpp
----------------------------------------------------------------------
diff --git a/examples/cpp/helloworld_blocking.cpp b/examples/cpp/helloworld_blocking.cpp
index c0ef4c5..b5aee8d 100644
--- a/examples/cpp/helloworld_blocking.cpp
+++ b/examples/cpp/helloworld_blocking.cpp
@@ -26,6 +26,7 @@
 #include <iostream>
 
 
+using namespace proton;
 using namespace proton::reactor;
 
 class HelloWorldBlocking : public MessagingHandler {
@@ -42,8 +43,7 @@ class HelloWorldBlocking : public MessagingHandler {
     }
 
     void onMessage(Event &e) {
-        std::string body = e.getMessage().getBody();
-        std::cout << body << std::endl;
+        std::cout << e.getMessage().body().get<String>() << std::endl;
         e.getConnection().close();
     }
 
@@ -56,7 +56,7 @@ int main(int argc, char **argv) {
         BlockingConnection conn = BlockingConnection(server);
         BlockingSender sender = conn.createSender(addr);
         Message m;
-        m.setBody("Hello World!");
+        m.body("Hello World!");
         sender.send(m);
         conn.close();
 

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/327f358e/examples/cpp/helloworld_direct.cpp
----------------------------------------------------------------------
diff --git a/examples/cpp/helloworld_direct.cpp b/examples/cpp/helloworld_direct.cpp
index 965ba04..536aba8 100644
--- a/examples/cpp/helloworld_direct.cpp
+++ b/examples/cpp/helloworld_direct.cpp
@@ -26,6 +26,7 @@
 #include <iostream>
 
 
+using namespace proton;
 using namespace proton::reactor;
 
 
@@ -44,14 +45,13 @@ class HelloWorldDirect : public MessagingHandler {
 
     void onSendable(Event &e) {
         Message m;
-        m.setBody("Hello World!");
+        m.body("Hello World!");
         e.getSender().send(m);
         e.getSender().close();
     }
 
     void onMessage(Event &e) {
-        std::string body = e.getMessage().getBody();
-        std::cout << body << std::endl;
+        std::cout << e.getMessage().body().get<String>() << std::endl;
     }
 
     void onAccepted(Event &e) {

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/327f358e/examples/cpp/simple_recv.cpp
----------------------------------------------------------------------
diff --git a/examples/cpp/simple_recv.cpp b/examples/cpp/simple_recv.cpp
index 48ba8a4..b4572f5 100644
--- a/examples/cpp/simple_recv.cpp
+++ b/examples/cpp/simple_recv.cpp
@@ -24,11 +24,13 @@
 #include "proton/Link.hpp"
 
 #include <iostream>
+#include <map>
 #include <stdlib.h>
 #include <stdio.h>
 #include <string.h>
 
 
+using namespace proton;
 using namespace proton::reactor;
 
 class Recv : public MessagingHandler {
@@ -46,15 +48,14 @@ class Recv : public MessagingHandler {
     }
 
     void onMessage(Event &e) {
-        int64_t id = 0;
         Message msg = e.getMessage();
-        if (msg.getIdType() == PN_ULONG) {
-            id = msg.getId();
-            if (id < received)
+        Value id = msg.id();
+        if (id.type() == ULONG) {
+            if (id.get<int>() < received)
                 return; // ignore duplicate
         }
         if (expected == 0 || received < expected) {
-            std::cout << '[' << id << "]: " << msg.getBody() << std::endl;
+            std::cout << msg.body() << std::endl;
             received++;
             if (received == expected) {
                 e.getReceiver().close();

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/327f358e/examples/cpp/simple_send.cpp
----------------------------------------------------------------------
diff --git a/examples/cpp/simple_send.cpp b/examples/cpp/simple_send.cpp
index 59222e4..f7518c1 100644
--- a/examples/cpp/simple_send.cpp
+++ b/examples/cpp/simple_send.cpp
@@ -24,11 +24,13 @@
 #include "proton/Connection.hpp"
 
 #include <iostream>
+#include <map>
 #include <string.h>
 #include <stdlib.h>
 #include <stdio.h>
 
 
+using namespace proton;
 using namespace proton::reactor;
 
 class Send : public MessagingHandler {
@@ -49,10 +51,10 @@ class Send : public MessagingHandler {
         Sender sender = e.getSender();
         while (sender.getCredit() && sent < total) {
             Message msg;
-            msg.setId(sent + 1);
-            // TODO: fancy map body content as in Python example.  Simple binary for now.
-            const char *bin = "some arbitrary binary data";
-            msg.setBody(bin, strlen(bin));
+            msg.id(Value(sent + 1));
+            std::map<std::string, int> m;
+            m["sequence"] = sent+1;
+            msg.body(as<MAP>(m));
             sender.send(msg);
             sent++;
         }

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/327f358e/proton-c/bindings/cpp/CMakeLists.txt
----------------------------------------------------------------------
diff --git a/proton-c/bindings/cpp/CMakeLists.txt b/proton-c/bindings/cpp/CMakeLists.txt
index b7e198f..f3fbb44 100644
--- a/proton-c/bindings/cpp/CMakeLists.txt
+++ b/proton-c/bindings/cpp/CMakeLists.txt
@@ -36,6 +36,7 @@ set(qpid-proton-cpp-source
   src/Duration.cpp
   src/Encoder.cpp
   src/Endpoint.cpp
+  src/Error.cpp
   src/Event.cpp
   src/Handler.cpp
   src/Link.cpp

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/327f358e/proton-c/bindings/cpp/README.md
----------------------------------------------------------------------
diff --git a/proton-c/bindings/cpp/README.md b/proton-c/bindings/cpp/README.md
index 9a30e35..b6640e5 100644
--- a/proton-c/bindings/cpp/README.md
+++ b/proton-c/bindings/cpp/README.md
@@ -7,24 +7,33 @@ API documentation in doxygen format.
 
 # TO DO
 
-There are a number of things that remain to be done.
-
-- Mapping of complex types.
-
-- Finish blocking API & demos.
-- API documentation, HTML docs on website.
-- FIXME and TODO notes in code, esp. error handling, missing sender/receiver/connection methods.
-
-- Valgrind for automated tests and demos.
-- More automated tests and examples.
-
-- Security: SASL/SSL support.
+Doc & examples
+- Example set with tutorial documentation. Follow pyton examples + C++ encode/decode example.
+  - Consistent option parsing for examples, like other languages.
+  - Auto tests for all examples validating all statements & code in tutorial.
+- API documentation, fill out & organize for readable doxygen HTML.
+- C++ section on website.
+
+Bugs
+- Memory management
+  - Drop PIMPL pattern in API: pn_foo pointer is already hiding the impl.
+  - Proper ownership of pn_objects created by user, e.g. Message. Let user choose pointer style?
+- Error handling, examples crash on error e.g. queue not found.
+- FIXME and TODO notes in code.
+
+Tests
+- Interop/type testing for full AMQP type coverage.
+- Unit testing for reasonable code coverage.
+- Valgrind for automated unit and example tests.
+
+Features
+- SASL/SSL support with interop tests.
 - Reconnection
-
+- Finish blocking API & examples.
+- Described types, full support and tests.
+- Durable subscriptions & demos (see python changes)
 
 # Nice to have
 
-Subclasses of Encoder/Decoder that push to/pull from a std::ostream/istream as
-values are inserted/extracted.
-
-Better support for Decimal type.
+- Helpers (or at least doc) for multi-threaded use (reactor/engine per connection)
+- Usable support for decimal types.

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/327f358e/proton-c/bindings/cpp/include/proton/Acceptor.hpp
----------------------------------------------------------------------
diff --git a/proton-c/bindings/cpp/include/proton/Acceptor.hpp b/proton-c/bindings/cpp/include/proton/Acceptor.hpp
index 5fd0004..591af2c 100644
--- a/proton-c/bindings/cpp/include/proton/Acceptor.hpp
+++ b/proton-c/bindings/cpp/include/proton/Acceptor.hpp
@@ -44,7 +44,6 @@ class Acceptor : public ProtonHandle<pn_acceptor_t>
     friend class ProtonImplRef<Acceptor>;
 };
 
-
-}} // namespace proton::reactor
+}}
 
 #endif  /*!PROTON_CPP_ACCEPTOR_H*/

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/327f358e/proton-c/bindings/cpp/include/proton/Acking.hpp
----------------------------------------------------------------------
diff --git a/proton-c/bindings/cpp/include/proton/Acking.hpp b/proton-c/bindings/cpp/include/proton/Acking.hpp
index f9f079f..67da0b1 100644
--- a/proton-c/bindings/cpp/include/proton/Acking.hpp
+++ b/proton-c/bindings/cpp/include/proton/Acking.hpp
@@ -39,6 +39,6 @@ class Acking
 };
 
 
-}} // namespace proton::reactor
+}}
 
 #endif  /*!PROTON_CPP_ACKING_H*/

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/327f358e/proton-c/bindings/cpp/include/proton/BlockingConnection.hpp
----------------------------------------------------------------------
diff --git a/proton-c/bindings/cpp/include/proton/BlockingConnection.hpp b/proton-c/bindings/cpp/include/proton/BlockingConnection.hpp
index 138b239..77345c4 100644
--- a/proton-c/bindings/cpp/include/proton/BlockingConnection.hpp
+++ b/proton-c/bindings/cpp/include/proton/BlockingConnection.hpp
@@ -61,7 +61,6 @@ class BlockingConnection : public Handle<BlockingConnectionImpl>
     friend class PrivateImplRef<BlockingConnection>;
 };
 
-
-}} // namespace proton::reactor
+}}
 
 #endif  /*!PROTON_CPP_BLOCKINGCONNECTION_H*/

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/327f358e/proton-c/bindings/cpp/include/proton/BlockingLink.hpp
----------------------------------------------------------------------
diff --git a/proton-c/bindings/cpp/include/proton/BlockingLink.hpp b/proton-c/bindings/cpp/include/proton/BlockingLink.hpp
index 3eec755..80df739 100644
--- a/proton-c/bindings/cpp/include/proton/BlockingLink.hpp
+++ b/proton-c/bindings/cpp/include/proton/BlockingLink.hpp
@@ -53,7 +53,6 @@ class BlockingLink
     friend class BlockingReceiver;
 };
 
-
-}} // namespace proton::reactor
+}}
 
 #endif  /*!PROTON_CPP_BLOCKINGLINK_H*/

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/327f358e/proton-c/bindings/cpp/include/proton/BlockingSender.hpp
----------------------------------------------------------------------
diff --git a/proton-c/bindings/cpp/include/proton/BlockingSender.hpp b/proton-c/bindings/cpp/include/proton/BlockingSender.hpp
index 64cbdfd..25f09bb 100644
--- a/proton-c/bindings/cpp/include/proton/BlockingSender.hpp
+++ b/proton-c/bindings/cpp/include/proton/BlockingSender.hpp
@@ -48,7 +48,6 @@ class BlockingSender : public BlockingLink
     friend class BlockingConnection;
 };
 
-
-}} // namespace proton::reactor
+}}
 
 #endif  /*!PROTON_CPP_BLOCKINGSENDER_H*/

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/327f358e/proton-c/bindings/cpp/include/proton/Connection.hpp
----------------------------------------------------------------------
diff --git a/proton-c/bindings/cpp/include/proton/Connection.hpp b/proton-c/bindings/cpp/include/proton/Connection.hpp
index e72b091..5656889 100644
--- a/proton-c/bindings/cpp/include/proton/Connection.hpp
+++ b/proton-c/bindings/cpp/include/proton/Connection.hpp
@@ -64,7 +64,6 @@ class Connection : public Endpoint, public Handle<ConnectionImpl>
    friend class ConnectionImpl;
 };
 
-
-}} // namespace proton::reactor
+}}
 
 #endif  /*!PROTON_CPP_CONNECTION_H*/

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/327f358e/proton-c/bindings/cpp/include/proton/Container.hpp
----------------------------------------------------------------------
diff --git a/proton-c/bindings/cpp/include/proton/Container.hpp b/proton-c/bindings/cpp/include/proton/Container.hpp
index 0f61599..7333566 100644
--- a/proton-c/bindings/cpp/include/proton/Container.hpp
+++ b/proton-c/bindings/cpp/include/proton/Container.hpp
@@ -72,6 +72,6 @@ class Container : public Handle<ContainerImpl>
    friend class PrivateImplRef<Container>;
 };
 
-}} // namespace proton::reactor
+}}
 
 #endif  /*!PROTON_CPP_CONTAINER_H*/

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/327f358e/proton-c/bindings/cpp/include/proton/Data.hpp
----------------------------------------------------------------------
diff --git a/proton-c/bindings/cpp/include/proton/Data.hpp b/proton-c/bindings/cpp/include/proton/Data.hpp
index 7f9dad0..30f85b7 100644
--- a/proton-c/bindings/cpp/include/proton/Data.hpp
+++ b/proton-c/bindings/cpp/include/proton/Data.hpp
@@ -29,31 +29,44 @@
 struct pn_data_t;
 
 namespace proton {
-namespace reactor {
 
 /** Base for classes that hold AMQP data. */
-class Data {
+PN_CPP_EXTERN class Data {
   public:
+    explicit Data();
     virtual ~Data();
+    Data(const Data&);
 
-    /** Copies the data */
     Data& operator=(const Data&);
 
     /** Clear the data. */
-    PN_CPP_EXTERN void clear();
+    void clear();
 
     /** True if there are no values. */
-    PN_CPP_EXTERN bool empty() const;
+    bool empty() const;
 
     /** Human readable representation of data. */
     friend std::ostream& operator<<(std::ostream&, const Data&);
 
+    /** The underlying pn_data_t */
+    pn_data_t* pnData() { return data; }
+
+    /** True if this Data object owns it's own pn_data_t, false if it is acting as a "view" */
+    bool own() const { return own_; }
+
+    void swap(Data&);
+
   protected:
-    /** Takes ownership of pd */
-    explicit Data(pn_data_t* pd=0);
+    /** Does not take ownership, just a view on the data */
+    explicit Data(pn_data_t*);
+
+    /** Does not take ownership, just a view on the data */
+    void view(pn_data_t*);
+
     mutable pn_data_t* data;
+    bool own_;
 };
 
 
-}}
+}
 #endif // DATA_H

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/327f358e/proton-c/bindings/cpp/include/proton/Decoder.hpp
----------------------------------------------------------------------
diff --git a/proton-c/bindings/cpp/include/proton/Decoder.hpp b/proton-c/bindings/cpp/include/proton/Decoder.hpp
index 814fb05..c3da9dc 100644
--- a/proton-c/bindings/cpp/include/proton/Decoder.hpp
+++ b/proton-c/bindings/cpp/include/proton/Decoder.hpp
@@ -21,14 +21,16 @@
 
 #include "proton/Data.hpp"
 #include "proton/types.hpp"
-#include "proton/exceptions.hpp"
+#include "proton/Error.hpp"
 #include <iosfwd>
 
 namespace proton {
-namespace reactor {
 
 class Value;
 
+/** Raised by Decoder operations on error */
+struct DecodeError : public Error { explicit DecodeError(const std::string&) throw(); };
+
 /**@file
  * Stream-like decoder from AMQP bytes to C++ values.
  * @ingroup cpp
@@ -64,10 +66,6 @@ You can also extract container values element-by-element, see the Start class.
 */
 PN_CPP_EXTERN class Decoder : public virtual Data {
   public:
-    /** Raised if a Decoder operation fails  */
-    struct Error : public ProtonException {
-        explicit Error(const std::string& msg) throw() : ProtonException(msg) {}
-    };
 
     PN_CPP_EXTERN Decoder();
     PN_CPP_EXTERN ~Decoder();
@@ -215,5 +213,5 @@ template <class T> Decoder& operator>>(Decoder& d, Ref<T, MAP> ref)  {
     return d;
 }
 
-}} // namespace proton::reactor
+}
 #endif // DECODER_H

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/327f358e/proton-c/bindings/cpp/include/proton/Delivery.hpp
----------------------------------------------------------------------
diff --git a/proton-c/bindings/cpp/include/proton/Delivery.hpp b/proton-c/bindings/cpp/include/proton/Delivery.hpp
index 63ecfcd..b90f7fa 100644
--- a/proton-c/bindings/cpp/include/proton/Delivery.hpp
+++ b/proton-c/bindings/cpp/include/proton/Delivery.hpp
@@ -55,7 +55,6 @@ class Delivery : public ProtonHandle<pn_delivery_t>
     friend class ProtonImplRef<Delivery>;
 };
 
-
-}} // namespace proton::reactor
+}}
 
 #endif  /*!PROTON_CPP_DELIVERY_H*/

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/327f358e/proton-c/bindings/cpp/include/proton/Duration.hpp
----------------------------------------------------------------------
diff --git a/proton-c/bindings/cpp/include/proton/Duration.hpp b/proton-c/bindings/cpp/include/proton/Duration.hpp
index 0265e73..288ef9d 100644
--- a/proton-c/bindings/cpp/include/proton/Duration.hpp
+++ b/proton-c/bindings/cpp/include/proton/Duration.hpp
@@ -23,34 +23,33 @@
  */
 
 #include "proton/ImportExport.hpp"
-#include "proton/types.h"
+#include "proton/types.hpp"
 
 namespace proton {
-namespace reactor {
 
 /** @ingroup cpp
  * A duration is a time in milliseconds.
  */
-class Duration
+class Duration : public Comparable<Duration>
 {
   public:
-    PN_CPP_EXTERN explicit Duration(uint64_t milliseconds);
-    PN_CPP_EXTERN uint64_t getMilliseconds() const;
-    PN_CPP_EXTERN static const Duration FOREVER;
-    PN_CPP_EXTERN static const Duration IMMEDIATE;
-    PN_CPP_EXTERN static const Duration SECOND;
-    PN_CPP_EXTERN static const Duration MINUTE;
-  private:
     uint64_t milliseconds;
+    explicit Duration(uint64_t ms) : milliseconds(ms) {}
+
+    bool operator<(Duration d) { return milliseconds < d.milliseconds; }
+    bool operator==(Duration d) { return milliseconds == d.milliseconds; }
+
+    static const Duration FOREVER;
+    static const Duration IMMEDIATE;
+    static const Duration SECOND;
+    static const Duration MINUTE;
 };
 
-PN_CPP_EXTERN Duration operator*(const Duration& duration,
-                                         uint64_t multiplier);
-PN_CPP_EXTERN Duration operator*(uint64_t multiplier,
-                                         const Duration& duration);
-PN_CPP_EXTERN bool operator==(const Duration& a, const Duration& b);
-PN_CPP_EXTERN bool operator!=(const Duration& a, const Duration& b);
+inline Duration operator*(Duration d, uint64_t n) { return Duration(d.milliseconds*n); }
+inline Duration operator*(uint64_t n, Duration d) { return d * n; }
 
-}} // namespace proton::reactor
+inline Timestamp operator+(Timestamp ts, Duration d) { return Timestamp(ts.milliseconds+d.milliseconds); }
+inline Timestamp operator+(Duration d, Timestamp ts) { return ts + d; }
+}
 
 #endif  /*!PROTON_CPP_DURATION_H*/

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/327f358e/proton-c/bindings/cpp/include/proton/Encoder.hpp
----------------------------------------------------------------------
diff --git a/proton-c/bindings/cpp/include/proton/Encoder.hpp b/proton-c/bindings/cpp/include/proton/Encoder.hpp
index e32fce5..aaa8d93 100644
--- a/proton-c/bindings/cpp/include/proton/Encoder.hpp
+++ b/proton-c/bindings/cpp/include/proton/Encoder.hpp
@@ -21,13 +21,13 @@
 
 #include "proton/Data.hpp"
 #include "proton/types.hpp"
-#include "proton/exceptions.hpp"
+#include "proton/Error.hpp"
 #include <iosfwd>
 
 struct pn_data_t;
 
 namespace proton {
-namespace reactor {
+
 
 class Value;
 
@@ -36,6 +36,9 @@ class Value;
  * @ingroup cpp
 */
 
+/** Raised by Encoder operations on error */
+struct EncodeError : public Error { explicit EncodeError(const std::string&) throw(); };
+
 /**
 @ingroup cpp
 
@@ -56,11 +59,6 @@ You can also insert containers element-by-element, see the Start class.
 */
 class Encoder : public virtual Data {
   public:
-    /** Raised if a Encoder operation fails  */
-    struct Error : public ProtonException {
-        explicit Error(const std::string& msg) throw() : ProtonException(msg) {}
-    };
-
     PN_CPP_EXTERN Encoder();
     PN_CPP_EXTERN ~Encoder();
 
@@ -127,6 +125,8 @@ class Encoder : public virtual Data {
     // TODO aconway 2015-06-16: DESCRIBED.
     ///@}
 
+    /** Copy data from a raw pn_data_t */
+    PN_CPP_EXTERN friend Encoder& operator<<(Encoder&, pn_data_t*);
   private:
     PN_CPP_EXTERN Encoder(pn_data_t* pd);
 
@@ -180,5 +180,5 @@ template <class T> Encoder& operator<<(Encoder& e, CRef<T, MAP> m){
 }
 
 
-}}
+}
 #endif // ENCODER_H

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/327f358e/proton-c/bindings/cpp/include/proton/Endpoint.hpp
----------------------------------------------------------------------
diff --git a/proton-c/bindings/cpp/include/proton/Endpoint.hpp b/proton-c/bindings/cpp/include/proton/Endpoint.hpp
index e68ffbf..2736047 100644
--- a/proton-c/bindings/cpp/include/proton/Endpoint.hpp
+++ b/proton-c/bindings/cpp/include/proton/Endpoint.hpp
@@ -53,6 +53,6 @@ class Endpoint
 };
 
 
-}} // namespace proton::reactor
+}}
 
 #endif  /*!PROTON_CPP_ENDPOINT_H*/

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/327f358e/proton-c/bindings/cpp/include/proton/Error.hpp
----------------------------------------------------------------------
diff --git a/proton-c/bindings/cpp/include/proton/Error.hpp b/proton-c/bindings/cpp/include/proton/Error.hpp
new file mode 100644
index 0000000..a3d3242
--- /dev/null
+++ b/proton-c/bindings/cpp/include/proton/Error.hpp
@@ -0,0 +1,42 @@
+#ifndef PROTON_CPP_EXCEPTIONS_H
+#define PROTON_CPP_EXCEPTIONS_H
+
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+#include <stdexcept>
+
+namespace proton {
+
+/** @ingroup cpp
+ * Functions in the proton namespace throw a subclass of proton::Error on error.
+ */
+struct Error : public std::runtime_error { explicit Error(const std::string&) throw(); };
+
+/** Raised if a message is rejected */
+struct MessageReject : public Error { explicit MessageReject(const std::string&) throw(); };
+
+/** Raised if a message is released */
+struct MessageRelease : public Error { explicit MessageRelease(const std::string&) throw(); };
+
+
+}
+
+#endif  /*!PROTON_CPP_EXCEPTIONS_H*/

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/327f358e/proton-c/bindings/cpp/include/proton/Event.hpp
----------------------------------------------------------------------
diff --git a/proton-c/bindings/cpp/include/proton/Event.hpp b/proton-c/bindings/cpp/include/proton/Event.hpp
index f808dd1..db85c9c 100644
--- a/proton-c/bindings/cpp/include/proton/Event.hpp
+++ b/proton-c/bindings/cpp/include/proton/Event.hpp
@@ -54,7 +54,6 @@ class Event
     PN_CPP_EXTERN Event& operator=(const Event&);
 };
 
-
-}} // namespace proton::reactor
+}}
 
 #endif  /*!PROTON_CPP_EVENT_H*/

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/327f358e/proton-c/bindings/cpp/include/proton/Handle.hpp
----------------------------------------------------------------------
diff --git a/proton-c/bindings/cpp/include/proton/Handle.hpp b/proton-c/bindings/cpp/include/proton/Handle.hpp
index f8fc81b..648658b 100644
--- a/proton-c/bindings/cpp/include/proton/Handle.hpp
+++ b/proton-c/bindings/cpp/include/proton/Handle.hpp
@@ -69,11 +69,11 @@ template <class T> class Handle {
     typedef T Impl;
     PROTON_CPP_INLINE_EXTERN Handle() :impl() {}
 
-    Impl* impl;
+    mutable Impl* impl;
 
   friend class PrivateImplRef<T>;
 };
 
-}} // namespace proton::reactor
+}}
 
 #endif  /*!PROTON_CPP_HANDLE_H*/

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/327f358e/proton-c/bindings/cpp/include/proton/Handler.hpp
----------------------------------------------------------------------
diff --git a/proton-c/bindings/cpp/include/proton/Handler.hpp b/proton-c/bindings/cpp/include/proton/Handler.hpp
index d20fbeb..c66eecb 100644
--- a/proton-c/bindings/cpp/include/proton/Handler.hpp
+++ b/proton-c/bindings/cpp/include/proton/Handler.hpp
@@ -44,7 +44,6 @@ class PN_CPP_EXTERN Handler
     std::vector<Handler *>childHandlers;
 };
 
-
-}} // namespace proton::reactor
+}}
 
 #endif  /*!PROTON_CPP_HANDLER_H*/

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/327f358e/proton-c/bindings/cpp/include/proton/Link.hpp
----------------------------------------------------------------------
diff --git a/proton-c/bindings/cpp/include/proton/Link.hpp b/proton-c/bindings/cpp/include/proton/Link.hpp
index bf5a9a7..5500041 100644
--- a/proton-c/bindings/cpp/include/proton/Link.hpp
+++ b/proton-c/bindings/cpp/include/proton/Link.hpp
@@ -61,8 +61,7 @@ class Link : public Endpoint, public ProtonHandle<pn_link_t>
     bool senderLink;
 };
 
-
-}} // namespace proton::reactor
+}}
 
 #include "proton/Sender.hpp"
 #include "proton/Receiver.hpp"

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/327f358e/proton-c/bindings/cpp/include/proton/Message.hpp
----------------------------------------------------------------------
diff --git a/proton-c/bindings/cpp/include/proton/Message.hpp b/proton-c/bindings/cpp/include/proton/Message.hpp
index f94f58b..b35eb18 100644
--- a/proton-c/bindings/cpp/include/proton/Message.hpp
+++ b/proton-c/bindings/cpp/include/proton/Message.hpp
@@ -23,94 +23,90 @@
  */
 #include "proton/ImportExport.hpp"
 #include "proton/ProtonHandle.hpp"
-#include "proton/message.h"
+#include "proton/Value.hpp"
+#include "proton/Message.hpp"
 #include <string>
 
+struct pn_message_t;
+struct pn_data_t;
 
 namespace proton {
-namespace reactor {
 
-class Message : public ProtonHandle<pn_message_t>
+// FIXME aconway 2015-06-17: documentation of properties.
+PN_CPP_EXTERN class Message : public reactor::ProtonHandle<pn_message_t>
 {
   public:
-    PN_CPP_EXTERN Message();
-    PN_CPP_EXTERN Message(pn_message_t *);
-    PN_CPP_EXTERN Message(const Message&);
-    PN_CPP_EXTERN Message& operator=(const Message&);
-    PN_CPP_EXTERN ~Message();
+    Message();
+    Message(pn_message_t *);
+    Message(const Message&);
+    Message& operator=(const Message&);
+    ~Message();
 
-    PN_CPP_EXTERN pn_message_t *getPnMessage() const;
+    pn_message_t *pnMessage() const;
 
-    // FIXME aconway 2015-06-11: get rid of get/set prefixes
+    void id(const Value& id);
+    Value id() const;
 
-    // FIXME aconway 2015-06-11: use Value not string to allow full range of AMQP types.
-    PN_CPP_EXTERN void setId(uint64_t id);
-    PN_CPP_EXTERN uint64_t getId();
-    PN_CPP_EXTERN void setId(const std::string &id);
-    PN_CPP_EXTERN std::string getStringId();
-    PN_CPP_EXTERN void setId(const char *p, size_t len);
-    PN_CPP_EXTERN size_t getId(const char **p);
-    PN_CPP_EXTERN pn_type_t getIdType();
+    void user(const std::string &user);
+    std::string user() const;
 
-    PN_CPP_EXTERN void setUserId(const std::string &id);
-    PN_CPP_EXTERN std::string getUserId();
+    void address(const std::string &addr);
+    std::string address() const;
 
-    PN_CPP_EXTERN void setAddress(const std::string &addr);
-    PN_CPP_EXTERN std::string getAddress();
+    void subject(const std::string &s);
+    std::string subject() const;
 
-    PN_CPP_EXTERN void setSubject(const std::string &s);
-    PN_CPP_EXTERN std::string getSubject();
+    void replyTo(const std::string &s);
+    std::string replyTo() const;
 
-    PN_CPP_EXTERN void setReplyTo(const std::string &s);
-    PN_CPP_EXTERN std::string getReplyTo();
+    void correlationId(const Value&);
+    Value correlationId() const;
 
-    PN_CPP_EXTERN void setCorrelationId(uint64_t id);
-    PN_CPP_EXTERN uint64_t getCorrelationId();
-    PN_CPP_EXTERN void setCorrelationId(const std::string &id);
-    PN_CPP_EXTERN std::string getStringCorrelationId();
-    PN_CPP_EXTERN void setCorrelationId(const char *p, size_t len);
-    PN_CPP_EXTERN size_t getCorrelationId(const char **p);
+    void contentType(const std::string &s);
+    std::string contentType() const;
 
-    // FIXME aconway 2015-06-11: use Value not string to allow full range of AMQP types.
-    PN_CPP_EXTERN pn_type_t getCorrelationIdType();
+    void contentEncoding(const std::string &s);
+    std::string contentEncoding() const;
 
-    PN_CPP_EXTERN void setContentType(const std::string &s);
-    PN_CPP_EXTERN std::string getContentType();
+    void expiry(Timestamp t);
+    Timestamp expiry() const;
 
-    PN_CPP_EXTERN void setContentEncoding(const std::string &s);
-    PN_CPP_EXTERN std::string getContentEncoding();
+    void creationTime(Timestamp t);
+    Timestamp creationTime() const;
 
-    PN_CPP_EXTERN void setExpiry(pn_timestamp_t t);
-    PN_CPP_EXTERN pn_timestamp_t getExpiry();
+    void groupId(const std::string &s);
+    std::string groupId() const;
 
-    PN_CPP_EXTERN void setCreationTime(pn_timestamp_t t);
-    PN_CPP_EXTERN pn_timestamp_t getCreationTime();
+    void replyToGroupId(const std::string &s);
+    std::string replyToGroupId() const;
 
-    PN_CPP_EXTERN void setGroupId(const std::string &s);
-    PN_CPP_EXTERN std::string getGroupId();
+    /** Set the body to an AMQP value. */
+    void body(const Value&);
 
-    PN_CPP_EXTERN void setReplyToGroupId(const std::string &s);
-    PN_CPP_EXTERN std::string getReplyToGroupId();
+    /** Template to convert any type to a Value and set as the body */
+    template <class T> void body(const T& v) { body(Value(v)); }
 
-    // FIXME aconway 2015-06-11: use Values for body.
-    PN_CPP_EXTERN void setBody(const std::string &data);
-    PN_CPP_EXTERN std::string getBody();
+    /** Set the body to a sequence of sections containing AMQP values. */
+    void body(const Values&);
 
-    PN_CPP_EXTERN void getBody(std::string &str);
+    const Values& body() const;
 
-    PN_CPP_EXTERN void setBody(const char *, size_t len);
-    PN_CPP_EXTERN size_t getBody(char *, size_t len);
-    PN_CPP_EXTERN size_t getBinaryBodySize();
+    Values& body(); ///< Allows in-place modification of body sections.
 
+    // FIXME aconway 2015-06-17: consistent and flexible treatment of buffers.
+    // Allow convenient std::string encoding/decoding (with re-use of existing
+    // string capacity) but also need to allow encoding/decoding of non-string
+    // buffers. Introduce a buffer type with begin/end pointers?
 
-    PN_CPP_EXTERN void encode(std::string &data);
-    PN_CPP_EXTERN void decode(const std::string &data);
+    void encode(std::string &data);
+    std::string encode();
+    void decode(const std::string &data);
 
   private:
-    friend class ProtonImplRef<Message>;
+    mutable Values body_;
+  friend class reactor::ProtonImplRef<Message>;
 };
 
-
-}} // namespace proton::reactor
+}
 
 #endif  /*!PROTON_CPP_MESSAGE_H*/

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/327f358e/proton-c/bindings/cpp/include/proton/MessagingAdapter.hpp
----------------------------------------------------------------------
diff --git a/proton-c/bindings/cpp/include/proton/MessagingAdapter.hpp b/proton-c/bindings/cpp/include/proton/MessagingAdapter.hpp
index 7c6fa79..243e049 100644
--- a/proton-c/bindings/cpp/include/proton/MessagingAdapter.hpp
+++ b/proton-c/bindings/cpp/include/proton/MessagingAdapter.hpp
@@ -34,7 +34,6 @@ namespace reactor {
 
 // Combine's Python's: EndpointStateHandler, IncomingMessageHandler, OutgoingMessageHandler
 
-
 class MessagingAdapter : public MessagingHandler
 {
   public:
@@ -73,7 +72,6 @@ class MessagingAdapter : public MessagingHandler
     MessagingHandler &delegate;  // The handler for generated MessagingEvent's
 };
 
-
-}} // namespace proton::reactor
+}}
 
 #endif  /*!PROTON_CPP_MESSAGING_ADAPTER_H*/

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/327f358e/proton-c/bindings/cpp/include/proton/MessagingEvent.hpp
----------------------------------------------------------------------
diff --git a/proton-c/bindings/cpp/include/proton/MessagingEvent.hpp b/proton-c/bindings/cpp/include/proton/MessagingEvent.hpp
index a73a7ad..e80f44b 100644
--- a/proton-c/bindings/cpp/include/proton/MessagingEvent.hpp
+++ b/proton-c/bindings/cpp/include/proton/MessagingEvent.hpp
@@ -94,7 +94,6 @@ class MessagingEvent : public ProtonEvent
     MessagingEvent(const MessagingEvent&);
 };
 
-
-}} // namespace proton::reactor
+}}
 
 #endif  /*!PROTON_CPP_MESSAGINGEVENT_H*/

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/327f358e/proton-c/bindings/cpp/include/proton/MessagingHandler.hpp
----------------------------------------------------------------------
diff --git a/proton-c/bindings/cpp/include/proton/MessagingHandler.hpp b/proton-c/bindings/cpp/include/proton/MessagingHandler.hpp
index ea712a6..06858e3 100644
--- a/proton-c/bindings/cpp/include/proton/MessagingHandler.hpp
+++ b/proton-c/bindings/cpp/include/proton/MessagingHandler.hpp
@@ -91,7 +91,6 @@ class PN_CPP_EXTERN MessagingHandler : public ProtonHandler , public Acking
     void createHelpers();
 };
 
-
-}} // namespace proton::reactor
+}}
 
 #endif  /*!PROTON_CPP_MESSAGING_HANDLER_H*/

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/327f358e/proton-c/bindings/cpp/include/proton/ProtonEvent.hpp
----------------------------------------------------------------------
diff --git a/proton-c/bindings/cpp/include/proton/ProtonEvent.hpp b/proton-c/bindings/cpp/include/proton/ProtonEvent.hpp
index 88358c9..0d1d534 100644
--- a/proton-c/bindings/cpp/include/proton/ProtonEvent.hpp
+++ b/proton-c/bindings/cpp/include/proton/ProtonEvent.hpp
@@ -51,7 +51,6 @@ class ProtonEvent : public Event
     Container &container;
 };
 
-
-}} // namespace proton::reactor
+}}
 
 #endif  /*!PROTON_CPP_PROTONEVENT_H*/

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/327f358e/proton-c/bindings/cpp/include/proton/ProtonHandle.hpp
----------------------------------------------------------------------
diff --git a/proton-c/bindings/cpp/include/proton/ProtonHandle.hpp b/proton-c/bindings/cpp/include/proton/ProtonHandle.hpp
index 1170753..213bc14 100644
--- a/proton-c/bindings/cpp/include/proton/ProtonHandle.hpp
+++ b/proton-c/bindings/cpp/include/proton/ProtonHandle.hpp
@@ -58,11 +58,11 @@ template <class T> class ProtonHandle {
     typedef T Impl;
     PROTON_CPP_INLINE_EXTERN ProtonHandle() :impl() {}
 
-    Impl* impl;
+    mutable Impl* impl;
 
   friend class ProtonImplRef<T>;
 };
 
-}} // namespace proton::reactor
+}}
 
 #endif  /*!PROTON_CPP_PROTONHANDLE_H*/

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/327f358e/proton-c/bindings/cpp/include/proton/ProtonHandler.hpp
----------------------------------------------------------------------
diff --git a/proton-c/bindings/cpp/include/proton/ProtonHandler.hpp b/proton-c/bindings/cpp/include/proton/ProtonHandler.hpp
index 91d8bd9..799ca89 100644
--- a/proton-c/bindings/cpp/include/proton/ProtonHandler.hpp
+++ b/proton-c/bindings/cpp/include/proton/ProtonHandler.hpp
@@ -77,7 +77,6 @@ class ProtonHandler : public Handler
     virtual void onUnhandled(Event &e);
 };
 
-
-}} // namespace proton::reactor
+}}
 
 #endif  /*!PROTON_CPP_PROTONHANDLER_H*/

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/327f358e/proton-c/bindings/cpp/include/proton/Receiver.hpp
----------------------------------------------------------------------
diff --git a/proton-c/bindings/cpp/include/proton/Receiver.hpp b/proton-c/bindings/cpp/include/proton/Receiver.hpp
index a913b7b..ad22302 100644
--- a/proton-c/bindings/cpp/include/proton/Receiver.hpp
+++ b/proton-c/bindings/cpp/include/proton/Receiver.hpp
@@ -42,7 +42,6 @@ class Receiver : public Link
     virtual void verifyType(pn_link_t *l);
 };
 
-
-}} // namespace proton::reactor
+}}
 
 #endif  /*!PROTON_CPP_RECEIVER_H*/

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/327f358e/proton-c/bindings/cpp/include/proton/Sender.hpp
----------------------------------------------------------------------
diff --git a/proton-c/bindings/cpp/include/proton/Sender.hpp b/proton-c/bindings/cpp/include/proton/Sender.hpp
index bb39b6d..3a3ee41 100644
--- a/proton-c/bindings/cpp/include/proton/Sender.hpp
+++ b/proton-c/bindings/cpp/include/proton/Sender.hpp
@@ -47,6 +47,6 @@ class Sender : public Link
 };
 
 
-}} // namespace proton::reactor
+}}
 
 #endif  /*!PROTON_CPP_SENDER_H*/

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/327f358e/proton-c/bindings/cpp/include/proton/Session.hpp
----------------------------------------------------------------------
diff --git a/proton-c/bindings/cpp/include/proton/Session.hpp b/proton-c/bindings/cpp/include/proton/Session.hpp
index 4a3eccc..1f19b32 100644
--- a/proton-c/bindings/cpp/include/proton/Session.hpp
+++ b/proton-c/bindings/cpp/include/proton/Session.hpp
@@ -57,7 +57,6 @@ class Transport;
     friend class ProtonImplRef<Session>;
 };
 
-
-}} // namespace proton::reactor
+}}
 
 #endif  /*!PROTON_CPP_SESSION_H*/

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/327f358e/proton-c/bindings/cpp/include/proton/Terminus.hpp
----------------------------------------------------------------------
diff --git a/proton-c/bindings/cpp/include/proton/Terminus.hpp b/proton-c/bindings/cpp/include/proton/Terminus.hpp
index 0b798b3..b13165e 100644
--- a/proton-c/bindings/cpp/include/proton/Terminus.hpp
+++ b/proton-c/bindings/cpp/include/proton/Terminus.hpp
@@ -76,6 +76,6 @@ class Terminus : public ProtonHandle<pn_terminus_t>
 };
 
 
-}} // namespace proton::reactor
+}}
 
 #endif  /*!PROTON_CPP_TERMINUS_H*/

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/327f358e/proton-c/bindings/cpp/include/proton/Transport.hpp
----------------------------------------------------------------------
diff --git a/proton-c/bindings/cpp/include/proton/Transport.hpp b/proton-c/bindings/cpp/include/proton/Transport.hpp
index ca93674..f81e483 100644
--- a/proton-c/bindings/cpp/include/proton/Transport.hpp
+++ b/proton-c/bindings/cpp/include/proton/Transport.hpp
@@ -43,6 +43,6 @@ class Transport
 };
 
 
-}} // namespace proton::reactor
+}}
 
 #endif  /*!PROTON_CPP_TRANSPORT_H*/

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/327f358e/proton-c/bindings/cpp/include/proton/Value.hpp
----------------------------------------------------------------------
diff --git a/proton-c/bindings/cpp/include/proton/Value.hpp b/proton-c/bindings/cpp/include/proton/Value.hpp
index 9448dc5..a5f2edf 100644
--- a/proton-c/bindings/cpp/include/proton/Value.hpp
+++ b/proton-c/bindings/cpp/include/proton/Value.hpp
@@ -21,23 +21,29 @@
 
 #include "proton/Values.hpp"
 
+struct pn_data_t;
+
 /**@file
  * Holder for an AMQP value.
  * @ingroup cpp
  */
 namespace proton {
-namespace reactor {
 
 /** Holds a single AMQP value. */
 PN_CPP_EXTERN class Value {
   public:
-    PN_CPP_EXTERN Value();
-    PN_CPP_EXTERN Value(const Value&);
+    Value();
+    Value(const Value&);
+
     /** Converting constructor from any settable value */
     template <class T> explicit Value(const T& v);
-    PN_CPP_EXTERN ~Value();
-    PN_CPP_EXTERN Value& operator=(const Value&);
 
+    ~Value();
+
+    Value& operator=(const Value&);
+
+    /** Copy the first value from a raw pn_data_t. */
+    Value& operator=(pn_data_t*);
 
     TypeId type() const;
 
@@ -55,13 +61,13 @@ PN_CPP_EXTERN class Value {
     template<class T> operator T() const;
 
     /** insert a value into an Encoder. */
-    PN_CPP_EXTERN friend Encoder& operator<<(Encoder&, const Value&);
+    friend Encoder& operator<<(Encoder&, const Value&);
 
     /** Extract a value from a decoder. */
-    PN_CPP_EXTERN friend Decoder& operator>>(Decoder&, Value&);
+    friend Decoder& operator>>(Decoder&, Value&);
 
     /** Human readable format */
-    PN_CPP_EXTERN friend std::ostream& operator<<(std::ostream&, const Value&);
+    friend std::ostream& operator<<(std::ostream&, const Value&);
 
     bool operator==(const Value&) const;
     bool operator !=(const Value& v) const{ return !(*this == v); }
@@ -93,6 +99,6 @@ template<class T> Value& Value::operator=(const T& value) { set(value); return *
 template<class T> Value::operator T() const { return get<T>(); }
 
 template<class T> Value::Value(const T& value) { set(value); }
-}}
+}
 
 #endif // VALUE_H

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/327f358e/proton-c/bindings/cpp/include/proton/Values.hpp
----------------------------------------------------------------------
diff --git a/proton-c/bindings/cpp/include/proton/Values.hpp b/proton-c/bindings/cpp/include/proton/Values.hpp
index 0377c0c..604d2be 100644
--- a/proton-c/bindings/cpp/include/proton/Values.hpp
+++ b/proton-c/bindings/cpp/include/proton/Values.hpp
@@ -28,7 +28,7 @@
  */
 
 namespace proton {
-namespace reactor {
+
 
 /** Holds a sequence of AMQP values, allows inserting and extracting.
  *
@@ -38,19 +38,24 @@ PN_CPP_EXTERN class Values : public Encoder, public Decoder {
   public:
     Values();
     Values(const Values&);
+
+    /** Does not take ownership, just a view on the data */
+    Values(pn_data_t*);
+
     ~Values();
 
     /** Copy data from another Values */
     Values& operator=(const Values&);
 
-    PN_CPP_EXTERN Values& rewind();
+    Values& rewind();
+
 
-  private:
   friend class Value;
+  friend class Message;
 };
 
 PN_CPP_EXTERN std::ostream& operator<<(std::ostream&, const Values&);
 
-}}
+}
 
 #endif // VALUES_H

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/327f358e/proton-c/bindings/cpp/include/proton/WaitCondition.hpp
----------------------------------------------------------------------
diff --git a/proton-c/bindings/cpp/include/proton/WaitCondition.hpp b/proton-c/bindings/cpp/include/proton/WaitCondition.hpp
index a960c42..12c7708 100644
--- a/proton-c/bindings/cpp/include/proton/WaitCondition.hpp
+++ b/proton-c/bindings/cpp/include/proton/WaitCondition.hpp
@@ -40,6 +40,6 @@ class WaitCondition
 };
 
 
-}} // namespace proton::reactor
+}}
 
 #endif  /*!PROTON_CPP_WAITCONDITION_H*/

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/327f358e/proton-c/bindings/cpp/include/proton/exceptions.hpp
----------------------------------------------------------------------
diff --git a/proton-c/bindings/cpp/include/proton/exceptions.hpp b/proton-c/bindings/cpp/include/proton/exceptions.hpp
deleted file mode 100644
index 9fdef94..0000000
--- a/proton-c/bindings/cpp/include/proton/exceptions.hpp
+++ /dev/null
@@ -1,49 +0,0 @@
-#ifndef PROTON_CPP_EXCEPTIONS_H
-#define PROTON_CPP_EXCEPTIONS_H
-
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-#include <stdexcept>
-
-namespace proton {
-namespace reactor {
-
-class ProtonException : public std::runtime_error
-{
-  public:
-    explicit ProtonException(const std::string& msg) throw() : std::runtime_error(msg) {}
-};
-
-class MessageReject : public ProtonException
-{
-  public:
-    explicit MessageReject(const std::string& msg) throw() : ProtonException(msg) {}
-};
-
-class MessageRelease : public ProtonException
-{
-  public:
-    explicit MessageRelease(const std::string& msg) throw() : ProtonException(msg) {}
-};
-
-}} // namespace proton::reactor
-
-#endif  /*!PROTON_CPP_EXCEPTIONS_H*/

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/327f358e/proton-c/bindings/cpp/include/proton/types.hpp
----------------------------------------------------------------------
diff --git a/proton-c/bindings/cpp/include/proton/types.hpp b/proton-c/bindings/cpp/include/proton/types.hpp
index 819abb1..62b2f53 100644
--- a/proton-c/bindings/cpp/include/proton/types.hpp
+++ b/proton-c/bindings/cpp/include/proton/types.hpp
@@ -33,7 +33,7 @@
  */
 
 namespace proton {
-namespace reactor {
+
 
 /** TypeId identifies an AMQP type */
 enum TypeId {
@@ -98,11 +98,14 @@ typedef double Double;
 
 ///@internal
 pn_bytes_t pn_bytes(const std::string&);
+//@internal
+std::string str(const pn_bytes_t& b);
 
 ///@internal
 #define STRING_LIKE(NAME)                                               \
     PN_CPP_EXTERN struct NAME : public std::string{                     \
         NAME(const std::string& s=std::string()) : std::string(s) {}    \
+        NAME(const char* s) : std::string(s) {}    \
         NAME(const pn_bytes_t& b) : std::string(b.start, b.size) {}     \
         operator pn_bytes_t() const { return pn_bytes(*this); }         \
     }
@@ -141,10 +144,11 @@ typedef Decimal<pn_decimal32_t> Decimal32;
 typedef Decimal<pn_decimal64_t> Decimal64;
 typedef Decimal<pn_decimal128_t> Decimal128;
 
-PN_CPP_EXTERN struct Timestamp {
+PN_CPP_EXTERN struct Timestamp : public Comparable<Timestamp> {
     pn_timestamp_t milliseconds; ///< Since the epoch 00:00:00 (UTC), 1 January 1970.
     Timestamp(int64_t ms=0) : milliseconds(ms) {}
     operator pn_timestamp_t() const { return milliseconds; }
+    bool operator==(const Timestamp& x) { return milliseconds == x.milliseconds; }
     bool operator<(const Timestamp& x) { return milliseconds < x.milliseconds; }
 };
 
@@ -245,6 +249,6 @@ inline Finish finish() { return Finish(); }
 PN_CPP_EXTERN struct Skip{};
 inline Skip skip() { return Skip(); }
 
-}}
+}
 
 #endif // TYPES_H

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/327f358e/proton-c/bindings/cpp/src/Acceptor.cpp
----------------------------------------------------------------------
diff --git a/proton-c/bindings/cpp/src/Acceptor.cpp b/proton-c/bindings/cpp/src/Acceptor.cpp
index 6d3d1af..2756a0a 100644
--- a/proton-c/bindings/cpp/src/Acceptor.cpp
+++ b/proton-c/bindings/cpp/src/Acceptor.cpp
@@ -20,7 +20,7 @@
  */
 
 #include "proton/Acceptor.hpp"
-#include "proton/exceptions.hpp"
+#include "proton/Error.hpp"
 #include "ProtonImplRef.hpp"
 #include "Msg.hpp"
 

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/327f358e/proton-c/bindings/cpp/src/Connection.cpp
----------------------------------------------------------------------
diff --git a/proton-c/bindings/cpp/src/Connection.cpp b/proton-c/bindings/cpp/src/Connection.cpp
index 006b567..2f31013 100644
--- a/proton-c/bindings/cpp/src/Connection.cpp
+++ b/proton-c/bindings/cpp/src/Connection.cpp
@@ -21,7 +21,7 @@
 #include "proton/Container.hpp"
 #include "proton/Connection.hpp"
 #include "proton/Handler.hpp"
-#include "proton/exceptions.hpp"
+#include "proton/Error.hpp"
 #include "Msg.hpp"
 #include "contexts.hpp"
 #include "ConnectionImpl.hpp"

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/327f358e/proton-c/bindings/cpp/src/ConnectionImpl.cpp
----------------------------------------------------------------------
diff --git a/proton-c/bindings/cpp/src/ConnectionImpl.cpp b/proton-c/bindings/cpp/src/ConnectionImpl.cpp
index 450d504..5fa2fb2 100644
--- a/proton-c/bindings/cpp/src/ConnectionImpl.cpp
+++ b/proton-c/bindings/cpp/src/ConnectionImpl.cpp
@@ -20,7 +20,7 @@
  */
 #include "proton/Container.hpp"
 #include "proton/Handler.hpp"
-#include "proton/exceptions.hpp"
+#include "proton/Error.hpp"
 #include "ConnectionImpl.hpp"
 #include "proton/Transport.hpp"
 #include "Msg.hpp"
@@ -73,7 +73,7 @@ ConnectionImpl::~ConnectionImpl() {
 Transport &ConnectionImpl::getTransport() {
     if (transport)
         return *transport;
-    throw ProtonException(MSG("Connection has no transport"));
+    throw Error(MSG("Connection has no transport"));
 }
 
 Handler* ConnectionImpl::getOverride() { return override; }
@@ -99,7 +99,7 @@ std::string ConnectionImpl::getHostname() {
 
 Connection &ConnectionImpl::getConnection() {
     // Endpoint interface.  Should be implemented in the Connection object.
-    throw ProtonException(MSG("Internal error"));
+    throw Error(MSG("Internal error"));
 }
 
 Container &ConnectionImpl::getContainer() {
@@ -117,16 +117,16 @@ void ConnectionImpl::reactorDetach() {
 
 Connection &ConnectionImpl::getReactorReference(pn_connection_t *conn) {
     if (!conn)
-        throw ProtonException(MSG("Null Proton connection"));
+        throw Error(MSG("Null Proton connection"));
     ConnectionImpl *impl = getConnectionContext(conn);
     if (!impl) {
         // First time we have seen this connection
         pn_reactor_t *reactor = pn_object_reactor(conn);
         if (!reactor)
-            throw ProtonException(MSG("Invalid Proton connection specifier"));
+            throw Error(MSG("Invalid Proton connection specifier"));
         Container container(getContainerContext(reactor));
         if (!container)  // can't be one created by our container
-            throw ProtonException(MSG("Unknown Proton connection specifier"));
+            throw Error(MSG("Unknown Proton connection specifier"));
         impl = new ConnectionImpl(container, *conn);
     }
     return impl->reactorReference;

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/327f358e/proton-c/bindings/cpp/src/Container.cpp
----------------------------------------------------------------------
diff --git a/proton-c/bindings/cpp/src/Container.cpp b/proton-c/bindings/cpp/src/Container.cpp
index 4fa6c6a..16de0c1 100644
--- a/proton-c/bindings/cpp/src/Container.cpp
+++ b/proton-c/bindings/cpp/src/Container.cpp
@@ -24,7 +24,7 @@
 #include "proton/Session.hpp"
 #include "proton/MessagingAdapter.hpp"
 #include "proton/Acceptor.hpp"
-#include "proton/exceptions.hpp"
+#include "proton/Error.hpp"
 #include "ContainerImpl.hpp"
 #include "PrivateImplRef.hpp"
 

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/327f358e/proton-c/bindings/cpp/src/ContainerImpl.cpp
----------------------------------------------------------------------
diff --git a/proton-c/bindings/cpp/src/ContainerImpl.cpp b/proton-c/bindings/cpp/src/ContainerImpl.cpp
index 80137b5..29c1e72 100644
--- a/proton-c/bindings/cpp/src/ContainerImpl.cpp
+++ b/proton-c/bindings/cpp/src/ContainerImpl.cpp
@@ -24,7 +24,7 @@
 #include "proton/Session.hpp"
 #include "proton/MessagingAdapter.hpp"
 #include "proton/Acceptor.hpp"
-#include "proton/exceptions.hpp"
+#include "proton/Error.hpp"
 
 #include "Msg.hpp"
 #include "ContainerImpl.hpp"
@@ -205,7 +205,7 @@ ContainerImpl::~ContainerImpl() {
 }
 
 Connection ContainerImpl::connect(std::string &host, Handler *h) {
-    if (!reactor) throw ProtonException(MSG("Container not started"));
+    if (!reactor) throw Error(MSG("Container not started"));
     Container cntnr(this);
     Connection connection(cntnr, handler);
     Connector *connector = new Connector(connection);
@@ -229,17 +229,17 @@ Duration ContainerImpl::getTimeout() {
 }
 
 void ContainerImpl::setTimeout(Duration timeout) {
-    if (timeout == Duration::FOREVER || timeout.getMilliseconds() > PN_MILLIS_MAX)
+    if (timeout == Duration::FOREVER || timeout.milliseconds > PN_MILLIS_MAX)
         pn_reactor_set_timeout(reactor, PN_MILLIS_MAX);
     else {
-        pn_millis_t tmo = timeout.getMilliseconds();
+        pn_millis_t tmo = timeout.milliseconds;
         pn_reactor_set_timeout(reactor, tmo);
     }
 }
 
 
 Sender ContainerImpl::createSender(Connection &connection, std::string &addr, Handler *h) {
-    if (!reactor) throw ProtonException(MSG("Container not started"));
+    if (!reactor) throw Error(MSG("Container not started"));
     Session session = getDefaultSession(connection.getPnConnection(), &getImpl(connection)->defaultSession);
     Sender snd = session.createSender(containerId  + '-' + addr);
     pn_link_t *lnk = snd.getPnLink();
@@ -253,7 +253,7 @@ Sender ContainerImpl::createSender(Connection &connection, std::string &addr, Ha
 }
 
 Sender ContainerImpl::createSender(std::string &urlString) {
-    if (!reactor) throw ProtonException(MSG("Container not started"));
+    if (!reactor) throw Error(MSG("Container not started"));
     Connection conn = connect(urlString, 0);
     Session session = getDefaultSession(conn.getPnConnection(), &getImpl(conn)->defaultSession);
     std::string path = Url(urlString).getPath();
@@ -264,7 +264,7 @@ Sender ContainerImpl::createSender(std::string &urlString) {
 }
 
 Receiver ContainerImpl::createReceiver(Connection &connection, std::string &addr) {
-    if (!reactor) throw ProtonException(MSG("Container not started"));
+    if (!reactor) throw Error(MSG("Container not started"));
     ConnectionImpl *connImpl = getImpl(connection);
     Session session = getDefaultSession(connImpl->pnConnection, &connImpl->defaultSession);
     Receiver rcv = session.createReceiver(containerId + '-' + addr);
@@ -274,7 +274,7 @@ Receiver ContainerImpl::createReceiver(Connection &connection, std::string &addr
 }
 
 Receiver ContainerImpl::createReceiver(const std::string &urlString) {
-    if (!reactor) throw ProtonException(MSG("Container not started"));
+    if (!reactor) throw Error(MSG("Container not started"));
     // TODO: const cleanup of API
     Connection conn = connect(const_cast<std::string &>(urlString), 0);
     Session session = getDefaultSession(conn.getPnConnection(), &getImpl(conn)->defaultSession);
@@ -290,11 +290,11 @@ Acceptor ContainerImpl::acceptor(const std::string &host, const std::string &por
     if (acptr)
         return Acceptor(acptr);
     else
-        throw ProtonException(MSG("accept fail: " << pn_error_text(pn_io_error(pn_reactor_io(reactor))) << "(" << host << ":" << port << ")"));
+        throw Error(MSG("accept fail: " << pn_error_text(pn_io_error(pn_reactor_io(reactor))) << "(" << host << ":" << port << ")"));
 }
 
 Acceptor ContainerImpl::listen(const std::string &urlString) {
-    if (!reactor) throw ProtonException(MSG("Container not started"));
+    if (!reactor) throw Error(MSG("Container not started"));
     Url url(urlString);
     // TODO: SSL
     return acceptor(url.getHost(), url.getPort());
@@ -307,7 +307,7 @@ pn_handler_t *ContainerImpl::wrapHandler(Handler *h) {
 
 
 void ContainerImpl::initializeReactor() {
-    if (reactor) throw ProtonException(MSG("Container already running"));
+    if (reactor) throw Error(MSG("Container already running"));
     reactor = pn_reactor();
 
     // Set our context on the reactor
@@ -343,26 +343,26 @@ void ContainerImpl::start() {
 }
 
 bool ContainerImpl::process() {
-    if (!reactor) throw ProtonException(MSG("Container not started"));
+    if (!reactor) throw Error(MSG("Container not started"));
     bool result = pn_reactor_process(reactor);
     // TODO: check errors
     return result;
 }
 
 void ContainerImpl::stop() {
-    if (!reactor) throw ProtonException(MSG("Container not started"));
+    if (!reactor) throw Error(MSG("Container not started"));
     pn_reactor_stop(reactor);
     // TODO: check errors
 }
 
 void ContainerImpl::wakeup() {
-    if (!reactor) throw ProtonException(MSG("Container not started"));
+    if (!reactor) throw Error(MSG("Container not started"));
     pn_reactor_wakeup(reactor);
     // TODO: check errors
 }
 
 bool ContainerImpl::isQuiesced() {
-    if (!reactor) throw ProtonException(MSG("Container not started"));
+    if (!reactor) throw Error(MSG("Container not started"));
     return pn_reactor_quiesced(reactor);
 }
 

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/327f358e/proton-c/bindings/cpp/src/Data.cpp
----------------------------------------------------------------------
diff --git a/proton-c/bindings/cpp/src/Data.cpp b/proton-c/bindings/cpp/src/Data.cpp
index 3cfa715..dc017ae 100644
--- a/proton-c/bindings/cpp/src/Data.cpp
+++ b/proton-c/bindings/cpp/src/Data.cpp
@@ -18,20 +18,39 @@
  */
 
 #include "proton/Data.hpp"
-#include <proton/codec.h>
+#include "proton/codec.h"
 #include "proton_bits.hpp"
+#include <utility>
 
 namespace proton {
-namespace reactor {
 
-Data::Data(pn_data_t* p) : data(p ? p : pn_data(0)) {}
+Data::Data() : data(pn_data(0)), own_(true) {}
 
-Data::~Data() { if (data) pn_data_free(data); }
+Data::Data(pn_data_t* p) : data(p), own_(false) { }
+
+Data::Data(const Data& x) : data(pn_data(0)), own_(true) { *this = x; }
+
+Data::~Data() { if (own_ && data) pn_data_free(data); }
+
+void Data::view(pn_data_t* newData) {
+    if (data && own_) pn_data_free(data);
+    data = newData;
+    own_ = false;
+}
+
+void Data::swap(Data& x) {
+    std::swap(data, x.data);
+    std::swap(own_, x.own_);
+}
 
 Data& Data::operator=(const Data& x) {
     if (this != &x) {
-        pn_data_free(data);
-        data = pn_data(pn_data_size(x.data));
+        if (!own_) {
+            data = pn_data(pn_data_size(x.data));
+            own_ = true;
+        } else {
+            clear();
+        }
         pn_data_copy(data, x.data);
     }
     return *this;
@@ -41,6 +60,6 @@ void Data::clear() { pn_data_clear(data); }
 
 bool Data::empty() const { return pn_data_size(data) == 0; }
 
-std::ostream& operator<<(std::ostream& o, const Data& d) { return o << Object(d.data); }
+std::ostream& operator<<(std::ostream& o, const Data& d) { return o << PnObject(d.data); }
 
-}} // namespace proton::reactor
+}

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/327f358e/proton-c/bindings/cpp/src/Decoder.cpp
----------------------------------------------------------------------
diff --git a/proton-c/bindings/cpp/src/Decoder.cpp b/proton-c/bindings/cpp/src/Decoder.cpp
index 6f5b73b..50e6a12 100644
--- a/proton-c/bindings/cpp/src/Decoder.cpp
+++ b/proton-c/bindings/cpp/src/Decoder.cpp
@@ -24,8 +24,6 @@
 #include "Msg.hpp"
 
 namespace proton {
-namespace reactor {
-
 
 /**@file
  *
@@ -38,6 +36,8 @@ Decoder::Decoder(const char* buffer, size_t size) { decode(buffer, size); }
 Decoder::Decoder(const std::string& buffer) { decode(buffer); }
 Decoder::~Decoder() {}
 
+DecodeError::DecodeError(const std::string& msg) throw() : Error("decode: "+msg) {}
+
 namespace {
 struct SaveState {
     pn_data_t* data;
@@ -55,12 +55,10 @@ struct Narrow {
 
 template <class T> T check(T result) {
     if (result < 0)
-        throw Decoder::Error("decode: " + errorStr(result));
+        throw DecodeError("" + errorStr(result));
     return result;
 }
 
-std::string str(const pn_bytes_t& b) { return std::string(b.start, b.size); }
-
 }
 
 void Decoder::decode(const char* i, size_t size) {
@@ -84,13 +82,13 @@ namespace {
 
 void badType(TypeId want, TypeId got) {
     if (want != got)
-        throw Decoder::Error("decode: expected "+typeName(want)+" found "+typeName(got));
+        throw DecodeError("expected "+typeName(want)+" found "+typeName(got));
 }
 
 TypeId preGet(pn_data_t* data) {
-    if (!pn_data_next(data)) throw Decoder::Error("decode: no more data");
+    if (!pn_data_next(data)) throw DecodeError("no more data");
     TypeId t = TypeId(pn_data_type(data));
-    if (t < 0) throw Decoder::Error("decode: invalid data");
+    if (t < 0) throw DecodeError("invalid data");
     return t;
 }
 
@@ -134,7 +132,7 @@ Decoder& operator>>(Decoder& d, Start& s) {
         s.size = 1;
         break;
       default:
-        throw Decoder::Error(MSG("decode: " << s.type << " is not a container type"));
+        throw DecodeError(MSG("" << s.type << " is not a container type"));
     }
     pn_data_enter(d.data);
     ss.cancel();
@@ -146,13 +144,13 @@ Decoder& operator>>(Decoder& d, Finish) { pn_data_exit(d.data); return d; }
 Decoder& operator>>(Decoder& d, Skip) { pn_data_next(d.data); return d; }
 
 Decoder& operator>>(Decoder& d, Value& v) {
-    if (d.data == v.values.data) throw Decoder::Error("decode: extract into self");
+    if (d.data == v.values.data) throw DecodeError("extract into self");
     pn_data_clear(v.values.data);
     {
         Narrow n(d.data);
         check(pn_data_appendn(v.values.data, d.data, 1));
     }
-    if (!pn_data_next(d.data)) throw Decoder::Error("decode: no more data");
+    if (!pn_data_next(d.data)) throw DecodeError("no more data");
     return d;
 }
 
@@ -325,4 +323,4 @@ Decoder& operator>>(Decoder& d, std::string& value) {
     return d;
 }
 
-}} // namespace proton::reactor
+}

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/327f358e/proton-c/bindings/cpp/src/Duration.cpp
----------------------------------------------------------------------
diff --git a/proton-c/bindings/cpp/src/Duration.cpp b/proton-c/bindings/cpp/src/Duration.cpp
index 1c5c5ea..7a11819 100644
--- a/proton-c/bindings/cpp/src/Duration.cpp
+++ b/proton-c/bindings/cpp/src/Duration.cpp
@@ -22,34 +22,10 @@
 #include <limits>
 
 namespace proton {
-namespace reactor {
-
-Duration::Duration(uint64_t ms) : milliseconds(ms) {}
-uint64_t Duration::getMilliseconds() const { return milliseconds; }
-
-Duration operator*(const Duration& duration, uint64_t multiplier)
-{
-    return Duration(duration.getMilliseconds() * multiplier);
-}
-
-Duration operator*(uint64_t multiplier, const Duration& duration)
-{
-    return Duration(duration.getMilliseconds() * multiplier);
-}
-
-bool operator==(const Duration& a, const Duration& b)
-{
-    return a.getMilliseconds() == b.getMilliseconds();
-}
-
-bool operator!=(const Duration& a, const Duration& b)
-{
-    return a.getMilliseconds() != b.getMilliseconds();
-}
 
 const Duration Duration::FOREVER(std::numeric_limits<uint64_t>::max());
 const Duration Duration::IMMEDIATE(0);
 const Duration Duration::SECOND(1000);
 const Duration Duration::MINUTE(SECOND * 60);
 
-}} // namespace proton::reactor
+}

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/327f358e/proton-c/bindings/cpp/src/Encoder.cpp
----------------------------------------------------------------------
diff --git a/proton-c/bindings/cpp/src/Encoder.cpp b/proton-c/bindings/cpp/src/Encoder.cpp
index 0bd6943..892c338 100644
--- a/proton-c/bindings/cpp/src/Encoder.cpp
+++ b/proton-c/bindings/cpp/src/Encoder.cpp
@@ -24,11 +24,12 @@
 #include "Msg.hpp"
 
 namespace proton {
-namespace reactor {
 
 Encoder::Encoder() {}
 Encoder::~Encoder() {}
 
+EncodeError::EncodeError(const std::string& msg) throw() : Error("encode: "+msg) {}
+
 namespace {
 struct SaveState {
     pn_data_t* data;
@@ -40,7 +41,7 @@ struct SaveState {
 
 void check(int result, pn_data_t* data) {
     if (result < 0)
-        throw Encoder::Error("encode: " + errorStr(pn_data_error(data), result));
+        throw EncodeError(errorStr(pn_data_error(data), result));
 }
 }
 
@@ -82,7 +83,7 @@ Encoder& operator<<(Encoder& e, const Start& s) {
       case LIST: pn_data_put_list(e.data); break;
       case DESCRIBED: pn_data_put_described(e.data); break;
       default:
-        throw Encoder::Error(MSG("encode: " << s.type << " is not a container type"));
+        throw EncodeError(MSG("" << s.type << " is not a container type"));
     }
     pn_data_enter(e.data);
     return e;
@@ -150,9 +151,9 @@ template<> struct ClassOf<STRING> { typedef String ValueType; };
 template<> struct ClassOf<SYMBOL> { typedef Symbol ValueType; };
 
 Encoder& operator<<(Encoder& e, const Value& v) {
-    if (e.data == v.values.data) throw Encoder::Error("encode: cannot insert into self");
+    if (e.data == v.values.data) throw EncodeError("cannot insert into self");
     check(pn_data_appendn(e.data, v.values.data, 1), e.data);
     return e;
 }
 
-}} // namespace proton::reactor
+}

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/327f358e/proton-c/bindings/cpp/src/Error.cpp
----------------------------------------------------------------------
diff --git a/proton-c/bindings/cpp/src/Error.cpp b/proton-c/bindings/cpp/src/Error.cpp
new file mode 100644
index 0000000..e97bf5f
--- /dev/null
+++ b/proton-c/bindings/cpp/src/Error.cpp
@@ -0,0 +1,30 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#include "proton/Error.hpp"
+
+namespace proton {
+
+Error::Error(const std::string& msg) throw() : std::runtime_error("proton: "+msg) {}
+
+MessageReject::MessageReject(const std::string& msg) throw() : Error(msg) {}
+
+MessageRelease::MessageRelease(const std::string& msg) throw() : Error(msg) {}
+
+}

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/327f358e/proton-c/bindings/cpp/src/Event.cpp
----------------------------------------------------------------------
diff --git a/proton-c/bindings/cpp/src/Event.cpp b/proton-c/bindings/cpp/src/Event.cpp
index 937e3ed..69825a8 100644
--- a/proton-c/bindings/cpp/src/Event.cpp
+++ b/proton-c/bindings/cpp/src/Event.cpp
@@ -24,7 +24,7 @@
 
 #include "proton/Event.hpp"
 #include "proton/Handler.hpp"
-#include "proton/exceptions.hpp"
+#include "proton/Error.hpp"
 
 #include "Msg.hpp"
 #include "contexts.hpp"
@@ -39,31 +39,31 @@ Event::~Event() {}
 
 Container &Event::getContainer() {
     // Subclasses to override as appropriate
-    throw ProtonException(MSG("No container context for event"));
+    throw Error(MSG("No container context for event"));
 }
 
 Connection &Event::getConnection() {
-    throw ProtonException(MSG("No connection context for Event"));
+    throw Error(MSG("No connection context for Event"));
 }
 
 Sender Event::getSender() {
-    throw ProtonException(MSG("No Sender context for event"));
+    throw Error(MSG("No Sender context for event"));
 }
 
 Receiver Event::getReceiver() {
-    throw ProtonException(MSG("No Receiver context for event"));
+    throw Error(MSG("No Receiver context for event"));
 }
 
 Link Event::getLink() {
-    throw ProtonException(MSG("No Link context for event"));
+    throw Error(MSG("No Link context for event"));
 }
 
 Message Event::getMessage() {
-    throw ProtonException(MSG("No message associated with event"));
+    throw Error(MSG("No message associated with event"));
 }
 
 void Event::setMessage(Message &) {
-    throw ProtonException(MSG("Operation not supported for this type of event"));
+    throw Error(MSG("Operation not supported for this type of event"));
 }
 
 

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/327f358e/proton-c/bindings/cpp/src/Link.cpp
----------------------------------------------------------------------
diff --git a/proton-c/bindings/cpp/src/Link.cpp b/proton-c/bindings/cpp/src/Link.cpp
index 9065524..76c100c 100644
--- a/proton-c/bindings/cpp/src/Link.cpp
+++ b/proton-c/bindings/cpp/src/Link.cpp
@@ -19,7 +19,7 @@
  *
  */
 #include "proton/Link.hpp"
-#include "proton/exceptions.hpp"
+#include "proton/Error.hpp"
 #include "proton/Connection.hpp"
 #include "ConnectionImpl.hpp"
 #include "Msg.hpp"


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