1 // Copyright Maciej Sobczak 2008-2019.
2 // This file is part of YAMI4.
3 //
4 // YAMI4 is free software: you can redistribute it and/or modify
5 // it under the terms of the GNU General Public License as published by
6 // the Free Software Foundation, either version 3 of the License, or
7 // (at your option) any later version.
8 //
9 // YAMI4 is distributed in the hope that it will be useful,
10 // but WITHOUT ANY WARRANTY; without even the implied warranty of
11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 // GNU General Public License for more details.
13 //
14 // You should have received a copy of the GNU General Public License
15 // along with YAMI4. If not, see <http://www.gnu.org/licenses/>.
16
17 #include "agent.h"
18 #include "channel_descriptor.h"
19 #include "core.h"
20 #include "fatal_errors.h"
21 #include "parameter_entry.h"
22 #include "parameter_iterator.h"
23 #include "parameters.h"
24 #include "parameters-details.h"
25 #include "raw_buffer_data_source.h"
26 #include <new>
27
28 namespace // unnamed
29 {
30
translate_result(yami::core::result res)31 int translate_result(yami::core::result res)
32 {
33 int translated = 0; // dummy initialization
34 switch (res)
35 {
36 case yami::core::ok: translated = 0; break;
37 case yami::core::no_such_name: translated = 1; break;
38 case yami::core::bad_type: translated = 2; break;
39 case yami::core::no_such_index: translated = 3; break;
40 case yami::core::no_memory: translated = 4; break;
41 case yami::core::nesting_too_deep: translated = 5; break;
42 case yami::core::not_enough_space: translated = 6; break;
43 case yami::core::no_entries: translated = 7; break;
44 case yami::core::unexpected_value: translated = 8; break;
45 case yami::core::bad_protocol: translated = 9; break;
46 case yami::core::io_error: translated = 10; break;
47 case yami::core::timed_out: translated = 11; break;
48 case yami::core::channel_closed: translated = 12; break;
49 case yami::core::bad_state: translated = 13; break;
50 default:
51 yami::details::fatal_failure(__FILE__, __LINE__);
52 }
53
54 return translated;
55 }
56
57 template <typename To, typename From>
58 To forced_cast(From f)
59 {
60 union
61 {
62 From f;
63 To t;
64 } converter;
65
66 converter.f = f;
67 return converter.t;
68 }
69
70 } // unnamed namespace
71
72 extern "C"
73 {
74
75 extern const std::size_t sizeof_parameters = sizeof(yami::core::parameters);
76 extern const std::size_t sizeof_parameter_iterator =
77 sizeof(yami::core::parameter_iterator);
78 extern const std::size_t sizeof_parameter_entry =
79 sizeof(yami::core::parameter_entry);
80
81 extern const std::size_t sizeof_raw_buffer_data_source =
82 sizeof(yami::core::raw_buffer_data_source);
83
84 extern const std::size_t sizeof_agent = sizeof(yami::core::agent);
85
register_fatal_error_handler(void * handler)86 void register_fatal_error_handler(void * handler)
87 {
88 yami::core::fatal_error_function custom_handler =
89 forced_cast<yami::core::fatal_error_function>(handler);
90
91 yami::core::register_fatal_error_handler(custom_handler);
92 }
93
set_bool_in_array(void * a,std::size_t i,int value)94 void set_bool_in_array(void * a, std::size_t i, int value)
95 {
96 bool * array = static_cast<bool *>(a);
97 array[i] = value != 0;
98 }
99
get_bool_from_array(const void * a,std::size_t i)100 int get_bool_from_array(const void * a, std::size_t i)
101 {
102 const bool * array = static_cast<const bool *>(a);
103 return array[i] ? 1 : 0;
104 }
105
set_int_in_array(void * a,std::size_t i,int value)106 void set_int_in_array(void * a, std::size_t i, int value)
107 {
108 int * array = static_cast<int *>(a);
109 array[i] = value;
110 }
111
get_int_from_array(const void * a,std::size_t i)112 int get_int_from_array(const void * a, std::size_t i)
113 {
114 const int * array = static_cast<const int *>(a);
115 return array[i];
116 }
117
set_long_long_in_array(void * a,std::size_t i,long long value)118 void set_long_long_in_array(void * a, std::size_t i, long long value)
119 {
120 long long * array = static_cast<long long *>(a);
121 array[i] = value;
122 }
123
get_long_long_from_array(const void * a,std::size_t i)124 long long get_long_long_from_array(const void * a, std::size_t i)
125 {
126 const long long * array = static_cast<const long long *>(a);
127 return array[i];
128 }
129
set_double_in_array(void * a,std::size_t i,double value)130 void set_double_in_array(void * a, std::size_t i, double value)
131 {
132 double * array = static_cast<double *>(a);
133 array[i] = value;
134 }
135
get_double_from_array(const void * a,std::size_t i)136 double get_double_from_array(const void * a, std::size_t i)
137 {
138 const double * array = static_cast<const double *>(a);
139 return array[i];
140 }
141
parameters_create(void * p,void * working_area,std::size_t size)142 void parameters_create(void * p, void * working_area, std::size_t size)
143 {
144 new (p) yami::core::parameters(working_area, size);
145 }
146
destroy_parameters(void * p)147 void destroy_parameters(void * p)
148 {
149 yami::core::parameters * params =
150 static_cast<yami::core::parameters *>(p);
151
152 params->~parameters();
153 }
154
parameters_set_boolean(void * p,const char * name,std::size_t name_length,int value)155 int parameters_set_boolean(void * p,
156 const char * name, std::size_t name_length, int value)
157 {
158 yami::core::parameters * params =
159 static_cast<yami::core::parameters *>(p);
160
161 return translate_result(
162 params->set_boolean(name, name_length, value != 0));
163 }
164
parameters_get_boolean(const void * p,const char * name,std::size_t name_length,int * value)165 int parameters_get_boolean(const void * p,
166 const char * name, std::size_t name_length, int * value)
167 {
168 const yami::core::parameters * params =
169 static_cast<const yami::core::parameters *>(p);
170
171 bool v;
172 const yami::core::result res = params->get_boolean(name, name_length, v);
173 if (res == yami::core::ok)
174 {
175 *value = v ? 1 : 0;
176 }
177
178 return translate_result(res);
179 }
180
parameters_set_integer(void * p,const char * name,std::size_t name_length,int value)181 int parameters_set_integer(void * p,
182 const char * name, std::size_t name_length, int value)
183 {
184 yami::core::parameters * params =
185 static_cast<yami::core::parameters *>(p);
186
187 return translate_result(
188 params->set_integer(name, name_length, value));
189 }
190
parameters_get_integer(const void * p,const char * name,std::size_t name_length,int * value)191 int parameters_get_integer(const void * p,
192 const char * name, std::size_t name_length, int * value)
193 {
194 const yami::core::parameters * params =
195 static_cast<const yami::core::parameters *>(p);
196
197 return translate_result(params->get_integer(name, name_length, *value));
198 }
199
parameters_set_long_long(void * p,const char * name,std::size_t name_length,long long value)200 int parameters_set_long_long(void * p,
201 const char * name, std::size_t name_length, long long value)
202 {
203 yami::core::parameters * params =
204 static_cast<yami::core::parameters *>(p);
205
206 return translate_result(
207 params->set_long_long(name, name_length, value));
208 }
209
parameters_get_long_long(const void * p,const char * name,std::size_t name_length,long long * value)210 int parameters_get_long_long(const void * p,
211 const char * name, std::size_t name_length, long long * value)
212 {
213 const yami::core::parameters * params =
214 static_cast<const yami::core::parameters *>(p);
215
216 return translate_result(params->get_long_long(name, name_length, *value));
217 }
218
parameters_set_double_float(void * p,const char * name,std::size_t name_length,double value)219 int parameters_set_double_float(void * p,
220 const char * name, std::size_t name_length, double value)
221 {
222 yami::core::parameters * params =
223 static_cast<yami::core::parameters *>(p);
224
225 return translate_result(
226 params->set_double_float(name, name_length, value));
227 }
228
parameters_get_double_float(const void * p,const char * name,std::size_t name_length,double * value)229 int parameters_get_double_float(const void * p,
230 const char * name, std::size_t name_length, double * value)
231 {
232 const yami::core::parameters * params =
233 static_cast<const yami::core::parameters *>(p);
234
235 return translate_result(
236 params->get_double_float(name, name_length, *value));
237 }
238
parameters_set_string(void * p,const char * name,std::size_t name_length,const char * value,std::size_t value_length)239 int parameters_set_string(void * p,
240 const char * name, std::size_t name_length,
241 const char * value, std::size_t value_length)
242 {
243 yami::core::parameters * params =
244 static_cast<yami::core::parameters *>(p);
245
246 return translate_result(
247 params->set_string(name, name_length, value, value_length));
248 }
249
parameters_get_string(const void * p,const char * name,std::size_t name_length,const char ** value,std::size_t * value_length)250 int parameters_get_string(const void * p,
251 const char * name, std::size_t name_length,
252 const char * * value, std::size_t * value_length)
253 {
254 const yami::core::parameters * params =
255 static_cast<const yami::core::parameters *>(p);
256
257 return translate_result(
258 params->get_string(name, name_length, *value, *value_length));
259 }
260
parameters_set_binary(void * p,const char * name,std::size_t name_length,const void * value,std::size_t value_length)261 int parameters_set_binary(void * p,
262 const char * name, std::size_t name_length,
263 const void * value, std::size_t value_length)
264 {
265 yami::core::parameters * params =
266 static_cast<yami::core::parameters *>(p);
267
268 return translate_result(
269 params->set_binary(name, name_length, value, value_length));
270 }
271
parameters_get_binary(const void * p,const char * name,std::size_t name_length,const void ** value,std::size_t * value_length)272 int parameters_get_binary(const void * p,
273 const char * name, std::size_t name_length,
274 const void * * value, std::size_t * value_length)
275 {
276 const yami::core::parameters * params =
277 static_cast<const yami::core::parameters *>(p);
278
279 return translate_result(
280 params->get_binary(name, name_length, *value, *value_length));
281 }
282
parameters_create_boolean_array(void * p,const char * name,std::size_t name_length,std::size_t array_length,void ** array)283 int parameters_create_boolean_array(void * p,
284 const char * name, std::size_t name_length,
285 std::size_t array_length, void * * array)
286 {
287 yami::core::parameters * params =
288 static_cast<yami::core::parameters *>(p);
289
290 bool * new_array;
291 const yami::core::result res =
292 params->create_boolean_array(name, name_length,
293 array_length, new_array);
294
295 if (res == yami::core::ok)
296 {
297 *array = new_array;
298 }
299
300 return translate_result(res);
301 }
302
parameters_get_boolean_array_length(const void * p,const char * name,std::size_t name_length,std::size_t * array_length)303 int parameters_get_boolean_array_length(const void * p,
304 const char * name, std::size_t name_length, std::size_t * array_length)
305 {
306 const yami::core::parameters * params =
307 static_cast<const yami::core::parameters *>(p);
308
309 bool * array;
310 return translate_result(
311 params->get_boolean_array(name, name_length, array, *array_length));
312 }
313
parameters_get_boolean_array(const void * p,const char * name,std::size_t name_length,void ** array,std::size_t * array_length)314 int parameters_get_boolean_array(const void * p,
315 const char * name, std::size_t name_length,
316 void * * array, std::size_t * array_length)
317 {
318 const yami::core::parameters * params =
319 static_cast<const yami::core::parameters *>(p);
320
321 bool * internal_array;
322 const yami::core::result res =
323 params->get_boolean_array(
324 name, name_length, internal_array, *array_length);
325 if (res == yami::core::ok)
326 {
327 *array = internal_array;
328 }
329
330 return translate_result(res);
331 }
332
parameters_create_integer_array(void * p,const char * name,std::size_t name_length,std::size_t array_length,void ** array)333 int parameters_create_integer_array(void * p,
334 const char * name, std::size_t name_length,
335 std::size_t array_length, void * * array)
336 {
337 yami::core::parameters * params =
338 static_cast<yami::core::parameters *>(p);
339
340 int * new_array;
341 const yami::core::result res =
342 params->create_integer_array(name, name_length,
343 array_length, new_array);
344
345 if (res == yami::core::ok)
346 {
347 *array = new_array;
348 }
349
350 return translate_result(res);
351 }
352
parameters_get_integer_array_length(const void * p,const char * name,std::size_t name_length,std::size_t * array_length)353 int parameters_get_integer_array_length(const void * p,
354 const char * name, std::size_t name_length, std::size_t * array_length)
355 {
356 const yami::core::parameters * params =
357 static_cast<const yami::core::parameters *>(p);
358
359 int * array;
360 return translate_result(
361 params->get_integer_array(name, name_length, array, *array_length));
362 }
363
parameters_get_integer_array(const void * p,const char * name,std::size_t name_length,void ** array,std::size_t * array_length)364 int parameters_get_integer_array(const void * p,
365 const char * name, std::size_t name_length,
366 void * * array, std::size_t * array_length)
367 {
368 const yami::core::parameters * params =
369 static_cast<const yami::core::parameters *>(p);
370
371 int * internal_array;
372 const yami::core::result res =
373 params->get_integer_array(
374 name, name_length, internal_array, *array_length);
375 if (res == yami::core::ok)
376 {
377 *array = internal_array;
378 }
379
380 return translate_result(res);
381 }
382
parameters_create_long_long_array(void * p,const char * name,std::size_t name_length,std::size_t array_length,void ** array)383 int parameters_create_long_long_array(void * p,
384 const char * name, std::size_t name_length,
385 std::size_t array_length, void * * array)
386 {
387 yami::core::parameters * params =
388 static_cast<yami::core::parameters *>(p);
389
390 long long * new_array;
391 const yami::core::result res =
392 params->create_long_long_array(name, name_length,
393 array_length, new_array);
394
395 if (res == yami::core::ok)
396 {
397 *array = new_array;
398 }
399
400 return translate_result(res);
401 }
402
parameters_get_long_long_array_length(const void * p,const char * name,std::size_t name_length,std::size_t * array_length)403 int parameters_get_long_long_array_length(const void * p,
404 const char * name, std::size_t name_length, std::size_t * array_length)
405 {
406 const yami::core::parameters * params =
407 static_cast<const yami::core::parameters *>(p);
408
409 long long * array;
410 return translate_result(
411 params->get_long_long_array(name, name_length, array, *array_length));
412 }
413
parameters_get_long_long_array(const void * p,const char * name,std::size_t name_length,void ** array,std::size_t * array_length)414 int parameters_get_long_long_array(const void * p,
415 const char * name, std::size_t name_length,
416 void * * array, std::size_t * array_length)
417 {
418 const yami::core::parameters * params =
419 static_cast<const yami::core::parameters *>(p);
420
421 long long * internal_array;
422 const yami::core::result res =
423 params->get_long_long_array(
424 name, name_length, internal_array, *array_length);
425 if (res == yami::core::ok)
426 {
427 *array = internal_array;
428 }
429
430 return translate_result(res);
431 }
432
parameters_create_double_float_array(void * p,const char * name,std::size_t name_length,std::size_t array_length,void ** array)433 int parameters_create_double_float_array(void * p,
434 const char * name, std::size_t name_length,
435 std::size_t array_length, void * * array)
436 {
437 yami::core::parameters * params =
438 static_cast<yami::core::parameters *>(p);
439
440 double * new_array;
441 const yami::core::result res =
442 params->create_double_float_array(name, name_length,
443 array_length, new_array);
444
445 if (res == yami::core::ok)
446 {
447 *array = new_array;
448 }
449
450 return translate_result(res);
451 }
452
parameters_get_double_float_array_length(const void * p,const char * name,std::size_t name_length,std::size_t * array_length)453 int parameters_get_double_float_array_length(const void * p,
454 const char * name, std::size_t name_length, std::size_t * array_length)
455 {
456 const yami::core::parameters * params =
457 static_cast<const yami::core::parameters *>(p);
458
459 double * array;
460 return translate_result(
461 params->get_double_float_array(
462 name, name_length, array, *array_length));
463 }
464
parameters_get_double_float_array(const void * p,const char * name,std::size_t name_length,void ** array,std::size_t * array_length)465 int parameters_get_double_float_array(const void * p,
466 const char * name, std::size_t name_length,
467 void * * array, std::size_t * array_length)
468 {
469 const yami::core::parameters * params =
470 static_cast<const yami::core::parameters *>(p);
471
472 double * internal_array;
473 const yami::core::result res =
474 params->get_double_float_array(
475 name, name_length, internal_array, *array_length);
476 if (res == yami::core::ok)
477 {
478 *array = internal_array;
479 }
480
481 return translate_result(res);
482 }
483
parameters_create_string_array(void * p,const char * name,std::size_t name_length,std::size_t array_length)484 int parameters_create_string_array(void * p,
485 const char * name, std::size_t name_length,
486 std::size_t array_length)
487 {
488 yami::core::parameters * params =
489 static_cast<yami::core::parameters *>(p);
490
491 return translate_result(
492 params->create_string_array(name, name_length, array_length));
493 }
494
parameters_get_string_array_length(const void * p,const char * name,std::size_t name_length,std::size_t * array_length)495 int parameters_get_string_array_length(const void * p,
496 const char * name, std::size_t name_length, std::size_t * array_length)
497 {
498 const yami::core::parameters * params =
499 static_cast<const yami::core::parameters *>(p);
500
501 return translate_result(
502 params->get_string_array_length(
503 name, name_length, *array_length));
504 }
505
parameters_set_string_in_array(void * p,const char * name,std::size_t name_length,std::size_t index,const char * value,std::size_t value_length)506 int parameters_set_string_in_array(void * p,
507 const char * name, std::size_t name_length,
508 std::size_t index, const char * value, std::size_t value_length)
509 {
510 yami::core::parameters * params =
511 static_cast<yami::core::parameters *>(p);
512
513 return translate_result(
514 params->set_string_in_array(name, name_length, index,
515 value, value_length));
516 }
517
parameters_get_string_in_array(const void * p,const char * name,std::size_t name_length,std::size_t index,const char ** value,std::size_t * value_length)518 int parameters_get_string_in_array(const void * p,
519 const char * name, std::size_t name_length,
520 std::size_t index,
521 const char * * value, std::size_t * value_length)
522 {
523 const yami::core::parameters * params =
524 static_cast<const yami::core::parameters *>(p);
525
526 return translate_result(
527 params->get_string_in_array(name, name_length, index,
528 *value, *value_length));
529 }
530
parameters_create_binary_array(void * p,const char * name,std::size_t name_length,std::size_t array_length)531 int parameters_create_binary_array(void * p,
532 const char * name, std::size_t name_length,
533 std::size_t array_length)
534 {
535 yami::core::parameters * params =
536 static_cast<yami::core::parameters *>(p);
537
538 return translate_result(
539 params->create_binary_array(name, name_length, array_length));
540 }
541
parameters_get_binary_array_length(const void * p,const char * name,std::size_t name_length,std::size_t * array_length)542 int parameters_get_binary_array_length(const void * p,
543 const char * name, std::size_t name_length, std::size_t * array_length)
544 {
545 const yami::core::parameters * params =
546 static_cast<const yami::core::parameters *>(p);
547
548 return translate_result(
549 params->get_binary_array_length(
550 name, name_length, *array_length));
551 }
552
parameters_set_binary_in_array(void * p,const char * name,std::size_t name_length,std::size_t index,const void * value,std::size_t value_length)553 int parameters_set_binary_in_array(void * p,
554 const char * name, std::size_t name_length,
555 std::size_t index, const void * value, std::size_t value_length)
556 {
557 yami::core::parameters * params =
558 static_cast<yami::core::parameters *>(p);
559
560 return translate_result(
561 params->set_binary_in_array(name, name_length, index,
562 value, value_length));
563 }
564
parameters_get_binary_in_array(const void * p,const char * name,std::size_t name_length,std::size_t index,const void ** value,std::size_t * value_length)565 int parameters_get_binary_in_array(const void * p,
566 const char * name, std::size_t name_length,
567 std::size_t index,
568 const void * * value, std::size_t * value_length)
569 {
570 const yami::core::parameters * params =
571 static_cast<const yami::core::parameters *>(p);
572
573 return translate_result(
574 params->get_binary_in_array(name, name_length, index,
575 *value, *value_length));
576 }
577
parameters_create_nested(void * p,const char * name,std::size_t name_length,void ** nested)578 int parameters_create_nested(void * p,
579 const char * name, std::size_t name_length,
580 void * * nested)
581 {
582 yami::core::parameters * params =
583 static_cast<yami::core::parameters *>(p);
584
585 yami::core::parameters * temp;
586 const yami::core::result res =
587 params->create_nested_parameters(name, name_length, temp);
588 if (res == yami::core::ok)
589 {
590 *nested = temp;
591 }
592
593 return translate_result(res);
594 }
595
parameters_get_nested(const void * p,const char * name,std::size_t name_length,void ** nested)596 int parameters_get_nested(const void * p,
597 const char * name, std::size_t name_length, void * * nested)
598 {
599 const yami::core::parameters * params =
600 static_cast<const yami::core::parameters *>(p);
601
602 yami::core::parameters * tmp;
603 const yami::core::result res =
604 params->get_nested_parameters(name, name_length, tmp);
605 if (res == yami::core::ok)
606 {
607 *nested = tmp;
608 }
609
610 return translate_result(res);
611 }
612
parameters_create_nested_array(void * p,const char * name,std::size_t name_length,std::size_t array_length)613 int parameters_create_nested_array(void * p,
614 const char * name, std::size_t name_length,
615 std::size_t array_length)
616 {
617 yami::core::parameters * params =
618 static_cast<yami::core::parameters *>(p);
619
620 return translate_result(
621 params->create_nested_array(name, name_length, array_length));
622 }
623
parameters_get_nested_array_length(const void * p,const char * name,std::size_t name_length,std::size_t * array_length)624 int parameters_get_nested_array_length(const void * p,
625 const char * name, std::size_t name_length, std::size_t * array_length)
626 {
627 const yami::core::parameters * params =
628 static_cast<const yami::core::parameters *>(p);
629
630 return translate_result(
631 params->get_nested_array_length(
632 name, name_length, *array_length));
633 }
634
parameters_get_nested_in_array(const void * p,const char * name,std::size_t name_length,std::size_t index,void ** nested)635 int parameters_get_nested_in_array(const void * p,
636 const char * name, std::size_t name_length, std::size_t index,
637 void * * nested)
638 {
639 const yami::core::parameters * params =
640 static_cast<const yami::core::parameters *>(p);
641
642 yami::core::parameters * tmp;
643 const yami::core::result res =
644 params->get_nested_in_array(name, name_length, index, tmp);
645 if (res == yami::core::ok)
646 {
647 *nested = tmp;
648 }
649
650 return translate_result(res);
651 }
652
parameters_size(const void * p)653 std::size_t parameters_size(const void * p)
654 {
655 const yami::core::parameters * params =
656 static_cast<const yami::core::parameters *>(p);
657
658 return params->size();
659 }
660
parameters_remove(void * p,const char * name,std::size_t name_length)661 int parameters_remove(void * p, const char * name, std::size_t name_length)
662 {
663 yami::core::parameters * params =
664 static_cast<yami::core::parameters *>(p);
665
666 return translate_result(params->remove(name, name_length));
667 }
668
parameters_clear(void * p)669 void parameters_clear(void * p)
670 {
671 yami::core::parameters * params =
672 static_cast<yami::core::parameters *>(p);
673
674 params->clear();
675 }
676
parameters_get_type(const void * p,const char * name,std::size_t name_length,int * type)677 int parameters_get_type(const void * p,
678 const char * name, std::size_t name_length,
679 int * type)
680 {
681 const yami::core::parameters * params =
682 static_cast<const yami::core::parameters *>(p);
683
684 yami::core::parameter_type t;
685 const yami::core::result res = params->get_type(name, name_length, t);
686 if (res == yami::core::ok)
687 {
688 *type = yami::details::type_code(t);
689 }
690
691 return translate_result(res);
692 }
693
parameters_get_iterator(const void * p,void * it,int * result)694 void parameters_get_iterator(const void * p, void * it, int * result)
695 {
696 const yami::core::parameters * params =
697 static_cast<const yami::core::parameters *>(p);
698
699 yami::core::parameter_iterator * iterator =
700 static_cast<yami::core::parameter_iterator *>(it);
701
702 const yami::core::result r = params->get_iterator(*iterator);
703 *result = translate_result(r);
704 }
705
parameters_find(const void * p,const char * name,std::size_t name_length,void * e,int * result)706 void parameters_find(const void * p,
707 const char * name, std::size_t name_length, void * e, int * result)
708 {
709 const yami::core::parameters * params =
710 static_cast<const yami::core::parameters *>(p);
711
712 yami::core::parameter_entry * entry =
713 static_cast<yami::core::parameter_entry *>(e);
714
715 const yami::core::result r = params->find(name, name_length, *entry);
716 *result = (r == yami::core::ok) ? 1 : 0;
717 }
718
parameters_serialize_buffer_size(const void * p,std::size_t * size)719 int parameters_serialize_buffer_size(const void * p, std::size_t * size)
720 {
721 const yami::core::parameters * params =
722 static_cast<const yami::core::parameters *>(p);
723
724 return translate_result(params->get_serialize_buffer_size(*size));
725 }
726
parameters_serialize(const void * p,char ** buffers,std::size_t * buffer_sizes,std::size_t num_of_buffers)727 int parameters_serialize(const void * p,
728 char * * buffers, std::size_t * buffer_sizes, std::size_t num_of_buffers)
729 {
730 const yami::core::parameters * params =
731 static_cast<const yami::core::parameters *>(p);
732
733 return translate_result(
734 params->serialize(buffers, buffer_sizes, num_of_buffers));
735 }
736
parameters_deserialize(void * p,const char ** buffers,const std::size_t * buffer_sizes,std::size_t num_of_buffers)737 int parameters_deserialize(void * p,
738 const char * * buffers, const std::size_t * buffer_sizes,
739 std::size_t num_of_buffers)
740 {
741 yami::core::parameters * params =
742 static_cast<yami::core::parameters *>(p);
743
744 return translate_result(
745 params->deserialize(buffers, buffer_sizes, num_of_buffers));
746 }
747
parameter_iterator_has_next(const void * it)748 int parameter_iterator_has_next(const void * it)
749 {
750 const yami::core::parameter_iterator * iterator =
751 static_cast<const yami::core::parameter_iterator *>(it);
752
753 return iterator->has_next() ? 1 : 0;
754 }
755
parameter_iterator_move_next(void * it)756 void parameter_iterator_move_next(void * it)
757 {
758 yami::core::parameter_iterator * iterator =
759 static_cast<yami::core::parameter_iterator *>(it);
760
761 iterator->move_next();
762 }
763
parameter_iterator_current(const void * it,void * e)764 void parameter_iterator_current(const void * it, void * e)
765 {
766 const yami::core::parameter_iterator * iterator =
767 static_cast<const yami::core::parameter_iterator *>(it);
768
769 yami::core::parameter_entry * entry =
770 static_cast<yami::core::parameter_entry *>(e);
771
772 *entry = iterator->current();
773 }
774
parameter_entry_type(const void * e)775 int parameter_entry_type(const void * e)
776 {
777 const yami::core::parameter_entry * entry =
778 static_cast<const yami::core::parameter_entry *>(e);
779
780 return yami::details::type_code(entry->type());
781 }
782
parameter_entry_name(const void * e,const char ** name,std::size_t * name_length)783 void parameter_entry_name(const void * e,
784 const char * * name, std::size_t * name_length)
785 {
786 const yami::core::parameter_entry * entry =
787 static_cast<const yami::core::parameter_entry *>(e);
788
789 entry->get_name(*name, *name_length);
790 }
791
parameter_entry_get_boolean(const void * e,int * value)792 int parameter_entry_get_boolean(const void * e, int * value)
793 {
794 const yami::core::parameter_entry * entry =
795 static_cast<const yami::core::parameter_entry *>(e);
796
797 bool v;
798 const yami::core::result res = entry->get_boolean(v);
799 if (res == yami::core::ok)
800 {
801 *value = v ? 1 : 0;
802 }
803
804 return translate_result(res);
805 }
806
parameter_entry_get_integer(const void * e,int * value)807 int parameter_entry_get_integer(const void * e, int * value)
808 {
809 const yami::core::parameter_entry * entry =
810 static_cast<const yami::core::parameter_entry *>(e);
811
812 return translate_result(entry->get_integer(*value));
813 }
814
parameter_entry_get_long_long(const void * e,long long * value)815 int parameter_entry_get_long_long(const void * e, long long * value)
816 {
817 const yami::core::parameter_entry * entry =
818 static_cast<const yami::core::parameter_entry *>(e);
819
820 return translate_result(entry->get_long_long(*value));
821 }
822
parameter_entry_get_double_float(const void * e,double * value)823 int parameter_entry_get_double_float(const void * e, double * value)
824 {
825 const yami::core::parameter_entry * entry =
826 static_cast<const yami::core::parameter_entry *>(e);
827
828 return translate_result(entry->get_double_float(*value));
829 }
830
parameter_entry_get_string(const void * e,const char ** value,std::size_t * value_length)831 int parameter_entry_get_string(const void * e,
832 const char * * value, std::size_t * value_length)
833 {
834 const yami::core::parameter_entry * entry =
835 static_cast<const yami::core::parameter_entry *>(e);
836
837 return translate_result(entry->get_string(*value, *value_length));
838 }
839
parameter_entry_get_binary(const void * e,const void ** value,std::size_t * value_length)840 int parameter_entry_get_binary(const void * e,
841 const void * * value, std::size_t * value_length)
842 {
843 const yami::core::parameter_entry * entry =
844 static_cast<const yami::core::parameter_entry *>(e);
845
846 return translate_result(entry->get_binary(*value, *value_length));
847 }
848
parameter_entry_get_boolean_array_length(const void * e,std::size_t * array_length)849 int parameter_entry_get_boolean_array_length(const void * e,
850 std::size_t * array_length)
851 {
852 const yami::core::parameter_entry * entry =
853 static_cast<const yami::core::parameter_entry *>(e);
854
855 bool * array;
856 return translate_result(
857 entry->get_boolean_array(array, *array_length));
858 }
859
parameter_entry_get_boolean_array(const void * e,void ** array,std::size_t * array_length)860 int parameter_entry_get_boolean_array(const void * e,
861 void * * array, std::size_t * array_length)
862 {
863 const yami::core::parameter_entry * entry =
864 static_cast<const yami::core::parameter_entry *>(e);
865
866 bool * internal_array;
867 const yami::core::result res =
868 entry->get_boolean_array(internal_array, *array_length);
869 if (res == yami::core::ok)
870 {
871 *array = internal_array;
872 }
873
874 return translate_result(res);
875 }
876
parameter_entry_get_integer_array_length(const void * e,std::size_t * array_length)877 int parameter_entry_get_integer_array_length(const void * e,
878 std::size_t * array_length)
879 {
880 const yami::core::parameter_entry * entry =
881 static_cast<const yami::core::parameter_entry *>(e);
882
883 int * array;
884 return translate_result(
885 entry->get_integer_array(array, *array_length));
886 }
887
parameter_entry_get_integer_array(const void * e,void ** array,std::size_t * array_length)888 int parameter_entry_get_integer_array(const void * e,
889 void * * array, std::size_t * array_length)
890 {
891 const yami::core::parameter_entry * entry =
892 static_cast<const yami::core::parameter_entry *>(e);
893
894 int * internal_array;
895 const yami::core::result res =
896 entry->get_integer_array(internal_array, *array_length);
897 if (res == yami::core::ok)
898 {
899 *array = internal_array;
900 }
901
902 return translate_result(res);
903 }
904
parameter_entry_get_long_long_array_length(const void * e,std::size_t * array_length)905 int parameter_entry_get_long_long_array_length(const void * e,
906 std::size_t * array_length)
907 {
908 const yami::core::parameter_entry * entry =
909 static_cast<const yami::core::parameter_entry *>(e);
910
911 long long * array;
912 return translate_result(
913 entry->get_long_long_array(array, *array_length));
914 }
915
parameter_entry_get_long_long_array(const void * e,void ** array,std::size_t * array_length)916 int parameter_entry_get_long_long_array(const void * e,
917 void * * array, std::size_t * array_length)
918 {
919 const yami::core::parameter_entry * entry =
920 static_cast<const yami::core::parameter_entry *>(e);
921
922 long long * internal_array;
923 const yami::core::result res =
924 entry->get_long_long_array(internal_array, *array_length);
925 if (res == yami::core::ok)
926 {
927 *array = internal_array;
928 }
929
930 return translate_result(res);
931 }
932
parameter_entry_get_double_float_array_length(const void * e,std::size_t * array_length)933 int parameter_entry_get_double_float_array_length(const void * e,
934 std::size_t * array_length)
935 {
936 const yami::core::parameter_entry * entry =
937 static_cast<const yami::core::parameter_entry *>(e);
938
939 double * array;
940 return translate_result(
941 entry->get_double_float_array(array, *array_length));
942 }
943
parameter_entry_get_double_float_array(const void * e,void ** array,std::size_t * array_length)944 int parameter_entry_get_double_float_array(const void * e,
945 void * * array, std::size_t * array_length)
946 {
947 const yami::core::parameter_entry * entry =
948 static_cast<const yami::core::parameter_entry *>(e);
949
950 double * internal_array;
951 const yami::core::result res =
952 entry->get_double_float_array(internal_array, *array_length);
953 if (res == yami::core::ok)
954 {
955 *array = internal_array;
956 }
957
958 return translate_result(res);
959 }
960
parameter_entry_get_string_array_length(const void * e,std::size_t * array_length)961 int parameter_entry_get_string_array_length(const void * e,
962 std::size_t * array_length)
963 {
964 const yami::core::parameter_entry * entry =
965 static_cast<const yami::core::parameter_entry *>(e);
966
967 return translate_result(
968 entry->get_string_array_length(*array_length));
969 }
970
parameter_entry_get_string_in_array(const void * e,std::size_t index,const char ** value,std::size_t * value_length)971 int parameter_entry_get_string_in_array(const void * e,
972 std::size_t index,
973 const char * * value, std::size_t * value_length)
974 {
975 const yami::core::parameter_entry * entry =
976 static_cast<const yami::core::parameter_entry *>(e);
977
978 return translate_result(
979 entry->get_string_in_array(index, *value, *value_length));
980 }
981
parameter_entry_get_binary_array_length(const void * e,std::size_t * array_length)982 int parameter_entry_get_binary_array_length(const void * e,
983 std::size_t * array_length)
984 {
985 const yami::core::parameter_entry * entry =
986 static_cast<const yami::core::parameter_entry *>(e);
987
988 return translate_result(
989 entry->get_binary_array_length(*array_length));
990 }
991
parameter_entry_get_binary_in_array(const void * e,std::size_t index,const void ** value,std::size_t * value_length)992 int parameter_entry_get_binary_in_array(const void * e,
993 std::size_t index,
994 const void * * value, std::size_t * value_length)
995 {
996 const yami::core::parameter_entry * entry =
997 static_cast<const yami::core::parameter_entry *>(e);
998
999 return translate_result(
1000 entry->get_binary_in_array(index, *value, *value_length));
1001 }
1002
parameter_entry_get_nested(const void * e,void ** nested)1003 int parameter_entry_get_nested(const void * e, void * * nested)
1004 {
1005 const yami::core::parameter_entry * entry =
1006 static_cast<const yami::core::parameter_entry *>(e);
1007
1008 yami::core::parameters * tmp;
1009 const yami::core::result res =
1010 entry->get_nested_parameters(tmp);
1011 if (res == yami::core::ok)
1012 {
1013 *nested = tmp;
1014 }
1015
1016 return translate_result(res);
1017 }
1018
raw_buffer_data_source_create(void * p,const char ** buffers,const std::size_t * buffer_sizes,std::size_t num_of_buffers)1019 void raw_buffer_data_source_create(void * p,
1020 const char * * buffers, const std::size_t * buffer_sizes,
1021 std::size_t num_of_buffers)
1022 {
1023 new (p) yami::core::raw_buffer_data_source(
1024 buffers, buffer_sizes, num_of_buffers);
1025 }
1026
destroy_raw_buffer_data_source(void * p)1027 void destroy_raw_buffer_data_source(void * p)
1028 {
1029 yami::core::raw_buffer_data_source * raw_buffer =
1030 static_cast<yami::core::raw_buffer_data_source *>(p);
1031
1032 raw_buffer->~raw_buffer_data_source();
1033 }
1034
raw_buffer_data_source_serialize_buffer_size(const void * p,std::size_t * size)1035 int raw_buffer_data_source_serialize_buffer_size(
1036 const void * p, std::size_t * size)
1037 {
1038 const yami::core::raw_buffer_data_source * raw =
1039 static_cast<const yami::core::raw_buffer_data_source *>(p);
1040
1041 return translate_result(raw->get_serialize_buffer_size(*size));
1042 }
1043
raw_buffer_data_source_serialize(const void * p,char ** buffers,std::size_t * buffer_sizes,std::size_t num_of_buffers)1044 int raw_buffer_data_source_serialize(const void * p,
1045 char * * buffers, std::size_t * buffer_sizes, std::size_t num_of_buffers)
1046 {
1047 const yami::core::raw_buffer_data_source * raw =
1048 static_cast<const yami::core::raw_buffer_data_source *>(p);
1049
1050 return translate_result(
1051 raw->serialize(buffers, buffer_sizes, num_of_buffers));
1052 }
1053
agent_create(void * p,void * options,void * incoming_callback,void * incoming_callback_hint,void * closed_callback,void * closed_callback_hint,void * working_area,std::size_t size,int * result)1054 void agent_create(void * p,
1055 void * options,
1056 void * incoming_callback, void * incoming_callback_hint,
1057 void * closed_callback, void * closed_callback_hint,
1058 void * working_area, std::size_t size, int * result)
1059 {
1060 yami::core::agent * the_agent = new (p) yami::core::agent();
1061
1062 yami::core::incoming_message_dispatch_function dispatch_callback =
1063 forced_cast<yami::core::incoming_message_dispatch_function>(
1064 incoming_callback);
1065 yami::core::closed_connection_function closed_function =
1066 forced_cast<yami::core::closed_connection_function>(
1067 closed_callback);
1068 yami::core::result r;
1069 if (options != NULL)
1070 {
1071 const yami::core::parameters * option_params =
1072 static_cast<yami::core::parameters *>(options);
1073
1074 r = the_agent->init(*option_params,
1075 dispatch_callback, incoming_callback_hint,
1076 closed_function, closed_callback_hint,
1077 working_area, size);
1078 }
1079 else
1080 {
1081 r = the_agent->init(
1082 dispatch_callback, incoming_callback_hint,
1083 closed_function, closed_callback_hint,
1084 working_area, size);
1085 }
1086
1087 *result = translate_result(r);
1088 }
1089
destroy_agent(void * p)1090 void destroy_agent(void * p)
1091 {
1092 yami::core::agent * the_agent =
1093 static_cast<yami::core::agent *>(p);
1094
1095 the_agent->~agent();
1096 }
1097
agent_install_event_notifications(void * p,void * event_callback,void * event_callback_hint)1098 void agent_install_event_notifications(void * p,
1099 void * event_callback, void * event_callback_hint)
1100 {
1101 yami::core::agent * the_agent =
1102 static_cast<yami::core::agent *>(p);
1103
1104 yami::core::event_notification_function event_function =
1105 forced_cast<yami::core::event_notification_function>(
1106 event_callback);
1107
1108 the_agent->install_event_notifications(
1109 event_function, event_callback_hint);
1110 }
1111
agent_open(void * p,const char * target,int * result)1112 void agent_open(void * p, const char * target, int * result)
1113 {
1114 yami::core::agent * the_agent =
1115 static_cast<yami::core::agent *>(p);
1116
1117 *result = translate_result(the_agent->open(target));
1118 }
1119
agent_open_descr(void * p,const char * target,std::size_t * index,std::size_t * seq_num,int * created_new,int * result)1120 void agent_open_descr(void * p, const char * target,
1121 std::size_t * index, std::size_t * seq_num,
1122 int * created_new, int * result)
1123 {
1124 yami::core::agent * the_agent =
1125 static_cast<yami::core::agent *>(p);
1126
1127 yami::core::channel_descriptor cd;
1128 bool created_new_channel;
1129 const yami::core::result r =
1130 the_agent->open(target, cd, created_new_channel);
1131 if (r == yami::core::ok)
1132 {
1133 cd.get_details(*index, *seq_num);
1134 *created_new = created_new_channel ? 1 : 0;
1135 }
1136
1137 *result = translate_result(r);
1138 }
1139
agent_is_open(void * p,const char * target,std::size_t * index,std::size_t * seq_num,int * result)1140 void agent_is_open(void * p, const char * target,
1141 std::size_t * index, std::size_t * seq_num, int * result)
1142 {
1143 yami::core::agent * the_agent =
1144 static_cast<yami::core::agent *>(p);
1145
1146 yami::core::channel_descriptor cd;
1147 const yami::core::result r = the_agent->is_open(target, cd);
1148 if (r == yami::core::ok)
1149 {
1150 cd.get_details(*index, *seq_num);
1151 }
1152
1153 *result = translate_result(r);
1154 }
1155
agent_close_cd(void * p,std::size_t index,std::size_t seq_num,std::size_t priority,int * result)1156 void agent_close_cd(void * p,
1157 std::size_t index, std::size_t seq_num,
1158 std::size_t priority, int * result)
1159 {
1160 yami::core::agent * the_agent =
1161 static_cast<yami::core::agent *>(p);
1162
1163 const yami::core::channel_descriptor cd(index, seq_num);
1164 *result = translate_result(the_agent->close(cd, priority));
1165 }
1166
agent_close_str(void * p,const char * target,std::size_t priority,int * result)1167 void agent_close_str(void * p, const char * target,
1168 std::size_t priority, int * result)
1169 {
1170 yami::core::agent * the_agent =
1171 static_cast<yami::core::agent *>(p);
1172
1173 *result = translate_result(the_agent->close(target, priority));
1174 }
1175
agent_hard_close_cd(void * p,std::size_t index,std::size_t seq_num,int * result)1176 void agent_hard_close_cd(void * p,
1177 std::size_t index, std::size_t seq_num,
1178 int * result)
1179 {
1180 yami::core::agent * the_agent =
1181 static_cast<yami::core::agent *>(p);
1182
1183 const yami::core::channel_descriptor cd(index, seq_num);
1184 *result = translate_result(the_agent->hard_close(cd));
1185 }
1186
agent_hard_close_str(void * p,const char * target,int * result)1187 void agent_hard_close_str(void * p, const char * target,
1188 int * result)
1189 {
1190 yami::core::agent * the_agent =
1191 static_cast<yami::core::agent *>(p);
1192
1193 *result = translate_result(the_agent->hard_close(target));
1194 }
1195
agent_post_cd(void * p,std::size_t index,std::size_t seq_num,void * header,void * body,std::size_t priority,void * progress_callback,void * progress_callback_hint,int * result)1196 void agent_post_cd(void * p,
1197 std::size_t index, std::size_t seq_num,
1198 void * header, void * body,
1199 std::size_t priority,
1200 void * progress_callback, void * progress_callback_hint,
1201 int * result)
1202 {
1203 yami::core::agent * the_agent =
1204 static_cast<yami::core::agent *>(p);
1205
1206 yami::core::message_progress_function progress_function =
1207 forced_cast<yami::core::message_progress_function>(
1208 progress_callback);
1209
1210 const yami::core::channel_descriptor cd(index, seq_num);
1211
1212 const yami::core::serializable * header_ser =
1213 static_cast<yami::core::serializable *>(header);
1214 const yami::core::serializable * body_ser =
1215 static_cast<yami::core::serializable *>(body);
1216
1217 *result = translate_result(
1218 the_agent->post(
1219 cd, *header_ser, *body_ser, priority,
1220 progress_function, progress_callback_hint));
1221 }
1222
agent_post_str(void * p,const char * target,void * header,void * body,std::size_t priority,void * progress_callback,void * progress_callback_hint,int * result)1223 void agent_post_str(void * p,
1224 const char * target,
1225 void * header, void * body,
1226 std::size_t priority,
1227 void * progress_callback, void * progress_callback_hint,
1228 int * result)
1229 {
1230 yami::core::agent * the_agent =
1231 static_cast<yami::core::agent *>(p);
1232
1233 yami::core::message_progress_function progress_function =
1234 forced_cast<yami::core::message_progress_function>(
1235 progress_callback);
1236
1237 const yami::core::serializable * header_ser =
1238 static_cast<yami::core::serializable *>(header);
1239 const yami::core::serializable * body_ser =
1240 static_cast<yami::core::serializable *>(body);
1241
1242 *result = translate_result(
1243 the_agent->post(
1244 target, *header_ser, *body_ser, priority,
1245 progress_function, progress_callback_hint));
1246 }
1247
agent_add_listener(void * p,const char * target,const char ** resolved_target,void * connection_callback,void * connection_callback_hint,int * result)1248 void agent_add_listener(void * p,
1249 const char * target,
1250 const char * * resolved_target,
1251 void * connection_callback, void * connection_callback_hint,
1252 int * result)
1253 {
1254 yami::core::agent * the_agent =
1255 static_cast<yami::core::agent *>(p);
1256
1257 yami::core::new_incoming_connection_function connection_function =
1258 forced_cast<yami::core::new_incoming_connection_function>(
1259 connection_callback);
1260
1261 *result = translate_result(
1262 the_agent->add_listener(target,
1263 connection_function, connection_callback_hint,
1264 resolved_target));
1265 }
1266
agent_remove_listener(void * p,const char * target,int * result)1267 void agent_remove_listener(void * p, const char * target, int * result)
1268 {
1269 yami::core::agent * the_agent =
1270 static_cast<yami::core::agent *>(p);
1271
1272 *result = translate_result(the_agent->remove_listener(target));
1273 }
1274
agent_do_some_work(void * p,std::size_t timeout,int allow_outgoing,int allow_incoming,int * result)1275 void agent_do_some_work(void * p,
1276 std::size_t timeout, int allow_outgoing, int allow_incoming,
1277 int * result)
1278 {
1279 yami::core::agent * the_agent =
1280 static_cast<yami::core::agent *>(p);
1281
1282 *result = translate_result(
1283 the_agent->do_some_work(timeout,
1284 allow_outgoing != 0, allow_incoming != 0));
1285 }
1286
agent_interrupt_work_waiter(void * p,int * result)1287 void agent_interrupt_work_waiter(void * p, int * result)
1288 {
1289 yami::core::agent * the_agent =
1290 static_cast<yami::core::agent *>(p);
1291
1292 *result = translate_result(the_agent->interrupt_work_waiter());
1293 }
1294
1295 } // extern "C"
1296