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