Go to the documentation of this file.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
00040 #include "jaus/core/events/createevent.h"
00041 #include "jaus/core/scaledinteger.h"
00042 #include "jaus/core/events/confirmeventrequest.h"
00043 #include "jaus/core/events/rejecteventrequest.h"
00044
00045 using namespace JAUS;
00046
00047 const double CreateEvent::Limits::MaxUpdateRate = 1092.0;
00048 const double CreateEvent::Limits::MinUpdateRate = 0.0;
00049
00050
00059 CreateEvent::CreateEvent(const Address& dest,
00060 const Address& src) : Message(CREATE_EVENT, dest, src)
00061 {
00062 mType = Events::EveryChange;
00063 mRequestID = 0;
00064 mRequestedPeriodicRate = 1;
00065 mQueryMessageCode = 0;
00066 }
00067
00068
00074 CreateEvent::CreateEvent(const CreateEvent& message) : Message(CREATE_EVENT)
00075 {
00076 mType = Events::EveryChange;
00077 mRequestID = 0;
00078 mRequestedPeriodicRate = 1;
00079 mQueryMessageCode = 0;
00080 *this = message;
00081 }
00082
00083
00089 CreateEvent::~CreateEvent()
00090 {
00091
00092 }
00093
00094
00105 bool CreateEvent::SetRequestedPeriodicRate(const double rate)
00106 {
00107 if(rate >= Limits::MinUpdateRate && rate <= Limits::MaxUpdateRate)
00108 {
00109 mRequestedPeriodicRate = rate;
00110 return true;
00111 }
00112 return false;
00113 }
00114
00115
00127 bool CreateEvent::SetQueryMessage(const Message* queryMessage)
00128 {
00129 mQueryMessage.Clear();
00130 if(queryMessage && queryMessage->WriteMessageBody(mQueryMessage) >= 0)
00131 {
00132 mQueryMessageCode = queryMessage->GetMessageCode();
00133 return true;
00134 }
00135 return false;
00136 }
00137
00138
00151 bool CreateEvent::SetQueryMessage(const UShort messageCode,
00152 const Packet& queryPayload)
00153 {
00154 mQueryMessageCode = messageCode;
00155 mQueryMessage = queryPayload;
00156 return true;
00157 }
00158
00159
00178 bool CreateEvent::IsResponseToMessage(const Message *requestingMessage) const
00179 {
00180 if(mSourceID == requestingMessage->GetDestinationID())
00181 {
00182 if(requestingMessage->GetMessageCode() == CONFIRM_EVENT_REQUEST)
00183 {
00184 const ConfirmEventRequest* original = dynamic_cast<const ConfirmEventRequest*>(requestingMessage);
00185 if(original && original->GetRequestID() == mRequestID)
00186 {
00187 return true;
00188 }
00189 }
00190 else if(requestingMessage->GetMessageCode() == REJECT_EVENT_REQUEST)
00191 {
00192 const RejectEventRequest* original = dynamic_cast<const RejectEventRequest*>(requestingMessage);
00193 {
00194 return true;
00195 }
00196 }
00197 }
00198 return false;
00199 }
00200
00201
00213 int CreateEvent::WriteMessageBody(Packet& packet) const
00214 {
00215 int total = 0;
00216 int expected = BYTE_SIZE*2 + USHORT_SIZE + UINT_SIZE + USHORT_SIZE;
00217 total += packet.Write(mRequestID);
00218 total += packet.WriteByte((Byte)mType);
00219 total += ScaledInteger::Write(packet,
00220 mRequestedPeriodicRate,
00221 Limits::MaxUpdateRate,
00222 Limits::MinUpdateRate,
00223 ScaledInteger::UShort);
00224 total += packet.Write( (UInt)(mQueryMessage.Size() + USHORT_SIZE ) );
00225 total += packet.Write( mQueryMessageCode );
00226 if(mQueryMessage.Size() > 0)
00227 {
00228 expected += mQueryMessage.Size();
00229 total += packet.Write(mQueryMessage);
00230 }
00231 return total == expected ? total : -1;
00232 }
00233
00234
00246 int CreateEvent::ReadMessageBody(const Packet& packet)
00247 {
00248 int total = 0;
00249 int expected = BYTE_SIZE*2 + USHORT_SIZE + UINT_SIZE + USHORT_SIZE;
00250 UInt payloadSize = 0;
00251 total += packet.Read(mRequestID);
00252 total += packet.Read((Byte &)mType);
00253 total += ScaledInteger::Read(packet,
00254 mRequestedPeriodicRate,
00255 Limits::MaxUpdateRate,
00256 Limits::MinUpdateRate,
00257 ScaledInteger::UShort);
00258 total += packet.Read( payloadSize );
00259 if(payloadSize >= USHORT_SIZE)
00260 {
00261 expected += payloadSize - USHORT_SIZE;
00262 total += packet.Read( mQueryMessageCode );
00263 total += packet.Read(mQueryMessage, payloadSize - USHORT_SIZE);
00264 }
00265 return total == expected ? total : -1;
00266 }
00267
00268
00274 void CreateEvent::ClearMessageBody()
00275 {
00276 mType = Events::EveryChange;
00277 mRequestID = 0;
00278 mRequestedPeriodicRate = 1;
00279 mQueryMessageCode = 0;
00280 mQueryMessage.Clear();
00281 }
00282
00283
00289 CreateEvent& CreateEvent::operator =(const CreateEvent& message)
00290 {
00291 if(this != &message)
00292 {
00293 CopyHeaderData(&message);
00294 mType = message.mType;
00295 mRequestID = message.mRequestID;
00296 mRequestedPeriodicRate = message.mRequestedPeriodicRate;
00297 mQueryMessageCode = message.mQueryMessageCode;
00298 mQueryMessage = message.mQueryMessage;
00299 }
00300 return *this;
00301 }
00302
00303
00304