summaryrefslogtreecommitdiff
path: root/qpid/cpp/src
diff options
context:
space:
mode:
authorGordon Sim <gsim@apache.org>2014-04-16 17:59:04 +0000
committerGordon Sim <gsim@apache.org>2014-04-16 17:59:04 +0000
commit668972c3a2612b93d0936b9499c1595e9b49dcf2 (patch)
tree6ee1c10324fd1788507c471ceb24914ab068b852 /qpid/cpp/src
parent6c3683c899dae331ae6185f63aba5ed0e16a9d9b (diff)
downloadqpid-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.cpp21
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()