00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #ifndef _TopicExchange_
00022 #define _TopicExchange_
00023
00024 #include <map>
00025 #include <vector>
00026 #include "BrokerExchange.h"
00027 #include "qpid/framing/FieldTable.h"
00028 #include "BrokerMessage.h"
00029 #include "qpid/sys/Monitor.h"
00030 #include "BrokerQueue.h"
00031
00032 namespace qpid {
00033 namespace broker {
00034
00036 class Tokens : public std::vector<std::string> {
00037 public:
00038 Tokens() {};
00039
00040
00042 Tokens(const std::string& s) { operator=(s); }
00044 Tokens & operator=(const std::string& s);
00045
00046 private:
00047 size_t hash;
00048 };
00049
00050
00056 class TopicPattern : public Tokens
00057 {
00058 public:
00059 TopicPattern() {}
00060
00061 TopicPattern(const Tokens& tokens) { operator=(tokens); }
00062 TopicPattern(const std::string& str) { operator=(str); }
00063 TopicPattern& operator=(const Tokens&);
00064 TopicPattern& operator=(const std::string& str) { return operator=(Tokens(str)); }
00065
00067 bool match(const std::string& topic) { return match(Tokens(topic)); }
00068 bool match(const Tokens& topic) const;
00069
00070 private:
00071 void normalize();
00072 };
00073
00074 class TopicExchange : public virtual Exchange{
00075 typedef std::map<TopicPattern, Queue::vector> BindingMap;
00076 BindingMap bindings;
00077 qpid::sys::Mutex lock;
00078
00079 public:
00080 static const std::string typeName;
00081
00082 TopicExchange(const string& name);
00083
00084 virtual std::string getType(){ return typeName; }
00085
00086 virtual void bind(Queue::shared_ptr queue, const string& routingKey, const qpid::framing::FieldTable* args);
00087
00088 virtual void unbind(Queue::shared_ptr queue, const string& routingKey, const qpid::framing::FieldTable* args);
00089
00090 virtual void route(Deliverable& msg, const string& routingKey, const qpid::framing::FieldTable* args);
00091
00092 virtual ~TopicExchange();
00093 };
00094
00095
00096
00097 }
00098 }
00099
00100 #endif