00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #ifndef _PROPHET_TLV_H_
00018 #define _PROPHET_TLV_H_
00019
00020 #include <string>
00021 #include <list>
00022 #include "BaseTLV.h"
00023
00024 namespace prophet {
00025
00026 class ProphetTLV
00027 {
00028 public:
00029 typedef std::list<BaseTLV*> List;
00030 typedef std::list<BaseTLV*>::iterator iterator;
00031 typedef std::list<BaseTLV*>::const_iterator const_iterator;
00032
00037 struct ProphetHeader {
00038 u_int8_t version;
00039 u_int8_t flags;
00040
00070 u_int8_t result;
00089 u_int8_t code;
00105 u_int16_t sender_instance;
00120 u_int16_t receiver_instance;
00127 u_int32_t transaction_id;
00136 u_int16_t submessage_flag:1;
00145 u_int16_t submessage_num:15;
00151 u_int16_t length;
00152 } __attribute__((packed));
00153
00158 typedef enum {
00159 UnknownResult = 0x0,
00160 NoSuccessAck = 0x1,
00161 AckAll = 0x2,
00162 Success = 0x3,
00163 Failure = 0x4,
00164 ReturnReceipt = 0x5
00165 } header_result_t;
00166
00167 static const size_t ProphetHeaderSize = sizeof(struct ProphetHeader);
00168
00172 static const char* result_to_str(header_result_t hr)
00173 {
00174 switch(hr) {
00175 case NoSuccessAck: return "NoSuccessAck";
00176 case AckAll: return "AckAll";
00177 case Success: return "Success";
00178 case Failure: return "Failure";
00179 case ReturnReceipt: return "ReturnReceipt";
00180 case UnknownResult:
00181 default: return "Unknown header result";
00182 }
00183 }
00184
00188 ProphetTLV(const std::string& src,
00189 const std::string& dst,
00190 header_result_t result,
00191 u_int16_t local_instance,
00192 u_int16_t remote_instance,
00193 u_int32_t tid);
00194
00198 ProphetTLV(const ProphetTLV& tlv);
00199
00203 virtual ~ProphetTLV();
00204
00209 size_t serialize(u_char* bp, size_t len) const;
00210
00215 static ProphetTLV* deserialize(const std::string& src,
00216 const std::string& dst,
00217 const u_char* bp, size_t len);
00218
00224 bool add_tlv(BaseTLV* tlv);
00225
00230 BaseTLV* get_tlv();
00231
00233 const std::string& source() const { return src_; }
00234 const std::string& destination() const { return dst_; }
00235 header_result_t result() const { return result_; }
00236 u_int16_t sender_instance() const { return sender_instance_; }
00237 u_int16_t receiver_instance() const { return receiver_instance_; }
00238 u_int32_t transaction_id() const { return tid_; }
00239 u_int16_t length() const { return length_; }
00240 size_t size() const { return list_.size(); }
00241 const List& list() const { return list_; }
00243
00244 protected:
00245 ProphetTLV();
00246
00247 std::string src_;
00248 std::string dst_;
00249 header_result_t result_;
00250 u_int16_t sender_instance_;
00251 u_int16_t receiver_instance_;
00252 u_int32_t tid_;
00253 mutable u_int16_t length_;
00254 List list_;
00255
00256 };
00257
00258 };
00259 #endif // _PROPHET_TLV_H_