From 668972c3a2612b93d0936b9499c1595e9b49dcf2 Mon Sep 17 00:00:00 2001 From: Gordon Sim Date: Wed, 16 Apr 2014 17:59:04 +0000 Subject: QPID-5707: treat '#' as implying create for exchange as well as queue git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk@1588001 13f79535-47bb-0310-9956-ffa450edef68 --- .../src/qpid/client/amqp0_10/AddressResolution.cpp | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) (limited to 'qpid/cpp') diff --git a/qpid/cpp/src/qpid/client/amqp0_10/AddressResolution.cpp b/qpid/cpp/src/qpid/client/amqp0_10/AddressResolution.cpp index 08dff111b3..98cc19547a 100644 --- a/qpid/cpp/src/qpid/client/amqp0_10/AddressResolution.cpp +++ b/qpid/cpp/src/qpid/client/amqp0_10/AddressResolution.cpp @@ -215,7 +215,7 @@ class Exchange : protected Node const std::string specifiedType; private: const bool durable; - const bool autoDelete; + bool autoDelete; const std::string alternateExchange; FieldTable arguments; }; @@ -326,6 +326,7 @@ struct Opt bool asBool(bool defaultValue) const; const Variant::List& asList() const; void collect(qpid::framing::FieldTable& args) const; + bool hasKey(const std::string&) const; const Variant::Map* options; const Variant* value; @@ -384,6 +385,15 @@ void Opt::collect(qpid::framing::FieldTable& args) const translate(value->asMap(), args); } } +bool Opt::hasKey(const std::string& key) const +{ + if (value) { + Variant::Map::const_iterator i = value->asMap().find(key); + return i != value->asMap().end(); + } else { + return false; + } +} bool AddressResolution::is_unreliable(const Address& address) { @@ -727,8 +737,9 @@ Queue::Queue(const Address& a) : Node(a), linkBindings.setDefaultQueue(name); if (qpid::messaging::AddressImpl::isTemporary(a) && createPolicy.isVoid()) { createPolicy = "always"; - autoDelete = true; - exclusive = true; + Opt specified = Opt(a)/NODE/X_DECLARE; + if (!specified.hasKey(AUTO_DELETE)) autoDelete = true; + if (!specified.hasKey(EXCLUSIVE)) exclusive = true; } } @@ -816,6 +827,10 @@ Exchange::Exchange(const Address& a) : Node(a), (Opt(a)/NODE/X_DECLARE/ARGUMENTS).collect(arguments); nodeBindings.setDefaultExchange(name); linkBindings.setDefaultExchange(name); + if (qpid::messaging::AddressImpl::isTemporary(a) && createPolicy.isVoid()) { + createPolicy = "always"; + if (!(Opt(a)/NODE/X_DECLARE).hasKey(AUTO_DELETE)) autoDelete = true; + } } bool Exchange::isReservedName() -- cgit v1.2.1