X-Git-Url: https://gerrit.automotivelinux.org/gerrit/gitweb?a=blobdiff_plain;f=src%2Fafb-stub-ws.c;h=164759271ac9f9d172ca124c59010ff6cacb9bd7;hb=d45426257d5149c735e33e3055220625a919e7bc;hp=625cea38e0128ef5c67da6c149d5e699937c4e57;hpb=5928e8fc14c2edabc0bc104fff7542819e06d45a;p=src%2Fapp-framework-binder.git diff --git a/src/afb-stub-ws.c b/src/afb-stub-ws.c index 625cea38..16475927 100644 --- a/src/afb-stub-ws.c +++ b/src/afb-stub-ws.c @@ -33,7 +33,6 @@ #include #include -#include #include @@ -126,6 +125,15 @@ struct server_describe struct afb_proto_ws_describe *describe; }; +/* + * structure for recording sessions + */ +struct server_session +{ + struct server_session *next; + struct afb_session *session; +}; + /******************* stub description for client or servers ******************/ struct afb_stub_ws @@ -148,6 +156,9 @@ struct afb_stub_ws /* credentials (server side) */ struct afb_cred *cred; + /* sessions (server side) */ + struct server_session *sessions; + /* apiset */ struct afb_apiset *apiset; @@ -209,9 +220,9 @@ static int server_req_subscribe_cb(struct afb_xreq *xreq, struct afb_eventid *ev int rc; struct server_req *wreq = CONTAINER_OF_XREQ(struct server_req, xreq); - rc = afb_evt_add_watch(wreq->stubws->listener, event); + rc = afb_evt_eventid_add_watch(wreq->stubws->listener, event); if (rc >= 0) - rc = afb_proto_ws_call_subscribe(wreq->call, afb_evt_event_fullname(event), afb_evt_event_id(event)); + rc = afb_proto_ws_call_subscribe(wreq->call, afb_evt_eventid_fullname(event), afb_evt_eventid_id(event)); if (rc < 0) ERROR("error while subscribing event"); return rc; @@ -222,8 +233,8 @@ static int server_req_unsubscribe_cb(struct afb_xreq *xreq, struct afb_eventid * int rc, rc2; struct server_req *wreq = CONTAINER_OF_XREQ(struct server_req, xreq); - rc = afb_proto_ws_call_unsubscribe(wreq->call, afb_evt_event_fullname(event), afb_evt_event_id(event)); - rc2 = afb_evt_remove_watch(wreq->stubws->listener, event); + rc = afb_proto_ws_call_unsubscribe(wreq->call, afb_evt_eventid_fullname(event), afb_evt_eventid_id(event)); + rc2 = afb_evt_eventid_remove_watch(wreq->stubws->listener, event); if (rc >= 0 && rc2 < 0) rc = rc2; if (rc < 0) @@ -248,7 +259,7 @@ static struct client_event *client_event_search(struct afb_stub_ws *stubws, uint struct client_event *ev; ev = stubws->events; - while (ev != NULL && (ev->id != eventid || 0 != strcmp(afb_evt_event_fullname(ev->eventid), name))) + while (ev != NULL && (ev->id != eventid || 0 != strcmp(afb_evt_eventid_fullname(ev->eventid), name))) ev = ev->next; return ev; @@ -259,7 +270,7 @@ static void client_call_cb(void * closure, struct afb_xreq *xreq) { struct afb_stub_ws *stubws = closure; - afb_proto_ws_client_call(stubws->proto, xreq->verb, afb_xreq_json(xreq), afb_session_uuid(xreq->context.session), xreq); + afb_proto_ws_client_call(stubws->proto, xreq->request.verb, afb_xreq_json(xreq), afb_session_uuid(xreq->context.session), xreq); afb_xreq_unhooked_addref(xreq); } @@ -360,7 +371,7 @@ static void on_event_create(void *closure, const char *event_name, int event_id) /* no conflict, try to add it */ ev = malloc(sizeof *ev); if (ev != NULL) { - ev->eventid = afb_evt_create_event(event_name); + ev->eventid = afb_evt_eventid_create(event_name); if (ev->eventid != NULL) { ev->refcount = 1; ev->id = event_id; @@ -394,7 +405,7 @@ static void on_event_remove(void *closure, const char *event_name, int event_id) *prv = ev->next; /* destroys the event */ - afb_evt_event_unref(ev->eventid); + afb_evt_eventid_unref(ev->eventid); free(ev); } @@ -436,7 +447,7 @@ static void on_event_push(void *closure, const char *event_name, int event_id, s /* check conflicts */ ev = client_event_search(stubws, event_id, event_name); if (ev) - afb_evt_push(ev->eventid, data); + afb_evt_eventid_push(ev->eventid, data); else ERROR("unreadable push event"); } @@ -446,7 +457,7 @@ static void on_event_broadcast(void *closure, const char *event_name, struct jso afb_evt_broadcast(event_name, data); } -static void client_subcall_reply_cb(void *closure, int status, json_object *object) +static void client_subcall_reply_cb(void *closure, int status, json_object *object, struct afb_request *request) { struct afb_proto_ws_subcall *subcall = closure; afb_proto_ws_subcall_reply(subcall, status, object); @@ -461,6 +472,46 @@ static void on_subcall(void *closure, struct afb_proto_ws_subcall *subcall, void /*****************************************************/ +static void record_session(struct afb_stub_ws *stubws, struct afb_session *session) +{ + struct server_session *s, **prv; + + /* search */ + prv = &stubws->sessions; + while ((s = *prv)) { + if (s->session == session) + return; + if (afb_session_is_closed(s->session)) { + *prv = s->next; + afb_session_unref(s->session); + free(s); + } + else + prv = &s->next; + } + + /* create */ + s = malloc(sizeof *s); + if (s) { + s->session = afb_session_addref(session); + s->next = stubws->sessions; + stubws->sessions = s; + } +} + +static void release_sessions(struct afb_stub_ws *stubws) +{ + struct server_session *s; + + while((s = stubws->sessions)) { + stubws->sessions = s->next; + afb_session_unref(s->session); + free(s); + } +} + +/*****************************************************/ + static void on_call(void *closure, struct afb_proto_ws_call *call, const char *verb, struct json_object *args, const char *sessionid) { struct afb_stub_ws *stubws = closure; @@ -480,11 +531,15 @@ static void on_call(void *closure, struct afb_proto_ws_call *call, const char *v /* init the context */ if (afb_context_connect(&wreq->xreq.context, sessionid, NULL) < 0) goto unconnected; + wreq->xreq.context.validated = 1; + record_session(stubws, wreq->xreq.context.session); + if (wreq->xreq.context.created) + afb_session_set_autoclose(wreq->xreq.context.session, 1); /* makes the call */ wreq->xreq.cred = afb_cred_addref(stubws->cred); - wreq->xreq.api = stubws->apiname; - wreq->xreq.verb = verb; + wreq->xreq.request.api = stubws->apiname; + wreq->xreq.request.verb = verb; wreq->xreq.json = args; afb_xreq_process(&wreq->xreq, stubws->apiset); return; @@ -585,7 +640,7 @@ static void drop_all_events(struct afb_stub_ws *stubws) while (ev) { nxt = ev->next; - afb_evt_event_unref(ev->eventid); + afb_evt_eventid_unref(ev->eventid); free(ev); ev = nxt; } @@ -598,6 +653,8 @@ static void on_hangup(void *closure) if (stubws->on_hangup) stubws->on_hangup(stubws); + + release_sessions(stubws); } /*****************************************************/ @@ -611,9 +668,9 @@ static struct afb_stub_ws *afb_stub_ws_create(int fd, const char *apiname, struc errno = ENOMEM; else { if (client) - stubws->proto = afb_proto_ws_create_client(fd, &client_itf, stubws); + stubws->proto = afb_proto_ws_create_client(afb_common_get_event_loop(), fd, &client_itf, stubws); else - stubws->proto = afb_proto_ws_create_server(fd, &server_itf, stubws); + stubws->proto = afb_proto_ws_create_server(afb_common_get_event_loop(), fd, &server_itf, stubws); if (stubws->proto != NULL) { strcpy(stubws->apiname, apiname); stubws->apiset = afb_apiset_addref(apiset); @@ -651,6 +708,7 @@ void afb_stub_ws_unref(struct afb_stub_ws *stubws) if (!__atomic_sub_fetch(&stubws->refcount, 1, __ATOMIC_RELAXED)) { drop_all_events(stubws); afb_evt_listener_unref(stubws->listener); + release_sessions(stubws); afb_proto_ws_unref(stubws->proto); afb_cred_unref(stubws->cred); afb_apiset_unref(stubws->apiset);