X-Git-Url: https://gerrit.automotivelinux.org/gerrit/gitweb?a=blobdiff_plain;f=src%2Fafb-api-dbus.c;h=ad640fb236552ac8ebe84535d1581b12027afc03;hb=3535d4cb73628c720da1bf74627ded2aec6f2ca1;hp=a94015705983f4f82ca4492d3ab00e5894e0c52e;hpb=271bb6fc606fc5068a7b7a8f22b0052aca2fb900;p=src%2Fapp-framework-binder.git diff --git a/src/afb-api-dbus.c b/src/afb-api-dbus.c index a9401570..ad640fb2 100644 --- a/src/afb-api-dbus.c +++ b/src/afb-api-dbus.c @@ -27,7 +27,7 @@ #include #include -#include +#include #include "afb-common.h" @@ -113,7 +113,7 @@ static struct api_dbus *make_api_dbus_3(int system, const char *path, size_t pat goto error2; } api->api++; - if (!afb_api_is_valid_name(api->api)) { + if (!afb_api_is_valid_name(api->api, 1)) { errno = EINVAL; goto error2; } @@ -226,7 +226,7 @@ struct dbus_memo { struct dbus_event { struct dbus_event *next; - struct afb_event event; + struct afb_eventid *eventid; int id; int refcount; }; @@ -332,7 +332,7 @@ static void api_dbus_client_call(void *closure, struct afb_xreq *xreq) /* creates the message */ msg = NULL; - rc = sd_bus_message_new_method_call(api->sdbus, &msg, api->name, api->path, api->name, xreq->verb); + rc = sd_bus_message_new_method_call(api->sdbus, &msg, api->name, api->path, api->name, xreq->request.verb); if (rc < 0) goto error; @@ -376,19 +376,19 @@ static int api_dbus_client_on_broadcast_event(sd_bus_message *m, void *userdata, return 1; } -/* search the event */ +/* search the eventid */ static struct dbus_event *api_dbus_client_event_search(struct api_dbus *api, int id, const char *name) { struct dbus_event *ev; ev = api->client.events; - while (ev != NULL && (ev->id != id || 0 != strcmp(afb_evt_event_fullname(ev->event), name))) + while (ev != NULL && (ev->id != id || 0 != strcmp(afb_evt_eventid_fullname(ev->eventid), name))) ev = ev->next; return ev; } -/* adds an event */ +/* adds an eventid */ static void api_dbus_client_event_create(struct api_dbus *api, int id, const char *name) { struct dbus_event *ev; @@ -403,8 +403,8 @@ static void api_dbus_client_event_create(struct api_dbus *api, int id, const cha /* no conflict, try to add it */ ev = malloc(sizeof *ev); if (ev != NULL) { - ev->event = afb_evt_create_event(name); - if (ev->event.closure == NULL) + ev->eventid = afb_evt_eventid_create(name); + if (ev->eventid == NULL) free(ev); else { ev->refcount = 1; @@ -417,7 +417,7 @@ static void api_dbus_client_event_create(struct api_dbus *api, int id, const cha ERROR("can't create event %s, out of memory", name); } -/* removes an event */ +/* removes an eventid */ static void api_dbus_client_event_drop(struct api_dbus *api, int id, const char *name) { struct dbus_event *ev, **prv; @@ -440,7 +440,7 @@ static void api_dbus_client_event_drop(struct api_dbus *api, int id, const char *prv = ev->next; /* destroys the event */ - afb_event_unref(ev->event); + afb_evt_eventid_unref(ev->eventid); free(ev); } @@ -459,7 +459,7 @@ static void api_dbus_client_event_push(struct api_dbus *api, int id, const char /* destroys the event */ object = json_tokener_parse(data); - afb_event_push(ev->event, object); + afb_evt_eventid_push(ev->eventid, object); } /* subscribes an event */ @@ -484,7 +484,7 @@ static void api_dbus_client_event_subscribe(struct api_dbus *api, int id, const } /* subscribe the request to the event */ - rc = afb_xreq_subscribe(memo->xreq, ev->event); + rc = afb_xreq_subscribe(memo->xreq, ev->eventid); if (rc < 0) ERROR("can't subscribe: %m"); } @@ -511,7 +511,7 @@ static void api_dbus_client_event_unsubscribe(struct api_dbus *api, int id, cons } /* unsubscribe the request from the event */ - rc = afb_xreq_unsubscribe(memo->xreq, ev->event); + rc = afb_xreq_unsubscribe(memo->xreq, ev->eventid); if (rc < 0) ERROR("can't unsubscribe: %m"); } @@ -842,37 +842,51 @@ static void dbus_req_fail(struct afb_xreq *xreq, const char *status, const char static void afb_api_dbus_server_event_send(struct origin *origin, char order, const char *event, int eventid, const char *data, uint64_t msgid); -static int dbus_req_subscribe(struct afb_xreq *xreq, struct afb_event event) +static int dbus_req_subscribe(struct afb_xreq *xreq, struct afb_eventid *eventid) { struct dbus_req *dreq = CONTAINER_OF_XREQ(struct dbus_req, xreq); uint64_t msgid; int rc; - rc = afb_evt_add_watch(dreq->listener->listener, event); + rc = afb_evt_eventid_add_watch(dreq->listener->listener, eventid); sd_bus_message_get_cookie(dreq->message, &msgid); - afb_api_dbus_server_event_send(dreq->listener->origin, 'S', afb_evt_event_fullname(event), afb_evt_event_id(event), "", msgid); + afb_api_dbus_server_event_send(dreq->listener->origin, 'S', afb_evt_eventid_fullname(eventid), afb_evt_eventid_id(eventid), "", msgid); return rc; } -static int dbus_req_unsubscribe(struct afb_xreq *xreq, struct afb_event event) +static int dbus_req_unsubscribe(struct afb_xreq *xreq, struct afb_eventid *eventid) { struct dbus_req *dreq = CONTAINER_OF_XREQ(struct dbus_req, xreq); uint64_t msgid; int rc; sd_bus_message_get_cookie(dreq->message, &msgid); - afb_api_dbus_server_event_send(dreq->listener->origin, 'U', afb_evt_event_fullname(event), afb_evt_event_id(event), "", msgid); - rc = afb_evt_remove_watch(dreq->listener->listener, event); + afb_api_dbus_server_event_send(dreq->listener->origin, 'U', afb_evt_eventid_fullname(eventid), afb_evt_eventid_id(eventid), "", msgid); + rc = afb_evt_eventid_remove_watch(dreq->listener->listener, eventid); return rc; } +static void dbus_req_subcall( + struct afb_xreq *xreq, + const char *api, + const char *verb, + struct json_object *args, + void (*callback)(void*, int, struct json_object*), + void *cb_closure) +{ + ERROR("DBUS API doesn't support subcalls, info: %s/%s(%s)", api, verb, json_object_to_json_string(args)); + callback(cb_closure, 1, afb_msg_json_reply_error("error", "subcall isn't supported", NULL, NULL)); + json_object_put(args); +} + const struct afb_xreq_query_itf afb_api_dbus_xreq_itf = { .json = dbus_req_json, .success = dbus_req_success, .fail = dbus_req_fail, .unref = dbus_req_destroy, .subscribe = dbus_req_subscribe, - .unsubscribe = dbus_req_unsubscribe + .unsubscribe = dbus_req_unsubscribe, + .subcall = dbus_req_subcall }; /******************* server part **********************************/ @@ -985,8 +999,8 @@ static int api_dbus_server_on_object_called(sd_bus_message *message, void *userd dreq->json = json_object_new_string(dreq->request); } dreq->listener = listener; - dreq->xreq.api = api->api; - dreq->xreq.verb = method; + dreq->xreq.request.api = api->api; + dreq->xreq.request.verb = method; afb_xreq_process(&dreq->xreq, api->server.apiset); return 1;