/*
- Copyright 2015 IoT.bzh
+ Copyright (C) 2015-2018 IoT.bzh
+
+ author: José Bollo <jose.bollo@iot.bzh>
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
#include <string.h>
#include <errno.h>
#include <assert.h>
-#include <syslog.h>
+#include <ctype.h>
+
#include <libxml/tree.h>
#include "verbose.h"
#include "wgt.h"
#include "wgt-config.h"
+#include "wgt-strings.h"
#include "wgt-info.h"
struct wgt_info {
return node ? xmlNodeGetContent(node) : NULL;
}
+static char *mkver(char *version)
+{
+ unsigned int lver;
+ char c, *r;
+ if (version) {
+ c = version[lver = 0];
+ while(c && c != ' ' && c != '.')
+ c = version[++lver];
+ if (c == '.') {
+ c = version[++lver];
+ while(c && c != ' ' && c != '.')
+ c = version[++lver];
+ }
+ r = malloc(lver + 1);
+ if (r) {
+ memcpy(r, version, lver);
+ r[lver] = 0;
+ return r;
+ }
+ }
+ return NULL;
+}
+
+static char *mkidaver(char *id, char *ver)
+{
+ size_t lid, lver;
+ char *r;
+ if (id && ver) {
+ lid = strlen(id);
+ lver = strlen(ver);
+ r = malloc(2 + lid + lver);
+ if (r) {
+ memcpy(r, id, lid);
+ r[lid] = '@';
+ memcpy(r + lid + 1, ver, lver);
+ r[lid + lver + 1] = 0;
+ return r;
+ }
+ }
+ return NULL;
+}
+
+static void make_lowercase(char *s)
+{
+ if (s) {
+ while(*s) {
+ *s = (char)tolower(*s);
+ s++;
+ }
+ }
+}
+
static int fill_desc(struct wgt_desc *desc, int want_icons, int want_features, int want_preferences)
{
xmlNodePtr node, pnode;
node = wgt_config_widget();
if (!node) {
- warning("no widget");
+ WARNING("no widget");
errno = EINVAL;
return -1;
}
- desc->id = xmlGetProp(node, wgt_config_string_id);
- desc->version = xmlGetProp(node, wgt_config_string_version);
- desc->width = getpropnum(node, wgt_config_string_width, 0);
- desc->height = getpropnum(node, wgt_config_string_height, 0);
- desc->viewmodes = xmlGetProp(node, wgt_config_string_viewmodes);
- desc->defaultlocale = xmlGetProp(node, wgt_config_string_defaultlocale);
+ desc->id = xmlGetProp(node, string_id);
+ make_lowercase(desc->id);
+ desc->version = xmlGetProp(node, string_version);
+ desc->ver = mkver(desc->version);
+ make_lowercase(desc->ver);
+ desc->idaver = mkidaver(desc->id, desc->ver);
+ desc->width = getpropnum(node, string_width, 0);
+ desc->height = getpropnum(node, string_height, 0);
+ desc->viewmodes = xmlGetProp(node, string_viewmodes);
+ desc->defaultlocale = xmlGetProp(node, string_defaultlocale);
node = wgt_config_name();
desc->name = optcontent(node);
- desc->name_short = optprop(node, wgt_config_string_short);
+ desc->name_short = optprop(node, string_short);
node = wgt_config_description();
desc->description = optcontent(node);
node = wgt_config_author();
desc->author = optcontent(node);
- desc->author_href = optprop(node, wgt_config_string_href);
- desc->author_email = optprop(node, wgt_config_string_email);
+ desc->author_href = optprop(node, string_href);
+ desc->author_email = optprop(node, string_email);
node = wgt_config_license();
desc->license = optcontent(node);
- desc->license_href = optprop(node, wgt_config_string_href);
+ desc->license_href = optprop(node, string_href);
node = wgt_config_content();
- desc->content_src = optprop(node, wgt_config_string_src);
+ desc->content_src = optprop(node, string_src);
if (node && desc->content_src == NULL) {
- warning("content without src");
+ WARNING("content without src");
errno = EINVAL;
return -1;
}
- desc->content_type = optprop(node, wgt_config_string_type);
- desc->content_encoding = optprop(node, wgt_config_string_encoding);
+ desc->content_type = optprop(node, string_type);
+ desc->content_encoding = optprop(node, string_encoding);
if (want_icons) {
icontail = &desc->icons;
errno = ENOMEM;
return -1;
}
- icon->src = xmlGetProp(node, wgt_config_string_src);
- icon->width = getpropnum(node, wgt_config_string_width, 0);
- icon->height = getpropnum(node, wgt_config_string_height, 0);
+ icon->src = xmlGetProp(node, string_src);
+ icon->width = getpropnum(node, string_width, 0);
+ icon->height = getpropnum(node, string_height, 0);
icon->next = NULL;
*icontail = icon;
if (icon->src == NULL) {
- warning("icon without src");
+ WARNING("icon without src");
errno = EINVAL;
return -1;
}
errno = ENOMEM;
return -1;
}
- feature->name = xmlGetProp(node, wgt_config_string_name);
- feature->required = getpropbool(node, wgt_config_string_required, 1);
+ feature->name = xmlGetProp(node, string_name);
+ feature->required = getpropbool(node, string_required, 1);
feature->params = NULL;
feature->next = NULL;
*featuretail = feature;
if (feature->name == NULL) {
- warning("feature without name");
+ WARNING("feature without name");
errno = EINVAL;
return -1;
}
errno = ENOMEM;
return -1;
}
- param->name = xmlGetProp(pnode, wgt_config_string_name);
- param->value = xmlGetProp(pnode, wgt_config_string_value);
+ param->name = xmlGetProp(pnode, string_name);
+ param->value = xmlGetProp(pnode, string_value);
param->next = NULL;
*paramtail = param;
if (param->name == NULL || param->value == NULL) {
- warning("param without name or value");
+ WARNING("param without name or value");
errno = EINVAL;
return -1;
}
errno = ENOMEM;
return -1;
}
- preference->name = xmlGetProp(node, wgt_config_string_name);
- preference->value = xmlGetProp(node, wgt_config_string_value);
- preference->readonly = getpropbool(node, wgt_config_string_readonly, 0);
+ preference->name = xmlGetProp(node, string_name);
+ preference->value = xmlGetProp(node, string_value);
+ preference->readonly = getpropbool(node, string_readonly, 0);
*preferencetail = preference;
preference->next = NULL;
if (preference->name == NULL) {
- warning("preference without name");
+ WARNING("preference without name");
errno = EINVAL;
return -1;
}
xmlFree(desc->id);
xmlFree(desc->version);
+ free(desc->ver);
+ free(desc->idaver);
xmlFree(desc->viewmodes);
xmlFree(desc->defaultlocale);
xmlFree(desc->name);
struct wgt_desc_param *param;
if (desc->id) fprintf(f, "%sid: %s\n", prefix, desc->id);
+ if (desc->version) fprintf(f, "%sversion: %s\n", prefix, desc->version);
+ if (desc->ver) fprintf(f, "%sver: %s\n", prefix, desc->ver);
+ if (desc->idaver) fprintf(f, "%sidaver: %s\n", prefix, desc->idaver);
if (desc->width) fprintf(f, "%swidth: %d\n", prefix, desc->width);
if (desc->height) fprintf(f, "%sheight: %d\n", prefix, desc->height);
- if (desc->version) fprintf(f, "%sversion: %s\n", prefix, desc->version);
if (desc->viewmodes) fprintf(f, "%sviewmodes: %s\n", prefix, desc->viewmodes);
if (desc->defaultlocale) fprintf(f, "%sdefaultlocale: %s\n", prefix, desc->defaultlocale);
if (desc->name) fprintf(f, "%sname: %s\n", prefix, desc->name);
}
}
-struct wgt_info *wgt_info_get(struct wgt *wgt, int icons, int features, int preferences)
+struct wgt_info *wgt_info_create(struct wgt *wgt, int icons, int features, int preferences)
{
int rc;
struct wgt_info *result;
return result;
}
+struct wgt_info *wgt_info_createat(int dirfd, const char *pathname, int icons, int features, int preferences)
+{
+ struct wgt_info *result = NULL;
+ struct wgt *wgt = wgt_createat(dirfd, pathname);
+ if (wgt) {
+ result = wgt_info_create(wgt, icons, features, preferences);
+ wgt_unref(wgt);
+ }
+ return result;
+}
+
const struct wgt_desc *wgt_info_desc(struct wgt_info *ifo)
{
+ assert(ifo);
return &ifo->desc;
}
+struct wgt *wgt_info_wgt(struct wgt_info *ifo)
+{
+ assert(ifo);
+ assert(ifo->wgt);
+ return ifo->wgt;
+}
+
void wgt_info_addref(struct wgt_info *ifo)
{
assert(ifo);
assert(ifo);
f = fdopen(fd, "w");
if (f == NULL)
- warning("can't fdopen in wgt_info_dump");
+ WARNING("can't fdopen in wgt_info_dump");
else {
dump_desc(&ifo->desc, f, prefix);
fclose(f);
}
}
+const struct wgt_desc_feature *wgt_info_feature(struct wgt_info *ifo, const char *name)
+{
+ const struct wgt_desc_feature *result = ifo->desc.features;
+ while(result && strcmp(result->name, name))
+ result = result->next;
+ return result;
+}
+
+const char *wgt_info_param(const struct wgt_desc_feature *feature, const char *name)
+{
+ const struct wgt_desc_param *param = feature->params;
+ while(param) {
+ if (0 == strcmp(name, param->name))
+ return param->value;
+ param = param->next;
+ }
+ return NULL;
+}
+