X-Git-Url: https://gerrit.automotivelinux.org/gerrit/gitweb?a=blobdiff_plain;f=src%2Fwgt-info.c;h=ade3830a226ad359af425a3daf24d727e2dfe6dc;hb=a855d14583b2ac2629dfac696fea788826bacc4d;hp=1dbc147586e417f16123c5b75824f2c8e32859d6;hpb=f3d64b7c741677cd28e2a11deed67196cd02b46a;p=src%2Fapp-framework-main.git diff --git a/src/wgt-info.c b/src/wgt-info.c index 1dbc147..ade3830 100644 --- a/src/wgt-info.c +++ b/src/wgt-info.c @@ -1,5 +1,7 @@ /* - Copyright 2015 IoT.bzh + Copyright (C) 2015-2020 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,14 +20,22 @@ #include #include #include -#include +#include + #include #include "verbose.h" #include "wgt.h" #include "wgt-config.h" +#include "wgt-strings.h" #include "wgt-info.h" +struct wgt_info { + int refcount; + struct wgt *wgt; + struct wgt_desc desc; +}; + static int getpropbool(xmlNodePtr node, const char *prop, int def) { int result; @@ -67,55 +77,115 @@ static xmlChar *optcontent(xmlNodePtr node) return node ? xmlNodeGetContent(node) : NULL; } -static int fill_info(struct wgt_info *ifo, int want_icons, int want_features, int want_preferences) +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) +{ +#if DISTINCT_VERSIONS + 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; +#else + return strdup(id); +#endif +} + +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; - struct wgt_info_icon *icon, **icontail; - struct wgt_info_feature *feature, **featuretail; - struct wgt_info_preference *preference, **preferencetail; - struct wgt_info_param *param, **paramtail; + struct wgt_desc_icon *icon, **icontail; + struct wgt_desc_feature *feature, **featuretail; + struct wgt_desc_preference *preference, **preferencetail; + struct wgt_desc_param *param, **paramtail; node = wgt_config_widget(); if (!node) { - warning("no widget"); + WARNING("no widget"); errno = EINVAL; return -1; } - ifo->id = xmlGetProp(node, wgt_config_string_id); - ifo->version = xmlGetProp(node, wgt_config_string_version); - ifo->width = getpropnum(node, wgt_config_string_width, 0); - ifo->height = getpropnum(node, wgt_config_string_height, 0); - ifo->viewmodes = xmlGetProp(node, wgt_config_string_viewmodes); - ifo->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(); - ifo->name = optcontent(node); - ifo->name_short = optprop(node, wgt_config_string_short); + desc->name = optcontent(node); + desc->name_short = optprop(node, string_short); node = wgt_config_description(); - ifo->description = optcontent(node); + desc->description = optcontent(node); node = wgt_config_author(); - ifo->author = optcontent(node); - ifo->author_href = optprop(node, wgt_config_string_href); - ifo->author_email = optprop(node, wgt_config_string_email); + desc->author = optcontent(node); + desc->author_href = optprop(node, string_href); + desc->author_email = optprop(node, string_email); node = wgt_config_license(); - ifo->license = optcontent(node); - ifo->license_href = optprop(node, wgt_config_string_href); + desc->license = optcontent(node); + desc->license_href = optprop(node, string_href); node = wgt_config_content(); - ifo->content_src = optprop(node, wgt_config_string_src); - if (node && ifo->content_src == NULL) { - warning("content without src"); + desc->content_src = optprop(node, string_src); + if (node && desc->content_src == NULL) { + WARNING("content without src"); errno = EINVAL; return -1; } - ifo->content_type = optprop(node, wgt_config_string_type); - ifo->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 = &ifo->icons; + icontail = &desc->icons; node = wgt_config_first_icon(); while (node) { icon = malloc(sizeof * icon); @@ -123,15 +193,15 @@ static int fill_info(struct wgt_info *ifo, int want_icons, int want_features, in 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; } @@ -141,7 +211,7 @@ static int fill_info(struct wgt_info *ifo, int want_icons, int want_features, in } if (want_features) { - featuretail = &ifo->features; + featuretail = &desc->features; node = wgt_config_first_feature(); while (node) { feature = malloc(sizeof * feature); @@ -149,14 +219,15 @@ static int fill_info(struct wgt_info *ifo, int want_icons, int want_features, in 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; } @@ -169,14 +240,14 @@ static int fill_info(struct wgt_info *ifo, int want_icons, int want_features, in 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; } @@ -191,7 +262,7 @@ static int fill_info(struct wgt_info *ifo, int want_icons, int want_features, in } if (want_preferences) { - preferencetail = &ifo->preferences; + preferencetail = &desc->preferences; node = wgt_config_first_preference(); while (node) { preference = malloc(sizeof * preference); @@ -199,15 +270,15 @@ static int fill_info(struct wgt_info *ifo, int want_icons, int want_features, in 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; } @@ -219,7 +290,119 @@ static int fill_info(struct wgt_info *ifo, int want_icons, int want_features, in return 0; } -struct wgt_info *wgt_info_get(struct wgt *wgt, int icons, int features, int preferences) +static void free_desc(struct wgt_desc *desc) +{ + struct wgt_desc_icon *icon; + struct wgt_desc_feature *feature; + struct wgt_desc_preference *preference; + struct wgt_desc_param *param; + + xmlFree(desc->id); + xmlFree(desc->version); + free(desc->ver); + free(desc->idaver); + xmlFree(desc->viewmodes); + xmlFree(desc->defaultlocale); + xmlFree(desc->name); + xmlFree(desc->name_short); + xmlFree(desc->description); + xmlFree(desc->author); + xmlFree(desc->author_href); + xmlFree(desc->author_email); + xmlFree(desc->license); + xmlFree(desc->license_href); + xmlFree(desc->content_src); + xmlFree(desc->content_type); + xmlFree(desc->content_encoding); + + while(desc->icons) { + icon = desc->icons; + desc->icons = icon->next; + xmlFree(icon->src); + free(icon); + } + + while(desc->features) { + feature = desc->features; + desc->features = feature->next; + xmlFree(feature->name); + while(feature->params) { + param = feature->params; + feature->params = param->next; + xmlFree(param->name); + xmlFree(param->value); + free(param); + } + free(feature); + } + + while(desc->preferences) { + preference = desc->preferences; + desc->preferences = preference->next; + xmlFree(preference->name); + xmlFree(preference->value); + free(preference); + } +} + +static void dump_desc(struct wgt_desc *desc, FILE *f, const char *prefix) +{ + struct wgt_desc_icon *icon; + struct wgt_desc_feature *feature; + struct wgt_desc_preference *preference; + 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->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); + if (desc->name_short) fprintf(f, "%sname_short: %s\n", prefix, desc->name_short); + if (desc->description) fprintf(f, "%sdescription: %s\n", prefix, desc->description); + if (desc->author) fprintf(f, "%sauthor: %s\n", prefix, desc->author); + if (desc->author_href) fprintf(f, "%sauthor_href: %s\n", prefix, desc->author_href); + if (desc->author_email) fprintf(f, "%sauthor_email: %s\n", prefix, desc->author_email); + if (desc->license) fprintf(f, "%slicense: %s\n", prefix, desc->license); + if (desc->license_href) fprintf(f, "%slicense_href: %s\n", prefix, desc->license_href); + if (desc->content_src) fprintf(f, "%scontent_src: %s\n", prefix, desc->content_src); + if (desc->content_type) fprintf(f, "%scontent_type: %s\n", prefix, desc->content_type); + if (desc->content_encoding) fprintf(f, "%scontent_encoding: %s\n", prefix, desc->content_encoding); + + icon = desc->icons; + while(icon) { + fprintf(f, "%s+ icon src: %s\n", prefix, icon->src); + if (icon->width) fprintf(f, "%s width: %d\n", prefix, icon->width); + if (icon->height) fprintf(f, "%s height: %d\n", prefix, icon->height); + icon = icon->next; + } + + feature = desc->features; + while(feature) { + fprintf(f, "%s+ feature name: %s\n", prefix, feature->name); + fprintf(f, "%s required: %s\n", prefix, feature->required ? "true" : "false"); + param = feature->params; + while(param) { + fprintf(f, "%s + param name: %s\n", prefix, param->name); + fprintf(f, "%s value: %s\n", prefix, param->value); + param = param->next; + } + feature = feature->next; + } + + preference = desc->preferences; + while(preference) { + fprintf(f, "%s+ preference name: %s\n", prefix, preference->name); + if (preference->value) fprintf(f, "%s value: %s\n", prefix, preference->value); + fprintf(f, "%s readonly: %s\n", prefix, preference->readonly ? "true" : "false"); + preference = preference->next; + } +} + +struct wgt_info *wgt_info_create(struct wgt *wgt, int icons, int features, int preferences) { int rc; struct wgt_info *result; @@ -239,8 +422,10 @@ struct wgt_info *wgt_info_get(struct wgt *wgt, int icons, int features, int pref return NULL; } result->refcount = 1; + result->wgt = wgt; + wgt_addref(wgt); - rc = fill_info(result, icons, features, preferences); + rc = fill_desc(&result->desc, icons, features, preferences); wgt_config_close(); if (rc) { wgt_info_unref(result); @@ -249,6 +434,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); @@ -258,125 +467,46 @@ void wgt_info_addref(struct wgt_info *ifo) void wgt_info_unref(struct wgt_info *ifo) { - struct wgt_info_icon *icon; - struct wgt_info_feature *feature; - struct wgt_info_preference *preference; - struct wgt_info_param *param; - assert(ifo); assert(ifo->refcount > 0); if (--ifo->refcount) return; - xmlFree(ifo->id); - xmlFree(ifo->version); - xmlFree(ifo->viewmodes); - xmlFree(ifo->defaultlocale); - xmlFree(ifo->name); - xmlFree(ifo->name_short); - xmlFree(ifo->description); - xmlFree(ifo->author); - xmlFree(ifo->author_href); - xmlFree(ifo->author_email); - xmlFree(ifo->license); - xmlFree(ifo->license_href); - xmlFree(ifo->content_src); - xmlFree(ifo->content_type); - xmlFree(ifo->content_encoding); - - while(ifo->icons) { - icon = ifo->icons; - ifo->icons = icon->next; - xmlFree(icon->src); - free(icon); - } - - while(ifo->features) { - feature = ifo->features; - ifo->features = feature->next; - xmlFree(feature->name); - while(feature->params) { - param = feature->params; - feature->params = param->next; - xmlFree(param->name); - xmlFree(param->value); - free(param); - } - free(feature); - } - - while(ifo->preferences) { - preference = ifo->preferences; - ifo->preferences = preference->next; - xmlFree(preference->name); - xmlFree(preference->value); - free(preference); - } + free_desc(&ifo->desc); + wgt_unref(ifo->wgt); free(ifo); } void wgt_info_dump(struct wgt_info *ifo, int fd, const char *prefix) { FILE *f; - struct wgt_info_icon *icon; - struct wgt_info_feature *feature; - struct wgt_info_preference *preference; - struct wgt_info_param *param; assert(ifo); f = fdopen(fd, "w"); - if (f == NULL) { - warning("can't fdopen in wgt_info_dump"); - return; - } - - if (ifo->id) fprintf(f, "%sid: %s\n", prefix, ifo->id); - if (ifo->width) fprintf(f, "%swidth: %d\n", prefix, ifo->width); - if (ifo->height) fprintf(f, "%sheight: %d\n", prefix, ifo->height); - if (ifo->version) fprintf(f, "%sversion: %s\n", prefix, ifo->version); - if (ifo->viewmodes) fprintf(f, "%sviewmodes: %s\n", prefix, ifo->viewmodes); - if (ifo->defaultlocale) fprintf(f, "%sdefaultlocale: %s\n", prefix, ifo->defaultlocale); - if (ifo->name) fprintf(f, "%sname: %s\n", prefix, ifo->name); - if (ifo->name_short) fprintf(f, "%sname_short: %s\n", prefix, ifo->name_short); - if (ifo->description) fprintf(f, "%sdescription: %s\n", prefix, ifo->description); - if (ifo->author) fprintf(f, "%sauthor: %s\n", prefix, ifo->author); - if (ifo->author_href) fprintf(f, "%sauthor_href: %s\n", prefix, ifo->author_href); - if (ifo->author_email) fprintf(f, "%sauthor_email: %s\n", prefix, ifo->author_email); - if (ifo->license) fprintf(f, "%slicense: %s\n", prefix, ifo->license); - if (ifo->license_href) fprintf(f, "%slicense_href: %s\n", prefix, ifo->license_href); - if (ifo->content_src) fprintf(f, "%scontent_src: %s\n", prefix, ifo->content_src); - if (ifo->content_type) fprintf(f, "%scontent_type: %s\n", prefix, ifo->content_type); - if (ifo->content_encoding) fprintf(f, "%scontent_encoding: %s\n", prefix, ifo->content_encoding); - - icon = ifo->icons; - while(icon) { - fprintf(f, "%s+ icon src: %s\n", prefix, icon->src); - if (icon->width) fprintf(f, "%s width: %d\n", prefix, icon->width); - if (icon->height) fprintf(f, "%s height: %d\n", prefix, icon->height); - icon = icon->next; + if (f == NULL) + WARNING("can't fdopen in wgt_info_dump"); + else { + dump_desc(&ifo->desc, f, prefix); + fclose(f); } +} - feature = ifo->features; - while(feature) { - fprintf(f, "%s+ feature name: %s\n", prefix, feature->name); - fprintf(f, "%s required: %s\n", prefix, feature->required ? "true" : "false"); - param = feature->params; - while(param) { - fprintf(f, "%s + param name: %s\n", prefix, param->name); - fprintf(f, "%s value: %s\n", prefix, param->value); - param = param->next; - } - feature = feature->next; - } +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; +} - preference = ifo->preferences; - while(preference) { - fprintf(f, "%s+ preference name: %s\n", prefix, preference->name); - if (preference->value) fprintf(f, "%s value: %s\n", prefix, preference->value); - fprintf(f, "%s readonly: %s\n", prefix, preference->readonly ? "true" : "false"); - preference = preference->next; +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; } - - fclose(f); + return NULL; }