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/12/30 22:13:11 UTC

[23/50] [abbrv] qpid-proton git commit: PROTON-1076: C++ Binding - per acceptor connection options (acceptor context)

PROTON-1076: C++ Binding - per acceptor connection options (acceptor context)


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

Branch: refs/heads/go1
Commit: c9158ed3ac6dd68590bddd061a7e0180d74abc90
Parents: 3f4dc74
Author: Clifford Jansen <cl...@apache.org>
Authored: Sat Dec 12 08:31:59 2015 -0800
Committer: Clifford Jansen <cl...@apache.org>
Committed: Sat Dec 12 08:31:59 2015 -0800

----------------------------------------------------------------------
 .../bindings/cpp/include/proton/acceptor.hpp     | 10 +++++++---
 .../bindings/cpp/include/proton/container.hpp    |  2 +-
 proton-c/bindings/cpp/include/proton/ssl.hpp     |  4 ++--
 proton-c/bindings/cpp/src/acceptor.cpp           |  7 +++++++
 proton-c/bindings/cpp/src/connection_options.cpp |  5 +----
 proton-c/bindings/cpp/src/container.cpp          |  4 ----
 proton-c/bindings/cpp/src/container_impl.cpp     | 19 +++----------------
 proton-c/bindings/cpp/src/container_impl.hpp     |  2 +-
 proton-c/bindings/cpp/src/contexts.cpp           | 15 +++++++++++++++
 proton-c/bindings/cpp/src/contexts.hpp           |  8 ++++++++
 10 files changed, 45 insertions(+), 31 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/c9158ed3/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 c5726aa..4edcc11 100644
--- a/proton-c/bindings/cpp/include/proton/acceptor.hpp
+++ b/proton-c/bindings/cpp/include/proton/acceptor.hpp
@@ -38,9 +38,13 @@ class acceptor : public object<pn_acceptor_t>
 
     /** close the acceptor */
     PN_CPP_EXTERN void close();
-#ifndef PROTON_1057_FIXED
-    friend class container_impl;
-#endif
+
+    /** Return the current set of connection options applied to inbound connectons by the acceptor.
+     *
+     * Note that changes made to the connection options only affect connections accepted after this
+     * call returns.
+     */
+    PN_CPP_EXTERN class connection_options &connection_options();
 };
 
 }

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/c9158ed3/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 2cebcd4..fbdafb9 100644
--- a/proton-c/bindings/cpp/include/proton/container.hpp
+++ b/proton-c/bindings/cpp/include/proton/container.hpp
@@ -62,7 +62,7 @@ class container : public event_loop {
     /** Locally open a connection @see connection::open  */
     PN_CPP_EXTERN connection connect(const proton::url&, const connection_options &opts = connection_options());
 
-    /** Open a connection to url and create a receiver with source=url.path() */
+    /** Listen on url host and port for incoming connections. */
     PN_CPP_EXTERN acceptor listen(const proton::url&, const connection_options &opts = connection_options());
 
     /** Run the event loop, return when all connections and acceptors are closed. */

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/c9158ed3/proton-c/bindings/cpp/include/proton/ssl.hpp
----------------------------------------------------------------------
diff --git a/proton-c/bindings/cpp/include/proton/ssl.hpp b/proton-c/bindings/cpp/include/proton/ssl.hpp
index bb78ae3..609e7e2 100644
--- a/proton-c/bindings/cpp/include/proton/ssl.hpp
+++ b/proton-c/bindings/cpp/include/proton/ssl.hpp
@@ -104,9 +104,9 @@ class server_domain : private ssl_domain {
     PN_CPP_EXTERN ~server_domain();
 
   private:
-    // Bring pn_domain into scope and allow container_impl to use it
+    // Bring pn_domain into scope and allow connection_options to use it
     using ssl_domain::pn_domain;
-    friend class container_impl;
+    friend class connection_options;
 };
 
 

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/c9158ed3/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 279f776..8f4c722 100644
--- a/proton-c/bindings/cpp/src/acceptor.cpp
+++ b/proton-c/bindings/cpp/src/acceptor.cpp
@@ -21,10 +21,17 @@
 
 #include "proton/acceptor.hpp"
 #include "proton/error.hpp"
+#include "proton/connection_options.hpp"
 #include "msg.hpp"
+#include "contexts.hpp"
 
 namespace proton {
 
 void acceptor::close() { pn_acceptor_close(pn_object()); }
 
+class connection_options& acceptor::connection_options() {
+    listener_context& lc(listener_context::get(pn_object()));
+    return lc.connection_options;
+}
+
 }

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/c9158ed3/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 6b72c9c..3a3e0e1 100644
--- a/proton-c/bindings/cpp/src/connection_options.cpp
+++ b/proton-c/bindings/cpp/src/connection_options.cpp
@@ -73,7 +73,6 @@ class connection_options::impl {
         {
             // SSL
             if (outbound && outbound->address().scheme() == url::AMQPS) {
-                // Configure outbound ssl options. pni_acceptor_readable handles the inbound case.
                 const char* id = resume_id.value.empty() ? NULL : resume_id.value.c_str();
                 pn_ssl_t *ssl = pn_ssl(pnt);
                 if (pn_ssl_init(ssl, client_domain.value.pn_domain(), id))
@@ -81,16 +80,14 @@ class connection_options::impl {
                 if (peer_hostname.set && !peer_hostname.value.empty())
                     if (pn_ssl_set_peer_hostname(ssl, peer_hostname.value.c_str()))
                         throw error(MSG("error in SSL/TLS peer hostname \"") << peer_hostname.value << '"');
-#ifdef PROTON_1054_FIXED
             } else if (!outbound) {
-                pn_acceptor_t *pnp = pn_connection_acceptor(pn_cast(&c));
+                pn_acceptor_t *pnp = pn_connection_acceptor(pnc);
                 listener_context &lc(listener_context::get(pnp));
                 if (lc.ssl) {
                     pn_ssl_t *ssl = pn_ssl(pnt);
                     if (pn_ssl_init(ssl, server_domain.value.pn_domain(), NULL))
                         throw error(MSG("server SSL/TLS initialization error"));
                 }
-#endif
             }
 
             // SASL

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/c9158ed3/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 34bd2a0..1924cc0 100644
--- a/proton-c/bindings/cpp/src/container.cpp
+++ b/proton-c/bindings/cpp/src/container.cpp
@@ -67,11 +67,7 @@ receiver container::open_receiver(const proton::url &url) {
 }
 
 acceptor container::listen(const proton::url &url, const connection_options &opts) {
-#ifdef PN_COMING_SOON
     return impl_->listen(url, opts);
-#else
-    return impl_->listen(url);
-#endif
 }
 
 task container::schedule(int delay, handler *h) { return impl_->schedule(delay, h); }

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/c9158ed3/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 648aa56..e3c7c2c 100644
--- a/proton-c/bindings/cpp/src/container_impl.cpp
+++ b/proton-c/bindings/cpp/src/container_impl.cpp
@@ -185,11 +185,9 @@ receiver container_impl::open_receiver(const proton::url &url) {
     return rcv;
 }
 
-acceptor container_impl::listen(const proton::url& url) {
+acceptor container_impl::listen(const proton::url& url, const connection_options &user_opts) {
     connection_options opts = server_connection_options(); // Defaults
-#ifdef PN_COMING_SOON
     opts.override(user_opts);
-#endif
     handler *h = opts.handler();
     pn_ptr<pn_handler_t> chandler = h ? cpp_handler(h) : pn_ptr<pn_handler_t>();
     pn_acceptor_t *acptr = pn_reactor_acceptor(reactor_.pn_object(), url.host().c_str(), url.port().c_str(), chandler.get());
@@ -197,16 +195,11 @@ acceptor container_impl::listen(const proton::url& url) {
         throw error(MSG("accept fail: " <<
                         pn_error_text(pn_io_error(reactor_.pn_io())))
                         << "(" << url << ")");
-#ifdef PROTON_1054_FIXED
     // Do not use pn_acceptor_set_ssl_domain().  Manage the incoming connections ourselves for
     // more flexibility (i.e. ability to change the server cert for a long running listener).
     listener_context& lc(listener_context::get(acptr));
     lc.connection_options = opts;
     lc.ssl = url.scheme() == url::AMQPS;
-#else
-    if (url.scheme() == url::AMQPS)
-        pn_acceptor_set_ssl_domain(acptr, server_connection_options_.server_domain().pn_domain());
-#endif
     return acceptor(acptr);
 }
 
@@ -233,15 +226,9 @@ void container_impl::server_connection_options(const connection_options &opts) {
 }
 
 void container_impl::configure_server_connection(connection &c) {
-#ifdef PN_1054_FIXED
-    pn_acceptor_t *pnp = pn_connection_acceptor(pn_cast(&c));
+    pn_acceptor_t *pnp = pn_connection_acceptor(connection_options::pn_connection(c));
     listener_context &lc(listener_context::get(pnp));
-    class connection_options &opts(lc.connection_options);
-#else
-    // Can't distinguish between multiple listeners yet.  See PROTON-1054
-    class connection_options &opts(server_connection_options_);
-#endif
-    opts.apply(c);
+    lc.connection_options.apply(c);
 }
 
 }

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/c9158ed3/proton-c/bindings/cpp/src/container_impl.hpp
----------------------------------------------------------------------
diff --git a/proton-c/bindings/cpp/src/container_impl.hpp b/proton-c/bindings/cpp/src/container_impl.hpp
index 4a89ab3..31ec0cf 100644
--- a/proton-c/bindings/cpp/src/container_impl.hpp
+++ b/proton-c/bindings/cpp/src/container_impl.hpp
@@ -52,7 +52,7 @@ class container_impl
     PN_CPP_EXTERN sender open_sender(const url&);
     PN_CPP_EXTERN receiver open_receiver(connection &connection, const std::string &addr, bool dynamic, handler *h);
     PN_CPP_EXTERN receiver open_receiver(const url&);
-    PN_CPP_EXTERN class acceptor listen(const url&);
+    PN_CPP_EXTERN class acceptor listen(const url&, const connection_options &);
     PN_CPP_EXTERN duration timeout();
     PN_CPP_EXTERN void timeout(duration timeout);
     void client_connection_options(const connection_options &);

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/c9158ed3/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 0ea4262..08187a2 100644
--- a/proton-c/bindings/cpp/src/contexts.cpp
+++ b/proton-c/bindings/cpp/src/contexts.cpp
@@ -48,6 +48,7 @@ pn_class_t cpp_context_class = PN_CLASS(cpp_context);
 // Handles
 PN_HANDLE(CONNECTION_CONTEXT)
 PN_HANDLE(CONTAINER_CONTEXT)
+PN_HANDLE(LISTENER_CONTEXT)
 }
 
 context::~context() {}
@@ -89,4 +90,18 @@ container &container_context::get(pn_reactor_t *pn_reactor) {
     return *ctx;
 }
 
+listener_context& listener_context::get(pn_acceptor_t* a) {
+    // A Proton C pn_acceptor_t is really just a selectable
+    pn_selectable_t *sel = reinterpret_cast<pn_selectable_t*>(a);
+
+    listener_context* ctx =
+        get_context<listener_context>(pn_selectable_attachments(sel), LISTENER_CONTEXT);
+    if (!ctx) {
+        ctx =  context::create<listener_context>();
+        set_context(pn_selectable_attachments(sel), LISTENER_CONTEXT, context::pn_class(), ctx);
+        pn_decref(ctx);
+    }
+    return *ctx;
+}
+
 }

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/c9158ed3/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 c12d8bd..9bfd2d4 100644
--- a/proton-c/bindings/cpp/src/contexts.hpp
+++ b/proton-c/bindings/cpp/src/contexts.hpp
@@ -76,6 +76,14 @@ class container_context {
     static container& get(pn_reactor_t*);
 };
 
+class listener_context : public context {
+  public:
+    static listener_context& get(pn_acceptor_t* c);
+    listener_context() : ssl(false) {}
+    class connection_options connection_options;
+    bool ssl;
+};
+
 }
 
 #endif  /*!PROTON_CPP_CONTEXTS_H*/


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