00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #ifndef _GLASS_PLUGIN_MESSENGER_HH_
00022 #define _GLASS_PLUGIN_MESSENGER_HH_
00023
00024 #include <map>
00025 #include <set>
00026 #include <queue>
00027 #include "plugin.h"
00028 #include "exception.h"
00029 #include <boost/thread.hpp>
00030
00031 namespace libglass {
00032
00033 class _Messenger;
00034
00042 class MessengerBase : public PluginBase {
00046 PLUGIN(MessengerBase);
00047
00048 private:
00049 std::map<const string *, _Messenger *, StringPointerCompare>
00050 messengers;
00051 boost::mutex msg_lock;
00053 protected:
00054 friend class _Messenger;
00055
00059 ~MessengerBase();
00060
00067 bool registerMessenger(_Messenger *v);
00068
00075 bool unregisterMessenger(_Messenger *v);
00076 public:
00077 };
00078
00084 class _Messenger : public PluginInterface {
00085 private:
00086 MessengerBase *mb;
00087 string name;
00088
00089 std::set<nodeId> owners;
00090
00091 protected:
00092 friend class MessengerBase;
00093
00097 _Messenger(const char *name) throw(Exception);
00098
00102 virtual ~_Messenger();
00103
00114 bool _sendMessage(nodeId id, chain &message);
00115
00123 virtual bool pushMessage(chain &) = 0;
00124 public:
00125 };
00126
00130 template<typename T,
00131 Serializer(*packf, T) = toString<T>,
00132 Unserializer(*unpackf, T) = fromString<T> >
00133 class Messenger : public _Messenger {
00134 protected:
00135 std::queue<string> q;
00136 void (*handler)(T &);
00137
00138 bool pushMessage(chain &c) {
00139
00140 }
00141 public:
00142
00143 Messenger(const char *name, void (*func)(T &data) = NULL) throw(Exception) :
00144 _Messenger(name), handler(func) {
00145 }
00146
00158 bool getMessage(nodeId id, string &message, bool block = false);
00159
00160
00161 bool setMessageHandler(void (*func)(string &message));
00162
00174 bool setHandler(void (*func)(SerializableObject *o));
00175 };
00176
00177 }
00178
00179 #endif