+ int result;
+
+ result = check_valid_string(desc->id, "id");
+ result |= check_valid_string(desc->version, "version");
+ result |= check_valid_string(desc->ver, "ver");
+ result |= check_defined(desc->content_src, "content");
+ if (desc->icons)
+ result |= check_defined(desc->icons->src, "icon.src");
+ if (result)
+ return result;
+
+ if (desc->icons && desc->icons->next) {
+ ERROR("widget has more than one icon defined (temporary constraints)");
+ errno = EINVAL;
+ result = -1;
+ }
+ return 0;
+}
+
+static int set_required_permissions(struct wgt_desc_param *params, int required)
+{
+ int optional;
+
+ while (params) {
+ /* check if target */
+ if (!strcmp(params->name, string_sharp_target)) {
+ /* do nothing when #target */
+ } else {
+ /* check the value */
+ if (!strcmp(params->value, string_required))
+ optional = !required;
+ else if (!strcmp(params->value, string_optional))
+ optional = 1;
+ else {
+ ERROR("unexpected parameter value: %s found for %s", params->value, params->name);
+ errno = EPERM;
+ return -1;
+ }
+ /* set the permission */
+ if (request_permission(params->name)) {
+ DEBUG("granted permission: %s", params->name);
+ } else if (optional) {
+ INFO("optional permission ungranted: %s", params->name);
+ } else {
+ ERROR("ungranted permission required: %s", params->name);
+ errno = EPERM;
+ return -1;
+ }