#include <stdio.h>
#include <time.h>
#include <getopt.h>
+#include <errno.h>
#include <json.h>
#include "verbose.h"
#include "utils-jbus.h"
+#include "utils-json.h"
#include "afm.h"
#include "afm-db.h"
+#include "wgt-info.h"
+#include "wgtpkg-install.h"
static const char appname[] = "afm-system-daemon";
+static const char *rootdir = NULL;
static void usage()
{
printf(
- "usage: %s [-q] [-v] [-r rootdir]... [-a appdir]...\n"
+ "usage: %s [-q] [-v] [-r rootdir]\n"
"\n"
- " -a appdir adds an application directory\n"
- " -r rootdir adds a root directory of applications\n"
+ " -r rootdir set root directory of applications\n"
" -d run as a daemon\n"
" -q quiet\n"
" -v verbose\n"
static struct option options[] = {
{ "root", required_argument, NULL, 'r' },
- { "application", required_argument, NULL, 'a' },
{ "daemon", no_argument, NULL, 'd' },
{ "quiet", no_argument, NULL, 'q' },
{ "verbose", no_argument, NULL, 'v' },
};
static struct jbus *jbus;
-static struct afm_db *afdb;
const char error_nothing[] = "[]";
const char error_bad_request[] = "\"bad request\"";
const char error_not_found[] = "\"not found\"";
const char error_cant_start[] = "\"can't start\"";
-static const char *getappid(struct json_object *obj)
+static void on_install(struct jreq *jreq, struct json_object *req)
{
- return json_type_string == json_object_get_type(obj) ? json_object_get_string(obj) : NULL;
-}
+ const char *wgtfile;
+ const char *root;
+ int force;
+ struct wgt_info *ifo;
+ struct json_object *resp;
+
+ /* scan the request */
+ switch (json_object_get_type(req)) {
+ case json_type_string:
+ wgtfile = json_object_get_string(req);
+ root = rootdir;
+ force = 0;
+ break;
+ case json_type_object:
+ wgtfile = j_get_string(req, "wgt", NULL);
+ if (wgtfile != NULL) {
+ root = j_get_string(req, "root", rootdir);
+ force = j_get_boolean(req, "force", 0);
+ break;
+ }
+ default:
+ jbus_reply_error_s(jreq, error_bad_request);
+ return;
+ }
-static void reply(struct jreq *jreq, struct json_object *resp, const char *errstr)
-{
- if (resp)
- jbus_reply_j(jreq, resp);
- else
- jbus_reply_error_s(jreq, errstr);
-}
+ /* install the widget */
+ ifo = install_widget(wgtfile, root, force);
+ if (ifo == NULL) {
+ jbus_reply_error_s(jreq, "\"installation failed\"");
+ return;
+ }
-static void on_runnables(struct jreq *jreq, struct json_object *obj)
-{
- struct json_object *resp = afm_db_application_list(afdb);
- jbus_reply_j(jreq, resp);
- json_object_put(resp);
-}
+ /* build the response */
+ resp = json_object_new_object();
+ if(!resp || !j_add_string(resp, "added", wgt_info_desc(ifo)->idaver)) {
+ json_object_put(resp);
+ wgt_info_unref(ifo);
+ jbus_reply_error_s(jreq, "\"out of memory but installed!\"");
+ return;
+ }
+ wgt_info_unref(ifo);
-static void on_detail(struct jreq *jreq, struct json_object *obj)
-{
- const char *appid = getappid(obj);
- struct json_object *resp = afm_db_get_application_public(afdb, appid);
- reply(jreq, resp, error_not_found);
+ /* reply and propagate event */
+ jbus_reply_j(jreq, resp);
+ jbus_send_signal_j(jbus, "changed", resp);
json_object_put(resp);
}
-extern void install_widget(const char *wgtfile, const char *root, int force);
-static void on_install(struct jreq *jreq, struct json_object *obj)
-{
- jbus_reply_error_s(jreq, "\"not yet implemented\"");
-}
-
-static void on_uninstall(struct jreq *jreq, struct json_object *obj)
+static void on_uninstall(struct jreq *jreq, struct json_object *req)
{
jbus_reply_error_s(jreq, "\"not yet implemented\"");
}
LOGAUTH(appname);
- /* first interpretation of arguments */
- while ((i = getopt_long(ac, av, "hdqvr:a:", options, NULL)) >= 0) {
+ /* interpretation of arguments */
+ while ((i = getopt_long(ac, av, "hdqvr:", options, NULL)) >= 0) {
switch (i) {
case 'h':
usage();
daemon = 1;
break;
case 'r':
- break;
- case 'a':
+ if (rootdir == NULL)
+ rootdir = optarg;
+ else {
+ ERROR("duplicate definition of rootdir");
+ return 1;
+ }
break;
case ':':
ERROR("missing argument value");
}
}
- /* init framework */
- afdb = afm_db_create();
- if (!afdb) {
- ERROR("afm_create failed");
- return 1;
- }
- if (afm_db_add_root(afdb, FWK_APP_DIR)) {
- ERROR("can't add root %s", FWK_APP_DIR);
- return 1;
- }
-
- /* second interpretation of arguments */
- optind = 1;
- while ((i = getopt_long(ac, av, "hdqvr:a:", options, NULL)) >= 0) {
- switch (i) {
- case 'r':
- if (afm_db_add_root(afdb, optarg)) {
- ERROR("can't add root %s", optarg);
- return 1;
- }
- break;
- case 'a':
- if (afm_db_add_application(afdb, optarg)) {
- ERROR("can't add application %s", optarg);
- return 1;
- }
- break;
+ /* check the rootdir */
+ if (rootdir == NULL)
+ rootdir = FWK_APP_DIR;
+ else {
+ rootdir = realpath(rootdir, NULL);
+ if (rootdir == NULL) {
+ ERROR("out of memory");
+ return 1;
}
}
-
- /* update the database */
- if (afm_db_update_applications(afdb)) {
- ERROR("afm_update_applications failed");
+ if (chdir(rootdir)) {
+ ERROR("can't enter %s", rootdir);
return 1;
}
+ /* daemonize */
if (daemon && daemonize()) {
ERROR("daemonization failed");
return 1;
ERROR("create_jbus failed");
return 1;
}
- if(jbus_add_service_j(jbus, "runnables", on_runnables)
- || jbus_add_service_j(jbus, "detail", on_detail)
- || jbus_add_service_j(jbus, "install", on_install)
+ if(jbus_add_service_j(jbus, "install", on_install)
|| jbus_add_service_j(jbus, "uninstall", on_uninstall)) {
ERROR("adding services failed");
return 1;
/* start and run */
if (jbus_start_serving(jbus)) {
- ERROR("cant start server");
+ ERROR("can't start server");
return 1;
}
while (!jbus_read_write_dispatch(jbus, -1));