00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #ifndef __FIREVISION_FVUTILS_NET_FUSE_MESSAGE_H_
00025 #define __FIREVISION_FVUTILS_NET_FUSE_MESSAGE_H_
00026
00027 #include <core/utils/refcount.h>
00028 #include <core/exceptions/software.h>
00029 #include <fvutils/net/fuse.h>
00030 #include <sys/types.h>
00031 #include <cstdlib>
00032 #include <cstring>
00033
00034 namespace firevision {
00035 #if 0
00036 }
00037 #endif
00038
00039 class FuseMessageContent;
00040
00041 class FuseNetworkMessage : public fawkes::RefCount
00042 {
00043 public:
00044 FuseNetworkMessage();
00045 FuseNetworkMessage(FUSE_message_t *msg);
00046 FuseNetworkMessage(FUSE_message_type_t type, void *payload, size_t payload_size,
00047 bool copy_payload = false);
00048 FuseNetworkMessage(FUSE_message_type_t type, FuseMessageContent *content);
00049 FuseNetworkMessage(FUSE_message_type_t type);
00050 ~FuseNetworkMessage();
00051
00052 uint32_t type() const;
00053 size_t payload_size() const;
00054 void * payload() const;
00055
00056 const FUSE_message_t & fmsg() const;
00057
00058
00059
00060
00061
00062
00063
00064
00065 template <typename MT>
00066 MT *
00067 msg() const
00068 {
00069 if ( payload_size() != sizeof(MT) ) {
00070 throw fawkes::TypeMismatchException("FawkesNetworkMessage: message has incorrect size for this type");
00071 }
00072 return (MT *)(_msg.payload);
00073 }
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083 template <typename MT>
00084 MT *
00085 msg_copy() const
00086 {
00087 if ( payload_size() != sizeof(MT) ) {
00088 throw fawkes::TypeMismatchException("FawkesNetworkMessage: message has incorrect size for this type");
00089 }
00090 void *tmp = malloc(sizeof(MT));
00091 memcpy(tmp, _msg.payload, sizeof(MT));
00092 return (MT *)tmp;
00093 }
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105 template <typename MT>
00106 MT *
00107 msgc() const
00108 {
00109 try {
00110 MT *m = new MT(type(), _msg.payload, payload_size());
00111 return m;
00112 } catch (fawkes::Exception &e) {
00113 throw;
00114 } catch (...) {
00115 throw fawkes::Exception("Unknown exception caught while parsing complex network message");
00116 }
00117 }
00118
00119 void pack();
00120
00121 void set_payload(void *payload, size_t payload_size);
00122 void set(FUSE_message_t &msg);
00123
00124
00125 protected:
00126
00127 FUSE_message_t _msg;
00128
00129 private:
00130 FuseMessageContent *__content;
00131 };
00132
00133 }
00134
00135 #endif