diff options
Diffstat (limited to 'qpid/cpp/src')
| -rw-r--r-- | qpid/cpp/src/qpid/client/amqp0_10/AddressResolution.cpp | 21 |
1 files changed, 18 insertions, 3 deletions
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() |
