00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030 #ifndef ACEDIA_MESSAGE_H
00031 #define ACEDIA_MESSAGE_H
00032
00033 #include "any.hpp"
00034 #include "tuple.hpp"
00035 #include "anyarray.hpp"
00036 #include "metaclass.hpp"
00037 #include "exceptions.hpp"
00038
00039 #include <string>
00040
00041 namespace acedia {
00042
00043
00044 class ActorRef;
00045 class NetworkMessage;
00046
00047
00048 namespace details
00049 {
00050 struct MessageData;
00051 struct ProxyFactory
00052 {
00053 virtual ~ProxyFactory();
00054 virtual ActorRef get(boost::uint32_t original_actor_id) = 0;
00055 };
00056 }
00057
00068 class Message : public AnyArray
00069 {
00070
00071 friend class NetworkMessage;
00072
00073 public:
00074
00078 Message();
00079
00083 Message(const ActorRef &sender, const ActorRef &receiver);
00084
00088 Message(const ActorRef &sender, const ActorRef &receiver, const Any &value);
00089
00093 Message(const ActorRef &sender, const ActorRef &receiver, const Any &v1, const Any &v2);
00094
00098 Message(const ActorRef &sender, const ActorRef &receiver, const Any &v1, const Any &v2, const Any &v3);
00099
00103 Message(const ActorRef &sender, const ActorRef &receiver, const Any &v1, const Any &v2, const Any &v3, const Any &v4);
00104
00108 Message(const ActorRef &sender, const ActorRef &receiver, const Any &v1, const Any &v2, const Any &v3, const Any &v4, const Any &v5);
00109
00113 Message(const ActorRef &sender, const ActorRef &receiver, const Any &v1, const Any &v2, const Any &v3, const Any &v4, const Any &v5, const Any &v6);
00114
00118 Message(const ActorRef &sender, const ActorRef &receiver, const Any &v1, const Any &v2, const Any &v3, const Any &v4, const Any &v5, const Any &v6, const Any &v7);
00119
00123 Message(const ActorRef &sender, const ActorRef &receiver, const Any &v1, const Any &v2, const Any &v3, const Any &v4, const Any &v5, const Any &v6, const Any &v7, const Any &v8);
00124
00128 Message(const ActorRef &sender, const ActorRef &receiver, const Any &v1, const Any &v2, const Any &v3, const Any &v4, const Any &v5, const Any &v6, const Any &v7, const Any &v8, const Any &v9);
00129
00133 Message(const Message &other);
00134
00138 ~Message();
00139
00143 Message &operator=(const Message &other);
00144
00148 bool operator==(const Message &other) const;
00149
00150 inline bool operator!=(const Message &other) const
00151 {
00152 return !((*this) == other);
00153 }
00154
00158 virtual boost::uint32_t length() const;
00159
00163 ActorRef &sender() const;
00164
00168 ActorRef &receiver() const;
00169
00174 virtual const Any &at(boost::uint32_t pos) const;
00175
00188 String toString(bool verbose = false) const;
00189
00194
00195
00201
00202
00206 virtual bool isMessage() const;
00207
00208 String serializeToString();
00209
00210
00211
00212
00213 static Message deserializeFrom(const char *str, details::ProxyFactory *factory);
00214
00215 private:
00216
00217 details::MessageData *data;
00218 Message(details::MessageData *data);
00219 void set(int N, const Any **values, const ActorRef &msgSender, const ActorRef &msgReceiver);
00220
00221 };
00222
00223 }
00224
00225 #endif