Newer
Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
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
#include "DENMCodec.hh"
#include "Asn1cEncDec.hh"
int DENMCodec::encode (const LibItsDenm__TestSystem::DenmReq& req, OCTETSTRING& data)
{
BITSTRING b;
int rc = asnCodec.encode(req.msgOut(), b);
if(rc){
data = bit2oct(b);
}
return rc;
}
int DENMCodec::decode (const OCTETSTRING& data, LibItsDenm__TestSystem::DenmInd& ind)
{
int rc = asnCodec.decode(oct2bit(data), ind.msgIn());
if(rc) {
/* TODO: fill other Indication fields */
}
return rc;
}
extern asn_TYPE_descriptor_t asn_DEF_DENM;
int DENMPDUCodec::encode (const DENM__PDU__Descriptions::DENM& denm, BITSTRING& data)
{
int rc = -1;
// encode as BER
TTCN_EncDec::set_error_behavior(TTCN_EncDec::ET_ALL,TTCN_EncDec::EB_WARNING);
TTCN_Buffer ber_buf, per_buf;
ber_buf.clear();
per_buf.clear();
//encode message in BER (CER variant, but can be any)
denm.encode(DENM__PDU__Descriptions::DENM_descr_,ber_buf,TTCN_EncDec::CT_BER,BER_ENCODE_CER);
// recode data as PER
if( asn1c_ber2per(asn_DEF_DENM, ber_buf, per_buf) ) {
rc = per_buf.get_len() * 8;
data = BITSTRING(rc, per_buf.get_data());
}
return rc;
}
int DENMPDUCodec::decode (const BITSTRING& data, DENM__PDU__Descriptions::DENM& denm)
{
// recode data to ber
TTCN_Buffer per_buf, ber_buf;
per_buf = TTCN_Buffer(bit2oct(data));
ber_buf.clear();
if(asn1c_per2ber(asn_DEF_DENM, per_buf, ber_buf)){
ber_buf.rewind();
denm.decode(DENM__PDU__Descriptions::DENM_descr_, ber_buf, TTCN_EncDec::CT_BER, BER_ACCEPT_ALL);
}
return per_buf.get_len();
}