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
00031
00032
00033
00034
00035
00036
00037
00038
00039 #ifndef MESSAGE_H_
00040 #define MESSAGE_H_
00041
00042
00043 #include<new>
00044 #include<string>
00045 #include<iostream>
00046 #include<boost/shared_array.hpp>
00047
00048
00049 #include "_namespace.h"
00050 NAMESPACE_BEGIN
00051 class Message;
00052 typedef size_t seqnum_t;
00053 NAMESPACE_END
00054
00055
00056 #include <cassert>
00057 #include<boost/shared_array.hpp>
00058 #include<boost/cstdint.hpp>
00059
00060
00061 #include "ariba/utility/types/Address.h"
00062 #include "ariba/utility/serialization.h"
00063
00064 std::ostream& operator<<(std::ostream& stream, const ariba::utility::Message& msg );
00065
00066 #include "_namespace.h"
00067 NAMESPACE_BEGIN
00068
00069 using_serialization;
00070 using ariba::utility::Address;
00071 using boost::shared_array;
00072
00078 class Message: public VSerializeable {
00079 VSERIALIZEABLE;
00080
00081 protected:
00082 friend std::ostream& ::operator<<(std::ostream& stream, const ariba::utility::Message& msg );
00083
00084
00085 shared_array<uint8_t> root;
00086
00087
00088 bool releasePayload;
00089 Data payload;
00090
00091
00092 const Address* srcAddr;
00093 const Address* destAddr;
00094
00095 public:
00099 inline Message() :
00100 root(), releasePayload(true), payload(), srcAddr(NULL),destAddr(NULL) {
00101 }
00102
00107 inline Message( const Data& data ) :
00108 srcAddr(NULL),destAddr(NULL), releasePayload(true) {
00109 this->payload = data.clone();
00110
00111 }
00112
00113 inline void dropPayload() {
00114 if (this->releasePayload) payload.release();
00115 }
00116
00117 inline void setReleasePayload( bool release ) {
00118 this->releasePayload = release;
00119 }
00120
00121 inline Data getPayload() const {
00122 return payload;
00123 }
00124
00125 inline void setPayload( const Data& payload ) {
00126 this->payload = payload;
00127 }
00128
00132 virtual ~Message();
00133
00134 std::string toString() const;
00135
00141 inline void setDestinationAddress(const Address* addr) {
00142 destAddr = addr;
00143 }
00144
00150 inline const Address* getDestinationAddress() const {
00151 return destAddr;
00152 }
00153
00159 inline void setSourceAddress(const Address* addr) {
00160 srcAddr = addr;
00161 }
00162
00168 inline const Address* getSourceAddress() const {
00169 return srcAddr;
00170 }
00171
00177 virtual const char* getDescription() const;
00178
00186 virtual Message* createReturnMessage() const;
00187
00193 inline void encapsulate( Message* message, int variant = DEFAULT_V ) {
00194 if ( !payload.isUnspecified() ) throw "Error: Message already encapsulated";
00195 payload = data_serialize( message, variant );
00196 message->dropPayload();
00197 }
00198
00206 template<class T>
00207 inline T* decapsulate() {
00208 if (!payload.isUnspecified()) {
00209 T* payloadMsg = new T();
00210 data_deserialize( payloadMsg, payload );
00211 return payloadMsg;
00212 }
00213 return NULL;
00214 }
00215
00223 template<class T>
00224 inline T* convert() {
00225 return decapsulate<T>();
00226 }
00227
00228 protected:
00233 class PayloadSerializer: public ExplicitSerializer {
00234 private:
00235 Message* msg;
00236 size_t len;
00237 public:
00238 finline PayloadSerializer(Message* msg, size_t length = ~0) {
00239 this->msg = msg;
00240 this->len = length;
00241 }
00242
00243 sznMethodBegin(X) {
00244 if (X.isSerializer()) {
00245 if (!msg->payload.isUnspecified()) X && msg->payload;
00246 } else {
00247 if (msg->payload.isUnspecified()) {
00248 size_t l = ((len == ~0) ? X.getRemainingLength() : len);
00249 msg->payload = X.getRemainingData(l);
00250 msg->releasePayload = false;
00251 }
00252 }
00253 }
00254 sznMethodEnd();
00255 };
00256
00264 finline PayloadSerializer Payload( size_t length = ~0 ) {
00265 return PayloadSerializer( this, length );
00266 }
00267
00268 };
00269
00270 NAMESPACE_END
00271
00272 sznBeginDefault(ariba::utility::Message, X) {
00273 X && Payload();
00274 } sznEnd();
00275
00276 #endif