Adds 2017 to copyrights
[src/app-framework-main.git] / src / afm-db.c
index 4dc2d5f..638713e 100644 (file)
@@ -1,5 +1,5 @@
 /*
- Copyright 2015 IoT.bzh
+ Copyright 2015, 2016, 2017 IoT.bzh
 
  author: José Bollo <jose.bollo@iot.bzh>
 
@@ -25,7 +25,7 @@
 #include <unistd.h>
 #include <sys/types.h>
 
-#include <json.h>
+#include <json-c/json.h>
 
 #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);
@@ -254,7 +254,8 @@ static int enumentries(struct enumdata *data, int (*callto)(struct enumdata *))
                                errno = ENAMETOOLONG;
                                return -1;
                        }
-                       data->length = stpcpy(beg, entry.d_name) - data->path;
+                       data->length = (int)(stpcpy(beg, entry.d_name)
+                                                               - data->path);
                        /* call the function */
                        rc = callto(data);
                        if (rc)
@@ -430,9 +431,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 +482,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;
 }