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 <[email protected]> Authored: Tue May 3 09:33:29 2016 -0700 Committer: Clifford Jansen <[email protected]> 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: [email protected] For additional commands, e-mail: [email protected]
