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