Newer
Older
#include "BTPCodec.hh"
int BTPCodec::encode (const LibItsBtp__TypesAndValues::BtpPacket& msg, OCTETSTRING& data)
loggers::get_instance().log_msg(">>> BTPCodec::encode: ", (const Base_Type&)msg);
TTCN_EncDec::clear_error();
TTCN_Buffer encoding_buffer;
encode_(msg, LibItsBtp__TypesAndValues::BtpPacket_descr_, encoding_buffer);
data = OCTETSTRING(encoding_buffer.get_len(), encoding_buffer.get_data());
loggers::get_instance().log_msg("<<< BTPCodec::encode: data=", data);
return 0;
/*
TTCN_Buffer b;
p.header().encode(LibItsBtp__TypesAndValues::BtpHeader_descr_, b, TTCN_EncDec::CT_RAW);
b.get_string(data);
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
return 0;*/
}
int BTPCodec::encode_ (const Base_Type& type, const TTCN_Typedescriptor_t& field_descriptor, TTCN_Buffer& encoding_buffer)
{
loggers::get_instance().log(">>> BTPCodec::encode_: processing %s/%s", type.get_descriptor()->name, field_descriptor.name);
loggers::get_instance().log_msg(">>> BTPCodec::encode_: ", type);
if (dynamic_cast<const Record_Type *>(&type) != NULL) {
const Record_Type& r = (const Record_Type &)type;
loggers::get_instance().log("BTPCodec::encode_: processing Record_Type %s", r.get_descriptor()->name);
for(int i = 0; i < r.get_count(); i++) {
loggers::get_instance().log("BTPCodec::encode_: processing %s/%s/%s - %d (1 ==> use dynamic_cast<const OPTIONAL<...>) - %d", r.fld_name(i), r.fld_descr(i)->name, r.get_at(i)->get_descriptor()->name, r.get_at(i)->is_optional(), r.get_at(i)->is_present());
if (r.get_at(i)->is_present()) {
if (encode_(*r.get_at(i), *r.fld_descr(i), encoding_buffer) == -1) {
loggers::get_instance().warning("BTPCodec::encode_: -1 result code returned");
return -1;
}
}
} // End of 'for' statement
} else if (std::string(type.get_descriptor()->name).compare("@LibItsBtp_TypesAndValues.BtpPayload") == 0) {
const OPTIONAL<LibItsBtp__TypesAndValues::BtpPayload> &v = dynamic_cast<const OPTIONAL<LibItsBtp__TypesAndValues::BtpPayload> &>(type);
loggers::get_instance().log("BTPCodec::encode_: Payload present: %d", v.is_present());
if (v.is_present()) {
if (encode_(static_cast<const LibItsBtp__TypesAndValues::BtpPayload &>(*v.get_opt_value()), LibItsBtp__TypesAndValues::BtpPayload_descr_, encoding_buffer) == -1) {
loggers::get_instance().warning("BTPCodec::encode_: -1 result code returned");
return -1;
}
}
} else if (std::string(type.get_descriptor()->name).compare("@LibItsBtp_TypesAndValues.DecodedBtpPayload") == 0) {
const OPTIONAL<LibItsBtp__TypesAndValues::DecodedBtpPayload> &v = dynamic_cast<const OPTIONAL<LibItsBtp__TypesAndValues::DecodedBtpPayload> &>(type);
loggers::get_instance().log("BTPCodec::encode_: DecodedBtpPayload present: %d", v.is_present());
if (v.is_present()) {
loggers::get_instance().error("BTPCodec::encode_ DecodedBtpPayload shall not be present");
}
} else {
loggers::get_instance().log("BTPCodec::encode_ (else): processing type %s/%s", type.get_descriptor()->name, field_descriptor.name);
type.encode(field_descriptor, encoding_buffer, TTCN_EncDec::CT_RAW);
}
loggers::get_instance().log_to_hexa("<<<BTPCodec::encode_: encoding_buffer=", encoding_buffer);
return 0;
int BTPCodec::decode (const OCTETSTRING& data, LibItsBtp__TypesAndValues::BtpPacket& msg)
TTCN_EncDec::clear_error();
TTCN_Buffer decoding_buffer(data);
loggers::get_instance().log_to_hexa(">>> BTPCodec::decode: decoding_buffer=", decoding_buffer);
decode_(msg, LibItsBtp__TypesAndValues::BtpPacket_descr_, decoding_buffer);
loggers::get_instance().log_msg("<<< BTPCodec::decode: ", (const Base_Type&)msg);
return 0;
TTCN_Buffer b(data);
p.header().decode(LibItsBtp__TypesAndValues::BtpHeader_descr_, b, TTCN_EncDec::CT_RAW);
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
int BTPCodec::decode_ (Base_Type& type, const TTCN_Typedescriptor_t& field_descriptor, TTCN_Buffer& decoding_buffer)
{
loggers::get_instance().log(">>> BTPCodec::decode_: processing %s/%s (%d,%d,%p)", type.get_descriptor()->name, field_descriptor.name, decoding_buffer.get_len(), decoding_buffer.get_pos(), decoding_buffer.get_read_data());
if (dynamic_cast<Record_Type *>(&type) != NULL) {
Record_Type& r = (Record_Type &)type;
loggers::get_instance().log("BTPCodec::decode_: processing Record_Type %s", r.get_descriptor()->name);
for(int i = 0; i < r.get_count(); i++) {
loggers::get_instance().log("BTPCodec::decode_: processing %s/%s/%s", r.fld_name(i), r.fld_descr(i)->name, r.get_at(i)->get_descriptor()->name);
if (decode_(*dynamic_cast<Base_Type *>(r.get_at(i)), *(r.fld_descr(i)), decoding_buffer) == -1) {
return -1;
}
} // End of 'for' statement
} else {
loggers::get_instance().log("BTPCodec::decode_ (else): processing type %s/%s - optional:%d", type.get_descriptor()->name, field_descriptor.name, type.is_optional());
if (std::string(field_descriptor.name).compare("@LibItsBtp_TypesAndValues.BtpPacket.payload") == 0) {
LibItsBtp__TypesAndValues::BtpPayload p;
decode_(p, LibItsBtp__TypesAndValues::BtpPayload_descr_, decoding_buffer);
loggers::get_instance().log_msg("BTPCodec::decode_: payload= ", p);
if (p.is_bound()) {
dynamic_cast<OPTIONAL<LibItsBtp__TypesAndValues::BtpPayload> &>(type) = OPTIONAL<LibItsBtp__TypesAndValues::BtpPayload>(p);
loggers::get_instance().log_msg("BTPCodec::decode_: Set OPTIONAL to ", type);
} else {
loggers::get_instance().log("BTPCodec::decode_: Set OPTIONAL to omit");
dynamic_cast<OPTIONAL<LibItsBtp__TypesAndValues::BtpPayload> &>(type).set_to_omit();
}
} else if (std::string(field_descriptor.name).compare("@LibItsBtp_TypesAndValues.BtpPacket.header") == 0) {
loggers::get_instance().log("BTPCodec::decode_: _type = %d", _type);
LibItsBtp__TypesAndValues::BtpHeader& b = static_cast<LibItsBtp__TypesAndValues::BtpHeader&>(type);
if (_type == BTPCodec::btpA) {
decode_(b.btpAHeader(), *b.btpAHeader().get_descriptor(), decoding_buffer);
} else if (_type == BTPCodec::btpB) {
decode_(b.btpBHeader(), *b.btpBHeader().get_descriptor(), decoding_buffer);
} else {
loggers::get_instance().error("BTPCodec::decode_: Invalid BTP type"); // Cannot be reached
}
loggers::get_instance().log_msg("BTPCodec::decode_: BtpHeader: ", type);
} else if (std::string(field_descriptor.name).compare("@LibItsBtp_TypesAndValues.BtpPayload.decodedPayload") == 0) {
dynamic_cast<OPTIONAL<LibItsBtp__TypesAndValues::DecodedBtpPayload> &>(type).set_to_omit();
} else if (std::string(field_descriptor.name).compare("@LibItsBtp_TypesAndValues.BtpPayload.rawPayload") == 0) {
// Decode BtpRawPayload data structure
OCTETSTRING s(decoding_buffer.get_len() - decoding_buffer.get_pos(), decoding_buffer.get_data() + decoding_buffer.get_pos());
loggers::get_instance().log_msg("BTPCodec::decode_: s=", s);
const unsigned char * p = static_cast<const unsigned char *>(s);
if (p == NULL) {
loggers::get_instance().warning("BTPCodec::encode_: Static cast error");
return -1;
}
dynamic_cast<OCTETSTRING &>(type) = s;
} else {
type.decode(field_descriptor, decoding_buffer, TTCN_EncDec::CT_RAW);
}
}
loggers::get_instance().log_msg("<<< BTPCodec::decode_: ", type);
loggers::get_instance().log_to_hexa("<<< BTPCodec::decode_: decoding_buffer=", decoding_buffer);
return 0;
}