X-Git-Url: https://gerrit.automotivelinux.org/gerrit/gitweb?a=blobdiff_plain;f=src%2Fwgt-info.c;h=9ff7766c5c51701de18bcda1287fe418f740a25c;hb=3a6e947bef1b2942e24d2fdee1a76dbf3305b508;hp=ddecb9a785e3795cbdf3bd9133d880baf6e19bd4;hpb=34fc3d39e4038b72513db2fc35077251f1f15d01;p=src%2Fapp-framework-main.git diff --git a/src/wgt-info.c b/src/wgt-info.c index ddecb9a..9ff7766 100644 --- a/src/wgt-info.c +++ b/src/wgt-info.c @@ -1,5 +1,7 @@ /* - Copyright 2015 IoT.bzh + Copyright 2015, 2016, 2017 IoT.bzh + + author: José Bollo Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -18,7 +20,8 @@ #include #include #include -#include +#include + #include #include "verbose.h" @@ -73,6 +76,58 @@ static xmlChar *optcontent(xmlNodePtr node) 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; @@ -83,12 +138,16 @@ static int fill_desc(struct wgt_desc *desc, int want_icons, int want_features, i node = wgt_config_widget(); if (!node) { - warning("no widget"); + WARNING("no widget"); errno = EINVAL; return -1; } desc->id = xmlGetProp(node, wgt_config_string_id); + make_lowercase(desc->id); desc->version = xmlGetProp(node, wgt_config_string_version); + desc->ver = mkver(desc->version); + make_lowercase(desc->ver); + desc->idaver = mkidaver(desc->id, desc->ver); 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); @@ -113,7 +172,7 @@ static int fill_desc(struct wgt_desc *desc, int want_icons, int want_features, i node = wgt_config_content(); desc->content_src = optprop(node, wgt_config_string_src); if (node && desc->content_src == NULL) { - warning("content without src"); + WARNING("content without src"); errno = EINVAL; return -1; } @@ -137,7 +196,7 @@ static int fill_desc(struct wgt_desc *desc, int want_icons, int want_features, i *icontail = icon; if (icon->src == NULL) { - warning("icon without src"); + WARNING("icon without src"); errno = EINVAL; return -1; } @@ -163,7 +222,7 @@ static int fill_desc(struct wgt_desc *desc, int want_icons, int want_features, i *featuretail = feature; if (feature->name == NULL) { - warning("feature without name"); + WARNING("feature without name"); errno = EINVAL; return -1; } @@ -183,7 +242,7 @@ static int fill_desc(struct wgt_desc *desc, int want_icons, int want_features, i *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; } @@ -214,7 +273,7 @@ static int fill_desc(struct wgt_desc *desc, int want_icons, int want_features, i preference->next = NULL; if (preference->name == NULL) { - warning("preference without name"); + WARNING("preference without name"); errno = EINVAL; return -1; } @@ -235,6 +294,8 @@ static void free_desc(struct wgt_desc *desc) xmlFree(desc->id); xmlFree(desc->version); + free(desc->ver); + free(desc->idaver); xmlFree(desc->viewmodes); xmlFree(desc->defaultlocale); xmlFree(desc->name); @@ -287,9 +348,11 @@ static void dump_desc(struct wgt_desc *desc, FILE *f, const char *prefix) 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); @@ -334,7 +397,7 @@ static void dump_desc(struct wgt_desc *desc, FILE *f, const char *prefix) } } -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; @@ -366,11 +429,30 @@ struct wgt_info *wgt_info_get(struct wgt *wgt, int icons, int features, int pref 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); @@ -397,10 +479,28 @@ void wgt_info_dump(struct wgt_info *ifo, int fd, const char *prefix) 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; + } + return NULL; +} +