X-Git-Url: https://gerrit.automotivelinux.org/gerrit/gitweb?a=blobdiff_plain;f=src%2Fafm-db.c;h=a15255b9cfa892a8d623d119fbf3f04d81b8c89e;hb=c643fe4639e923b0a88e1a5d9df691418b540056;hp=4dc2d5fde6125cd550623d6cf1223a20ed361079;hpb=b6d4ed93426e7d4425a0178903bf1f19c8ae2f61;p=src%2Fapp-framework-main.git diff --git a/src/afm-db.c b/src/afm-db.c index 4dc2d5f..a15255b 100644 --- a/src/afm-db.c +++ b/src/afm-db.c @@ -1,5 +1,5 @@ /* - Copyright 2015 IoT.bzh + Copyright 2015, 2016, 2017 IoT.bzh author: José Bollo @@ -25,7 +25,7 @@ #include #include -#include +#include #include "utils-json.h" #include "wgt-info.h" @@ -39,9 +39,9 @@ * path: STRING, the path of the root directory for the application * content: STRING, the relative path to the entryu point of the application * type: STRING, the mime type describing the type 'content' - * plugins: ARRAY, array of plugins + * bindings: ARRAY, array of bindings * [ - * STRING, path to the plugin + * STRING, path to the binding * ] * public: OBJECT, public content describing the application widget * { @@ -139,7 +139,7 @@ static int addwgt(struct afm_apps *apps, const char *path, if (!pub) goto error; - plugs = j_add_new_array(priv, "plugins"); + plugs = j_add_new_array(priv, "bindings"); if (!plugs) goto error; @@ -157,10 +157,10 @@ static int addwgt(struct afm_apps *apps, const char *path, || !j_add_string(pub, "author", desc->author)) goto error; - /* extract plugins from features */ + /* extract bindings from features */ feat = desc->features; while (feat) { - static const char prefix[] = FWK_PREFIX_PLUGIN; + static const char prefix[] = FWK_PREFIX_BINDING; if (!memcmp(feat->name, prefix, sizeof prefix - 1)) { str = json_object_new_string ( feat->name + sizeof prefix - 1); @@ -231,7 +231,7 @@ static int enumentries(struct enumdata *data, int (*callto)(struct enumdata *)) DIR *dir; int rc; char *beg; - struct dirent entry, *e; + struct dirent *e; size_t len; /* opens the directory */ @@ -244,23 +244,28 @@ static int enumentries(struct enumdata *data, int (*callto)(struct enumdata *)) *beg++ = '/'; /* enumerate entries */ - rc = readdir_r(dir, &entry, &e); - while (!rc && e) { - if (entry.d_name[0] != '.' || (entry.d_name[1] - && (entry.d_name[1] != '.' || entry.d_name[2]))) { + for(;;) { + errno = 0; + e = readdir(dir); + if (!e) { + rc = !errno - 1; + break; + } + if (e->d_name[0] != '.' || (e->d_name[1] + && (e->d_name[1] != '.' || e->d_name[2]))) { /* prepare callto */ - len = strlen(entry.d_name); + len = strlen(e->d_name); if (beg + len >= data->path + sizeof data->path) { errno = ENAMETOOLONG; return -1; } - data->length = stpcpy(beg, entry.d_name) - data->path; + data->length = (int)(stpcpy(beg, e->d_name) + - data->path); /* call the function */ rc = callto(data); if (rc) break; } - rc = readdir_r(dir, &entry, &e); } closedir(dir); return rc; @@ -430,9 +435,9 @@ int afm_db_update_applications(struct afm_db *afdb) /* for each directory of afdb */ for (dir = afdb->dirhead ; dir != NULL ; dir = dir->next) { if (dir->type == type_root) { - edata.length = stpcpy(edata.path, dir->path) - - edata.path; - assert(edata.length < sizeof edata.path); + edata.length = (int)(stpcpy(edata.path, dir->path) + - edata.path); + assert(edata.length < (int)sizeof edata.path); /* enumerate the applications */ rc = enumentries(&edata, enumvers); if (rc) @@ -481,10 +486,31 @@ struct json_object *afm_db_application_list(struct afm_db *afdb) */ struct json_object *afm_db_get_application(struct afm_db *afdb, const char *id) { + int i; struct json_object *result; - if (!afm_db_ensure_applications(afdb) && json_object_object_get_ex( - afdb->applications.direct, id, &result)) + + if (afm_db_ensure_applications(afdb)) + return NULL; + + /* search case sensitively */ + if (json_object_object_get_ex( afdb->applications.direct, id, &result)) return json_object_get(result); + + /* fallback to a case insensitive search */ + i = json_object_array_length(afdb->applications.pubarr); + while (i) { + result = json_object_array_get_idx(afdb->applications.pubarr, --i); + if (result + && json_object_object_get_ex(result, "id", &result) + && !strcasecmp(id, json_object_get_string(result))) { + if (json_object_object_get_ex( afdb->applications.direct, + json_object_get_string(result), + &result)) + return json_object_get(result); + else + return NULL; + } + } return NULL; }