#pragma once #include "params.hh" class OCTETSTRING; class CHARSTRING; class BITSTRING; struct asn_TYPE_descriptor_s; class asn1_recode_oer { protected: int xer2oer (const asn_TYPE_descriptor_s & td, TTCN_Buffer & buf); int oer2xer (const asn_TYPE_descriptor_s & td, TTCN_Buffer & buf); int recode (const asn_TYPE_descriptor_s & td, int from, int to, TTCN_Buffer & buf); }; template class oer_codec : public asn1_recode_oer { public: virtual int encode(const TPDU& msg, BITSTRING& bits) = 0; virtual int decode(const BITSTRING& bits, TPDU& msg) = 0; protected: inline int _decode (const TTCN_Typedescriptor_t& ttcn, const asn_TYPE_descriptor_s & td, const BITSTRING& p_data, TPDU& msg) { TTCN_Buffer buf(bit2oct(p_data)); TTCN_EncDec::set_error_behavior(TTCN_EncDec::ET_ALL, TTCN_EncDec::EB_WARNING); int rc = oer2xer (td, buf); if (rc > 0) { msg.decode(ttcn, buf, TTCN_EncDec::CT_BER, BER_ACCEPT_ALL); rc = buf.get_len(); } return rc; } inline int _encode (const TTCN_Typedescriptor_t& ttcn, const asn_TYPE_descriptor_s & td, const TPDU& msg, BITSTRING& p_data) { int rc = -1; TTCN_Buffer buf; TTCN_EncDec::set_error_behavior(TTCN_EncDec::ET_ALL, TTCN_EncDec::EB_WARNING); msg.encode(ttcn, buf, TTCN_EncDec::CT_BER, BER_ENCODE_DER); if (buf.get_len() > 0) { rc = xer2oer (td, buf); if (rc > 0) { p_data = oct2bit(OCTETSTRING(buf.get_len(), buf.get_data())); } } return rc; } }; #endif