From f3181db7c364e4f91d68fb987164402dc33f68ce Mon Sep 17 00:00:00 2001 From: Christian Grothoff Date: Fri, 30 Jul 2021 10:47:14 +0200 Subject: folding history in preparation of GNU Anastasis-gtk v0.0.0 release --- src/anastasis/anastasis-gtk_attributes.c | 247 +++++++++++++++++++++++++++++++ 1 file changed, 247 insertions(+) create mode 100644 src/anastasis/anastasis-gtk_attributes.c (limited to 'src/anastasis/anastasis-gtk_attributes.c') diff --git a/src/anastasis/anastasis-gtk_attributes.c b/src/anastasis/anastasis-gtk_attributes.c new file mode 100644 index 0000000..bbf3621 --- /dev/null +++ b/src/anastasis/anastasis-gtk_attributes.c @@ -0,0 +1,247 @@ +/* + This file is part of anastasis-gtk. + Copyright (C) 2020 Anastasis SARL + + Anastasis is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published + by the Free Software Foundation; either version 3, or (at your + option) any later version. + + Anastasis is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Anastasis; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. +*/ +/** + * @file src/anastasis/anastasis-gtk_handle-identity-changed.c + * @brief + * @author Christian Grothoff + * @author Dennis Neufeld + */ +#include +#include +#include "anastasis-gtk_helper.h" +#include "anastasis-gtk_action.h" +#include "anastasis-gtk_attributes.h" + + +static json_t * +extract_entry (GtkWidget *entry) +{ + const gchar *txt; + + txt = gtk_entry_get_text (GTK_ENTRY (entry)); + if ( (NULL == txt) || + (0 == strlen (txt)) ) + return NULL; + return json_string (txt); +} + + +static json_t * +extract_cal (GtkWidget *cal) +{ + guint day = 0; + guint month = 0; + guint year = 0; + char txt[12]; + + gtk_calendar_get_date (GTK_CALENDAR (cal), + &year, + &month, + &day); + if (! (day && month && day)) + return NULL; + GNUNET_snprintf (txt, + sizeof (txt), + "%04u-%02u-%02u", + (unsigned int) year, + (unsigned int) month, + (unsigned int) day); + return json_string (txt); +} + + +json_t * +AG_collect_attributes (bool partial) +{ + static struct + { + const char *type; + json_t * (*extract)(GtkWidget *w); + } e_map [] = { + { .type = "string", + .extract = &extract_entry }, + { .type = "date", + .extract = &extract_cal }, + { .type = NULL, + .extract = NULL } + }; + const json_t *id_attributes; + json_t *result; + size_t index; + json_t *id_attr; + + id_attributes = json_object_get (AG_redux_state, + "required_attributes"); + GNUNET_assert (NULL != id_attributes); + result = json_object (); + GNUNET_assert (NULL != result); + json_array_foreach (id_attributes, index, id_attr) + { + json_t *val = NULL; + GtkWidget *w; + const char *attr_name; + const char *attr_type; + const char *attr_uuid; + int optional = false; + struct GNUNET_JSON_Specification spec[] = { + GNUNET_JSON_spec_mark_optional ( + GNUNET_JSON_spec_boolean ("optional", + &optional)), + GNUNET_JSON_spec_string ("type", + &attr_type), + GNUNET_JSON_spec_string ("name", + &attr_name), + GNUNET_JSON_spec_string ("uuid", + &attr_uuid), + GNUNET_JSON_spec_end () + }; + struct GNUNET_HashCode uh; + + GNUNET_assert (GNUNET_OK == + GNUNET_JSON_parse (id_attr, + spec, + NULL, NULL)); + GNUNET_CRYPTO_hash (attr_uuid, + strlen (attr_uuid), + &uh); + w = GNUNET_CONTAINER_multihashmap_get (AG_entry_attributes, + &uh); + if (NULL == w) + { + if (partial) + continue; + json_decref (result); + return NULL; + } + for (unsigned int i = 0; NULL != e_map[i].type; i++) + { + if (0 != strcmp (e_map[i].type, + attr_type)) + continue; + val = e_map[i].extract (w); + break; + } + if (NULL == val) + { + if (partial) + continue; + if (optional) + continue; + json_decref (result); + return NULL; + } + GNUNET_assert (0 == + json_object_set_new (result, + attr_name, + val)); + } + return json_pack ("{s:o}", + "identity_attributes", + result); +} + + +/** + * Import string value into a GtkEntry. + * + * @param w should be a GtkEntry + * @param value should be a string value + */ +static void +import_entry (GtkWidget *w, + const json_t *value) +{ + GNUNET_break (json_is_string (value)); + gtk_entry_set_text (GTK_ENTRY (w), + json_string_value (value)); +} + + +/** + * Import date value into a GtkCalendar. + * + * @param w should be a GtkCalendar + * @param value should be a date value + */ +static void +import_cal (GtkWidget *w, + const json_t *value) +{ + const char *s; + guint day; + guint month; + guint year; + char dummy; + + s = json_string_value (value); + if (NULL == s) + { + GNUNET_break (0); + return; + } + if (3 != + sscanf (s, + "%04u-%02u-%02u%c", + &year, + &month, + &day, + &dummy)) + { + GNUNET_break (0); + return; + } + gtk_calendar_select_day (GTK_CALENDAR (w), + day); + gtk_calendar_select_month (GTK_CALENDAR (w), + month, + year); +} + + +void +AG_import_attribute_data (GtkWidget *w, + const char *type, + const json_t *value) +{ + static struct + { + const char *type; + void (*import)(GtkWidget *w, + const json_t *value); + } i_map [] = { + { .type = "string", + .import = &import_entry }, + { .type = "date", + .import = &import_cal }, + { .type = NULL, + .import = NULL } + }; + + for (unsigned int i = 0; NULL != i_map[i].type; i++) + { + if (0 != strcmp (i_map[i].type, + type)) + continue; + i_map[i].import (w, + value); + return; + } + +} -- cgit v1.2.3