You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by ac...@apache.org on 2016/04/22 18:29:07 UTC

qpid-proton git commit: PROTON-1179: c++: Update connection_engine to use error_condition.

Repository: qpid-proton
Updated Branches:
  refs/heads/master 27cea74f9 -> 6fabb14ce


PROTON-1179: c++: Update connection_engine to use error_condition.

- connection_engine::close uses error_condition.
- moved set_error_condition() to error_condition::set(pn_condition_t*)
  to make it accessible to connection_engine
- added error_condition op==, op<<.


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

Branch: refs/heads/master
Commit: 6fabb14ce6e906f3c8080699fdcdfd126667a839
Parents: 27cea74
Author: Alan Conway <ac...@redhat.com>
Authored: Fri Apr 22 09:50:16 2016 -0400
Committer: Alan Conway <ac...@redhat.com>
Committed: Fri Apr 22 12:23:47 2016 -0400

----------------------------------------------------------------------
 .../cpp/include/proton/error_condition.hpp      |  5 +++
 .../cpp/include/proton/io/connection_engine.hpp | 11 +++---
 proton-c/bindings/cpp/src/endpoint.cpp          | 37 ++++++++------------
 proton-c/bindings/cpp/src/engine_test.cpp       | 26 +++++++++++---
 proton-c/bindings/cpp/src/error_condition.cpp   |  9 +++++
 .../bindings/cpp/src/io/connection_engine.cpp   | 10 +++---
 proton-c/bindings/cpp/src/io/posix/socket.cpp   |  7 ++--
 proton-c/bindings/cpp/src/proton_bits.cpp       | 24 ++++++++++++-
 proton-c/bindings/cpp/src/proton_bits.hpp       | 14 +++++---
 9 files changed, 100 insertions(+), 43 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/6fabb14c/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
index 0d109dc..0da428d 100644
--- a/proton-c/bindings/cpp/include/proton/error_condition.hpp
+++ b/proton-c/bindings/cpp/include/proton/error_condition.hpp
@@ -28,6 +28,7 @@
 #include "proton/config.hpp"
 
 #include <string>
+#include <iosfwd>
 
 struct pn_condition_t;
 
@@ -86,6 +87,10 @@ class error_condition {
     /// @endcond
 };
 
+PN_CPP_EXTERN bool operator==(const error_condition& x, const error_condition& y);
+
+PN_CPP_EXTERN std::ostream& operator<<(std::ostream& o, const error_condition& err);
+
 }
 
 #endif // PROTON_CPP_ERROR_CONDITION_H

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/6fabb14c/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 42ab06e..acf47fa 100644
--- a/proton-c/bindings/cpp/include/proton/io/connection_engine.hpp
+++ b/proton-c/bindings/cpp/include/proton/io/connection_engine.hpp
@@ -146,10 +146,10 @@ PN_CPP_CLASS_EXTERN connection_engine {
     /// Indicate that the write side of the transport has closed and no more data will be written.
     PN_CPP_EXTERN void write_close();
 
-    /// Indicate that the transport has closed with an error condition.
-    /// This calls both read_close() and write_close().
-    /// The error condition will be passed to handler::on_transport_error()
-    PN_CPP_EXTERN void close(const std::string& name, const std::string& description);
+    /// Close the engine with an error that will be passed to handler::on_transport_error().
+    /// Calls read_close() and write_close().
+    /// Note: You still need to call dispatch() to process final close-down events.
+    PN_CPP_EXTERN void close(const error_condition&);
 
     /// Dispatch all available events and call the corresponding \ref handler methods.
     ///
@@ -168,6 +168,9 @@ PN_CPP_CLASS_EXTERN connection_engine {
     /// Get the AMQP connection associated with this connection_engine.
     PN_CPP_EXTERN proton::connection connection() const;
 
+    /// Get the transport associated with this connection_engine.
+    PN_CPP_EXTERN proton::transport transport() const;
+
   private:
     connection_engine(const connection_engine&);
     connection_engine& operator=(const connection_engine&);

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/6fabb14c/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 c70edbf..60d9355 100644
--- a/proton-c/bindings/cpp/src/endpoint.cpp
+++ b/proton-c/bindings/cpp/src/endpoint.cpp
@@ -18,13 +18,13 @@
  * under the License.
  *
  */
-
-#include "proton/endpoint.hpp"
+#include "proton_bits.hpp"
 
 #include "proton/connection.hpp"
+#include "proton/endpoint.hpp"
 #include "proton/error_condition.hpp"
-#include "proton/session.hpp"
 #include "proton/link.hpp"
+#include "proton/session.hpp"
 
 #include "proton/connection.h"
 #include "proton/session.h"
@@ -35,22 +35,6 @@ namespace {
 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 {
@@ -59,19 +43,28 @@ 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(); }
+void connection::close(const error_condition& condition) {
+    set_error_condition(condition, pn_connection_condition(pn_object()));
+    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(); }
+void session::close(const error_condition& condition) {
+    set_error_condition(condition, pn_session_condition(pn_object()));
+    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(); }
+void link::close(const error_condition& condition) {
+    set_error_condition(condition, pn_link_condition(pn_object()));
+    close();
+}
 
 endpoint::~endpoint() {}
 

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/6fabb14c/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 3bb154f..8c2385d 100644
--- a/proton-c/bindings/cpp/src/engine_test.cpp
+++ b/proton-c/bindings/cpp/src/engine_test.cpp
@@ -97,7 +97,7 @@ template <class S> typename S::value_type quick_pop(S& s) {
 struct record_handler : public handler {
     std::deque<proton::link> links;
     std::deque<proton::session> sessions;
-    std::deque<std::string> errors;
+    std::deque<std::string> errors, transport_errors, connection_errors;
 
     void on_receiver_open(receiver &l) override {
         links.push_back(l);
@@ -111,6 +111,14 @@ struct record_handler : public handler {
         sessions.push_back(s);
     }
 
+    void on_transport_error(transport& t) override {
+        transport_errors.push_back(t.error().what());
+    }
+
+    void on_connection_error(connection& c) override {
+        connection_errors.push_back(c.error().what());
+    }
+
     void on_unhandled_error(const proton::error_condition& c) override {
         errors.push_back(c.what());
     }
@@ -213,6 +221,8 @@ void test_endpoint_close() {
     ca.close(proton::error_condition("conn", "bad connection"));
     while (!cb.closed()) e.process();
     ASSERT_EQUAL("conn: bad connection", cb.error().what());
+    ASSERT_EQUAL(1, hb.connection_errors.size());
+    ASSERT_EQUAL("conn: bad connection", hb.connection_errors.front());
 }
 
 void test_transport_close() {
@@ -222,14 +232,20 @@ void test_transport_close() {
     e.a.connection().open();
     while (!e.b.connection().active()) e.process();
 
-    e.a.close("oops", "engine failure");
+    e.a.close(proton::error_condition("oops", "engine failure"));
     // Closed but we still have output data to flush so a.dispatch() is true.
     ASSERT(e.a.dispatch());
-    while (!e.b.connection().closed()) e.process();
+    do { e.process(); } while (e.b.dispatch());
     ASSERT_EQUAL(1, hb.errors.size());
     ASSERT_EQUAL("oops: engine failure", hb.errors.front());
-    ASSERT_EQUAL("oops", e.b.connection().error().name());
-    ASSERT_EQUAL("engine failure", e.b.connection().error().description());
+    // Connection and transport share the same error.
+    ASSERT_EQUAL(proton::error_condition("oops", "engine failure"),e.b.connection().error());
+    ASSERT_EQUAL(proton::error_condition("oops", "engine failure"),e.b.transport().error());
+    // But connectoin was never protocol closed.
+    ASSERT(!e.b.connection().closed());
+    ASSERT_EQUAL(0, hb.connection_errors.size());
+    ASSERT_EQUAL(1, hb.transport_errors.size());
+    ASSERT_EQUAL("oops: engine failure", hb.transport_errors.front());
 }
 
 int main(int, char**) {

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/6fabb14c/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
index 247941f..07abddb 100644
--- a/proton-c/bindings/cpp/src/error_condition.cpp
+++ b/proton-c/bindings/cpp/src/error_condition.cpp
@@ -84,4 +84,13 @@ std::string error_condition::what() const {
     }
 }
 
+bool operator==(const error_condition& x, const error_condition& y) {
+    return x.name() == y.name() && x.description() == y.description()
+        && x.properties() == y.properties();
+}
+
+std::ostream& operator<<(std::ostream& o, const error_condition& err) {
+    return o << err.what();
+}
+
 }

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/6fabb14c/proton-c/bindings/cpp/src/io/connection_engine.cpp
----------------------------------------------------------------------
diff --git a/proton-c/bindings/cpp/src/io/connection_engine.cpp b/proton-c/bindings/cpp/src/io/connection_engine.cpp
index b3aa223..e2a9356 100644
--- a/proton-c/bindings/cpp/src/io/connection_engine.cpp
+++ b/proton-c/bindings/cpp/src/io/connection_engine.cpp
@@ -147,10 +147,8 @@ void connection_engine::write_close() {
     pn_transport_close_head(transport_.pn_object());
 }
 
-void connection_engine::close(const std::string& name, const std::string& description) {
-    pn_condition_t* c = pn_transport_condition(transport_.pn_object());
-    pn_condition_set_name(c, name.c_str());
-    pn_condition_set_description(c, description.c_str());
+void connection_engine::close(const proton::error_condition& err) {
+    set_error_condition(err, pn_transport_condition(transport_.pn_object()));
     read_close();
     write_close();
 }
@@ -159,4 +157,8 @@ proton::connection connection_engine::connection() const {
     return connection_;
 }
 
+proton::transport connection_engine::transport() const {
+    return transport_;
+}
+
 }}

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/6fabb14c/proton-c/bindings/cpp/src/io/posix/socket.cpp
----------------------------------------------------------------------
diff --git a/proton-c/bindings/cpp/src/io/posix/socket.cpp b/proton-c/bindings/cpp/src/io/posix/socket.cpp
index e275288..204b530 100644
--- a/proton-c/bindings/cpp/src/io/posix/socket.cpp
+++ b/proton-c/bindings/cpp/src/io/posix/socket.cpp
@@ -19,6 +19,7 @@
 
 #include "msg.hpp"
 
+#include <proton/error_condition.hpp>
 #include <proton/io/socket.hpp>
 #include <proton/url.hpp>
 
@@ -92,7 +93,7 @@ void engine::read() {
         else if (n == 0)
             read_close();
         else if (n < 0 && errno != EAGAIN && errno != EWOULDBLOCK)
-            close("io_error", error_str());
+            close(error_condition("io_error", error_str()));
     }
 }
 
@@ -103,7 +104,7 @@ void engine::write() {
         if (n > 0)
             write_done(n);
         else if (n < 0 && errno != EAGAIN && errno != EWOULDBLOCK) {
-            close("io_error", error_str());
+            close(error_condition("io_error", error_str()));
         }
     }
 }
@@ -119,7 +120,7 @@ void engine::run() {
             FD_SET(socket_, &wr);
         int n = ::select(FD_SETSIZE, &rd, &wr, NULL, NULL);
         if (n < 0) {
-            close("select: ", error_str());
+            close(error_condition("select: ", error_str()));
             break;
         }
         if (FD_ISSET(socket_, &rd)) {

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/6fabb14c/proton-c/bindings/cpp/src/proton_bits.cpp
----------------------------------------------------------------------
diff --git a/proton-c/bindings/cpp/src/proton_bits.cpp b/proton-c/bindings/cpp/src/proton_bits.cpp
index 0d41da8..af032c9 100644
--- a/proton-c/bindings/cpp/src/proton_bits.cpp
+++ b/proton-c/bindings/cpp/src/proton_bits.cpp
@@ -17,11 +17,16 @@
  * under the License.
  */
 
+#include "proton_bits.hpp"
+
 #include <string>
 #include <ostream>
+
+#include <proton/condition.h>
 #include <proton/error.h>
 #include <proton/object.h>
-#include "proton_bits.hpp"
+
+namespace proton {
 
 std::string error_str(long code) {
   switch (code)
@@ -54,3 +59,20 @@ std::ostream& operator<<(std::ostream& o, const inspectable& object) {
     pn_free(str);
     return o;
 }
+
+void set_error_condition(const error_condition& e, pn_condition_t *c) {
+    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();
+}
+
+}

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/6fabb14c/proton-c/bindings/cpp/src/proton_bits.hpp
----------------------------------------------------------------------
diff --git a/proton-c/bindings/cpp/src/proton_bits.hpp b/proton-c/bindings/cpp/src/proton_bits.hpp
index 6ba0848..a53eaf0 100644
--- a/proton-c/bindings/cpp/src/proton_bits.hpp
+++ b/proton-c/bindings/cpp/src/proton_bits.hpp
@@ -1,5 +1,5 @@
-#ifndef ERROR_H
-#define ERROR_H
+#ifndef PROTON_BITS_HPP
+#define PROTON_BITS_HPP
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
@@ -21,6 +21,7 @@
 
 #include <string>
 #include <iosfwd>
+#include <proton/error_condition.hpp>
 #include <proton/error.h>
 
 /**@file
@@ -28,6 +29,10 @@
  * Assorted internal proton utilities.
  */
 
+namespace proton {
+
+class error_condition;
+
 std::string error_str(long code);
 
 /** Print the error string from pn_error_t, or from code if pn_error_t has no error. */
@@ -39,7 +44,8 @@ struct inspectable { void* value; inspectable(void* o) : value(o) {} };
 /** Stream a proton object via pn_inspect. */
 std::ostream& operator<<(std::ostream& o, const inspectable& object);
 
+void set_error_condition(const error_condition&, pn_condition_t*);
 
+}
 
-
-#endif // ERROR_H
+#endif // PROTON_BITS_HPP


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