apiset: improvements
authorJosé Bollo <jose.bollo@iot.bzh>
Fri, 21 Apr 2017 16:59:02 +0000 (18:59 +0200)
committerJosé Bollo <jose.bollo@iot.bzh>
Fri, 21 Apr 2017 16:59:02 +0000 (18:59 +0200)
Change-Id: I476ab17bb5c48dbb3cd6c215687989203407549f
Signed-off-by: José Bollo <jose.bollo@iot.bzh>
src/afb-apiset.c
src/afb-apiset.h

index c17881e..63c28fe 100644 (file)
@@ -146,6 +146,15 @@ struct afb_apiset *afb_apiset_create(const char *name, int timeout)
        return set;
 }
 
+/**
+ * the name of the apiset
+ * @param set the api set
+ * @return the name of the set
+ */
+const char *afb_apiset_name(struct afb_apiset *set)
+{
+       return set->name;
+}
 
 /**
  * Get the API timeout of the set
@@ -246,7 +255,6 @@ void afb_apiset_default_api_drop(struct afb_apiset *set)
  * @param api the api
  * @returns 0 in case of success or -1 in case
  * of error with errno set:
- *   - EINVAL if name isn't valid
  *   - EEXIST if name already registered
  *   - ENOMEM when out of memory
  */
@@ -255,13 +263,6 @@ int afb_apiset_add(struct afb_apiset *set, const char *name, struct afb_api api)
        struct api_desc *apis;
        int i, c;
 
-       /* Checks the api name */
-       if (!afb_api_is_valid_name(name)) {
-               ERROR("invalid api name forbidden (name is '%s')", name);
-               errno = EINVAL;
-               goto error;
-       }
-
        /* check previously existing plugin */
        for (i = 0 ; i < set->count ; i++) {
                c = strcasecmp(set->apis[i].name, name);
@@ -337,6 +338,27 @@ int afb_apiset_del(struct afb_apiset *set, const char *name)
  * @param api the structure where to store data about the API of name
  * @return 0 in case of success or -1 in case of error
  */
+int afb_apiset_lookup(struct afb_apiset *set, const char *name, struct afb_api *api)
+{
+       const struct api_desc *i;
+
+       i = search(set, name);
+       if (i) {
+               *api = i->api;
+               return 0;
+       }
+
+       errno = ENOENT;
+       return -1;
+}
+
+/**
+ * Get from the 'set' the API of 'name' in 'api' with fallback to subset or default api
+ * @param set the set of API
+ * @param name the name of the API to get
+ * @param api the structure where to store data about the API of name
+ * @return 0 in case of success or -1 in case of error
+ */
 int afb_apiset_get(struct afb_apiset *set, const char *name, struct afb_api *api)
 {
        const struct api_desc *i;
@@ -478,7 +500,7 @@ int afb_apiset_get_verbosity(struct afb_apiset *set, const char *name)
                return -1;
        }
        if (!i->api.itf->get_verbosity)
-               return 0;
+               return verbosity;
 
        return i->api.itf->get_verbosity(i->api.closure);
 }
@@ -513,3 +535,17 @@ const char **afb_apiset_get_names(struct afb_apiset *set)
        return names;
 }
 
+/**
+ * Enumerate the api names to a callback.
+ * @param set the api set
+ * @param callback the function to call for each name
+ * @param closure the closure for the callback
+ */
+void afb_apiset_enum(struct afb_apiset *set, void (*callback)(struct afb_apiset *set, const char *name, void *closure), void *closure)
+{
+       int i;
+
+       for (i = 0 ; i < set->count ; i++)
+               callback(set, set->apis[i].name, closure);
+}
+
index 2b3ea2a..ff6f6b4 100644 (file)
@@ -23,6 +23,7 @@ struct afb_apiset;
 extern struct afb_apiset *afb_apiset_addref(struct afb_apiset *set);
 extern void afb_apiset_unref(struct afb_apiset *set);
 extern struct afb_apiset *afb_apiset_create(const char *name, int timeout);
+extern const char *afb_apiset_name(struct afb_apiset *set);
 extern int afb_apiset_timeout_get(struct afb_apiset *set);
 extern void afb_apiset_timeout_set(struct afb_apiset *set, int to);
 extern void afb_apiset_subset_set(struct afb_apiset *set, struct afb_apiset *subset);
@@ -33,6 +34,7 @@ extern void afb_apiset_default_api_set(struct afb_apiset *set, struct afb_api ap
 extern void afb_apiset_default_api_drop(struct afb_apiset *set);
 extern int afb_apiset_add(struct afb_apiset *set, const char *name, struct afb_api api);
 extern int afb_apiset_del(struct afb_apiset *set, const char *name);
+extern int afb_apiset_lookup(struct afb_apiset *set, const char *name, struct afb_api *api);
 extern int afb_apiset_get(struct afb_apiset *set, const char *name, struct afb_api *api);
 extern int afb_apiset_start_service(struct afb_apiset *set, const char *name, int share_session, int onneed);
 extern int afb_apiset_start_all_services(struct afb_apiset *set, int share_session);
@@ -40,4 +42,5 @@ extern void afb_apiset_update_hooks(struct afb_apiset *set, const char *name);
 extern void afb_apiset_set_verbosity(struct afb_apiset *set, const char *name, int level);
 extern int afb_apiset_get_verbosity(struct afb_apiset *set, const char *name);
 extern const char **afb_apiset_get_names(struct afb_apiset *set);
+extern void afb_apiset_enum(struct afb_apiset *set, void (*callback)(struct afb_apiset *set, const char *name, void *closure), void *closure);