Commit | Line | Data |
---|---|---|
d44e3c4f | 1 | /****************************************************************************** |
2 | * Copyright (c) 2000-2016 Ericsson Telecom AB | |
3 | * All rights reserved. This program and the accompanying materials | |
4 | * are made available under the terms of the Eclipse Public License v1.0 | |
5 | * which accompanies this distribution, and is available at | |
6 | * http://www.eclipse.org/legal/epl-v10.html | |
7 | * | |
8 | * Contributors: | |
9 | * Baji, Laszlo | |
10 | * Balasko, Jeno | |
11 | * Baranyi, Botond | |
12 | * Beres, Szabolcs | |
13 | * Delic, Adam | |
14 | * Forstner, Matyas | |
15 | * Horvath, Gabriella | |
16 | * Kovacs, Ferenc | |
17 | * Raduly, Csaba | |
18 | * Szabados, Kristof | |
19 | * Szabo, Bence Janos | |
20 | * Szabo, Janos Zoltan – initial implementation | |
21 | * Szalai, Gabor | |
22 | * Tatarka, Gabor | |
23 | * Pandi, Krisztian | |
24 | * | |
25 | ******************************************************************************/ | |
970ed795 EL |
26 | #ifndef OCTETSTRING_HH |
27 | #define OCTETSTRING_HH | |
28 | ||
29 | #include "Basetype.hh" | |
30 | #include "Template.hh" | |
31 | #include "Optional.hh" | |
32 | #include "Error.hh" | |
33 | ||
34 | class INTEGER; | |
35 | class BITSTRING; | |
36 | class HEXSTRING; | |
37 | class CHARSTRING; | |
38 | class OCTETSTRING_ELEMENT; | |
39 | class Module_Param; | |
40 | ||
41 | // octetstring value class | |
42 | ||
43 | class OCTETSTRING : public Base_Type { | |
44 | ||
45 | friend class OCTETSTRING_ELEMENT; | |
46 | friend class OCTETSTRING_template; | |
47 | friend class TTCN_Buffer; | |
48 | ||
49 | friend OCTETSTRING int2oct(int value, int length); | |
50 | friend OCTETSTRING int2oct(const INTEGER& value, int length); | |
51 | friend OCTETSTRING str2oct(const CHARSTRING& value); | |
52 | friend OCTETSTRING bit2oct(const BITSTRING& value); | |
53 | friend OCTETSTRING hex2oct(const HEXSTRING& value); | |
54 | friend OCTETSTRING unichar2oct(const UNIVERSAL_CHARSTRING& invalue); | |
55 | friend OCTETSTRING unichar2oct(const UNIVERSAL_CHARSTRING& invalue, const CHARSTRING& string_encoding); | |
56 | friend OCTETSTRING replace(const OCTETSTRING& value, int index, int len, | |
57 | const OCTETSTRING& repl); | |
58 | ||
59 | protected: // for ASN_ANY which is derived from OCTETSTRING | |
60 | struct octetstring_struct; | |
61 | octetstring_struct *val_ptr; | |
62 | ||
63 | void init_struct(int n_octets); | |
64 | void copy_value(); | |
65 | OCTETSTRING(int n_octets); | |
66 | ||
67 | public: | |
68 | OCTETSTRING(); | |
69 | OCTETSTRING(int n_octets, const unsigned char* octets_ptr); | |
70 | OCTETSTRING(const OCTETSTRING_ELEMENT& other_value); | |
71 | OCTETSTRING(const OCTETSTRING& other_value); | |
72 | ~OCTETSTRING(); | |
73 | ||
74 | OCTETSTRING& operator=(const OCTETSTRING& other_value); | |
75 | OCTETSTRING& operator=(const OCTETSTRING_ELEMENT& other_value); | |
76 | ||
77 | boolean operator==(const OCTETSTRING& other_value) const; | |
78 | boolean operator==(const OCTETSTRING_ELEMENT& other_value) const; | |
79 | ||
80 | inline boolean operator!=(const OCTETSTRING& other_value) const | |
81 | { return !(*this == other_value); } | |
82 | inline boolean operator!=(const OCTETSTRING_ELEMENT& other_value) const | |
83 | { return !(*this == other_value); } | |
84 | ||
85 | OCTETSTRING operator+(const OCTETSTRING& other_value) const; | |
86 | OCTETSTRING operator+(const OCTETSTRING_ELEMENT& other_value) const; | |
87 | ||
88 | OCTETSTRING& operator+=(const OCTETSTRING& other_value); | |
89 | OCTETSTRING& operator+=(const OCTETSTRING_ELEMENT& other_value); | |
90 | ||
91 | OCTETSTRING operator~() const; | |
92 | OCTETSTRING operator&(const OCTETSTRING& other_value) const; | |
93 | OCTETSTRING operator&(const OCTETSTRING_ELEMENT& other_value) const; | |
94 | OCTETSTRING operator|(const OCTETSTRING& other_value) const; | |
95 | OCTETSTRING operator|(const OCTETSTRING_ELEMENT& other_value) const; | |
96 | OCTETSTRING operator^(const OCTETSTRING& other_value) const; | |
97 | OCTETSTRING operator^(const OCTETSTRING_ELEMENT& other_value) const; | |
98 | ||
99 | OCTETSTRING operator<<(int shift_count) const; | |
100 | OCTETSTRING operator<<(const INTEGER& shift_count) const; | |
101 | OCTETSTRING operator>>(int shift_count) const; | |
102 | OCTETSTRING operator>>(const INTEGER& shift_count) const; | |
103 | OCTETSTRING operator<<=(int rotate_count) const; | |
104 | OCTETSTRING operator<<=(const INTEGER& rotate_count) const; | |
105 | OCTETSTRING operator>>=(int rotate_count) const; | |
106 | OCTETSTRING operator>>=(const INTEGER& rotate_count) const; | |
107 | ||
108 | OCTETSTRING_ELEMENT operator[](int index_value); | |
109 | OCTETSTRING_ELEMENT operator[](const INTEGER& index_value); | |
110 | const OCTETSTRING_ELEMENT operator[](int index_value) const; | |
111 | const OCTETSTRING_ELEMENT operator[](const INTEGER& index_value) const; | |
112 | ||
113 | inline boolean is_bound() const { return val_ptr != NULL; } | |
114 | inline boolean is_value() const { return val_ptr != NULL; } | |
115 | inline void must_bound(const char *err_msg) const | |
116 | { if (val_ptr == NULL) TTCN_error("%s", err_msg); } | |
117 | void clean_up(); | |
118 | ||
119 | int lengthof() const; | |
120 | operator const unsigned char*() const; | |
121 | void dump () const; | |
122 | ||
123 | #ifdef TITAN_RUNTIME_2 | |
124 | boolean is_equal(const Base_Type* other_value) const { return *this == *(static_cast<const OCTETSTRING*>(other_value)); } | |
125 | void set_value(const Base_Type* other_value) { *this = *(static_cast<const OCTETSTRING*>(other_value)); } | |
126 | Base_Type* clone() const { return new OCTETSTRING(*this); } | |
127 | const TTCN_Typedescriptor_t* get_descriptor() const { return &OCTETSTRING_descr_; } | |
128 | #else | |
129 | inline boolean is_present() const { return is_bound(); } | |
130 | #endif | |
131 | ||
132 | void log() const; | |
133 | void set_param(Module_Param& param); | |
3abe9331 | 134 | Module_Param* get_param(Module_Param_Name& param_name) const; |
970ed795 EL |
135 | |
136 | void encode_text(Text_Buf& text_buf) const; | |
137 | void decode_text(Text_Buf& text_buf); | |
138 | ||
139 | public: | |
140 | void encode(const TTCN_Typedescriptor_t& p_td, TTCN_Buffer& p_buf, | |
141 | TTCN_EncDec::coding_t p_coding, ...) const; | |
142 | ||
143 | void decode(const TTCN_Typedescriptor_t& p_td, TTCN_Buffer& p_buf, | |
144 | TTCN_EncDec::coding_t p_coding, ...); | |
145 | ||
146 | ASN_BER_TLV_t* BER_encode_TLV(const TTCN_Typedescriptor_t& p_td, | |
147 | unsigned p_coding) const; | |
148 | #ifdef TITAN_RUNTIME_2 | |
149 | ASN_BER_TLV_t* BER_encode_negtest_raw() const; | |
150 | virtual int encode_raw(TTCN_Buffer& p_buf) const; | |
151 | virtual int RAW_encode_negtest_raw(RAW_enc_tree& p_myleaf) const; | |
3f84031e | 152 | /** Adds this octetstring to the end of a JSON buffer as raw data. |
153 | * Used during the negative testing of the JSON encoder. | |
154 | * @return The number of bytes added. */ | |
155 | int JSON_encode_negtest_raw(JSON_Tokenizer&) const; | |
970ed795 EL |
156 | #endif |
157 | boolean BER_decode_TLV(const TTCN_Typedescriptor_t& p_td, | |
158 | const ASN_BER_TLV_t& p_tlv, unsigned L_form); | |
159 | ||
160 | /** Encodes the value of the variable according to the | |
161 | * TTCN_Typedescriptor_t. It must be public because called by | |
162 | * another types during encoding. Returns the length of encoded data*/ | |
163 | int RAW_encode(const TTCN_Typedescriptor_t&, RAW_enc_tree&) const; | |
164 | /** Decodes the value of the variable according to the | |
165 | * TTCN_Typedescriptor_t. It must be public because called by | |
166 | * another types during encoding. Returns the number of decoded | |
167 | * bits. */ | |
168 | int RAW_decode(const TTCN_Typedescriptor_t&, TTCN_Buffer& buff, int limit, | |
169 | raw_order_t top_bit_ord, boolean no_err=FALSE, | |
170 | int sel_field=-1, boolean first_call=TRUE); | |
171 | int TEXT_encode(const TTCN_Typedescriptor_t&, | |
172 | TTCN_Buffer&) const; | |
173 | int TEXT_decode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, Limit_Token_List&, | |
174 | boolean no_err=FALSE, boolean first_call=TRUE); | |
175 | int XER_encode(const XERdescriptor_t& p_td, TTCN_Buffer& p_buf, | |
af710487 | 176 | unsigned int flavor, int indent, embed_values_enc_struct_t*) const; |
970ed795 | 177 | int XER_decode(const XERdescriptor_t& p_td, XmlReaderWrap& reader, |
feade998 | 178 | unsigned int flavor, unsigned int flavor2, embed_values_dec_struct_t*); |
970ed795 EL |
179 | |
180 | /** Encodes accordingly to the JSON encoding rules. | |
181 | * Returns the length of the encoded data. */ | |
182 | int JSON_encode(const TTCN_Typedescriptor_t&, JSON_Tokenizer&) const; | |
183 | ||
184 | /** Decodes accordingly to the JSON encoding rules. | |
185 | * Returns the length of the decoded data. */ | |
186 | int JSON_decode(const TTCN_Typedescriptor_t&, JSON_Tokenizer&, boolean); | |
187 | }; | |
188 | ||
189 | ||
190 | class OCTETSTRING_ELEMENT { | |
191 | boolean bound_flag; | |
192 | OCTETSTRING& str_val; | |
193 | int octet_pos; | |
194 | ||
195 | public: | |
196 | OCTETSTRING_ELEMENT(boolean par_bound_flag, OCTETSTRING& par_str_val, | |
197 | int par_octet_pos); | |
198 | ||
199 | OCTETSTRING_ELEMENT& operator=(const OCTETSTRING& other_value); | |
200 | OCTETSTRING_ELEMENT& operator=(const OCTETSTRING_ELEMENT& other_value); | |
201 | ||
202 | boolean operator==(const OCTETSTRING& other_value) const; | |
203 | boolean operator==(const OCTETSTRING_ELEMENT& other_value) const; | |
204 | inline boolean operator!=(const OCTETSTRING& other_value) const | |
205 | { return !(*this == other_value); } | |
206 | inline boolean operator!=(const OCTETSTRING_ELEMENT& other_value) const | |
207 | { return !(*this == other_value); } | |
208 | ||
209 | OCTETSTRING operator+(const OCTETSTRING& other_value) const; | |
210 | OCTETSTRING operator+(const OCTETSTRING_ELEMENT& other_value) const; | |
211 | ||
212 | OCTETSTRING operator~() const; | |
213 | OCTETSTRING operator&(const OCTETSTRING& other_value) const; | |
214 | OCTETSTRING operator&(const OCTETSTRING_ELEMENT& other_value) const; | |
215 | OCTETSTRING operator|(const OCTETSTRING& other_value) const; | |
216 | OCTETSTRING operator|(const OCTETSTRING_ELEMENT& other_value) const; | |
217 | OCTETSTRING operator^(const OCTETSTRING& other_value) const; | |
218 | OCTETSTRING operator^(const OCTETSTRING_ELEMENT& other_value) const; | |
219 | ||
220 | inline boolean is_bound() const { return bound_flag; } | |
221 | inline boolean is_present() const { return bound_flag; } | |
222 | inline boolean is_value() const { return bound_flag; } | |
223 | inline void must_bound(const char *err_msg) const | |
224 | { if (!bound_flag) TTCN_error("%s", err_msg); } | |
225 | ||
226 | unsigned char get_octet() const; | |
227 | ||
228 | void log() const; | |
229 | }; | |
230 | ||
231 | // octetstring template class | |
232 | ||
28352dbd BB |
233 | struct decmatch_struct; |
234 | ||
970ed795 EL |
235 | class OCTETSTRING_template : public Restricted_Length_Template { |
236 | #ifdef __SUNPRO_CC | |
237 | public: | |
238 | #endif | |
239 | struct octetstring_pattern_struct; | |
240 | private: | |
241 | OCTETSTRING single_value; | |
242 | union { | |
243 | struct { | |
244 | unsigned int n_values; | |
245 | OCTETSTRING_template *list_value; | |
246 | } value_list; | |
247 | octetstring_pattern_struct *pattern_value; | |
28352dbd | 248 | decmatch_struct* dec_match; |
970ed795 EL |
249 | }; |
250 | ||
251 | void copy_template(const OCTETSTRING_template& other_value); | |
252 | static boolean match_pattern(const octetstring_pattern_struct *string_pattern, | |
253 | const OCTETSTRING::octetstring_struct *string_value); | |
254 | ||
255 | public: | |
256 | OCTETSTRING_template(); | |
257 | OCTETSTRING_template(template_sel other_value); | |
258 | OCTETSTRING_template(const OCTETSTRING& other_value); | |
259 | OCTETSTRING_template(const OCTETSTRING_ELEMENT& other_value); | |
260 | OCTETSTRING_template(const OPTIONAL<OCTETSTRING>& other_value); | |
261 | OCTETSTRING_template(unsigned int n_elements, | |
262 | const unsigned short *pattern_elements); | |
263 | OCTETSTRING_template(const OCTETSTRING_template& other_value); | |
264 | ~OCTETSTRING_template(); | |
265 | void clean_up(); | |
266 | ||
267 | OCTETSTRING_template& operator=(template_sel other_value); | |
268 | OCTETSTRING_template& operator=(const OCTETSTRING& other_value); | |
269 | OCTETSTRING_template& operator=(const OCTETSTRING_ELEMENT& other_value); | |
270 | OCTETSTRING_template& operator=(const OPTIONAL<OCTETSTRING>& other_value); | |
271 | OCTETSTRING_template& operator=(const OCTETSTRING_template& other_value); | |
272 | ||
273 | OCTETSTRING_ELEMENT operator[](int index_value); | |
274 | OCTETSTRING_ELEMENT operator[](const INTEGER& index_value); | |
275 | const OCTETSTRING_ELEMENT operator[](int index_value) const; | |
276 | const OCTETSTRING_ELEMENT operator[](const INTEGER& index_value) const; | |
277 | ||
3abe9331 | 278 | boolean match(const OCTETSTRING& other_value, boolean legacy = FALSE) const; |
970ed795 EL |
279 | const OCTETSTRING& valueof() const; |
280 | ||
281 | int lengthof() const; | |
282 | ||
28352dbd | 283 | void set_type(template_sel template_type, unsigned int list_length = 0); |
970ed795 | 284 | OCTETSTRING_template& list_item(unsigned int list_index); |
28352dbd BB |
285 | |
286 | void set_decmatch(Dec_Match_Interface* new_instance); | |
970ed795 EL |
287 | |
288 | void log() const; | |
3abe9331 | 289 | void log_match(const OCTETSTRING& match_value, boolean legacy = FALSE) const; |
970ed795 EL |
290 | |
291 | void set_param(Module_Param& param); | |
3abe9331 | 292 | Module_Param* get_param(Module_Param_Name& param_name) const; |
970ed795 EL |
293 | |
294 | void encode_text(Text_Buf& text_buf) const; | |
295 | void decode_text(Text_Buf& text_buf); | |
296 | ||
3abe9331 | 297 | boolean is_present(boolean legacy = FALSE) const; |
298 | boolean match_omit(boolean legacy = FALSE) const; | |
970ed795 EL |
299 | #ifdef TITAN_RUNTIME_2 |
300 | void valueofv(Base_Type* value) const { *(static_cast<OCTETSTRING*>(value)) = valueof(); } | |
301 | void set_value(template_sel other_value) { *this = other_value; } | |
302 | void copy_value(const Base_Type* other_value) { *this = *(static_cast<const OCTETSTRING*>(other_value)); } | |
303 | Base_Template* clone() const { return new OCTETSTRING_template(*this); } | |
304 | const TTCN_Typedescriptor_t* get_descriptor() const { return &OCTETSTRING_descr_; } | |
3abe9331 | 305 | boolean matchv(const Base_Type* other_value, boolean legacy) const { return match(*(static_cast<const OCTETSTRING*>(other_value)), legacy); } |
306 | void log_matchv(const Base_Type* match_value, boolean legacy) const { log_match(*(static_cast<const OCTETSTRING*>(match_value)), legacy); } | |
970ed795 | 307 | #else |
3abe9331 | 308 | void check_restriction(template_res t_res, const char* t_name=NULL, boolean legacy = FALSE) const; |
970ed795 EL |
309 | #endif |
310 | }; | |
311 | ||
312 | #endif |