diff options
| author | Gordon Sim <gsim@apache.org> | 2014-04-16 17:59:04 +0000 |
|---|---|---|
| committer | Gordon Sim <gsim@apache.org> | 2014-04-16 17:59:04 +0000 |
| commit | 668972c3a2612b93d0936b9499c1595e9b49dcf2 (patch) | |
| tree | 6ee1c10324fd1788507c471ceb24914ab068b852 /qpid/cpp/src | |
| parent | 6c3683c899dae331ae6185f63aba5ed0e16a9d9b (diff) | |
| download | qpid-python-668972c3a2612b93d0936b9499c1595e9b49dcf2.tar.gz | |
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
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() |
