X-Git-Url: https://gerrit.automotivelinux.org/gerrit/gitweb?a=blobdiff_plain;f=src%2Faf-usrd.c;fp=src%2Faf-usrd.c;h=f7e039fe6b28637a51cb3867119c761870869360;hb=41e3ea4dbae634ca13941d134e990d953b741c4b;hp=0000000000000000000000000000000000000000;hpb=32c6eecb9955e94b4d68efc09912efe88140ce83;p=src%2Fapp-framework-main.git diff --git a/src/af-usrd.c b/src/af-usrd.c new file mode 100644 index 0000000..f7e039f --- /dev/null +++ b/src/af-usrd.c @@ -0,0 +1,156 @@ +/* + Copyright 2015 IoT.bzh + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +#include + +#include "verbose.h" +#include "utils-jbus.h" +#include "appfwk.h" + +static struct jbus *jbus; +static struct appfwk *appfwk; + +const char error_nothing[] = "[]"; +const char error_not_found[] = "{\"status\":\"error: not found\"}"; + +static const char *getappid(struct json_object *obj) +{ + return json_object_get_string(obj); +} + +static const char *getrunid(struct json_object *obj) +{ + return json_object_get_string(obj); +} + +static void reply(struct jreq *jreq, struct json_object *resp, const char *errstr) +{ + if (obj) + jbus_reply(jreq, resp); + else + jbus_replyj(jreq, errstr); +} + +static void on_runnables(struct jreq *jreq, struct json_object *obj) +{ + struct json_object *resp = appfwk_application_list(appfwk); + jbus_reply(jreq, resp); + json_object_put(obj); +} + +static void on_detail(struct jreq *jreq, struct json_object *obj) +{ + const char *appid = getappid(obj); + struct json_object *resp = appfwk_get_application_public(appfwk, appid); + reply(jreq, resp, error_not_found); + json_object_put(obj); +} + +static void on_start(struct jreq *jreq, struct json_object *obj) +{ + const char *appid = getappid(obj); + const char *runid = appfwk_start(appfwk, appid); + jbus_replyj(jreq, runid ? runid : error_not_found); + json_object_put(obj); +} + +static void on_stop(struct jreq *jreq, struct json_object *obj) +{ + const char *runid = getrunid(obj); + int status = appfwk_stop(appfwk, runid); + jbus_replyj(jreq, status ? error_not_found : "true"); + json_object_put(obj); +} + +static void on_suspend(struct jreq *jreq, struct json_object *obj) +{ + const char *runid = getrunid(obj); + int status = appfwk_suspend(appfwk, runid); + jbus_replyj(jreq, status ? error_not_found : "true"); + json_object_put(obj); +} + +static void on_resume(struct jreq *jreq, struct json_object *obj) +{ + const char *runid = getrunid(obj); + int status = appfwk_resume(appfwk, runid); + jbus_replyj(jreq, status ? error_not_found : "true"); + json_object_put(obj); +} + +static void on_runners(struct jreq *jreq, struct json_object *obj) +{ + struct json_object *resp = appfwk_running_list(appfwk); + jbus_reply(jreq, resp); + json_object_put(obj); +} + +static void on_state(struct jreq *jreq, struct json_object *obj) +{ + const char *runid = getrunid(obj); + int status = appfwk_state(appfwk, runid); + jbus_replyj(jreq, status ? error_not_found : "true"); + json_object_put(obj); +} + +int main(int ac, char **av) +{ + LOGAUTH("af-usrd"); + + /* init framework */ + appfwk = appfwk_create(); + if (!appfwk) { + ERROR("appfwk_create failed"); + return 1; + } + if (appfwk_add_root(appfwk, FWK_APP_DIR)) { + ERROR("can't add root %s", FWK_APP_DIR); + return 1; + } + if (appfwk_update_applications(appfwk)) { + ERROR("appfwk_update_applications failed"); + return 1; + } + + /* init service */ + jbus = create_jbus(1, "/org/automotive/linux/framework"); + if (!jbus) { + ERROR("create_jbus failed"); + return 1; + } + if(jbus_add_service(jbus, "runnables", on_runnables) + || jbus_add_service(jbus, "detail", on_detail) + || jbus_add_service(jbus, "start", on_run) + || jbus_add_service(jbus, "stop", on_stop) + || jbus_add_service(jbus, "suspend", on_suspend) + || jbus_add_service(jbus, "resume", on_resume) + || jbus_add_service(jbus, "runners", on_runners) + || jbus_add_service(jbus, "state", on_state)) { + ERROR("adding services failed"); + return 1; + } + + /* start and run */ + if (jbus_start_serving(jbus)) { + ERROR("cant start server"); + return 1; + } + while (!jbus_read_write_dispatch(jbus, -1)); + return 0; +} + + +