1 // Copyright 2011 Juri Glass, Mathias Runge, Nadim El Sayed
2 // DAI-Labor, TU-Berlin
3 //
4 // This file is part of libSML.
5 //
6 // libSML is free software: you can redistribute it and/or modify
7 // it under the terms of the GNU General Public License as published by
8 // the Free Software Foundation, either version 3 of the License, or
9 // (at your option) any later version.
10 //
11 // libSML is distributed in the hope that it will be useful,
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 // GNU General Public License for more details.
15 //
16 // You should have received a copy of the GNU General Public License
17 // along with libSML. If not, see <http://www.gnu.org/licenses/>.
18
19
20 #include <sml/sml_get_profile_pack_response.h>
21 #include <stdio.h>
22
23 static void * sml_prof_obj_header_entry_parse_(sml_buffer *buf);
24 static void * sml_value_entry_parse_(sml_buffer *buf);
25 static void sml_value_entry_free_( void * p );
26 static void sml_value_entry_write_( void * p, sml_buffer *buf);
27
sml_prof_obj_header_entry_free_(void * p)28 static void sml_prof_obj_header_entry_free_( void * p ) {
29 sml_prof_obj_header_entry * entry = p;
30 if (entry) {
31 sml_octet_string_free(entry->obj_name);
32 sml_unit_free(entry->unit);
33 sml_number_free(entry->scaler);
34
35 free(entry);
36 }
37 }
38
sml_prof_obj_period_entry_parse_(sml_buffer * buf)39 static void * sml_prof_obj_period_entry_parse_(sml_buffer *buf) {
40 sml_prof_obj_period_entry *entry = sml_prof_obj_period_entry_init();
41
42 if (sml_buf_get_next_type(buf) != SML_TYPE_LIST) {
43 buf->error = 1;
44 goto error;
45 }
46
47 if (sml_buf_get_next_length(buf) != 4) {
48 buf->error = 1;
49 goto error;
50 }
51
52
53 entry->val_time = sml_time_parse(buf);
54 if (sml_buf_has_errors(buf)) goto error;
55 entry->status = sml_u64_parse(buf);
56 if (sml_buf_has_errors(buf)) goto error;
57 entry->value_list = sml_sequence_parse(buf, sml_value_entry_parse_, sml_value_entry_free_);
58 if (sml_buf_has_errors(buf)) goto error;
59 entry->period_signature = sml_signature_parse(buf);
60 if (sml_buf_has_errors(buf)) goto error;
61
62 return entry;
63
64 error:
65 buf->error = 1;
66 sml_prof_obj_period_entry_free(entry);
67 return 0;
68 }
69
sml_prof_obj_period_entry_free_(void * p)70 static void sml_prof_obj_period_entry_free_( void * p ) {
71 sml_prof_obj_period_entry * entry = p;
72
73 if (entry) {
74 sml_time_free(entry->val_time);
75 sml_number_free(entry->status);
76 sml_sequence_free(entry->value_list);
77 sml_signature_free(entry->period_signature);
78
79 free(entry);
80 }
81 }
82
sml_prof_obj_header_entry_write_(void * p,sml_buffer * buf)83 static void sml_prof_obj_header_entry_write_( void * p, sml_buffer *buf) {
84 sml_prof_obj_header_entry * entry = p;
85
86 sml_buf_set_type_and_length(buf, SML_TYPE_LIST, 3);
87
88 sml_octet_string_write(entry->obj_name, buf);
89 sml_unit_write(entry->unit, buf);
90 sml_i8_write(entry->scaler, buf);
91 }
92
sml_prof_obj_period_entry_write_(void * p,sml_buffer * buf)93 static void sml_prof_obj_period_entry_write_( void * p, sml_buffer *buf) {
94 sml_prof_obj_period_entry * entry = p;
95
96 sml_buf_set_type_and_length(buf, SML_TYPE_LIST, 4);
97 sml_time_write(entry->val_time, buf);
98 sml_u64_write(entry->status, buf);
99 sml_sequence_write(entry->value_list, buf, sml_value_entry_write_);
100 sml_signature_write(entry->period_signature, buf);
101 }
102
sml_value_entry_parse_(sml_buffer * buf)103 static void * sml_value_entry_parse_(sml_buffer *buf) {
104 sml_value_entry *entry = sml_value_entry_init();
105
106 if (sml_buf_get_next_type(buf) != SML_TYPE_LIST) {
107 buf->error = 1;
108 goto error;
109 }
110
111 if (sml_buf_get_next_length(buf) != 2) {
112 buf->error = 1;
113 goto error;
114 }
115
116 entry->value = sml_value_parse(buf);
117 if (sml_buf_has_errors(buf)) goto error;
118 entry->value_signature = sml_signature_parse(buf);
119 if (sml_buf_has_errors(buf)) goto error;
120
121 return entry;
122
123 error:
124 buf->error = 1;
125 sml_value_entry_free(entry);
126 return 0;
127 }
128
sml_value_entry_write_(void * p,sml_buffer * buf)129 static void sml_value_entry_write_( void * p, sml_buffer *buf) {
130 sml_value_entry * entry = p;
131
132 sml_buf_set_type_and_length(buf, SML_TYPE_LIST, 2);
133 sml_value_write(entry->value, buf);
134 sml_signature_write(entry->value_signature, buf);
135 }
136
sml_value_entry_free_(void * p)137 static void sml_value_entry_free_( void * p ) {
138 sml_value_entry * entry = p;
139
140 if (entry) {
141 sml_value_free(entry->value);
142 sml_signature_free(entry->value_signature);
143
144 free(entry);
145 }
146 }
147
148 // sml_get_profile_pack_response;
149
sml_get_profile_pack_response_init()150 sml_get_profile_pack_response *sml_get_profile_pack_response_init() {
151 sml_get_profile_pack_response *msg = (sml_get_profile_pack_response *) malloc(sizeof(sml_get_profile_pack_response));
152 *msg = ( sml_get_profile_pack_response ) {
153 .server_id = NULL,
154 .act_time = NULL,
155 .reg_period = NULL,
156 .parameter_tree_path = NULL,
157 .header_list = NULL,
158 .period_list = NULL,
159 .rawdata = NULL,
160 .profile_signature = NULL
161 };
162
163 return msg;
164 }
165
sml_get_profile_pack_response_parse(sml_buffer * buf)166 sml_get_profile_pack_response *sml_get_profile_pack_response_parse(sml_buffer *buf){
167 sml_get_profile_pack_response *msg = sml_get_profile_pack_response_init();
168
169 if (sml_buf_get_next_type(buf) != SML_TYPE_LIST) {
170 buf->error = 1;
171 goto error;
172 }
173
174 if (sml_buf_get_next_length(buf) != 8) {
175 buf->error = 1;
176 goto error;
177 }
178
179 msg->server_id = sml_octet_string_parse(buf);
180 if (sml_buf_has_errors(buf)) goto error;
181
182 msg->act_time = sml_time_parse(buf);
183 if (sml_buf_has_errors(buf)) goto error;
184
185 msg->reg_period = sml_u32_parse(buf);
186 if (sml_buf_has_errors(buf)) goto error;
187
188 msg->parameter_tree_path = sml_tree_path_parse(buf);
189 if (sml_buf_has_errors(buf)) goto error;
190
191 msg->header_list = sml_sequence_parse(buf, sml_prof_obj_header_entry_parse_, sml_prof_obj_header_entry_free_);
192 if (sml_buf_has_errors(buf)) goto error;
193
194 msg->period_list = sml_sequence_parse(buf, sml_prof_obj_period_entry_parse_, sml_prof_obj_period_entry_free_);
195 if (sml_buf_has_errors(buf)) goto error;
196
197 msg->rawdata = sml_octet_string_parse(buf);
198 if (sml_buf_has_errors(buf)) goto error;
199
200 msg->profile_signature = sml_signature_parse(buf);
201 if (sml_buf_has_errors(buf)) goto error;
202
203 return msg;
204
205 error:
206 buf->error = 1;
207 sml_get_profile_pack_response_free(msg);
208 return 0;
209 }
210
sml_get_profile_pack_response_write(sml_get_profile_pack_response * msg,sml_buffer * buf)211 void sml_get_profile_pack_response_write(sml_get_profile_pack_response *msg, sml_buffer *buf) {
212 sml_buf_set_type_and_length(buf, SML_TYPE_LIST, 8);
213
214 sml_octet_string_write(msg->server_id, buf);
215 sml_time_write(msg->act_time, buf);
216 sml_u32_write(msg->reg_period, buf);
217 sml_tree_path_write(msg->parameter_tree_path, buf);
218 sml_sequence_write(msg->header_list, buf, sml_prof_obj_header_entry_write_);
219 sml_sequence_write(msg->period_list, buf, sml_prof_obj_period_entry_write_);
220 sml_octet_string_write(msg->rawdata, buf);
221 sml_signature_write(msg->profile_signature, buf);
222 }
223
sml_get_profile_pack_response_free(sml_get_profile_pack_response * msg)224 void sml_get_profile_pack_response_free(sml_get_profile_pack_response *msg){
225 if (msg) {
226 sml_octet_string_free(msg->server_id);
227 sml_time_free(msg->act_time);
228 sml_number_free(msg->reg_period);
229 sml_tree_path_free(msg->parameter_tree_path);
230 sml_sequence_free(msg->header_list);
231 sml_sequence_free(msg->period_list);
232 sml_octet_string_free(msg->rawdata);
233 sml_signature_free(msg->profile_signature);
234
235 free(msg);
236 }
237 }
238
239
240 // sml_prof_obj_header_entry;
241
sml_prof_obj_header_entry_init()242 sml_prof_obj_header_entry *sml_prof_obj_header_entry_init() {
243 sml_prof_obj_header_entry *entry = (sml_prof_obj_header_entry *) malloc(sizeof(sml_prof_obj_header_entry));
244 *entry = ( sml_prof_obj_header_entry ) {
245 .obj_name = NULL,
246 .unit = NULL,
247 .scaler = NULL
248 };
249 return entry;
250 }
251
sml_prof_obj_header_entry_parse_(sml_buffer * buf)252 static void * sml_prof_obj_header_entry_parse_(sml_buffer *buf) {
253 sml_prof_obj_header_entry *entry = sml_prof_obj_header_entry_init();
254
255 if (sml_buf_get_next_type(buf) != SML_TYPE_LIST) {
256 buf->error = 1;
257 goto error;
258 }
259
260 if (sml_buf_get_next_length(buf) != 3) {
261 buf->error = 1;
262 goto error;
263 }
264
265 entry->obj_name = sml_octet_string_parse(buf);
266 if (sml_buf_has_errors(buf)) goto error;
267 entry->unit = sml_unit_parse(buf);
268 if (sml_buf_has_errors(buf)) goto error;
269 entry->scaler = sml_i8_parse(buf);
270 if (sml_buf_has_errors(buf)) goto error;
271
272 return entry;
273 error:
274 buf->error = 1;
275 sml_prof_obj_header_entry_free(entry);
276 return 0;
277 }
278
sml_prof_obj_header_entry_parse(sml_buffer * buf)279 sml_prof_obj_header_entry * sml_prof_obj_header_entry_parse( sml_buffer * buf ) {
280 return sml_prof_obj_header_entry_parse_( buf );
281 }
282
sml_prof_obj_header_entry_write(sml_prof_obj_header_entry * entry,sml_buffer * buf)283 void sml_prof_obj_header_entry_write( sml_prof_obj_header_entry * entry, sml_buffer * buf ) {
284 sml_prof_obj_header_entry_write_( entry, buf );
285 }
286
sml_prof_obj_header_entry_free(sml_prof_obj_header_entry * entry)287 void sml_prof_obj_header_entry_free( sml_prof_obj_header_entry * entry ) {
288 sml_prof_obj_header_entry_free_( entry );
289 }
290
291
292 // sml_prof_obj_period_entry;
293
sml_prof_obj_period_entry_init()294 sml_prof_obj_period_entry *sml_prof_obj_period_entry_init() {
295 sml_prof_obj_period_entry *entry = (sml_prof_obj_period_entry *) malloc(sizeof(sml_prof_obj_period_entry));
296 *entry = ( sml_prof_obj_period_entry ) {
297 .val_time = NULL,
298 .status = NULL,
299 .value_list = NULL,
300 .period_signature = NULL
301 };
302 return entry;
303 }
304
sml_prof_obj_period_entry_parse(sml_buffer * buf)305 sml_prof_obj_period_entry * sml_prof_obj_period_entry_parse( sml_buffer * buf ) {
306 return sml_prof_obj_period_entry_parse_( buf );
307 }
308
sml_prof_obj_period_entry_write(sml_prof_obj_period_entry * entry,sml_buffer * buf)309 void sml_prof_obj_period_entry_write( sml_prof_obj_period_entry * entry, sml_buffer * buf ) {
310 sml_prof_obj_period_entry_write_( entry, buf );
311 }
312
sml_prof_obj_period_entry_free(sml_prof_obj_period_entry * entry)313 void sml_prof_obj_period_entry_free( sml_prof_obj_period_entry * entry ) {
314 sml_prof_obj_period_entry_free_( entry );
315 }
316
317
318 // sml_value_entry;
319
sml_value_entry_init()320 sml_value_entry *sml_value_entry_init() {
321 sml_value_entry *entry = (sml_value_entry *) malloc(sizeof(sml_value_entry));
322 *entry = ( sml_value_entry ) {
323 .value = NULL,
324 .value_signature = NULL
325 };
326
327 return entry;
328 }
329
sml_value_entry_parse(sml_buffer * buf)330 sml_value_entry * sml_value_entry_parse( sml_buffer * buf ) {
331 return sml_value_entry_parse_( buf );
332 }
333
sml_value_entry_write(sml_value_entry * entry,sml_buffer * buf)334 void sml_value_entry_write( sml_value_entry * entry, sml_buffer * buf ) {
335 sml_value_entry_write_( entry, buf );
336 }
337
sml_value_entry_free(sml_value_entry * entry)338 void sml_value_entry_free( sml_value_entry * entry ) {
339 sml_value_entry_free_( entry );
340 }
341