You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by as...@apache.org on 2016/04/28 02:48:14 UTC

[6/6] qpid-proton git commit: PROTON-1153: [C++ binding] More removal of friends - Get rid of many friend declarations that are needed to access private members. - Do this by introducing an internal way to unwrap a wrapped proton-c object pointer and

PROTON-1153: [C++ binding] More removal of friends
- Get rid of many friend declarations that are needed to access
  private members.
- Do this by introducing an internal way to unwrap a wrapped proton-c
  object pointer and replace some wrapped code by "raw" proton-c


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

Branch: refs/heads/master
Commit: 1f0df2a55e8dc7c38654fbd70c10d59834b936e5
Parents: 138ffab
Author: Andrew Stitcher <as...@apache.org>
Authored: Wed Apr 27 03:47:49 2016 -0400
Committer: Andrew Stitcher <as...@apache.org>
Committed: Wed Apr 27 20:45:51 2016 -0400

----------------------------------------------------------------------
 .../bindings/cpp/include/proton/connection.hpp  |  5 --
 .../cpp/include/proton/connection_options.hpp   |  3 -
 .../bindings/cpp/include/proton/container.hpp   |  3 +-
 .../bindings/cpp/include/proton/delivery.hpp    | 15 -----
 proton-c/bindings/cpp/include/proton/link.hpp   | 13 ----
 proton-c/bindings/cpp/include/proton/object.hpp |  2 +-
 .../bindings/cpp/include/proton/receiver.hpp    |  2 -
 .../cpp/include/proton/receiver_options.hpp     |  6 +-
 proton-c/bindings/cpp/include/proton/sasl.hpp   |  7 ---
 proton-c/bindings/cpp/include/proton/sender.hpp |  2 -
 .../cpp/include/proton/sender_options.hpp       |  6 +-
 .../bindings/cpp/include/proton/session.hpp     |  4 +-
 proton-c/bindings/cpp/include/proton/source.hpp |  3 +-
 proton-c/bindings/cpp/include/proton/target.hpp |  3 +-
 .../bindings/cpp/include/proton/terminus.hpp    | 13 +---
 .../bindings/cpp/include/proton/transfer.hpp    | 10 ---
 .../bindings/cpp/include/proton/transport.hpp   |  5 --
 proton-c/bindings/cpp/src/connection.cpp        |  2 +-
 .../bindings/cpp/src/connection_options.cpp     | 17 +++---
 proton-c/bindings/cpp/src/connector.cpp         |  3 +-
 proton-c/bindings/cpp/src/container_impl.cpp    |  6 +-
 proton-c/bindings/cpp/src/contexts.cpp          |  5 ++
 proton-c/bindings/cpp/src/contexts.hpp          |  4 +-
 proton-c/bindings/cpp/src/delivery.cpp          |  3 -
 .../bindings/cpp/src/io/connection_engine.cpp   | 28 ++++-----
 proton-c/bindings/cpp/src/link.cpp              | 31 ----------
 proton-c/bindings/cpp/src/message.cpp           |  6 +-
 proton-c/bindings/cpp/src/messaging_adapter.cpp | 10 +--
 proton-c/bindings/cpp/src/node_options.cpp      | 49 +++++++++------
 proton-c/bindings/cpp/src/proton_bits.hpp       | 19 +++---
 proton-c/bindings/cpp/src/receiver_options.cpp  | 63 +++++++++----------
 proton-c/bindings/cpp/src/sasl.cpp              |  7 ---
 proton-c/bindings/cpp/src/sender_options.cpp    | 64 +++++++++++---------
 proton-c/bindings/cpp/src/session.cpp           |  2 +-
 proton-c/bindings/cpp/src/source.cpp            |  4 +-
 proton-c/bindings/cpp/src/target.cpp            |  4 +-
 proton-c/bindings/cpp/src/terminus.cpp          | 41 -------------
 proton-c/bindings/cpp/src/transfer.cpp          |  1 -
 proton-c/bindings/cpp/src/transport.cpp         |  2 +-
 39 files changed, 171 insertions(+), 302 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/1f0df2a5/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 60ffe6e..6f664db 100644
--- a/proton-c/bindings/cpp/include/proton/connection.hpp
+++ b/proton-c/bindings/cpp/include/proton/connection.hpp
@@ -120,12 +120,7 @@ PN_CPP_CLASS_EXTERN connection : public internal::object<pn_connection_t>, publi
     void host(const std::string& h);
 
     friend class internal::factory<connection>;
-    friend class connection_context;
-    friend class io::connection_engine;
-    friend class connection_options;
     friend class connector;
-    friend class container_impl;
-    friend class transport;
     /// @endcond
 };
 

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/1f0df2a5/proton-c/bindings/cpp/include/proton/connection_options.hpp
----------------------------------------------------------------------
diff --git a/proton-c/bindings/cpp/include/proton/connection_options.hpp b/proton-c/bindings/cpp/include/proton/connection_options.hpp
index a4b7246..df02840 100644
--- a/proton-c/bindings/cpp/include/proton/connection_options.hpp
+++ b/proton-c/bindings/cpp/include/proton/connection_options.hpp
@@ -148,9 +148,6 @@ class connection_options {
   private:
     void apply(connection&) const;
     proton_handler* handler() const;
-    static pn_connection_t *pn_connection(connection &);
-    class ssl_client_options &ssl_client_options();
-    class ssl_server_options &ssl_server_options();
 
     class impl;
     internal::pn_unique_ptr<impl> impl_;

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/1f0df2a5/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 dc66e78..9759c67 100644
--- a/proton-c/bindings/cpp/include/proton/container.hpp
+++ b/proton-c/bindings/cpp/include/proton/container.hpp
@@ -139,7 +139,8 @@ class container {
 
     friend class connector;
     friend class messaging_adapter;
-    friend class link;
+    friend class receiver_options;
+    friend class sender_options;
     /// @endcond
 };
 

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/1f0df2a5/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 a7e0511..3f76166 100644
--- a/proton-c/bindings/cpp/include/proton/delivery.hpp
+++ b/proton-c/bindings/cpp/include/proton/delivery.hpp
@@ -60,22 +60,7 @@ class delivery : public transfer {
     PN_CPP_EXTERN void modify() { settle(MODIFIED); }
 
     /// @cond INTERNAL
-  private:
-    /// Get the size of the current delivery.
-    size_t pending() const;
-
-    /// Check if a delivery is complete.
-    bool partial() const;
-
-    /// Check if a delivery is readable.
-    ///
-    /// A delivery is considered readable if it is the current
-    /// delivery on a receiver.
-    bool readable() const;
-
   friend class internal::factory<delivery>;
-  friend class message;
-  friend class messaging_adapter;
     /// @endcond
 };
 

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/1f0df2a5/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 3db6f95..a9622ed 100644
--- a/proton-c/bindings/cpp/include/proton/link.hpp
+++ b/proton-c/bindings/cpp/include/proton/link.hpp
@@ -120,16 +120,6 @@ PN_CPP_CLASS_EXTERN link : public internal::object<pn_link_t> , public endpoint
     void attach();
 
   private:
-    // Used by sender/receiver options
-    void handler(proton_handler &);
-    void detach_handler();
-    void sender_settle_mode(sender_options::sender_settle_mode);
-    void receiver_settle_mode(receiver_options::receiver_settle_mode);
-    // Used by message to decode message from a delivery
-    ssize_t recv(char* buffer, size_t size);
-    bool advance();
-    link_context &context();
-
     /// XXX local versus remote, mutability
     /// XXX - local_sender_settle_mode and local_receiver_settle_mode
     sender_options::sender_settle_mode sender_settle_mode();
@@ -138,9 +128,6 @@ PN_CPP_CLASS_EXTERN link : public internal::object<pn_link_t> , public endpoint
     receiver_options::receiver_settle_mode remote_receiver_settle_mode();
 
     friend class internal::factory<link>;
-    friend class message;
-    friend class receiver_options;
-    friend class sender_options;
     ///@endcond
 };
 

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/1f0df2a5/proton-c/bindings/cpp/include/proton/object.hpp
----------------------------------------------------------------------
diff --git a/proton-c/bindings/cpp/include/proton/object.hpp b/proton-c/bindings/cpp/include/proton/object.hpp
index dcbe086..7c7495d 100644
--- a/proton-c/bindings/cpp/include/proton/object.hpp
+++ b/proton-c/bindings/cpp/include/proton/object.hpp
@@ -85,7 +85,7 @@ template <class T> class object : private comparable<object<T> > {
     friend bool operator<(const object& a, const object& b) { return a.object_ < b.object_; }
 };
 
-/// Factory class used internally to make wrappers
+/// Factory class used internally to make wrappers and extract proton objects
 template <class T> class factory;
 
 }}

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/1f0df2a5/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 a63be67..cfc480f 100644
--- a/proton-c/bindings/cpp/include/proton/receiver.hpp
+++ b/proton-c/bindings/cpp/include/proton/receiver.hpp
@@ -55,8 +55,6 @@ PN_CPP_CLASS_EXTERN receiver : public link {
     /// @cond INTERNAL
   friend class internal::factory<receiver>;
   friend class receiver_iterator;
-  friend class source;
-  friend class target;
     /// @endcond
 };
 

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/1f0df2a5/proton-c/bindings/cpp/include/proton/receiver_options.hpp
----------------------------------------------------------------------
diff --git a/proton-c/bindings/cpp/include/proton/receiver_options.hpp b/proton-c/bindings/cpp/include/proton/receiver_options.hpp
index b0bf02a..bb9ac3f 100644
--- a/proton-c/bindings/cpp/include/proton/receiver_options.hpp
+++ b/proton-c/bindings/cpp/include/proton/receiver_options.hpp
@@ -81,6 +81,9 @@ class receiver_options {
     /// Copy options.
     PN_CPP_EXTERN receiver_options& operator=(const receiver_options&);
 
+    /// Merge with another option set
+    PN_CPP_EXTERN void update(const receiver_options& other);
+
     /// Set a handler for events scoped to the receiver.  If NULL,
     /// receiver-scoped events are discarded.
     PN_CPP_EXTERN receiver_options& handler(class handler *);
@@ -121,14 +124,11 @@ class receiver_options {
     /// @cond INTERNAL
   private:
     void apply(receiver &) const;
-    proton_handler* handler() const;
-    PN_CPP_EXTERN void update(const receiver_options& other);
 
     class impl;
     internal::pn_unique_ptr<impl> impl_;
 
     friend class receiver;
-    friend class container_impl;
     /// @endcond
 };
 

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/1f0df2a5/proton-c/bindings/cpp/include/proton/sasl.hpp
----------------------------------------------------------------------
diff --git a/proton-c/bindings/cpp/include/proton/sasl.hpp b/proton-c/bindings/cpp/include/proton/sasl.hpp
index e9a7731..eee6b96 100644
--- a/proton-c/bindings/cpp/include/proton/sasl.hpp
+++ b/proton-c/bindings/cpp/include/proton/sasl.hpp
@@ -67,16 +67,9 @@ class sasl {
 
     /// @cond INTERNAL
   private:
-    void allow_insecure_mechs(bool);
-    bool allow_insecure_mechs();
-    void allowed_mechs(const std::string &);
-    void config_name(const std::string&);
-    void config_path(const std::string&);
-
     pn_sasl_t* const object_;
 
     friend class internal::factory<sasl>;
-    friend class connection_options;
     /// @endcond
 };
 

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/1f0df2a5/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 e620ebe..7fff04a 100644
--- a/proton-c/bindings/cpp/include/proton/sender.hpp
+++ b/proton-c/bindings/cpp/include/proton/sender.hpp
@@ -61,8 +61,6 @@ PN_CPP_CLASS_EXTERN sender : public link
   /// @cond INTERNAL
   friend class internal::factory<sender>;
   friend class sender_iterator;
-  friend class source;
-  friend class target;
   /// @endcond
 };
 

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/1f0df2a5/proton-c/bindings/cpp/include/proton/sender_options.hpp
----------------------------------------------------------------------
diff --git a/proton-c/bindings/cpp/include/proton/sender_options.hpp b/proton-c/bindings/cpp/include/proton/sender_options.hpp
index d42880c..2aab021 100644
--- a/proton-c/bindings/cpp/include/proton/sender_options.hpp
+++ b/proton-c/bindings/cpp/include/proton/sender_options.hpp
@@ -80,6 +80,9 @@ class sender_options {
     /// Copy options.
     PN_CPP_EXTERN sender_options& operator=(const sender_options&);
 
+    /// Merge with another option set
+    PN_CPP_EXTERN void update(const sender_options& other);
+
     /// Set a handler for events scoped to the sender.  If NULL,
     /// sender-scoped events are discarded.
     PN_CPP_EXTERN sender_options& handler(class handler *);
@@ -100,14 +103,11 @@ class sender_options {
     /// @cond INTERNAL
   private:
     void apply(sender&) const;
-    proton_handler* handler() const;
-    PN_CPP_EXTERN void update(const sender_options& other);
 
     class impl;
     internal::pn_unique_ptr<impl> impl_;
 
     friend class sender;
-    friend class container_impl;
     /// @endcond
 };
 

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/1f0df2a5/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 df4d153..33efd30 100644
--- a/proton-c/bindings/cpp/include/proton/session.hpp
+++ b/proton-c/bindings/cpp/include/proton/session.hpp
@@ -91,9 +91,7 @@ PN_CPP_CLASS_EXTERN session : public internal::object<pn_session_t>, public endp
     /// Return the receivers on this session.
     PN_CPP_EXTERN receiver_range receivers() const;
 
-  friend class sender_iterator;
-  friend class receiver_iterator;
-  friend class session_iterator;
+    friend class internal::factory<session>;
 };
 
 

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/1f0df2a5/proton-c/bindings/cpp/include/proton/source.hpp
----------------------------------------------------------------------
diff --git a/proton-c/bindings/cpp/include/proton/source.hpp b/proton-c/bindings/cpp/include/proton/source.hpp
index e34632b..218610d 100644
--- a/proton-c/bindings/cpp/include/proton/source.hpp
+++ b/proton-c/bindings/cpp/include/proton/source.hpp
@@ -47,10 +47,9 @@ class source : public terminus {
     source(pn_terminus_t* t);
     source(const sender&);
     source(const receiver&);
+  friend class internal::factory<source>;
   friend class sender;
   friend class receiver;
-  friend class sender_options;
-  friend class receiver_options;
     /// @endcond
 };
 

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/1f0df2a5/proton-c/bindings/cpp/include/proton/target.hpp
----------------------------------------------------------------------
diff --git a/proton-c/bindings/cpp/include/proton/target.hpp b/proton-c/bindings/cpp/include/proton/target.hpp
index 1658b26..ca7dc69 100644
--- a/proton-c/bindings/cpp/include/proton/target.hpp
+++ b/proton-c/bindings/cpp/include/proton/target.hpp
@@ -47,10 +47,9 @@ class target : public terminus {
     target(pn_terminus_t* t);
     target(const sender&);
     target(const receiver&);
+  friend class internal::factory<target>;
   friend class sender;
   friend class receiver;
-  friend class sender_options;
-  friend class receiver_options;
     /// @endcond
 
 };

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/1f0df2a5/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 99f5f13..d73717b 100644
--- a/proton-c/bindings/cpp/include/proton/terminus.hpp
+++ b/proton-c/bindings/cpp/include/proton/terminus.hpp
@@ -78,26 +78,17 @@ class terminus {
     PN_CPP_EXTERN const value& filter() const;
 
     /// @cond INTERNAL
+  protected:
+    pn_terminus_t *pn_object() { return object_; }
   private:
-    void address(const std::string &);
-    void expiry_policy(enum expiry_policy);
-    void timeout(duration);
-    void distribution_mode(enum distribution_mode);
-    void durability_mode(enum durability_mode);
-    void dynamic(bool);
-    value& node_properties();
-    value& filter();
-
     pn_terminus_t* object_;
     value properties_, filter_;
     pn_link_t* parent_;
 
 
     friend class internal::factory<terminus>;
-    friend class internal::noderef;
     friend class source;
     friend class target;
-    friend class source_options;
     /// @endcond
 };
 

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/1f0df2a5/proton-c/bindings/cpp/include/proton/transfer.hpp
----------------------------------------------------------------------
diff --git a/proton-c/bindings/cpp/include/proton/transfer.hpp b/proton-c/bindings/cpp/include/proton/transfer.hpp
index 67c3a42..f37984d 100644
--- a/proton-c/bindings/cpp/include/proton/transfer.hpp
+++ b/proton-c/bindings/cpp/include/proton/transfer.hpp
@@ -77,17 +77,7 @@ class transfer : public internal::object<pn_delivery_t> {
     /// Get the remote state for a delivery.
     enum state state() const;
 
-  private:
-    /// Check if a delivery is updated.
-    ///
-    /// A delivery is considered updated whenever the peer
-    /// communicates a new disposition for the delivery. Once a
-    /// delivery becomes updated, it will remain so until clear() is
-    /// called.
-    bool updated() const;
-
   friend class internal::factory<transfer>;
-  friend class messaging_adapter;
     /// @endcond
 };
 

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/1f0df2a5/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 6b94696..590bac0 100644
--- a/proton-c/bindings/cpp/include/proton/transport.hpp
+++ b/proton-c/bindings/cpp/include/proton/transport.hpp
@@ -72,11 +72,6 @@ class transport : public internal::object<pn_transport_t> {
 
     /// @cond INTERNAL
     friend class internal::factory<transport>;
-    friend class connection;
-    friend class connection_options;
-    friend class connector;
-    friend class io::connection_engine;
-    friend class messaging_adapter;
     /// @endcond
 };
 

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/1f0df2a5/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 5fb4268..954973d 100644
--- a/proton-c/bindings/cpp/src/connection.cpp
+++ b/proton-c/bindings/cpp/src/connection.cpp
@@ -43,7 +43,7 @@
 namespace proton {
 
 transport connection::transport() const {
-    return pn_connection_transport(pn_object());
+    return make_wrapper(pn_connection_transport(pn_object()));
 }
 
 void connection::open() {

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/1f0df2a5/proton-c/bindings/cpp/src/connection_options.cpp
----------------------------------------------------------------------
diff --git a/proton-c/bindings/cpp/src/connection_options.cpp b/proton-c/bindings/cpp/src/connection_options.cpp
index e655a68..d5eff82 100644
--- a/proton-c/bindings/cpp/src/connection_options.cpp
+++ b/proton-c/bindings/cpp/src/connection_options.cpp
@@ -29,6 +29,7 @@
 #include "connector.hpp"
 #include "messaging_adapter.hpp"
 #include "msg.hpp"
+#include "proton_bits.hpp"
 
 #include "proton/connection.h"
 #include "proton/transport.h"
@@ -63,7 +64,7 @@ class connection_options::impl {
     option<std::string> sasl_config_path;
 
     void apply(connection& c) {
-        pn_connection_t *pnc = connection_options::pn_connection(c);
+        pn_connection_t *pnc = unwrap(c);
         pn_transport_t *pnt = pn_connection_transport(pnc);
         connector *outbound = dynamic_cast<connector*>(
             connection_context::get(c).handler.get());
@@ -92,18 +93,17 @@ class connection_options::impl {
             }
 
             // SASL
-            transport t = c.transport();
             if (!sasl_enabled.set || sasl_enabled.value) {
                 if (sasl_enabled.set)  // Explicitly set, not just default behaviour.
-                    t.sasl();          // Force a sasl instance.  Lazily create one otherwise.
+                    pn_sasl(pnt);          // Force a sasl instance.  Lazily create one otherwise.
                 if (sasl_allow_insecure_mechs.set)
-                    t.sasl().allow_insecure_mechs(sasl_allow_insecure_mechs.value);
+                    pn_sasl_set_allow_insecure_mechs(pn_sasl(pnt), sasl_allow_insecure_mechs.value);
                 if (sasl_allowed_mechs.set)
-                    t.sasl().allowed_mechs(sasl_allowed_mechs.value);
+                    pn_sasl_allowed_mechs(pn_sasl(pnt), sasl_allowed_mechs.value.c_str());
                 if (sasl_config_name.set)
-                    t.sasl().config_name(sasl_config_name.value);
+                    pn_sasl_config_name(pn_sasl(pnt), sasl_config_name.value.c_str());
                 if (sasl_config_path.set)
-                    t.sasl().config_path(sasl_config_path.value);
+                    pn_sasl_config_path(pn_sasl(pnt), sasl_config_path.value.c_str());
             }
 
             if (max_frame_size.set)
@@ -185,8 +185,5 @@ connection_options& connection_options::sasl_config_name(const std::string &n) {
 connection_options& connection_options::sasl_config_path(const std::string &p) { impl_->sasl_config_path = p; return *this; }
 
 void connection_options::apply(connection& c) const { impl_->apply(c); }
-class ssl_client_options &connection_options::ssl_client_options() { return impl_->ssl_client_options.value; }
-class ssl_server_options &connection_options::ssl_server_options() { return impl_->ssl_server_options.value; }
 proton_handler* connection_options::handler() const { return impl_->handler.value; }
-pn_connection_t* connection_options::pn_connection(connection &c) { return c.pn_object(); }
 } // namespace proton

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/1f0df2a5/proton-c/bindings/cpp/src/connector.cpp
----------------------------------------------------------------------
diff --git a/proton-c/bindings/cpp/src/connector.cpp b/proton-c/bindings/cpp/src/connector.cpp
index 9aca9a0..f2e1776 100644
--- a/proton-c/bindings/cpp/src/connector.cpp
+++ b/proton-c/bindings/cpp/src/connector.cpp
@@ -30,6 +30,7 @@
 #include "proton/sasl.hpp"
 
 #include "container_impl.hpp"
+#include "proton_bits.hpp"
 #include "proton_event.hpp"
 
 #include "proton/connection.h"
@@ -62,7 +63,7 @@ void connector::reconnect_timer(const class reconnect_timer &rt) {
 void connector::connect() {
     connection_.host(address_.host_port());
     pn_transport_t *pnt = pn_transport();
-    transport t(pnt);
+    transport t(make_wrapper(pnt));
     if (!address_.username().empty())
         connection_.user(address_.username());
     if (!address_.password().empty())

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/1f0df2a5/proton-c/bindings/cpp/src/container_impl.cpp
----------------------------------------------------------------------
diff --git a/proton-c/bindings/cpp/src/container_impl.cpp b/proton-c/bindings/cpp/src/container_impl.cpp
index ce7b0d5..62e626f 100644
--- a/proton-c/bindings/cpp/src/container_impl.cpp
+++ b/proton-c/bindings/cpp/src/container_impl.cpp
@@ -153,7 +153,7 @@ connection container_impl::connect(const proton::url &url, const connection_opti
     connection_context& cc(connection_context::get(conn));
     cc.handler.reset(ctor.release());
     cc.link_gen.prefix(id_gen_.next() + "/");
-    pn_connection_set_container(conn.pn_object(), id_.c_str());
+    pn_connection_set_container(unwrap(conn), id_.c_str());
 
     conn.open();
     return conn;
@@ -221,10 +221,10 @@ void container_impl::receiver_options(const proton::receiver_options &opts) {
 }
 
 void container_impl::configure_server_connection(connection &c) {
-    pn_acceptor_t *pnp = pn_connection_acceptor(connection_options::pn_connection(c));
+    pn_acceptor_t *pnp = pn_connection_acceptor(unwrap(c));
     listener_context &lc(listener_context::get(pnp));
     connection_context::get(c).link_gen.prefix(id_gen_.next() + "/");
-    pn_connection_set_container(c.pn_object(), id_.c_str());
+    pn_connection_set_container(unwrap(c), id_.c_str());
     lc.connection_options.apply(c);
 }
 

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/1f0df2a5/proton-c/bindings/cpp/src/contexts.cpp
----------------------------------------------------------------------
diff --git a/proton-c/bindings/cpp/src/contexts.cpp b/proton-c/bindings/cpp/src/contexts.cpp
index 99b05a1..173764e 100644
--- a/proton-c/bindings/cpp/src/contexts.cpp
+++ b/proton-c/bindings/cpp/src/contexts.cpp
@@ -22,6 +22,7 @@
 #include "contexts.hpp"
 #include "msg.hpp"
 #include "reactor.hpp"
+#include "proton_bits.hpp"
 
 #include "proton/error.hpp"
 
@@ -76,6 +77,10 @@ context::id connection_context::id(pn_connection_t* c) {
     return context::id(pn_connection_attachments(c), CONNECTION_CONTEXT);
 }
 
+context::id connection_context::id(const connection& c) {
+    return id(unwrap(c));
+}
+
 void container_context::set(const reactor& r, container& c) {
     set_context(pn_reactor_attachments(r.pn_object()), CONTAINER_CONTEXT, PN_VOID, &c);
 }

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/1f0df2a5/proton-c/bindings/cpp/src/contexts.hpp
----------------------------------------------------------------------
diff --git a/proton-c/bindings/cpp/src/contexts.hpp b/proton-c/bindings/cpp/src/contexts.hpp
index 0aa539e..0305b8a 100644
--- a/proton-c/bindings/cpp/src/contexts.hpp
+++ b/proton-c/bindings/cpp/src/contexts.hpp
@@ -40,9 +40,9 @@ struct pn_acceptor_t;
 namespace proton {
 
 class proton_handler;
+class reactor;
 class work_queue;
 
-
 // Base class for C++ classes that are used as proton contexts.
 // Contexts are pn_objects managed by pn reference counts, the C++ value is allocated in-place.
 class context {
@@ -98,7 +98,7 @@ class connection_context : public context {
 
   protected:
     static context::id id(pn_connection_t*);
-    static context::id id(const connection& c) { return id(c.pn_object()); }
+    static context::id id(const connection& c);
 };
 
 void container_context(const reactor&, container&);

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/1f0df2a5/proton-c/bindings/cpp/src/delivery.cpp
----------------------------------------------------------------------
diff --git a/proton-c/bindings/cpp/src/delivery.cpp b/proton-c/bindings/cpp/src/delivery.cpp
index b60a0b3..7effc52 100644
--- a/proton-c/bindings/cpp/src/delivery.cpp
+++ b/proton-c/bindings/cpp/src/delivery.cpp
@@ -30,7 +30,4 @@ namespace proton {
 delivery::delivery(pn_delivery_t* d): transfer(make_wrapper(d)) {}
 receiver delivery::receiver() const { return make_wrapper<class receiver>(pn_delivery_link(pn_object())); }
 
-bool delivery::partial()  const { return pn_delivery_partial(pn_object()); }
-bool delivery::readable() const { return pn_delivery_readable(pn_object()); }
-size_t delivery::pending() const { return pn_delivery_pending(pn_object()); }
 }

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/1f0df2a5/proton-c/bindings/cpp/src/io/connection_engine.cpp
----------------------------------------------------------------------
diff --git a/proton-c/bindings/cpp/src/io/connection_engine.cpp b/proton-c/bindings/cpp/src/io/connection_engine.cpp
index ffef3b7..045ae66 100644
--- a/proton-c/bindings/cpp/src/io/connection_engine.cpp
+++ b/proton-c/bindings/cpp/src/io/connection_engine.cpp
@@ -44,19 +44,19 @@ namespace io {
 
 connection_engine::connection_engine(class handler &h, const connection_options& opts):
     handler_(h),
-    connection_(internal::take_ownership(pn_connection()).get()),
-    transport_(internal::take_ownership(pn_transport()).get()),
+    connection_(make_wrapper(internal::take_ownership(pn_connection()).get())),
+    transport_(make_wrapper(internal::take_ownership(pn_transport()).get())),
     collector_(internal::take_ownership(pn_collector()).get())
 {
     if (!connection_ || !transport_ || !collector_)
         throw proton::error("engine create");
     transport_.bind(connection_);
-    pn_connection_collect(connection_.pn_object(), collector_.get());
+    pn_connection_collect(unwrap(connection_), collector_.get());
     opts.apply(connection_);
 
     // Provide local random defaults for connection_id and link_prefix if not by opts.
     if (connection_.container_id().empty())
-        pn_connection_set_container(connection_.pn_object(), uuid::random().str().c_str());
+        pn_connection_set_container(unwrap(connection_), uuid::random().str().c_str());
     id_generator &link_gen = connection_context::get(connection_).link_gen;
     if (link_gen.prefix().empty())
         link_gen.prefix(uuid::random().str()+"/");
@@ -81,45 +81,45 @@ bool connection_engine::dispatch() {
         }
         pn_collector_pop(collector_.get());
     }
-    return !(pn_transport_closed(transport_.pn_object()));
+    return !(pn_transport_closed(unwrap(transport_)));
 }
 
 mutable_buffer connection_engine::read_buffer() {
-    ssize_t cap = pn_transport_capacity(transport_.pn_object());
+    ssize_t cap = pn_transport_capacity(unwrap(transport_));
     if (cap > 0)
-        return mutable_buffer(pn_transport_tail(transport_.pn_object()), cap);
+        return mutable_buffer(pn_transport_tail(unwrap(transport_)), cap);
     else
         return mutable_buffer(0, 0);
 }
 
 void connection_engine::read_done(size_t n) {
     if (n > 0)
-        pn_transport_process(transport_.pn_object(), n);
+        pn_transport_process(unwrap(transport_), n);
 }
 
 void connection_engine::read_close() {
-    pn_transport_close_tail(transport_.pn_object());
+    pn_transport_close_tail(unwrap(transport_));
 }
 
 const_buffer connection_engine::write_buffer() const {
-    ssize_t pending = pn_transport_pending(transport_.pn_object());
+    ssize_t pending = pn_transport_pending(unwrap(transport_));
     if (pending > 0)
-        return const_buffer(pn_transport_head(transport_.pn_object()), pending);
+        return const_buffer(pn_transport_head(unwrap(transport_)), pending);
     else
         return const_buffer(0, 0);
 }
 
 void connection_engine::write_done(size_t n) {
     if (n > 0)
-        pn_transport_pop(transport_.pn_object(), n);
+        pn_transport_pop(unwrap(transport_), n);
 }
 
 void connection_engine::write_close() {
-    pn_transport_close_head(transport_.pn_object());
+    pn_transport_close_head(unwrap(transport_));
 }
 
 void connection_engine::close(const proton::error_condition& err) {
-    set_error_condition(err, pn_transport_condition(transport_.pn_object()));
+    set_error_condition(err, pn_transport_condition(unwrap(transport_)));
     read_close();
     write_close();
 }

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/1f0df2a5/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 a12fcdb..02a061d 100644
--- a/proton-c/bindings/cpp/src/link.cpp
+++ b/proton-c/bindings/cpp/src/link.cpp
@@ -70,45 +70,18 @@ class session link::session() const {
     return pn_link_session(pn_object());
 }
 
-void link::handler(proton_handler &h) {
-    pn_record_t *record = pn_link_attachments(pn_object());
-    internal::pn_ptr<pn_handler_t> chandler = connection().container().impl_->cpp_handler(&h);
-    pn_record_set_handler(record, chandler.get());
-}
-
-void link::detach_handler() {
-    pn_record_t *record = pn_link_attachments(pn_object());
-    pn_record_set_handler(record, 0);
-}
-
 error_condition link::error() const {
     return make_wrapper(pn_link_remote_condition(pn_object()));
 }
 
-ssize_t link::recv(char* buffer, size_t size) {
-    return pn_link_recv(pn_object(), buffer, size);
-}
-
-bool link::advance() {
-    return pn_link_advance(pn_object());
-}
-
 sender_options::sender_settle_mode link::sender_settle_mode() {
     return (sender_options::sender_settle_mode) pn_link_snd_settle_mode(pn_object());
 }
 
-void link::sender_settle_mode(sender_options::sender_settle_mode mode) {
-    pn_link_set_snd_settle_mode(pn_object(), (pn_snd_settle_mode_t) mode);
-}
-
 receiver_options::receiver_settle_mode link::receiver_settle_mode() {
     return (receiver_options::receiver_settle_mode) pn_link_rcv_settle_mode(pn_object());
 }
 
-void link::receiver_settle_mode(receiver_options::receiver_settle_mode mode) {
-    pn_link_set_rcv_settle_mode(pn_object(), (pn_rcv_settle_mode_t) mode);
-}
-
 sender_options::sender_settle_mode link::remote_sender_settle_mode() {
     return (sender_options::sender_settle_mode) pn_link_remote_snd_settle_mode(pn_object());
 }
@@ -117,8 +90,4 @@ receiver_options::receiver_settle_mode link::remote_receiver_settle_mode() {
     return (receiver_options::receiver_settle_mode) pn_link_remote_rcv_settle_mode(pn_object());
 }
 
-link_context &link::context() {
-    return link_context::get(pn_object());
-}
-
 }

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/1f0df2a5/proton-c/bindings/cpp/src/message.cpp
----------------------------------------------------------------------
diff --git a/proton-c/bindings/cpp/src/message.cpp b/proton-c/bindings/cpp/src/message.cpp
index 0f653c6..0ca5d61 100644
--- a/proton-c/bindings/cpp/src/message.cpp
+++ b/proton-c/bindings/cpp/src/message.cpp
@@ -291,13 +291,13 @@ void message::decode(const std::vector<char> &s) {
 
 void message::decode(proton::delivery delivery) {
     std::vector<char> buf;
-    buf.resize(delivery.pending());
+    buf.resize(pn_delivery_pending(unwrap(delivery)));
     proton::receiver link = delivery.receiver();
-    ssize_t n = link.recv(const_cast<char *>(&buf[0]), buf.size());
+    ssize_t n = pn_link_recv(unwrap(link), const_cast<char *>(&buf[0]), buf.size());
     if (n != ssize_t(buf.size())) throw error(MSG("receiver read failure"));
     clear();
     decode(buf);
-    link.advance();
+    pn_link_advance(unwrap(link));
 }
 
 bool message::durable() const { return pn_message_is_durable(pn_msg()); }

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/1f0df2a5/proton-c/bindings/cpp/src/messaging_adapter.cpp
----------------------------------------------------------------------
diff --git a/proton-c/bindings/cpp/src/messaging_adapter.cpp b/proton-c/bindings/cpp/src/messaging_adapter.cpp
index ac362bc..8ac377e 100644
--- a/proton-c/bindings/cpp/src/messaging_adapter.cpp
+++ b/proton-c/bindings/cpp/src/messaging_adapter.cpp
@@ -87,7 +87,7 @@ void messaging_adapter::on_delivery(proton_event &pe) {
 
     if (pn_link_is_receiver(lnk)) {
         delivery d(make_wrapper<delivery>(dlv));
-        if (!d.partial() && d.readable()) {
+        if (!pn_delivery_partial(dlv) && pn_delivery_readable(dlv)) {
             // generate on_message
             pn_connection_t *pnc = pn_session_connection(pn_link_session(lnk));
             connection_context& ctx = connection_context::get(pnc);
@@ -105,15 +105,15 @@ void messaging_adapter::on_delivery(proton_event &pe) {
                     d.accept();
             }
         }
-        else if (d.updated() && d.settled()) {
+        else if (pn_delivery_updated(dlv) && d.settled()) {
             delegate_.on_delivery_settle(d);
         }
         credit_topup(lnk);
     } else {
         tracker t(make_wrapper<tracker>(dlv));
         // sender
-        if (t.updated()) {
-            uint64_t rstate = t.state();
+        if (pn_delivery_updated(dlv)) {
+            uint64_t rstate = pn_delivery_remote_state(dlv);
             if (rstate == PN_ACCEPTED) {
                 delegate_.on_tracker_accept(t);
             }
@@ -239,7 +239,7 @@ void messaging_adapter::on_transport_tail_closed(proton_event &pe) {
     pn_connection_t *conn = pn_event_connection(pe.pn_event());
     if (conn && is_local_open(pn_connection_state(conn))) {
         pn_transport_t *tspt = pn_event_transport(pe.pn_event());
-        transport t(tspt);
+        transport t(make_wrapper(tspt));
         if (pn_condition_is_set(pn_transport_condition(tspt))) {
             delegate_.on_transport_error(t);
         }

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/1f0df2a5/proton-c/bindings/cpp/src/node_options.cpp
----------------------------------------------------------------------
diff --git a/proton-c/bindings/cpp/src/node_options.cpp b/proton-c/bindings/cpp/src/node_options.cpp
index 56c823c..b8438fa 100644
--- a/proton-c/bindings/cpp/src/node_options.cpp
+++ b/proton-c/bindings/cpp/src/node_options.cpp
@@ -24,6 +24,10 @@
 #include "proton/target_options.hpp"
 #include "proton/target.hpp"
 
+#include "proton_bits.hpp"
+
+#include <limits>
+
 namespace proton {
 
 template <class T> struct option {
@@ -35,42 +39,50 @@ template <class T> struct option {
     void update(const option<T>& x) { if (x.set) *this = x.value; }
 };
 
-namespace internal {
-class noderef {
-    // friend class to handle private access on terminus.  TODO: change to newer single friend mechanism.
-  public:
-    static void address(terminus &t, const std::string &s) { t.address(s); }
-    static void dynamic(terminus &t, bool b) { t.dynamic(b); }
-    static void durability_mode(terminus &t, enum durability_mode m) { t.durability_mode(m); }
-    static void expiry_policy(terminus &t, enum expiry_policy p) { t.expiry_policy(p); }
-    static void timeout(terminus &t, duration d) { t.timeout(d); }
-};
+namespace {
+    void address(terminus &t, const std::string &s) { pn_terminus_set_address(unwrap(t), s.c_str()); }
+    void set_dynamic(terminus &t, bool b) { pn_terminus_set_dynamic(unwrap(t), b); }
+    void durability_mode(terminus &t, enum durability_mode m) { pn_terminus_set_durability(unwrap(t), pn_durability_t(m)); }
+    void expiry_policy(terminus &t, enum expiry_policy p) { pn_terminus_set_expiry_policy(unwrap(t), pn_expiry_policy_t(p)); }
+    void timeout(terminus &t, duration d) {
+      uint32_t seconds = 0;
+      if (d == duration::FOREVER)
+        seconds = std::numeric_limits<uint32_t>::max();
+      else if (d != duration::IMMEDIATE) {
+        uint64_t x = d.milliseconds();
+        if ((std::numeric_limits<uint64_t>::max() - x) <= 500)
+          seconds = std::numeric_limits<uint32_t>::max();
+        else {
+          x = (x + 500) / 1000;
+          seconds = x < std::numeric_limits<uint32_t>::max() ? x : std::numeric_limits<uint32_t>::max();
+        }
+      }
+      pn_terminus_set_timeout(unwrap(t), seconds);
+    }
 }
 
 namespace {
 
 // Options common to sources and targets
 
-using internal::noderef;
-
 void node_address(terminus &t, option<std::string> &addr, option<bool> &dynamic) {
     if (dynamic.set && dynamic.value) {
-        noderef::dynamic(t, true);
+        set_dynamic(t, true);
         // Ignore any addr value for dynamic.
         return;
     }
     if (addr.set) {
-        noderef::address(t, addr.value);
+        address(t, addr.value);
     }
 }
 
 void node_durability(terminus &t, option<enum durability_mode> &mode) {
-    if (mode.set) noderef::durability_mode(t, mode.value);
+    if (mode.set) durability_mode(t, mode.value);
 }
 
 void node_expiry(terminus &t, option<enum expiry_policy> &policy, option<duration> &d) {
-    if (policy.set) noderef::expiry_policy(t, policy.value);
-    if (d.set) noderef::timeout(t, d.value);
+    if (policy.set) expiry_policy(t, policy.value);
+    if (d.set) timeout(t, d.value);
 }
 
 }
@@ -89,7 +101,8 @@ class source_options::impl {
         node_address(s, address, dynamic);
         node_durability(s, durability_mode);
         node_expiry(s, expiry_policy, timeout);
-        if (distribution_mode.set) s.distribution_mode(distribution_mode.value);
+        if (distribution_mode.set)
+          pn_terminus_set_distribution_mode(unwrap(s), pn_distribution_mode_t(distribution_mode.value));
     }
 
     void update(const impl& x) {

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/1f0df2a5/proton-c/bindings/cpp/src/proton_bits.hpp
----------------------------------------------------------------------
diff --git a/proton-c/bindings/cpp/src/proton_bits.hpp b/proton-c/bindings/cpp/src/proton_bits.hpp
index 6a4f5f3..6cf6322 100644
--- a/proton-c/bindings/cpp/src/proton_bits.hpp
+++ b/proton-c/bindings/cpp/src/proton_bits.hpp
@@ -42,10 +42,6 @@ struct pn_terminus_t;
 
 namespace proton {
 
-namespace internal {
-class terminus;
-}
-
 class transport;
 class sasl;
 class ssl;
@@ -59,6 +55,9 @@ class tracker;
 class delivery;
 class error_condition;
 class acceptor;
+class terminus;
+class source;
+class target;
 
 std::string error_str(long code);
 
@@ -94,6 +93,8 @@ template <> struct wrapped<delivery> { typedef pn_delivery_t type; };
 template <> struct wrapped<error_condition> { typedef pn_condition_t type; };
 template <> struct wrapped<acceptor> { typedef pn_acceptor_t type; };
 template <> struct wrapped<terminus> { typedef pn_terminus_t type; };
+template <> struct wrapped<source> { typedef pn_terminus_t type; };
+template <> struct wrapped<target> { typedef pn_terminus_t type; };
 
 template <class T> struct wrapper {};
 template <> struct wrapper<pn_transport_t> { typedef transport type; };
@@ -111,16 +112,20 @@ template <> struct wrapper<pn_terminus_t> { typedef terminus type; };
 template <class T>
 class factory {
 public:
-    static T make(typename wrapped<T>::type* t) { return t; }
+    static T wrap(typename wrapped<T>::type* t) { return t; }
+    static typename wrapped<T>::type* unwrap(T t) { return t.pn_object(); }
 };
 
 }
 
 template <class T>
-typename internal::wrapper<T>::type make_wrapper(T* t) { return internal::factory<typename internal::wrapper<T>::type>::make(t); }
+typename internal::wrapper<T>::type make_wrapper(T* t) { return internal::factory<typename internal::wrapper<T>::type>::wrap(t); }
 
 template <class U>
-U make_wrapper(typename internal::wrapped<U>::type* t) { return internal::factory<U>::make(t); }
+U make_wrapper(typename internal::wrapped<U>::type* t) { return internal::factory<U>::wrap(t); }
+
+template <class T>
+typename internal::wrapped<T>::type* unwrap(T t) {return internal::factory<T>::unwrap(t); }
 
 }
 

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/1f0df2a5/proton-c/bindings/cpp/src/receiver_options.cpp
----------------------------------------------------------------------
diff --git a/proton-c/bindings/cpp/src/receiver_options.cpp b/proton-c/bindings/cpp/src/receiver_options.cpp
index 1831d11..e2eb416 100644
--- a/proton-c/bindings/cpp/src/receiver_options.cpp
+++ b/proton-c/bindings/cpp/src/receiver_options.cpp
@@ -19,19 +19,16 @@
  *
  */
 
-#include "proton/binary.hpp"
-#include "proton/receiver.hpp"
 #include "proton/receiver_options.hpp"
 #include "proton/handler.hpp"
-#include "proton/settings.hpp"
 #include "proton/source_options.hpp"
 #include "proton/target_options.hpp"
 
 #include "proton/link.h"
 
 #include "contexts.hpp"
+#include "container_impl.hpp"
 #include "messaging_adapter.hpp"
-#include "msg.hpp"
 #include "proton_bits.hpp"
 
 namespace proton {
@@ -46,6 +43,30 @@ template <class T> struct option {
 };
 
 class receiver_options::impl {
+    static void set_handler(receiver l, proton_handler &h) {
+        pn_record_t *record = pn_link_attachments(unwrap(l));
+        internal::pn_ptr<pn_handler_t> chandler = connection().container().impl_->cpp_handler(&h);
+        pn_record_set_handler(record, chandler.get());
+    }
+
+    static link_context& get_context(receiver l) {
+        return link_context::get(unwrap(l));
+    }
+
+    static void set_delivery_mode(receiver l, enum delivery_mode mode) {
+        switch (mode) {
+        case AT_MOST_ONCE:
+            pn_link_set_snd_settle_mode(unwrap(l), PN_SND_SETTLED);
+            break;
+        case AT_LEAST_ONCE:
+            pn_link_set_snd_settle_mode(unwrap(l), PN_SND_UNSETTLED);
+            pn_link_set_rcv_settle_mode(unwrap(l), PN_RCV_FIRST);
+            break;
+        default:
+            break;
+        }
+    }
+
   public:
     option<proton_handler*> handler;
     option<enum delivery_mode> delivery_mode;
@@ -59,37 +80,18 @@ class receiver_options::impl {
 
     void apply(receiver& r) {
         if (r.uninitialized()) {
-            if (delivery_mode.set) {
-                switch (delivery_mode.value) {
-                case AT_MOST_ONCE:
-                    r.sender_settle_mode(sender_options::SETTLED);
-                    break;
-                case AT_LEAST_ONCE:
-                    r.sender_settle_mode(sender_options::UNSETTLED);
-                    r.receiver_settle_mode(receiver_options::SETTLE_ALWAYS);
-                    break;
-                default:
-                    break;
-                }
-            }
-            if (handler.set) {
-                if (handler.value)
-                    r.handler(*handler.value);
-                else
-                    r.detach_handler();
-            }
-
-            if (auto_settle.set) r.context().auto_settle = auto_settle.value;
-            if (auto_accept.set) r.context().auto_accept = auto_accept.value;
-            if (credit_window.set) r.context().credit_window = credit_window.value;
+            if (delivery_mode.set) set_delivery_mode(r, delivery_mode.value);
+            if (handler.set && handler.value) set_handler(r, *handler.value);
+            if (auto_settle.set) get_context(r).auto_settle = auto_settle.value;
+            if (auto_accept.set) get_context(r).auto_accept = auto_accept.value;
+            if (credit_window.set) get_context(r).credit_window = credit_window.value;
 
-            terminus local_src(make_wrapper(pn_link_source(r.pn_object())));
             if (source.set) {
-                proton::source local_s(pn_link_source(r.pn_object()));
+                proton::source local_s(make_wrapper<proton::source>(pn_link_source(unwrap(r))));
                 source.value.apply(local_s);
             }
             if (target.set) {
-                proton::target local_t(pn_link_target(r.pn_object()));
+                proton::target local_t(make_wrapper<proton::target>(pn_link_target(unwrap(r))));
                 target.value.apply(local_t);
             }
         }
@@ -131,6 +133,5 @@ receiver_options& receiver_options::target(target_options &s) {impl_->target = s
 receiver_options& receiver_options::selector(const std::string&) { return *this; }
 
 void receiver_options::apply(receiver& r) const { impl_->apply(r); }
-proton_handler* receiver_options::handler() const { return impl_->handler.value; }
 
 } // namespace proton

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/1f0df2a5/proton-c/bindings/cpp/src/sasl.cpp
----------------------------------------------------------------------
diff --git a/proton-c/bindings/cpp/src/sasl.cpp b/proton-c/bindings/cpp/src/sasl.cpp
index 5ce7454..73668cd 100644
--- a/proton-c/bindings/cpp/src/sasl.cpp
+++ b/proton-c/bindings/cpp/src/sasl.cpp
@@ -35,11 +35,4 @@ std::string sasl::mech() const {
     return m ? std::string(m) : std::string();
 }
 
-void sasl::allow_insecure_mechs(bool allowed) { pn_sasl_set_allow_insecure_mechs(object_, allowed); }
-bool sasl::allow_insecure_mechs() { return pn_sasl_get_allow_insecure_mechs(object_); }
-void sasl::allowed_mechs(const std::string &mechs) { pn_sasl_allowed_mechs(object_, mechs.c_str()); }
-void sasl::config_name(const std::string &name) { pn_sasl_config_name(object_, name.c_str()); }
-void sasl::config_path(const std::string &path) { pn_sasl_config_path(object_, path.c_str()); }
-
-
 } // namespace

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/1f0df2a5/proton-c/bindings/cpp/src/sender_options.cpp
----------------------------------------------------------------------
diff --git a/proton-c/bindings/cpp/src/sender_options.cpp b/proton-c/bindings/cpp/src/sender_options.cpp
index a759d47..9467c9e 100644
--- a/proton-c/bindings/cpp/src/sender_options.cpp
+++ b/proton-c/bindings/cpp/src/sender_options.cpp
@@ -19,17 +19,15 @@
  *
  */
 
-#include "proton/binary.hpp"
-#include "proton/sender.hpp"
 #include "proton/sender_options.hpp"
 #include "proton/handler.hpp"
 #include "proton/source_options.hpp"
 #include "proton/target_options.hpp"
 
-#include "msg.hpp"
-#include "messaging_adapter.hpp"
+#include "container_impl.hpp"
 #include "contexts.hpp"
-
+#include "messaging_adapter.hpp"
+#include "proton_bits.hpp"
 
 namespace proton {
 
@@ -43,6 +41,30 @@ template <class T> struct option {
 };
 
 class sender_options::impl {
+    static void set_handler(sender l, proton_handler &h) {
+        pn_record_t *record = pn_link_attachments(unwrap(l));
+        internal::pn_ptr<pn_handler_t> chandler = connection().container().impl_->cpp_handler(&h);
+        pn_record_set_handler(record, chandler.get());
+    }
+
+    static link_context& get_context(sender l) {
+        return link_context::get(unwrap(l));
+    }
+
+    static void set_delivery_mode(sender l, enum delivery_mode mode) {
+        switch (mode) {
+        case AT_MOST_ONCE:
+            pn_link_set_snd_settle_mode(unwrap(l), PN_SND_SETTLED);
+            break;
+        case AT_LEAST_ONCE:
+            pn_link_set_snd_settle_mode(unwrap(l), PN_SND_UNSETTLED);
+            pn_link_set_rcv_settle_mode(unwrap(l), PN_RCV_FIRST);
+            break;
+        default:
+            break;
+        }
+    }
+
   public:
     option<proton_handler*> handler;
     option<enum delivery_mode> delivery_mode;
@@ -52,33 +74,16 @@ class sender_options::impl {
 
     void apply(sender& s) {
         if (s.uninitialized()) {
-            if (delivery_mode.set) {
-                switch (delivery_mode.value) {
-                case AT_MOST_ONCE:
-                    s.sender_settle_mode(sender_options::SETTLED);
-                    break;
-                case AT_LEAST_ONCE:
-                        s.sender_settle_mode(sender_options::UNSETTLED);
-                        s.receiver_settle_mode(receiver_options::SETTLE_ALWAYS);
-                    break;
-                default:
-                    break;
-                }
-            }
-            if (handler.set) {
-                if (handler.value)
-                    s.handler(*handler.value);
-                else
-                    s.detach_handler();
-            }
-            if (auto_settle.set) s.context().auto_settle = auto_settle.value;
+            if (delivery_mode.set) set_delivery_mode(s, delivery_mode.value);
+            if (handler.set && handler.value) set_handler(s, *handler.value);
+            if (auto_settle.set) get_context(s).auto_settle = auto_settle.value;
             if (source.set) {
-                proton::source local_src(pn_link_source(s.pn_object()));
-                source.value.apply(local_src);
+                proton::source local_s(make_wrapper<proton::source>(pn_link_source(unwrap(s))));
+                source.value.apply(local_s);
             }
             if (target.set) {
-                proton::target local_src(pn_link_target(s.pn_object()));
-                target.value.apply(local_src);
+                proton::target local_t(make_wrapper<proton::target>(pn_link_target(unwrap(s))));
+                target.value.apply(local_t);
             }
         }
     }
@@ -113,6 +118,5 @@ sender_options& sender_options::source(source_options &s) {impl_->source = s; re
 sender_options& sender_options::target(target_options &s) {impl_->target = s; return *this; }
 
 void sender_options::apply(sender& s) const { impl_->apply(s); }
-proton_handler* sender_options::handler() const { return impl_->handler.value; }
 
 } // namespace proton

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/1f0df2a5/proton-c/bindings/cpp/src/session.cpp
----------------------------------------------------------------------
diff --git a/proton-c/bindings/cpp/src/session.cpp b/proton-c/bindings/cpp/src/session.cpp
index 87349c9..c620242 100644
--- a/proton-c/bindings/cpp/src/session.cpp
+++ b/proton-c/bindings/cpp/src/session.cpp
@@ -99,7 +99,7 @@ receiver_range session::receivers() const {
 
 
 session_iterator session_iterator::operator++() {
-    obj_ = pn_session_next(obj_.pn_object(), 0);
+    obj_ = pn_session_next(unwrap(obj_), 0);
     return *this;
 }
 

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/1f0df2a5/proton-c/bindings/cpp/src/source.cpp
----------------------------------------------------------------------
diff --git a/proton-c/bindings/cpp/src/source.cpp b/proton-c/bindings/cpp/src/source.cpp
index c955e14..26de203 100644
--- a/proton-c/bindings/cpp/src/source.cpp
+++ b/proton-c/bindings/cpp/src/source.cpp
@@ -32,9 +32,9 @@ namespace proton {
 // Set parent_ non-null when the local terminus is authoritative and may need to be looked up.
 source::source(pn_terminus_t *t) : terminus(make_wrapper(t)) {}
 
-source::source(const sender& snd) : terminus(make_wrapper(pn_link_remote_source(snd.pn_object()))) { parent_ = snd.pn_object(); }
+source::source(const sender& snd) : terminus(make_wrapper(pn_link_remote_source(unwrap(snd)))) { parent_ = unwrap(snd); }
 
-source::source(const receiver& rcv) : terminus(make_wrapper(pn_link_remote_source(rcv.pn_object()))) {}
+source::source(const receiver& rcv) : terminus(make_wrapper(pn_link_remote_source(unwrap(rcv)))) {}
 
 std::string source::address() const {
     pn_terminus_t *authoritative = object_;

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/1f0df2a5/proton-c/bindings/cpp/src/target.cpp
----------------------------------------------------------------------
diff --git a/proton-c/bindings/cpp/src/target.cpp b/proton-c/bindings/cpp/src/target.cpp
index 2f48bf9..2085601 100644
--- a/proton-c/bindings/cpp/src/target.cpp
+++ b/proton-c/bindings/cpp/src/target.cpp
@@ -31,8 +31,8 @@ namespace proton {
 
 // Set parent_ non-null when the local terminus is authoritative and may need to be looked up.
 target::target(pn_terminus_t *t) : terminus(make_wrapper(t)) {}
-target::target(const sender& snd) : terminus(make_wrapper(pn_link_remote_target(snd.pn_object()))) {}
-target::target(const receiver& rcv) : terminus(make_wrapper(pn_link_remote_target(rcv.pn_object()))) { parent_ = rcv.pn_object(); }
+target::target(const sender& snd) : terminus(make_wrapper(pn_link_remote_target(unwrap(snd)))) {}
+target::target(const receiver& rcv) : terminus(make_wrapper(pn_link_remote_target(unwrap(rcv)))) { parent_ = unwrap(rcv); }
 
 std::string target::address() const {
     pn_terminus_t *authoritative = object_;

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/1f0df2a5/proton-c/bindings/cpp/src/terminus.cpp
----------------------------------------------------------------------
diff --git a/proton-c/bindings/cpp/src/terminus.cpp b/proton-c/bindings/cpp/src/terminus.cpp
index 396d823..f9460bb 100644
--- a/proton-c/bindings/cpp/src/terminus.cpp
+++ b/proton-c/bindings/cpp/src/terminus.cpp
@@ -24,8 +24,6 @@
 #include "proton/link.hpp"
 #include "proton/link.h"
 
-#include <limits>
-
 namespace proton {
 
 terminus::terminus(pn_terminus_t* t) :
@@ -36,67 +34,28 @@ enum expiry_policy terminus::expiry_policy() const {
     return (enum expiry_policy)pn_terminus_get_expiry_policy(object_);
 }
 
-void terminus::expiry_policy(enum expiry_policy policy) {
-    pn_terminus_set_expiry_policy(object_, pn_expiry_policy_t(policy));
-}
-
 duration terminus::timeout() const {
     return duration::SECOND * pn_terminus_get_timeout(object_);
 }
 
-void terminus::timeout(duration d) {
-    uint32_t seconds = 0;
-    if (d == duration::FOREVER)
-        seconds = std::numeric_limits<uint32_t>::max();
-    else if (d != duration::IMMEDIATE) {
-        uint64_t x = d.milliseconds();
-        if ((std::numeric_limits<uint64_t>::max() - x) <= 500)
-            seconds = std::numeric_limits<uint32_t>::max();
-        else {
-            x = (x + 500) / 1000;
-            seconds = x < std::numeric_limits<uint32_t>::max() ? x : std::numeric_limits<uint32_t>::max();
-        }
-    }
-    pn_terminus_set_timeout(object_, seconds);
-}
-
 enum distribution_mode terminus::distribution_mode() const {
     return (enum distribution_mode)pn_terminus_get_distribution_mode(object_);
 }
 
-void terminus::distribution_mode(enum distribution_mode mode) {
-    pn_terminus_set_distribution_mode(object_, pn_distribution_mode_t(mode));
-}
-
 enum durability_mode terminus::durability_mode() {
     return (enum durability_mode) pn_terminus_get_durability(object_);
 }
 
-void terminus::durability_mode(enum durability_mode d) {
-    pn_terminus_set_durability(object_, (pn_durability_t) d);
-}
-
 std::string terminus::address() const {
     return str(pn_terminus_get_address(object_));
 }
 
-void terminus::address(const std::string &addr) {
-    pn_terminus_set_address(object_, addr.c_str());
-}
-
 bool terminus::dynamic() const {
     return pn_terminus_is_dynamic(object_);
 }
 
-void terminus::dynamic(bool d) {
-    pn_terminus_set_dynamic(object_, d);
-}
-
-value& terminus::filter() { return filter_; }
 const value& terminus::filter() const { return filter_; }
 
-
-value& terminus::node_properties() { return properties_; }
 const value& terminus::node_properties() const { return properties_; }
 
 

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/1f0df2a5/proton-c/bindings/cpp/src/transfer.cpp
----------------------------------------------------------------------
diff --git a/proton-c/bindings/cpp/src/transfer.cpp b/proton-c/bindings/cpp/src/transfer.cpp
index 3559558..4356f7f 100644
--- a/proton-c/bindings/cpp/src/transfer.cpp
+++ b/proton-c/bindings/cpp/src/transfer.cpp
@@ -48,6 +48,5 @@ void transfer::settle(enum state state) {
     settle();
 }
 
-bool transfer::updated()  const { return pn_delivery_updated(pn_object()); }
 enum transfer::state transfer::state() const { return static_cast<enum state>(pn_delivery_remote_state(pn_object())); }
 }

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/1f0df2a5/proton-c/bindings/cpp/src/transport.cpp
----------------------------------------------------------------------
diff --git a/proton-c/bindings/cpp/src/transport.cpp b/proton-c/bindings/cpp/src/transport.cpp
index 5681ce4..b22d09a 100644
--- a/proton-c/bindings/cpp/src/transport.cpp
+++ b/proton-c/bindings/cpp/src/transport.cpp
@@ -56,7 +56,7 @@ void transport::unbind() {
 }
 
 void transport::bind(class connection &conn) {
-    if (pn_transport_bind(pn_object(), conn.pn_object()))
+    if (pn_transport_bind(pn_object(), unwrap(conn)))
         throw proton::error(MSG("transport::bind failed " << pn_error_text(pn_transport_error(pn_object()))));
 }
 


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