You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by as...@apache.org on 2016/04/21 02:07:57 UTC
qpid-proton git commit: 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 informa
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 <as...@apache.org>
Authored: Tue Apr 19 16:03:37 2016 -0400
Committer: Andrew Stitcher <as...@apache.org>
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: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org