summaryrefslogtreecommitdiff
path: root/cpp/broker/src/HeadersExchange.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'cpp/broker/src/HeadersExchange.cpp')
-rw-r--r--cpp/broker/src/HeadersExchange.cpp41
1 files changed, 21 insertions, 20 deletions
diff --git a/cpp/broker/src/HeadersExchange.cpp b/cpp/broker/src/HeadersExchange.cpp
index 03a029ea4d..65204cdb85 100644
--- a/cpp/broker/src/HeadersExchange.cpp
+++ b/cpp/broker/src/HeadersExchange.cpp
@@ -18,8 +18,10 @@
#include "HeadersExchange.h"
#include "ExchangeBinding.h"
#include "Value.h"
+#include "QpidError.h"
#include <algorithm>
+
using namespace qpid::broker;
using namespace qpid::framing;
using namespace qpid::concurrent;
@@ -28,38 +30,36 @@ using namespace qpid::concurrent;
// The current search algorithm really sucks.
// Fieldtables are heavy, maybe use shared_ptr to do handle-body.
-namespace qpid {
-namespace broker {
+using namespace qpid::broker;
namespace {
-const std::string all("all");
-const std::string any("any");
-const std::string x_match("x-match");
+ const std::string all("all");
+ const std::string any("any");
+ const std::string x_match("x-match");
}
-HeadersExchange::HeadersExchange(const string& name) : Exchange(name) { }
+HeadersExchange::HeadersExchange(const string& _name) : Exchange(_name) { }
void HeadersExchange::bind(Queue::shared_ptr queue, const string& routingKey, FieldTable* args){
std::cout << "HeadersExchange::bind" << std::endl;
Locker locker(lock);
std::string what = args->getString("x-match");
- // TODO aconway 2006-09-26: throw an exception for invalid bindings.
- if (what != all && what != any) return; // Invalid.
+ if (what != all && what != any) {
+ THROW_QPID_ERROR(PROTOCOL_ERROR, "Invalid x-match value binding to headers exchange.");
+ }
bindings.push_back(Binding(*args, queue));
queue->bound(new ExchangeBinding(this, queue, routingKey, args));
}
-void HeadersExchange::unbind(Queue::shared_ptr queue, const string& routingKey, FieldTable* args){
- Locker locker(lock);;
- for (Bindings::iterator i = bindings.begin(); i != bindings.end(); ++i) {
- if (i->first == *args) {
- bindings.erase(i);
- }
- }
+void HeadersExchange::unbind(Queue::shared_ptr queue, const string& /*routingKey*/, FieldTable* args){
+ Locker locker(lock);
+ Bindings::iterator i =
+ std::find(bindings.begin(),bindings.end(), Binding(*args, queue));
+ if (i != bindings.end()) bindings.erase(i);
}
-void HeadersExchange::route(Message::shared_ptr& msg, const string& routingKey, FieldTable* args){
+void HeadersExchange::route(Message::shared_ptr& msg, const string& /*routingKey*/, FieldTable* args){
std::cout << "route: " << *args << std::endl;
Locker locker(lock);;
for (Bindings::iterator i = bindings.begin(); i != bindings.end(); ++i) {
@@ -70,12 +70,13 @@ void HeadersExchange::route(Message::shared_ptr& msg, const string& routingKey,
HeadersExchange::~HeadersExchange() {}
const std::string HeadersExchange::typeName("headers");
+
namespace
{
-bool match_values(const Value& bind, const Value& msg) {
- return dynamic_cast<const EmptyValue*>(&bind) || bind == msg;
-}
+ bool match_values(const Value& bind, const Value& msg) {
+ return dynamic_cast<const EmptyValue*>(&bind) || bind == msg;
+ }
}
@@ -115,5 +116,5 @@ bool HeadersExchange::match(const FieldTable& bind, const FieldTable& msg) {
}
}
-}}
+