message.h
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 __INTERFACE_MESSAGE_H_
00025 #define __INTERFACE_MESSAGE_H_
00026
00027 #include <interface/field_iterator.h>
00028 #include <interface/types.h>
00029 #include <core/utils/refcount.h>
00030
00031 #define __INTERFACE_MESSAGE_TYPE_SIZE 32
00032
00033 namespace fawkes {
00034 #if 0
00035 }
00036 #endif
00037
00038 class Mutex;
00039 class Interface;
00040 class InterfaceFieldIterator;
00041 class Time;
00042
00043 class Message : public RefCount
00044 {
00045 friend class Interface;
00046 public:
00047 Message(const char *type);
00048 Message(const Message *mesg);
00049 Message(const Message &mesg);
00050 virtual ~Message();
00051
00052 Message & operator= (const Message & m);
00053
00054 unsigned int id() const;
00055 void set_id(unsigned int message_id);
00056 void mark_enqueued();
00057 bool enqueued() const;
00058 const Time * time_enqueued() const;
00059
00060 unsigned int sender_id() const;
00061 const char * sender_thread_name() const;
00062 Interface * interface() const;
00063 const char * type() const;
00064
00065 InterfaceFieldIterator fields();
00066 InterfaceFieldIterator fields_end();
00067
00068 unsigned int num_fields() const;
00069
00070 const void * datachunk() const;
00071 unsigned int datasize() const;
00072
00073 unsigned int hops() const;
00074 void set_hops(unsigned int hops);
00075
00076 void set_from_chunk(const void *chunk);
00077
00078 unsigned int recipient() const;
00079
00080 virtual Message * clone() const;
00081
00082
00083
00084
00085 template <class MessageType>
00086 bool is_of_type();
00087
00088 private:
00089 unsigned int __message_id;
00090 unsigned int __hops;
00091 bool __enqueued;
00092 Time *__time_enqueued;
00093
00094 unsigned int recipient_interface_mem_serial;
00095 unsigned int sender_interface_instance_serial;
00096
00097 char *_type;
00098 char *_sender_thread_name;
00099 unsigned int _sender_id;
00100
00101 Interface *_transmit_via_iface;
00102
00103 interface_fieldinfo_t *__fieldinfo_list;
00104
00105 unsigned int __num_fields;
00106
00107 private:
00108 void set_interface(Interface *iface);
00109
00110 protected:
00111 void add_fieldinfo(interface_fieldtype_t type, const char *name,
00112 size_t length, void *value, const char *enumtype = 0);
00113
00114 void *data_ptr;
00115 unsigned int data_size;
00116
00117
00118
00119 typedef struct {
00120 int64_t timestamp_sec;
00121 int64_t timestamp_usec;
00122 } message_data_ts_t;
00123 message_data_ts_t *data_ts;
00124 };
00125
00126 template <class MessageType>
00127 bool
00128 Message::is_of_type()
00129 {
00130 return (dynamic_cast<MessageType *>(this) != 0);
00131 }
00132
00133
00134 }
00135
00136 #endif