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