diff options
author | Gordon Sim <gsim@apache.org> | 2008-03-11 12:24:46 +0000 |
---|---|---|
committer | Gordon Sim <gsim@apache.org> | 2008-03-11 12:24:46 +0000 |
commit | d38d509af075300441ad858b1bb7680ac6b8e5ca (patch) | |
tree | 900123f1d4cff0aa7caf63f12cca25817d6acac9 /cpp | |
parent | 2390281e2a22a5935e6cbe553f87222d02c64198 (diff) | |
download | qpid-python-d38d509af075300441ad858b1bb7680ac6b8e5ca.tar.gz |
Fixed broker to take application headers from final format message-properties struct
Fixed headers exchange to recognise x-match even if sent as a string other than 32 bit sized
Converted remaining python exchange tests
git-svn-id: https://svn.apache.org/repos/asf/incubator/qpid/trunk/qpid@635898 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'cpp')
-rw-r--r-- | cpp/src/qpid/broker/HeadersExchange.cpp | 36 | ||||
-rw-r--r-- | cpp/src/qpid/broker/HeadersExchange.h | 2 | ||||
-rw-r--r-- | cpp/src/qpid/broker/MessageAdapter.cpp | 9 | ||||
-rw-r--r-- | cpp/src/qpid/broker/MessageAdapter.h | 3 |
4 files changed, 39 insertions, 11 deletions
diff --git a/cpp/src/qpid/broker/HeadersExchange.cpp b/cpp/src/qpid/broker/HeadersExchange.cpp index c0f6cf19d2..634fcd7b88 100644 --- a/cpp/src/qpid/broker/HeadersExchange.cpp +++ b/cpp/src/qpid/broker/HeadersExchange.cpp @@ -21,6 +21,7 @@ #include "HeadersExchange.h" #include "qpid/framing/FieldValue.h" #include "qpid/framing/reply_exceptions.h" +#include "qpid/log/Statement.h" #include <algorithm> @@ -35,9 +36,10 @@ using namespace qpid::sys; using namespace qpid::broker; namespace { - const StringValue all("all"); - const StringValue any("any"); + const std::string all("all"); + const std::string any("any"); const std::string x_match("x-match"); + const std::string empty; } HeadersExchange::HeadersExchange(const string& _name, Manageable* _parent) : @@ -55,11 +57,27 @@ HeadersExchange::HeadersExchange(const std::string& _name, bool _durable, mgmtExchange->set_type (typeName); } +std::string HeadersExchange::getMatch(const FieldTable* args) +{ + if (!args) { + throw InternalErrorException(QPID_MSG("No arguments given.")); + } + FieldTable::ValuePtr what = args->get(x_match); + if (!what) { + return empty; + } + if (!what->convertsTo<std::string>()) { + throw InternalErrorException(QPID_MSG("Invalid x-match value binding to headers exchange.")); + } + return what->get<std::string>(); +} + bool HeadersExchange::bind(Queue::shared_ptr queue, const string& /*routingKey*/, const FieldTable* args){ RWlock::ScopedWlock locker(lock); - FieldTable::ValuePtr what = args->get(x_match); - if (!what || (*what != all && *what != any)) + std::string what = getMatch(args); + if (what != all && what != any) throw InternalErrorException(QPID_MSG("Invalid x-match value binding to headers exchange.")); + Bindings::iterator i; for (i = bindings.begin(); i != bindings.end(); i++) @@ -100,6 +118,8 @@ bool HeadersExchange::unbind(Queue::shared_ptr queue, const string& /*routingKey void HeadersExchange::route(Deliverable& msg, const string& /*routingKey*/, const FieldTable* args){ + if (!args) return;//can't match if there were no headers passed in + RWlock::ScopedRlock locker(lock); uint32_t count(0); @@ -153,10 +173,8 @@ namespace bool HeadersExchange::match(const FieldTable& bind, const FieldTable& msg) { typedef FieldTable::ValueMap Map; - FieldTable::ValuePtr what = bind.get(x_match); - if (!what) { - return false; - } else if (*what == all) { + std::string what = getMatch(&bind); + if (what == all) { for (Map::const_iterator i = bind.begin(); i != bind.end(); ++i) @@ -169,7 +187,7 @@ bool HeadersExchange::match(const FieldTable& bind, const FieldTable& msg) { } } return true; - } else if (*what == any) { + } else if (what == any) { for (Map::const_iterator i = bind.begin(); i != bind.end(); ++i) diff --git a/cpp/src/qpid/broker/HeadersExchange.h b/cpp/src/qpid/broker/HeadersExchange.h index 4f654179c5..6e101e193a 100644 --- a/cpp/src/qpid/broker/HeadersExchange.h +++ b/cpp/src/qpid/broker/HeadersExchange.h @@ -38,6 +38,8 @@ class HeadersExchange : public virtual Exchange { Bindings bindings; qpid::sys::RWlock lock; + static std::string getMatch(const framing::FieldTable* args); + public: static const std::string typeName; diff --git a/cpp/src/qpid/broker/MessageAdapter.cpp b/cpp/src/qpid/broker/MessageAdapter.cpp index 2515b2fff6..d54f30ff72 100644 --- a/cpp/src/qpid/broker/MessageAdapter.cpp +++ b/cpp/src/qpid/broker/MessageAdapter.cpp @@ -47,7 +47,7 @@ namespace broker{ const framing::FieldTable* TransferAdapter::getApplicationHeaders(const framing::FrameSet& f) { - const framing::MessageProperties* p = f.getHeaders()->get<framing::MessageProperties>(); + const framing::MessageProperties010* p = f.getHeaders()->get<framing::MessageProperties010>(); return p ? &(p->getApplicationHeaders()) : 0; } @@ -67,4 +67,11 @@ namespace broker{ const framing::DeliveryProperties* p = f.getHeaders()->get<framing::DeliveryProperties>(); return p ? p->getRoutingKey() : empty; } + + const framing::FieldTable* PreviewAdapter::getApplicationHeaders(const framing::FrameSet& f) + { + const framing::MessageProperties* p = f.getHeaders()->get<framing::MessageProperties>(); + return p ? &(p->getApplicationHeaders()) : 0; + } + }} diff --git a/cpp/src/qpid/broker/MessageAdapter.h b/cpp/src/qpid/broker/MessageAdapter.h index 865d2e1685..6aebfdc9b3 100644 --- a/cpp/src/qpid/broker/MessageAdapter.h +++ b/cpp/src/qpid/broker/MessageAdapter.h @@ -51,7 +51,7 @@ struct TransferAdapter : MessageAdapter virtual std::string getRoutingKey(const framing::FrameSet& f); virtual std::string getExchange(const framing::FrameSet& f); bool isImmediate(const framing::FrameSet&); - const framing::FieldTable* getApplicationHeaders(const framing::FrameSet& f); + virtual const framing::FieldTable* getApplicationHeaders(const framing::FrameSet& f); bool isPersistent(const framing::FrameSet& f); }; @@ -59,6 +59,7 @@ struct PreviewAdapter : TransferAdapter { std::string getExchange(const framing::FrameSet& f); std::string getRoutingKey(const framing::FrameSet& f); + const framing::FieldTable* getApplicationHeaders(const framing::FrameSet& f); }; }} |