Repository: qpid-proton Updated Branches: refs/heads/master f1e2428ba -> 13364ad50
PROTON-1180, PROTON-1179: Finish endpoint work, most of the condition work - Renamed condition -> error_condition - renamed all accessors for error_condition to error() - Made error_condition a value class holding the same information as the pn_condition_t it is made from. - Added close(const error_condition&) to endpoint - Enabled tests for endpoint::close(const error_condition&) x Can't yet set the properties on an error_condition in a close() Project: http://git-wip-us.apache.org/repos/asf/qpid-proton/repo Commit: http://git-wip-us.apache.org/repos/asf/qpid-proton/commit/13364ad5 Tree: http://git-wip-us.apache.org/repos/asf/qpid-proton/tree/13364ad5 Diff: http://git-wip-us.apache.org/repos/asf/qpid-proton/diff/13364ad5 Branch: refs/heads/master Commit: 13364ad50e1f276def4487d8f54d6486619ec785 Parents: f1e2428 Author: Andrew Stitcher <[email protected]> Authored: Tue Apr 19 16:03:37 2016 -0400 Committer: Andrew Stitcher <[email protected]> Committed: Wed Apr 20 20:02:39 2016 -0400 ---------------------------------------------------------------------- examples/cpp/broker.hpp | 4 +- proton-c/bindings/cpp/CMakeLists.txt | 2 +- .../bindings/cpp/include/proton/condition.hpp | 92 -------------------- .../bindings/cpp/include/proton/connection.hpp | 6 +- .../bindings/cpp/include/proton/endpoint.hpp | 5 +- .../cpp/include/proton/error_condition.hpp | 91 +++++++++++++++++++ .../bindings/cpp/include/proton/handler.hpp | 4 +- .../cpp/include/proton/io/connection_engine.hpp | 2 +- proton-c/bindings/cpp/include/proton/link.hpp | 8 +- .../bindings/cpp/include/proton/session.hpp | 7 +- .../bindings/cpp/include/proton/transport.hpp | 4 +- proton-c/bindings/cpp/src/condition.cpp | 65 -------------- proton-c/bindings/cpp/src/connection.cpp | 4 +- proton-c/bindings/cpp/src/endpoint.cpp | 22 +++++ proton-c/bindings/cpp/src/engine_test.cpp | 62 +++++++------ proton-c/bindings/cpp/src/error_condition.cpp | 87 ++++++++++++++++++ proton-c/bindings/cpp/src/handler.cpp | 12 +-- proton-c/bindings/cpp/src/link.cpp | 2 +- proton-c/bindings/cpp/src/session.cpp | 2 +- proton-c/bindings/cpp/src/transport.cpp | 10 +-- 20 files changed, 273 insertions(+), 218 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/13364ad5/examples/cpp/broker.hpp ---------------------------------------------------------------------- diff --git a/examples/cpp/broker.hpp b/examples/cpp/broker.hpp index 8f16e61..8d08f2a 100644 --- a/examples/cpp/broker.hpp +++ b/examples/cpp/broker.hpp @@ -195,10 +195,10 @@ class broker_handler : public proton::handler { } void on_transport_error(proton::transport &t) override { - std::cout << "broker client disconnect: " << t.condition().what() << std::endl; + std::cout << "broker client disconnect: " << t.error().what() << std::endl; } - void on_unhandled_error(const proton::condition &c) override { + void on_unhandled_error(const proton::error_condition &c) override { std::cerr << "broker error: " << c.what() << std::endl; } http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/13364ad5/proton-c/bindings/cpp/CMakeLists.txt ---------------------------------------------------------------------- diff --git a/proton-c/bindings/cpp/CMakeLists.txt b/proton-c/bindings/cpp/CMakeLists.txt index 2549547..070728f 100644 --- a/proton-c/bindings/cpp/CMakeLists.txt +++ b/proton-c/bindings/cpp/CMakeLists.txt @@ -28,7 +28,6 @@ set(qpid-proton-cpp-source src/acceptor.cpp src/binary.cpp src/byte_array.cpp - src/condition.cpp src/connection.cpp src/connection_options.cpp src/connector.cpp @@ -43,6 +42,7 @@ set(qpid-proton-cpp-source src/encoder.cpp src/endpoint.cpp src/error.cpp + src/error_condition.cpp src/handler.cpp src/id_generator.cpp src/io/connection_engine.cpp http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/13364ad5/proton-c/bindings/cpp/include/proton/condition.hpp ---------------------------------------------------------------------- diff --git a/proton-c/bindings/cpp/include/proton/condition.hpp b/proton-c/bindings/cpp/include/proton/condition.hpp deleted file mode 100644 index 9a350f8..0000000 --- a/proton-c/bindings/cpp/include/proton/condition.hpp +++ /dev/null @@ -1,92 +0,0 @@ -#ifndef PROTON_CPP_CONDITION_H -#define PROTON_CPP_CONDITION_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/export.hpp" -#include "proton/value.hpp" - -#include "proton/config.hpp" - -#include <string> - -struct pn_condition_t; - -namespace proton { - -/// Describes an endpoint error state. -/// -/// This class has only one purpose: it can be used to get access to information about why -/// an endpoint (a link, session, connection) or a transport has closed. -/// -/// The information that is requuired (for instance the condition name and/or description) -/// should be extracted immediately from the condition in order to enforce this conditions -/// cannot be copied or assigned. -class condition { - /// @cond INTERNAL - condition(pn_condition_t* c) : condition_(c) {} - /// @endcond - - public: -#if PN_CPP_HAS_CPP11 - condition() = delete; - condition(const condition&) = delete; - condition(condition&&) = default; - condition& operator=(const condition&) = delete; - condition& operator=(condition&&) = delete; -#endif - - /// No condition set. - PN_CPP_EXTERN bool operator!() const; - - /// XXX add C++11 explicit bool conversion with a note about - /// C++11-only usage - - /// No condition has been set. - PN_CPP_EXTERN bool empty() const; - - /// Condition name. - PN_CPP_EXTERN std::string name() const; - - /// Descriptive string for condition. - PN_CPP_EXTERN std::string description() const; - - /// Extra information for condition. - PN_CPP_EXTERN value properties() const; - - /// Simple printable string for condition. - PN_CPP_EXTERN std::string what() const; - - /// @cond INTERNAL - private: - pn_condition_t* const condition_; - - friend class transport; - friend class connection; - friend class session; - friend class link; - /// @endcond -}; - -} - -#endif // PROTON_CPP_CONDITION_H http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/13364ad5/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 586b327..9a1feab 100644 --- a/proton-c/bindings/cpp/include/proton/connection.hpp +++ b/proton-c/bindings/cpp/include/proton/connection.hpp @@ -56,7 +56,7 @@ PN_CPP_CLASS_EXTERN connection : public internal::object<pn_connection_t>, publi PN_CPP_EXTERN bool active() const; PN_CPP_EXTERN bool closed() const; - PN_CPP_EXTERN class condition condition() const; + PN_CPP_EXTERN class error_condition error() const; /// Get the container. /// @@ -84,6 +84,10 @@ PN_CPP_CLASS_EXTERN connection : public internal::object<pn_connection_t>, publi /// handler::on_connection_close(). PN_CPP_EXTERN void close(); + /// Initiate close with an error condition. + /// The operation is not complete till handler::on_connection_close(). + PN_CPP_EXTERN void close(const error_condition&); + /// @cond INTERNAL /// XXX undiscussed /// Release link and session resources of this connection. http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/13364ad5/proton-c/bindings/cpp/include/proton/endpoint.hpp ---------------------------------------------------------------------- diff --git a/proton-c/bindings/cpp/include/proton/endpoint.hpp b/proton-c/bindings/cpp/include/proton/endpoint.hpp index b0f1d55..b4d7034 100644 --- a/proton-c/bindings/cpp/include/proton/endpoint.hpp +++ b/proton-c/bindings/cpp/include/proton/endpoint.hpp @@ -23,7 +23,7 @@ */ #include "proton/config.hpp" #include "proton/export.hpp" -#include "proton/condition.hpp" +#include "proton/error_condition.hpp" #include "proton/comparable.hpp" namespace proton { @@ -43,10 +43,11 @@ PN_CPP_CLASS_EXTERN endpoint { virtual bool closed() const = 0; /// Get the error condition of the remote endpoint. - virtual class condition condition() const = 0; + virtual class error_condition error() const = 0; /// Close endpoint virtual void close() = 0; + virtual void close(const error_condition&) = 0; #if PN_CPP_HAS_CPP11 // Make everything explicit for C++11 compilers http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/13364ad5/proton-c/bindings/cpp/include/proton/error_condition.hpp ---------------------------------------------------------------------- diff --git a/proton-c/bindings/cpp/include/proton/error_condition.hpp b/proton-c/bindings/cpp/include/proton/error_condition.hpp new file mode 100644 index 0000000..0d109dc --- /dev/null +++ b/proton-c/bindings/cpp/include/proton/error_condition.hpp @@ -0,0 +1,91 @@ +#ifndef PROTON_CPP_ERROR_CONDITION_H +#define PROTON_CPP_ERROR_CONDITION_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/export.hpp" +#include "proton/value.hpp" + +#include "proton/config.hpp" + +#include <string> + +struct pn_condition_t; + +namespace proton { + +/// Describes an endpoint error state. +class error_condition { + /// @cond INTERNAL + error_condition(pn_condition_t* c); + /// @endcond + + public: + error_condition() {} + PN_CPP_EXTERN error_condition(std::string description); + PN_CPP_EXTERN error_condition(std::string name, std::string description); + PN_CPP_EXTERN error_condition(std::string name, std::string description, proton::value properties); + +#if PN_CPP_HAS_CPP11 + error_condition(const error_condition&) = default; + error_condition(error_condition&&) = default; + error_condition& operator=(const error_condition&) = default; + error_condition& operator=(error_condition&&) = default; +#endif + + /// No condition set. + PN_CPP_EXTERN bool operator!() const; + + /// XXX add C++11 explicit bool conversion with a note about + /// C++11-only usage + + /// No condition has been set. + PN_CPP_EXTERN bool empty() const; + + /// Condition name. + PN_CPP_EXTERN std::string name() const; + + /// Descriptive string for condition. + PN_CPP_EXTERN std::string description() const; + + /// Extra information for condition. + PN_CPP_EXTERN value properties() const; + + /// Simple printable string for condition. + PN_CPP_EXTERN std::string what() const; + + /// @cond INTERNAL + private: + std::string name_; + std::string description_; + proton::value properties_; + + friend class transport; + friend class connection; + friend class session; + friend class link; + /// @endcond +}; + +} + +#endif // PROTON_CPP_ERROR_CONDITION_H http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/13364ad5/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 fa81454..ff50b37 100644 --- a/proton-c/bindings/cpp/include/proton/handler.hpp +++ b/proton-c/bindings/cpp/include/proton/handler.hpp @@ -28,7 +28,7 @@ namespace proton { -class condition; +class error_condition; class container; class event; class transport; @@ -138,7 +138,7 @@ PN_CPP_CLASS_EXTERN handler /// @endcond /// Fallback error handling. - PN_CPP_EXTERN virtual void on_unhandled_error(const condition &c); + PN_CPP_EXTERN virtual void on_unhandled_error(const error_condition &c); /// @} http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/13364ad5/proton-c/bindings/cpp/include/proton/io/connection_engine.hpp ---------------------------------------------------------------------- diff --git a/proton-c/bindings/cpp/include/proton/io/connection_engine.hpp b/proton-c/bindings/cpp/include/proton/io/connection_engine.hpp index 3192d44..42ab06e 100644 --- a/proton-c/bindings/cpp/include/proton/io/connection_engine.hpp +++ b/proton-c/bindings/cpp/include/proton/io/connection_engine.hpp @@ -20,10 +20,10 @@ * under the License. */ -#include "proton/condition.hpp" #include "proton/connection.hpp" #include "proton/connection_options.hpp" #include "proton/error.hpp" +#include "proton/error_condition.hpp" #include "proton/export.hpp" #include "proton/pn_unique_ptr.hpp" #include "proton/transport.hpp" http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/13364ad5/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 0d9a92c..a9c5edc 100644 --- a/proton-c/bindings/cpp/include/proton/link.hpp +++ b/proton-c/bindings/cpp/include/proton/link.hpp @@ -38,7 +38,7 @@ namespace proton { class sender; class receiver; -class condition; +class error_condition; class link_context; /// A named channel for sending or receiving messages. It is the base @@ -57,7 +57,7 @@ PN_CPP_CLASS_EXTERN link : public internal::object<pn_link_t> , public endpoint PN_CPP_EXTERN bool active() const; PN_CPP_EXTERN bool closed() const; - PN_CPP_EXTERN class condition condition() const; + PN_CPP_EXTERN class error_condition error() const; /// Locally open the link. The operation is not complete till /// handler::on_link_open. @@ -67,6 +67,10 @@ PN_CPP_CLASS_EXTERN link : public internal::object<pn_link_t> , public endpoint /// handler::on_link_close. PN_CPP_EXTERN void close(); + /// Initiate close with an error condition. + /// The operation is not complete till handler::on_connection_close(). + PN_CPP_EXTERN void close(const error_condition&); + /// Suspend the link without closing it. A suspended link may be /// reopened with the same or different link options if supported by /// the peer. A suspended durable subscriptions becomes inactive http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/13364ad5/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 73e75d6..5321221 100644 --- a/proton-c/bindings/cpp/include/proton/session.hpp +++ b/proton-c/bindings/cpp/include/proton/session.hpp @@ -54,7 +54,7 @@ PN_CPP_CLASS_EXTERN session : public internal::object<pn_session_t>, public endp PN_CPP_EXTERN bool active() const; PN_CPP_EXTERN bool closed() const; - PN_CPP_EXTERN class condition condition() const; + PN_CPP_EXTERN class error_condition error() const; /// @cond INTERNAL /// XXX needs to take connection options @@ -67,6 +67,11 @@ PN_CPP_CLASS_EXTERN session : public internal::object<pn_session_t>, public endp /// handler::on_session_close(). PN_CPP_EXTERN void close(); + /// Initiate close with an error condition. + /// The operation is not complete till handler::on_connection_close(). + PN_CPP_EXTERN void close(const error_condition&); + + /// Return the container for this session PN_CPP_EXTERN class container &container() const; http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/13364ad5/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 a6d7570..b29f480 100644 --- a/proton-c/bindings/cpp/include/proton/transport.hpp +++ b/proton-c/bindings/cpp/include/proton/transport.hpp @@ -31,7 +31,7 @@ struct pn_transport_t; namespace proton { class connection; -class condition; +class error_condition; class sasl; namespace io { @@ -56,7 +56,7 @@ class transport : public internal::object<pn_transport_t> { PN_CPP_EXTERN class sasl sasl() const; /// Get the error condition. - PN_CPP_EXTERN class condition condition() const; + PN_CPP_EXTERN class error_condition error() const; /// @cond INTERNAL /// XXX need to discuss, local versus remote http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/13364ad5/proton-c/bindings/cpp/src/condition.cpp ---------------------------------------------------------------------- diff --git a/proton-c/bindings/cpp/src/condition.cpp b/proton-c/bindings/cpp/src/condition.cpp deleted file mode 100644 index 391c12e..0000000 --- a/proton-c/bindings/cpp/src/condition.cpp +++ /dev/null @@ -1,65 +0,0 @@ -/* - * - * 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/condition.hpp" -#include "proton/condition.h" - -namespace proton { - -bool condition::operator!() const { - return !pn_condition_is_set(condition_); -} - -bool condition::empty() const { - return !pn_condition_is_set(condition_); -} - -std::string condition::name() const { - const char* n = pn_condition_get_name(condition_); - return n ? n : ""; -} - -std::string condition::description() const { - const char* d = pn_condition_get_description(condition_); - return d ? d : ""; -} - -value condition::properties() const { - pn_data_t* t = pn_condition_info(condition_); - return t ? value(t) : value(); -} - -std::string condition::what() const { - if (!*this) { - return "No error condition"; - } else { - const char* n = pn_condition_get_name(condition_); - const char* d = pn_condition_get_description(condition_); - std::string s; - if (n) s += n; - if (d) { - if (n) s += ": "; - s += d; - } - return s; - } -} - -} http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/13364ad5/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 9b5bf34..b1d296f 100644 --- a/proton-c/bindings/cpp/src/connection.cpp +++ b/proton-c/bindings/cpp/src/connection.cpp @@ -71,7 +71,7 @@ std::string connection::container_id() const { container& connection::container() const { pn_reactor_t *r = pn_object_reactor(pn_object()); if (!r) - throw error("connection does not have a container"); + throw proton::error("connection does not have a container"); return container_context::get(r); } @@ -106,7 +106,7 @@ receiver connection::open_receiver(const std::string &addr, const link_options & return default_session().open_receiver(addr, opts); } -condition connection::condition() const { +error_condition connection::error() const { return pn_connection_remote_condition(pn_object()); } http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/13364ad5/proton-c/bindings/cpp/src/endpoint.cpp ---------------------------------------------------------------------- diff --git a/proton-c/bindings/cpp/src/endpoint.cpp b/proton-c/bindings/cpp/src/endpoint.cpp index 2cd55c3..c70edbf 100644 --- a/proton-c/bindings/cpp/src/endpoint.cpp +++ b/proton-c/bindings/cpp/src/endpoint.cpp @@ -22,6 +22,7 @@ #include "proton/endpoint.hpp" #include "proton/connection.hpp" +#include "proton/error_condition.hpp" #include "proton/session.hpp" #include "proton/link.hpp" @@ -35,6 +36,21 @@ inline bool uninitialized(int state) { return state & PN_LOCAL_UNINIT; } inline bool active(int state) { return state & PN_LOCAL_ACTIVE; } inline bool closed(int state) { return (state & PN_LOCAL_CLOSED) && (state & PN_REMOTE_CLOSED); } +inline void set_condition(pn_condition_t *c, const proton::error_condition &e) { + pn_condition_clear(c); + + if (!e.name().empty()) { + pn_condition_set_name(c, e.name().c_str()); + } + if (!e.description().empty()) { + pn_condition_set_description(c, e.description().c_str()); + } + // TODO: This is wrong as it copies the value so doesn't change + // The internals of c + //proton::value v(pn_condition_info(c)); + //v = e.properties(); +} + } namespace proton { @@ -43,14 +59,20 @@ bool connection::uninitialized() const { return ::uninitialized(pn_connection_st bool connection::active() const { return ::active(pn_connection_state(pn_object())); } bool connection::closed() const { return ::closed(pn_connection_state(pn_object())); } +void connection::close(const error_condition& condition) { ::set_condition(pn_connection_condition(pn_object()), condition); close(); } + bool session::uninitialized() const { return ::uninitialized(pn_session_state(pn_object())); } bool session::active() const { return ::active(pn_session_state(pn_object())); } bool session::closed() const { return ::closed(pn_session_state(pn_object())); } +void session::close(const error_condition& condition) { ::set_condition(pn_session_condition(pn_object()), condition); close(); } + bool link::uninitialized() const { return ::uninitialized(pn_link_state(pn_object())); } bool link::active() const { return ::active(pn_link_state(pn_object())); } bool link::closed() const { return ::closed(pn_link_state(pn_object())); } +void link::close(const error_condition& condition) { ::set_condition(pn_link_condition(pn_object()), condition); close(); } + endpoint::~endpoint() {} } http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/13364ad5/proton-c/bindings/cpp/src/engine_test.cpp ---------------------------------------------------------------------- diff --git a/proton-c/bindings/cpp/src/engine_test.cpp b/proton-c/bindings/cpp/src/engine_test.cpp index 8ff1380..319f25e 100644 --- a/proton-c/bindings/cpp/src/engine_test.cpp +++ b/proton-c/bindings/cpp/src/engine_test.cpp @@ -111,7 +111,7 @@ struct record_handler : public handler { sessions.push_back(s); } - void on_unhandled_error(const condition& c) override { + void on_unhandled_error(const proton::error_condition& c) override { errors.push_back(c.what()); } }; @@ -186,35 +186,33 @@ void test_container_prefix() { void test_endpoint_close() { // Make sure conditions are sent to the remote end. - // FIXME aconway 2016-03-22: re-enable these tests when we can set error conditions. - - // record_handler ha, hb; - // engine_pair e(ha, hb); - // e.a.connection().open(); - // e.a.connection().open_sender("x"); - // e.a.connection().open_receiver("y"); - // while (ha.links.size() < 2 || hb.links.size() < 2) e.process(); - // link ax = quick_pop(ha.links), ay = quick_pop(ha.links); - // link bx = quick_pop(hb.links), by = quick_pop(hb.links); - - // // Close a link - // ax.close(condition("err", "foo bar")); - // while (!(bx.state() & endpoint::REMOTE_CLOSED)) e.process(); - // condition c = bx.remote_condition(); - // ASSERT_EQUAL("err", c.name()); - // ASSERT_EQUAL("foo bar", c.description()); - // ASSERT_EQUAL("err: foo bar", ax.local_condition().what()); - - // // Close a link with an empty condition - // ay.close(condition()); - // while (!(by.state() & endpoint::REMOTE_CLOSED)) e.process(); - // ASSERT(by.remote_condition().empty()); - - // // Close a connection - // connection ca = e.a.connection(), cb = e.b.connection(); - // ca.close(condition("conn", "bad connection")); - // while (!cb.closed()) e.process(); - // ASSERT_EQUAL("conn: bad connection", cb.remote_condition().what()); + record_handler ha, hb; + engine_pair e(ha, hb); + e.a.connection().open(); + e.a.connection().open_sender("x"); + e.a.connection().open_receiver("y"); + while (ha.links.size() < 2 || hb.links.size() < 2) e.process(); + link ax = quick_pop(ha.links), ay = quick_pop(ha.links); + link bx = quick_pop(hb.links), by = quick_pop(hb.links); + + // Close a link + ax.close(proton::error_condition("err", "foo bar")); + while (!bx.closed()) e.process(); + proton::error_condition c = bx.error(); + ASSERT_EQUAL("err", c.name()); + ASSERT_EQUAL("foo bar", c.description()); + ASSERT_EQUAL("err: foo bar", c.what()); + + // Close a link with an empty condition + ay.close(proton::error_condition()); + while (!by.closed()) e.process(); + ASSERT(by.error().empty()); + + // Close a connection + connection ca = e.a.connection(), cb = e.b.connection(); + ca.close(proton::error_condition("conn", "bad connection")); + while (!cb.closed()) e.process(); + ASSERT_EQUAL("conn: bad connection", cb.error().what()); } void test_transport_close() { @@ -230,8 +228,8 @@ void test_transport_close() { while (!e.b.connection().closed()) e.process(); ASSERT_EQUAL(1, hb.errors.size()); ASSERT_EQUAL("oops: engine failure", hb.errors.front()); - ASSERT_EQUAL("oops", e.b.connection().condition().name()); - ASSERT_EQUAL("engine failure", e.b.connection().condition().description()); + ASSERT_EQUAL("oops", e.b.connection().error().name()); + ASSERT_EQUAL("engine failure", e.b.connection().error().description()); } int main(int, char**) { http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/13364ad5/proton-c/bindings/cpp/src/error_condition.cpp ---------------------------------------------------------------------- diff --git a/proton-c/bindings/cpp/src/error_condition.cpp b/proton-c/bindings/cpp/src/error_condition.cpp new file mode 100644 index 0000000..247941f --- /dev/null +++ b/proton-c/bindings/cpp/src/error_condition.cpp @@ -0,0 +1,87 @@ +/* + * + * 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/error_condition.hpp" +#include "proton/condition.h" +namespace { +inline std::string safe_convert(const char* s) { + return s ? s : std::string(); +} +} + +namespace proton { + +error_condition::error_condition(pn_condition_t* c) : + name_(safe_convert(pn_condition_get_name(c))), + description_(safe_convert(pn_condition_get_description(c))), + properties_(pn_condition_info(c)) +{} + + +error_condition::error_condition(std::string description) : + name_("proton:io:error"), + description_(description) +{} + +error_condition::error_condition(std::string name, std::string description) : + name_(name), + description_(description) +{} + +error_condition::error_condition(std::string name, std::string description, value properties) : + name_(name), + description_(description), + properties_(properties) +{} + +bool error_condition::operator!() const { + return name_.empty(); +} + +bool error_condition::empty() const { + return name_.empty(); +} + +std::string error_condition::name() const { + return name_; +} + +std::string error_condition::description() const { + return description_; +} + +value error_condition::properties() const { + return properties_; +} + +std::string error_condition::what() const { + if (!*this) { + return "No error condition"; + } else { + std::string s(name_); + if (!description_.empty()) { + s += ": "; + s += description_; + } + return s; + } +} + +} http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/13364ad5/proton-c/bindings/cpp/src/handler.cpp ---------------------------------------------------------------------- diff --git a/proton-c/bindings/cpp/src/handler.cpp b/proton-c/bindings/cpp/src/handler.cpp index d7d43d2..d46b880 100644 --- a/proton-c/bindings/cpp/src/handler.cpp +++ b/proton-c/bindings/cpp/src/handler.cpp @@ -41,18 +41,18 @@ void handler::on_message(delivery &, message &) {} void handler::on_sendable(sender &) {} void handler::on_timer(container &) {} void handler::on_transport_close(transport &) {} -void handler::on_transport_error(transport &t) { on_unhandled_error(t.condition()); } +void handler::on_transport_error(transport &t) { on_unhandled_error(t.error()); } void handler::on_connection_close(connection &) {} -void handler::on_connection_error(connection &c) { on_unhandled_error(c.condition()); } +void handler::on_connection_error(connection &c) { on_unhandled_error(c.error()); } void handler::on_connection_open(connection &) {} void handler::on_session_close(session &) {} -void handler::on_session_error(session &s) { on_unhandled_error(s.condition()); } +void handler::on_session_error(session &s) { on_unhandled_error(s.error()); } void handler::on_session_open(session &) {} void handler::on_receiver_close(receiver &) {} -void handler::on_receiver_error(receiver &l) { on_unhandled_error(l.condition()); } +void handler::on_receiver_error(receiver &l) { on_unhandled_error(l.error()); } void handler::on_receiver_open(receiver &) {} void handler::on_sender_close(sender &) {} -void handler::on_sender_error(sender &l) { on_unhandled_error(l.condition()); } +void handler::on_sender_error(sender &l) { on_unhandled_error(l.error()); } void handler::on_sender_open(sender &) {} void handler::on_tracker_accept(tracker &) {} void handler::on_tracker_reject(tracker &) {} @@ -60,6 +60,6 @@ void handler::on_tracker_release(tracker &) {} void handler::on_tracker_settle(tracker &) {} void handler::on_delivery_settle(delivery &) {} -void handler::on_unhandled_error(const condition& c) { throw proton::error(c.what()); } +void handler::on_unhandled_error(const error_condition& c) { throw proton::error(c.what()); } } http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/13364ad5/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 b6e268b..8798694 100644 --- a/proton-c/bindings/cpp/src/link.cpp +++ b/proton-c/bindings/cpp/src/link.cpp @@ -99,7 +99,7 @@ void link::detach_handler() { pn_record_set_handler(record, 0); } -condition link::condition() const { +error_condition link::error() const { return pn_link_remote_condition(pn_object()); } http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/13364ad5/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 a6fed21..24bbb72 100644 --- a/proton-c/bindings/cpp/src/session.cpp +++ b/proton-c/bindings/cpp/src/session.cpp @@ -70,7 +70,7 @@ receiver session::open_receiver(const std::string &addr, const link_options &lo) return rcv; } -condition session::condition() const { +error_condition session::error() const { return pn_session_remote_condition(pn_object()); } http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/13364ad5/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 cbaab6e..a788816 100644 --- a/proton-c/bindings/cpp/src/transport.cpp +++ b/proton-c/bindings/cpp/src/transport.cpp @@ -21,7 +21,7 @@ #include "proton/error.hpp" #include "proton/transport.hpp" -#include "proton/condition.hpp" +#include "proton/error_condition.hpp" #include "proton/connection.hpp" #include "proton/ssl.hpp" #include "proton/sasl.hpp" @@ -45,18 +45,18 @@ class sasl transport::sasl() const { return pn_sasl(pn_object()); } -condition transport::condition() const { - return proton::condition(pn_transport_condition(pn_object())); +error_condition transport::error() const { + return proton::error_condition(pn_transport_condition(pn_object())); } void transport::unbind() { if (pn_transport_unbind(pn_object())) - throw error(MSG("transport::unbind failed " << pn_error_text(pn_transport_error(pn_object())))); + throw proton::error(MSG("transport::unbind failed " << pn_error_text(pn_transport_error(pn_object())))); } void transport::bind(class connection &conn) { if (pn_transport_bind(pn_object(), conn.pn_object())) - throw error(MSG("transport::bind failed " << pn_error_text(pn_transport_error(pn_object())))); + throw proton::error(MSG("transport::bind failed " << pn_error_text(pn_transport_error(pn_object())))); } uint32_t transport::max_frame_size() const { --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
