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