64 #include <amxc/amxc.h>
65 #include <amxp/amxp.h>
67 #include <amxd/amxd_dm.h>
68 #include <amxd/amxd_object.h>
84 if((c ==
'(') || (c ==
')')) {
91 static void amxb_trim(
char* str, amxc_string_is_char_fn_t fn) {
93 amxc_string_init(&txt, 0);
94 amxc_string_push_buffer(&txt, str, strlen(str) + 1);
95 amxc_string_trimr(&txt, fn);
96 amxc_string_take_buffer(&txt);
97 amxc_string_clean(&txt);
128 amxc_var_t* rv = GET_ARG(data,
"retval");
132 amxc_var_set_type(request->
result, AMXC_VAR_ID_LIST);
133 amxc_var_take_it(rv);
134 amxc_var_set_index(request->
result, 0, rv, AMXC_VAR_FLAG_DEFAULT);
135 request->
bus_retval = GET_UINT32(data,
"status");
149 amxc_var_t empty_args;
150 amxc_var_t* fn_rv = NULL;
151 amxc_var_t* out_args = NULL;
152 amxd_object_t*
object = NULL;
153 amxc_var_init(&empty_args);
154 amxc_var_set_type(&empty_args, AMXC_VAR_ID_HTABLE);
157 when_null_status(
object, exit, retval = amxd_status_object_not_found);
163 amxc_var_set_type(request->
result, AMXC_VAR_ID_LIST);
164 fn_rv = amxc_var_add_new(request->
result);
166 retval = amxd_object_invoke_function(
object, invoke_ctx->
method, args, fn_rv);
167 if(!amxc_htable_is_empty(amxc_var_constcast(amxc_htable_t, args))) {
168 out_args = amxc_var_add_new(request->
result);
169 amxc_var_move(out_args, args);
175 if((request->
done_fn != NULL) || (request->
cb_fn != NULL)) {
177 if(retval == amxd_status_deferred) {
178 uint64_t call_id = amxc_var_constcast(uint64_t, fn_rv);
187 if(retval == amxd_status_deferred) {
188 uint64_t call_id = 0;
190 call_id = amxc_var_constcast(uint64_t, fn_rv);
193 when_failed(retval, exit);
194 if(request->
cb_fn != NULL) {
201 amxc_var_clean(&empty_args);
211 amxc_var_t* func_args = args;
215 if((amxc_var_type_of(args) == AMXC_VAR_ID_NULL) ||
216 ( amxc_var_type_of(args) == AMXC_VAR_ID_INVALID)) {
248 int fd = amxp_signal_fd();
256 FD_SET(fd, &readset);
260 retval = select(fd + 1, &readset, NULL, NULL, &t);
284 const char* interface,
285 const char* method) {
286 int retval = amxd_status_unknown_error;
289 when_null(invoke_ctx, exit);
290 when_not_null(*invoke_ctx, exit);
291 when_null(ctx, exit);
293 when_str_empty(method, exit);
296 when_null((*invoke_ctx), exit);
298 (*invoke_ctx)->object =
object == NULL ? strdup(
"") : strdup(
object);
299 when_null((*invoke_ctx)->object, exit);
300 (*invoke_ctx)->interface =
interface == NULL ? NULL : strdup(interface);
301 (*invoke_ctx)->method = strdup(method);
302 when_null((*invoke_ctx)->method, exit);
308 if(amxb_is_valid_be_func(fns, new_invoke, fns->new_invoke)) {
315 amxc_llist_append(&ctx->
invoke_ctxs, &(*invoke_ctx)->it);
328 when_null(invoke_ctx, exit);
329 when_null(*invoke_ctx, exit);
331 if(amxc_llist_it_is_in_list(&(*invoke_ctx)->it)) {
332 ctx = amxc_container_of((*invoke_ctx)->it.llist,
340 amxc_llist_it_take(&(*invoke_ctx)->it);
341 free((*invoke_ctx)->object);
342 free((*invoke_ctx)->interface);
343 free((*invoke_ctx)->method);
364 amxc_var_init(&temp_var);
366 when_null(invoke_ctx, exit);
367 when_null(invoke_ctx->
it.llist, exit);
371 when_null(req, exit);
372 request = &req->
data;
374 request->
result = (ret == NULL) ? &temp_var : ret;
379 request->
priv = priv;
383 if(retval == amxd_status_deferred) {
392 amxc_var_clean(&temp_var);
406 when_null(invoke_ctx, exit);
407 when_null(invoke_ctx->
it.llist, exit);
408 when_null(request, exit);
412 when_null(req, exit);
413 *request = &req->
data;
433 if((retval != 0) && (req != NULL)) {
448 when_null(request, exit);
449 req = amxc_container_of(request,
amxb_req_t, data);
457 when_null(ctx, exit);
475 when_null(req, exit);
477 *request = &req->
data;
488 when_null(request, exit);
489 req = amxc_container_of(request,
amxb_req_t, data);
490 if(amxc_llist_it_is_in_list(&req->
it)) {
504 when_null(request, exit);
505 when_null((*request), exit);
507 req = amxc_container_of(*request,
amxb_req_t, data);
508 amxc_var_delete(&(*request)->result);
518 when_false(amxc_llist_it_is_in_list(&req->
it), exit_free);
529 amxc_llist_it_take(&req->
it);
Ambiorix bus agnostic API header file.
static int amxb_invoke_wait_local(amxb_req_t *req, int timeout)
static void amxb_complete_async_invoke(UNUSED const amxc_var_t *const data, void *const priv)
static int amxb_invoke_local_impl(amxb_invoke_t *invoke_ctx, amxb_bus_ctx_t *ctx, amxc_var_t *args, amxb_request_t *request, bool async)
static void amxb_trim(char *str, amxc_string_is_char_fn_t fn)
static void amxb_complete_async_deferred_invoke(const amxc_var_t *const data, void *const priv)
static int amxb_invoke_be_impl(amxb_invoke_t *invoke_ctx, amxb_bus_ctx_t *ctx, amxc_var_t *args, amxb_request_t *request, int timeout, bool async)
static int isbrace(int c)
Ambiorix Bus Backend Interface.
#define amxb_is_valid_be_func(ft, member, ptr)
amxd_object_t * amxb_fetch_local_object(amxb_bus_ctx_t *ctx, const char *object)
bool PRIVATE amxb_is_local_object(amxb_bus_ctx_t *ctx, const char *obj_path)
void(* amxb_be_cb_fn_t)(const amxb_bus_ctx_t *bus_ctx, const amxc_var_t *const data, void *priv)
void(* amxb_be_done_cb_fn_t)(const amxb_bus_ctx_t *bus_ctx, amxb_request_t *req, int status, void *priv)
#define AMXB_ERROR_UNKNOWN
Unknown error.
#define AMXB_ERROR_NOT_SUPPORTED_OP
Function/operation not supported.
#define AMXB_STATUS_OK
All ok.
int amxb_wait_for_request(amxb_request_t *request, int timeout)
Waits for an asynchronous remote function invoke to finish.
int amxb_request_new(amxb_request_t **request)
Allocates an empty amxb_request_t.
int amxb_close_request(amxb_request_t **request)
Closes a previously create remote function called context.
int amxb_new_invoke(amxb_invoke_t **invoke_ctx, amxb_bus_ctx_t *const ctx, const char *object, const char *interface, const char *method)
Prepares a remote function invocation.
void amxb_free_invoke(amxb_invoke_t **invoke_ctx)
Deletes a function invoke context, and frees allocated memory.
int amxb_async_invoke(amxb_invoke_t *invoke_ctx, amxc_var_t *args, amxb_be_cb_fn_t fn, amxb_be_done_cb_fn_t done_fn, void *priv, amxb_request_t **request)
Invokes a remote function, as defined by the function invoke context.
amxb_bus_ctx_t * amxb_request_get_ctx(amxb_request_t *request)
Get the bus context of the request if any.
int amxb_invoke(amxb_invoke_t *invoke_ctx, amxc_var_t *args, amxc_var_t *ret, amxb_be_cb_fn_t fn, void *priv, int timeout)
Invokes a remote function, as defined by the function invoke context.
The back-end interface structure.
amxb_be_free_invoke_fn_t free_invoke
amxb_be_new_invoke_fn_t new_invoke
amxb_be_close_request_fn_t close_request
amxb_be_invoke_fn_t invoke
amxb_be_async_invoke_fn_t async_invoke
amxb_be_wait_request_fn_t wait_request
const amxb_be_funcs_t * bus_fn
amxb_be_done_cb_fn_t done_fn