Repository: qpid-proton Updated Branches: refs/heads/master 8a6d7ea76 -> 27f9aec21
PROTON-1857: [cpp] correct decoding for connection offered/desired capabilities capabilities are encoded as a "multiple" symbol field. "multiple" fields can be encoded either as an array or a single value. The C++ binding was not accepting a single value. Project: http://git-wip-us.apache.org/repos/asf/qpid-proton/repo Commit: http://git-wip-us.apache.org/repos/asf/qpid-proton/commit/af93c804 Tree: http://git-wip-us.apache.org/repos/asf/qpid-proton/tree/af93c804 Diff: http://git-wip-us.apache.org/repos/asf/qpid-proton/diff/af93c804 Branch: refs/heads/master Commit: af93c804ca34ca6d9de48c87dae7391f4a602239 Parents: 8a6d7ea Author: Alan Conway <acon...@redhat.com> Authored: Wed Jun 13 14:57:25 2018 -0400 Committer: Alan Conway <acon...@redhat.com> Committed: Wed Jun 13 14:58:53 2018 -0400 ---------------------------------------------------------------------- cpp/include/proton/value.hpp | 2 +- cpp/src/connection.cpp | 4 ++-- cpp/src/proton_bits.hpp | 26 ++++++++++++++++++++++++++ 3 files changed, 29 insertions(+), 3 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/af93c804/cpp/include/proton/value.hpp ---------------------------------------------------------------------- diff --git a/cpp/include/proton/value.hpp b/cpp/include/proton/value.hpp index 552a2e4..979881e 100644 --- a/cpp/include/proton/value.hpp +++ b/cpp/include/proton/value.hpp @@ -125,7 +125,7 @@ class value : public internal::value_base, private internal::comparable<value> { /// @relatedalso proton::value template<class T> T get(const value& v) { T x; get(v, x); return x; } -/// Like get(const value&) but assigns the value to a reference +/// Like get(const value&) but extracts the value to a reference @p x /// instead of returning it. May be more efficient for complex values /// (arrays, maps, etc.) /// http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/af93c804/cpp/src/connection.cpp ---------------------------------------------------------------------- diff --git a/cpp/src/connection.cpp b/cpp/src/connection.cpp index cab1ec6..b2dadae 100644 --- a/cpp/src/connection.cpp +++ b/cpp/src/connection.cpp @@ -182,12 +182,12 @@ void connection::wake() const { std::vector<symbol> connection::offered_capabilities() const { value caps(pn_connection_remote_offered_capabilities(pn_object())); - return caps.empty() ? std::vector<symbol>() : caps.get<std::vector<symbol> >(); + return get_multiple<std::vector<symbol> >(caps); } std::vector<symbol> connection::desired_capabilities() const { value caps(pn_connection_remote_desired_capabilities(pn_object())); - return caps.empty() ? std::vector<symbol>() : caps.get<std::vector<symbol> >(); + return get_multiple<std::vector<symbol> >(caps); } } http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/af93c804/cpp/src/proton_bits.hpp ---------------------------------------------------------------------- diff --git a/cpp/src/proton_bits.hpp b/cpp/src/proton_bits.hpp index b6636f9..48b9f5f 100644 --- a/cpp/src/proton_bits.hpp +++ b/cpp/src/proton_bits.hpp @@ -157,6 +157,32 @@ template <class T> returned<T> make_returned(typename internal::wrapped<T>::type return internal::returned_factory::make<T>(pn); } +// Get an AMQP "multiple" field from a value. A "multiple" field can be encoded as a single +// value or as an array. This function always extracts it as a sequence, a sequence of one +// if it is encoded as a single value. +// +// T should be a valid sequence type for proton::get() with a T::value_type typedef. +// +template<class T> +void get_multiple(const value& v, T& x) { + if (v.empty()) { + x.clear(); + } else if (v.type() == ARRAY) { + proton::get(v,x); + } else { + x.resize(1); + proton::get(v,x[0]); + } +} + +// Same as previous but returns the value. +template<class T> +T get_multiple(const value& v) { + T x; + get_multiple(v, x); + return x; } +} // namespace proton + #endif // PROTON_BITS_HPP --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@qpid.apache.org For additional commands, e-mail: commits-h...@qpid.apache.org