You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by cl...@apache.org on 2016/05/03 18:43:53 UTC

qpid-proton git commit: PROTON-1187: session_options, connection.open() with connection_options

Repository: qpid-proton
Updated Branches:
  refs/heads/master 3dfb077c4 -> 99a905615


PROTON-1187: session_options, connection.open() with connection_options


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

Branch: refs/heads/master
Commit: 99a90561524fc0a3fe0c37833b7c3d97e4bc84d3
Parents: 3dfb077
Author: Clifford Jansen <cl...@apache.org>
Authored: Tue May 3 09:33:29 2016 -0700
Committer: Clifford Jansen <cl...@apache.org>
Committed: Tue May 3 09:35:00 2016 -0700

----------------------------------------------------------------------
 proton-c/bindings/cpp/CMakeLists.txt            |  1 +
 .../bindings/cpp/include/proton/connection.hpp  |  7 +-
 .../cpp/include/proton/connection_options.hpp   |  1 +
 .../bindings/cpp/include/proton/container.hpp   |  1 +
 .../bindings/cpp/include/proton/handler.hpp     |  1 +
 .../bindings/cpp/include/proton/session.hpp     | 12 ++-
 .../cpp/include/proton/session_options.hpp      | 75 +++++++++++++++++
 proton-c/bindings/cpp/src/connection.cpp        | 13 ++-
 proton-c/bindings/cpp/src/container_impl.cpp    | 16 ++--
 proton-c/bindings/cpp/src/session.cpp           | 12 ++-
 proton-c/bindings/cpp/src/session_options.cpp   | 84 ++++++++++++++++++++
 proton-c/bindings/cpp/src/terminus.cpp          |  1 -
 12 files changed, 203 insertions(+), 21 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/99a90561/proton-c/bindings/cpp/CMakeLists.txt
----------------------------------------------------------------------
diff --git a/proton-c/bindings/cpp/CMakeLists.txt b/proton-c/bindings/cpp/CMakeLists.txt
index 4ef3097..1a99385 100644
--- a/proton-c/bindings/cpp/CMakeLists.txt
+++ b/proton-c/bindings/cpp/CMakeLists.txt
@@ -64,6 +64,7 @@ set(qpid-proton-cpp-source
   src/sender.cpp
   src/sender_options.cpp
   src/session.cpp
+  src/session_options.cpp
   src/source.cpp
   src/ssl.cpp
   src/ssl_domain.cpp

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/99a90561/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 6f664db..a1bbaea 100644
--- a/proton-c/bindings/cpp/include/proton/connection.hpp
+++ b/proton-c/bindings/cpp/include/proton/connection.hpp
@@ -74,12 +74,9 @@ PN_CPP_CLASS_EXTERN connection : public internal::object<pn_connection_t>, publi
     /// Return the container ID for the connection.
     PN_CPP_EXTERN std::string container_id() const;
 
-    /// @cond INTERNAL
-    /// XXX connection options
     /// Initiate local open.  The operation is not complete till
     /// handler::on_connection_open().
-    PN_CPP_EXTERN void open();
-    /// @endcond
+    PN_CPP_EXTERN void open(const connection_options &opts = connection_options());
 
     /// Initiate local close.  The operation is not complete till
     /// handler::on_connection_close().
@@ -96,7 +93,7 @@ PN_CPP_CLASS_EXTERN connection : public internal::object<pn_connection_t>, publi
     /// @endcond
 
     /// Open a new session.
-    PN_CPP_EXTERN session open_session();
+    PN_CPP_EXTERN session open_session(const session_options &opts = session_options());
 
     /// Get the default session.  A default session is created on the
     /// first call and reused for the lifetime of the connection.

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/99a90561/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 df02840..6c7491f 100644
--- a/proton-c/bindings/cpp/include/proton/connection_options.hpp
+++ b/proton-c/bindings/cpp/include/proton/connection_options.hpp
@@ -155,6 +155,7 @@ class connection_options {
     friend class container_impl;
     friend class connector;
     friend class io::connection_engine;
+    friend class connection;
 };
 
 }

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/99a90561/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 ae5f08c..c3a650b 100644
--- a/proton-c/bindings/cpp/include/proton/container.hpp
+++ b/proton-c/bindings/cpp/include/proton/container.hpp
@@ -140,6 +140,7 @@ class container {
     friend class messaging_adapter;
     friend class receiver_options;
     friend class sender_options;
+    friend class session_options;
     /// @endcond
 };
 

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/99a90561/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 8806c17..b59e0cf 100644
--- a/proton-c/bindings/cpp/include/proton/handler.hpp
+++ b/proton-c/bindings/cpp/include/proton/handler.hpp
@@ -155,6 +155,7 @@ PN_CPP_CLASS_EXTERN handler
     friend class connection_options;
     friend class receiver_options;
     friend class sender_options;
+    friend class session_options;
     /// @endcond
 };
 

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/99a90561/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 33efd30..4f92a34 100644
--- a/proton-c/bindings/cpp/include/proton/session.hpp
+++ b/proton-c/bindings/cpp/include/proton/session.hpp
@@ -26,6 +26,7 @@
 #include "proton/endpoint.hpp"
 #include "proton/receiver.hpp"
 #include "proton/sender.hpp"
+#include "proton/session_options.hpp"
 
 #include "proton/types.h"
 #include "proton/link.h"
@@ -57,12 +58,9 @@ PN_CPP_CLASS_EXTERN session : public internal::object<pn_session_t>, public endp
 
     PN_CPP_EXTERN class error_condition error() const;
 
-    /// @cond INTERNAL
-    /// XXX needs to take connection options
     /// Initiate local open.  The operation is not complete till
     /// handler::on_session_open().
-    PN_CPP_EXTERN void open();
-    /// @endcond
+    PN_CPP_EXTERN void open(const session_options &opts = session_options());
 
     /// Initiate local close.  The operation is not complete till
     /// handler::on_session_close().
@@ -85,6 +83,12 @@ PN_CPP_CLASS_EXTERN session : public internal::object<pn_session_t>, public endp
     /// Open a receiver for `addr`.
     PN_CPP_EXTERN receiver open_receiver(const std::string &addr, const receiver_options &opts = receiver_options());
 
+    /// The number of incoming bytes currently buffered.
+    PN_CPP_EXTERN size_t incoming_bytes() const;
+
+    /// The number of outgoing bytes currently buffered.
+    PN_CPP_EXTERN size_t outgoing_bytes() const;
+
     /// Return the senders on this session.
     PN_CPP_EXTERN sender_range senders() const;
 

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/99a90561/proton-c/bindings/cpp/include/proton/session_options.hpp
----------------------------------------------------------------------
diff --git a/proton-c/bindings/cpp/include/proton/session_options.hpp b/proton-c/bindings/cpp/include/proton/session_options.hpp
new file mode 100644
index 0000000..182f5ff
--- /dev/null
+++ b/proton-c/bindings/cpp/include/proton/session_options.hpp
@@ -0,0 +1,75 @@
+#ifndef PROTON_CPP_SESSION_OPTIONS_H
+#define PROTON_CPP_SESSION_OPTIONS_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 "proton/config.hpp"
+#include "proton/export.hpp"
+#include "proton/pn_unique_ptr.hpp"
+#include "proton/types.hpp"
+
+
+namespace proton {
+
+class handler;
+class session;
+
+
+/// Options for creating a session.
+///
+/// Options can be "chained" (@see proton::connection_options).
+///
+/// Normal value semantics: copy or assign creates a separate copy of
+/// the options.
+class session_options {
+  public:
+
+    /// Create an empty set of options.
+    PN_CPP_EXTERN session_options();
+
+    /// Copy options.
+    PN_CPP_EXTERN session_options(const session_options&);
+
+    PN_CPP_EXTERN ~session_options();
+
+    /// Copy options.
+    PN_CPP_EXTERN session_options& operator=(const session_options&);
+
+    /// Set a handler for the session.
+    PN_CPP_EXTERN session_options& handler(class handler *);
+
+    /// @cond INTERNAL
+    // Other useful session configuration TBD.
+  private:
+    void apply(session&) const;
+    PN_CPP_EXTERN void update(const session_options& other);
+
+    class impl;
+    internal::pn_unique_ptr<impl> impl_;
+
+    friend class session;
+    /// @endcond
+};
+
+}
+
+#endif // PROTON_CPP_SESSION_OPTIONS_H

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/99a90561/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 954973d..093c19a 100644
--- a/proton-c/bindings/cpp/src/connection.cpp
+++ b/proton-c/bindings/cpp/src/connection.cpp
@@ -46,12 +46,14 @@ transport connection::transport() const {
     return make_wrapper(pn_connection_transport(pn_object()));
 }
 
-void connection::open() {
+void connection::open(const connection_options &opts) {
     connector *connector = dynamic_cast<class connector*>(
         connection_context::get(pn_object()).handler.get());
     if (connector)
+        // connector has an internal copy of opts
         connector->apply_options();
-    // Inbound connections should already be configured.
+    else
+        opts.apply(*this);
     pn_connection_open(pn_object());
 }
 
@@ -82,7 +84,12 @@ session_range connection::sessions() const {
     return session_range(session_iterator(pn_session_head(pn_object(), 0)));
 }
 
-session connection::open_session() { return pn_session(pn_object()); }
+session connection::open_session(const session_options &opts) {
+    session s(make_wrapper<session>(pn_session(pn_object())));
+    // TODO: error check, too many sessions, no mem...
+    if (!!s) s.open(opts);
+    return s;
+}
 
 session connection::default_session() {
     connection_context& ctx = connection_context::get(pn_object());

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/99a90561/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 477d5bc..00ac5fd 100644
--- a/proton-c/bindings/cpp/src/container_impl.cpp
+++ b/proton-c/bindings/cpp/src/container_impl.cpp
@@ -110,12 +110,14 @@ class override_handler : public proton_handler
 };
 
 internal::pn_ptr<pn_handler_t> container_impl::cpp_handler(proton_handler *h) {
-    pn_handler_t *handler = pn_handler_new(&handler_context::dispatch,
-                                           sizeof(struct handler_context),
-                                           &handler_context::cleanup);
-    handler_context &hc = handler_context::get(handler);
-    hc.container_ = &container_;
-    hc.handler_ = h;
+    pn_handler_t *handler = h ? pn_handler_new(&handler_context::dispatch,
+                                               sizeof(struct handler_context),
+                                               &handler_context::cleanup) : 0;
+    if (handler) {
+        handler_context &hc = handler_context::get(handler);
+        hc.container_ = &container_;
+        hc.handler_ = h;
+    }
     return internal::take_ownership(handler);
 }
 
@@ -154,7 +156,7 @@ connection container_impl::connect(const proton::url &url, const connection_opti
     cc.link_gen.prefix(id_gen_.next() + "/");
     pn_connection_set_container(unwrap(conn), id_.c_str());
 
-    conn.open();
+    conn.open(opts);
     return conn;
 }
 

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/99a90561/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 c620242..a209814 100644
--- a/proton-c/bindings/cpp/src/session.cpp
+++ b/proton-c/bindings/cpp/src/session.cpp
@@ -24,6 +24,7 @@
 #include "proton/session.h"
 #include "proton/session.hpp"
 #include "proton/connection.hpp"
+#include "proton/session_options.hpp"
 
 #include "contexts.hpp"
 #include "container_impl.hpp"
@@ -33,7 +34,8 @@
 
 namespace proton {
 
-void session::open() {
+void session::open(const session_options &opts) {
+    opts.apply(*this);
     pn_session_open(pn_object());
 }
 
@@ -77,6 +79,14 @@ error_condition session::error() const {
     return make_wrapper(pn_session_remote_condition(pn_object()));
 }
 
+size_t session::incoming_bytes() const {
+    return pn_session_incoming_bytes(pn_object());
+}
+
+size_t session::outgoing_bytes() const {
+    return pn_session_outgoing_bytes(pn_object());
+}
+
 sender_range session::senders() const {
     pn_link_t *lnk = pn_link_head(pn_session_connection(pn_object()), 0);
     while (lnk) {

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/99a90561/proton-c/bindings/cpp/src/session_options.cpp
----------------------------------------------------------------------
diff --git a/proton-c/bindings/cpp/src/session_options.cpp b/proton-c/bindings/cpp/src/session_options.cpp
new file mode 100644
index 0000000..e95884b
--- /dev/null
+++ b/proton-c/bindings/cpp/src/session_options.cpp
@@ -0,0 +1,84 @@
+/*
+ *
+ * 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/session_options.hpp"
+#include "proton/session.hpp"
+#include "proton/connection.hpp"
+#include "proton/container.hpp"
+
+#include "proton/session.h"
+
+#include "messaging_adapter.hpp"
+#include "container_impl.hpp"
+#include "proton_bits.hpp"
+
+namespace proton {
+
+template <class T> struct option {
+    T value;
+    bool set;
+
+    option() : value(), set(false) {}
+    option& operator=(const T& x) { value = x;  set = true; return *this; }
+    void update(const option<T>& x) { if (x.set) *this = x.value; }
+};
+
+class session_options::impl {
+  public:
+    option<proton_handler *> handler;
+
+    void apply(session& s) {
+        if (s.uninitialized()) {
+            if (handler.set) {
+                pn_record_t *record = pn_session_attachments(unwrap(s));
+                internal::pn_ptr<pn_handler_t> chandler = s.connection().container().impl_->cpp_handler(handler.value);
+                pn_record_set_handler(record, chandler.get());
+            }
+        }
+    }
+
+    void update(const impl& x) {
+        handler.update(x.handler);
+    }
+
+};
+
+session_options::session_options() : impl_(new impl()) {}
+session_options::session_options(const session_options& x) : impl_(new impl()) {
+    *this = x;
+}
+session_options::~session_options() {}
+
+session_options& session_options::operator=(const session_options& x) {
+    *impl_ = *x.impl_;
+    return *this;
+}
+
+void session_options::update(const session_options& x) { impl_->update(*x.impl_); }
+
+session_options& session_options::handler(class handler *h) { impl_->handler = h->messaging_adapter_.get(); return *this; }
+
+void session_options::apply(session& s) const { impl_->apply(s); }
+
+
+
+
+} // namespace proton

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/99a90561/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 f1cc61a..7d3bc5b 100644
--- a/proton-c/bindings/cpp/src/terminus.cpp
+++ b/proton-c/bindings/cpp/src/terminus.cpp
@@ -52,7 +52,6 @@ bool terminus::dynamic() const {
 
 value terminus::node_properties() const {
     value x(pn_terminus_properties(object_));
-    pn_terminus_properties(object_); // ZZZ
     return x;
 }
 


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