message.cpp
00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #include <core/exception.h>
00025
00026 #include <netcomm/fawkes/message.h>
00027 #include <netcomm/fawkes/message_content.h>
00028
00029 #include <netinet/in.h>
00030 #include <cstring>
00031 #include <cstdlib>
00032 #include <cstddef>
00033
00034 namespace fawkes {
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048 FawkesNetworkMessageTooBigException::FawkesNetworkMessageTooBigException(size_t message_size)
00049 : Exception("Network message size too big")
00050 {
00051 fawkes_message_header_t fmh;
00052 append("Tried to create message of %l bytes, while only %l bytes allowed", message_size,
00053 sizeof(fmh.payload_size));
00054 }
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087 FawkesNetworkMessage::FawkesNetworkMessage()
00088 {
00089 memset(&_msg, 0, sizeof(_msg));
00090 _clid = 0;
00091 _content = NULL;
00092 }
00093
00094
00095
00096
00097
00098
00099 FawkesNetworkMessage::FawkesNetworkMessage(unsigned int clid, fawkes_message_t &msg)
00100 {
00101 _content = NULL;
00102 _clid = clid;
00103 memcpy(&_msg, &msg, sizeof(fawkes_message_t));
00104 }
00105
00106
00107
00108
00109
00110
00111 FawkesNetworkMessage::FawkesNetworkMessage(fawkes_message_t &msg)
00112 {
00113 _content = NULL;
00114 _clid = 0;
00115 memcpy(&_msg, &msg, sizeof(fawkes_message_t));
00116 }
00117
00118
00119
00120
00121
00122
00123
00124
00125
00126 FawkesNetworkMessage::FawkesNetworkMessage(unsigned short int cid, unsigned short int msg_id,
00127 void *payload, size_t payload_size)
00128 {
00129 _clid = 0;
00130 _content = NULL;
00131 if ( payload_size > 0xFFFFFFFF ) {
00132
00133 throw FawkesNetworkMessageTooBigException(payload_size);
00134 }
00135 _msg.header.cid = htons(cid);
00136 _msg.header.msg_id = htons(msg_id);
00137 _msg.header.payload_size = htonl(payload_size);
00138 _msg.payload = payload;
00139 }
00140
00141
00142
00143
00144
00145
00146
00147
00148
00149 FawkesNetworkMessage::FawkesNetworkMessage(unsigned short int cid, unsigned short int msg_id,
00150 size_t payload_size)
00151 {
00152 _content = NULL;
00153 _clid = 0;
00154 if ( payload_size > 0xFFFFFFFF ) {
00155
00156 throw FawkesNetworkMessageTooBigException(payload_size);
00157 }
00158 _msg.header.cid = htons(cid);
00159 _msg.header.msg_id = htons(msg_id);
00160 _msg.header.payload_size = htonl(payload_size);
00161 _msg.payload = calloc(1, payload_size);
00162 }
00163
00164
00165
00166
00167
00168
00169
00170 FawkesNetworkMessage::FawkesNetworkMessage(unsigned short int cid, unsigned short int msg_id)
00171 {
00172 _content = NULL;
00173 _clid = 0;
00174 _msg.header.cid = htons(cid);
00175 _msg.header.msg_id = htons(msg_id);
00176 _msg.header.payload_size = 0;
00177 _msg.payload = NULL;
00178 }
00179
00180
00181
00182
00183
00184
00185
00186
00187 FawkesNetworkMessage::FawkesNetworkMessage(unsigned short int cid, unsigned short int msg_id,
00188 FawkesNetworkMessageContent *content)
00189 {
00190 _content = content;
00191 _clid = 0;
00192 _msg.header.cid = htons(cid);
00193 _msg.header.msg_id = htons(msg_id);
00194 _msg.header.payload_size = 0;
00195 _msg.payload = NULL;
00196 }
00197
00198
00199
00200
00201
00202
00203
00204
00205 FawkesNetworkMessage::FawkesNetworkMessage(unsigned int clid,
00206 unsigned short int cid, unsigned short int msg_id,
00207 FawkesNetworkMessageContent *content)
00208 {
00209 _content = content;
00210 _clid = clid;
00211 _msg.header.cid = htons(cid);
00212 _msg.header.msg_id = htons(msg_id);
00213 _msg.header.payload_size = 0;
00214 _msg.payload = NULL;
00215 }
00216
00217
00218
00219
00220
00221
00222
00223
00224
00225
00226 FawkesNetworkMessage::FawkesNetworkMessage(unsigned int clid,
00227 unsigned short int cid, unsigned short int msg_id,
00228 void *payload, size_t payload_size)
00229 {
00230 _content = NULL;
00231 if ( payload_size > 0xFFFFFFFF ) {
00232
00233 throw FawkesNetworkMessageTooBigException(payload_size);
00234 }
00235 _clid = clid;
00236 _msg.header.cid = htons(cid);
00237 _msg.header.msg_id = htons(msg_id);
00238 _msg.header.payload_size = htonl(payload_size);
00239 _msg.payload = payload;
00240 }
00241
00242
00243
00244
00245
00246
00247
00248 FawkesNetworkMessage::FawkesNetworkMessage(unsigned int clid,
00249 unsigned short int cid, unsigned short int msg_id)
00250 {
00251 _content = NULL;
00252 _clid = clid;
00253 _msg.header.cid = htons(cid);
00254 _msg.header.msg_id = htons(msg_id);
00255 _msg.header.payload_size = 0;
00256 _msg.payload = NULL;
00257 }
00258
00259
00260
00261
00262
00263 FawkesNetworkMessage::~FawkesNetworkMessage()
00264 {
00265 if ( _content == NULL ) {
00266 if ( _msg.payload != NULL ) {
00267 free(_msg.payload);
00268 _msg.payload = NULL;
00269 }
00270 } else {
00271 delete _content;
00272 _content = NULL;
00273 }
00274 }
00275
00276
00277
00278
00279
00280 unsigned int
00281 FawkesNetworkMessage::clid() const
00282 {
00283 return _clid;
00284 }
00285
00286
00287
00288
00289
00290 unsigned short int
00291 FawkesNetworkMessage::cid() const
00292 {
00293 return ntohs(_msg.header.cid);
00294 }
00295
00296
00297
00298
00299
00300 unsigned short int
00301 FawkesNetworkMessage::msgid() const
00302 {
00303 return ntohs(_msg.header.msg_id);
00304 }
00305
00306
00307
00308
00309
00310 size_t
00311 FawkesNetworkMessage::payload_size() const
00312 {
00313 return ntohl(_msg.header.payload_size);
00314 }
00315
00316
00317
00318
00319
00320 void *
00321 FawkesNetworkMessage::payload() const
00322 {
00323 return _msg.payload;
00324 }
00325
00326
00327
00328
00329
00330 const fawkes_message_t &
00331 FawkesNetworkMessage::fmsg() const
00332 {
00333 return _msg;
00334 }
00335
00336
00337
00338
00339
00340 void
00341 FawkesNetworkMessage::set_client_id(unsigned int clid)
00342 {
00343 _clid = clid;
00344 }
00345
00346
00347
00348
00349
00350 void
00351 FawkesNetworkMessage::set_component_id(unsigned short int cid)
00352 {
00353 _msg.header.cid = htons(cid);
00354 }
00355
00356
00357
00358
00359
00360 void
00361 FawkesNetworkMessage::set_message_id(unsigned short int msg_id)
00362 {
00363 _msg.header.msg_id = htons(msg_id);
00364 }
00365
00366
00367
00368
00369
00370
00371 void
00372 FawkesNetworkMessage::set_payload(void *payload, size_t payload_size)
00373 {
00374 if ( payload_size > 0xFFFFFFFF ) {
00375
00376 throw FawkesNetworkMessageTooBigException(payload_size);
00377 }
00378 _msg.payload = payload;
00379 _msg.header.payload_size = htonl(payload_size);
00380 }
00381
00382
00383
00384
00385
00386 void
00387 FawkesNetworkMessage::set(fawkes_message_t &msg)
00388 {
00389 memcpy(&_msg, &msg, sizeof(fawkes_message_t));
00390 }
00391
00392
00393
00394
00395
00396 void
00397 FawkesNetworkMessage::set_content(FawkesNetworkMessageContent *content)
00398 {
00399 _content = content;
00400 }
00401
00402
00403
00404
00405
00406
00407
00408 void
00409 FawkesNetworkMessage::pack()
00410 {
00411 if ( _content != NULL ) {
00412 _content->serialize();
00413 _msg.payload = _content->payload();
00414 _msg.header.payload_size = htonl(_content->payload_size());
00415 }
00416 }
00417
00418 }