taler-mdb

GNU Taler Extensions and Integrations
Log | Files | Refs | Submodules | README | LICENSE

commit 3e131ed22a9e809e8a7ba79e853bef83fab3823f
parent b7ba7232787dd53cce413db937be744e1320534a
Author: Boss Marco <bossm8@students.bfh.ch>
Date:   Mon, 11 Nov 2019 17:53:39 +0100

first steps in configurable products

Diffstat:
Msrc/main.c | 135++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-------------------
Mtaler.conf | 27+++++++++++++++++++++++++++
2 files changed, 130 insertions(+), 32 deletions(-)

diff --git a/src/main.c b/src/main.c @@ -19,7 +19,7 @@ along with /** * @file main.c * @brief main functionality of the application -* @author BOSS Marco +* @author Boss Marco * @author Christian Grothoff */ #include <stdio.h> @@ -42,7 +42,7 @@ along with #define NFC_TIMEOUT 500 #define MAX_HTTP_RETRY_FREQ GNUNET_TIME_relative_multiply ( \ - GNUNET_TIME_UNIT_MILLISECONDS, 500) + GNUNET_TIME_UNIT_MILLISECONDS, 500) /** * Code returned by libnfc in case of success. @@ -77,8 +77,9 @@ static const uint8_t get_data[] = { 0x00, 0xCA, 0x01, 0x00, 0x00, 0x00 }; struct Product { - const char *price; - const char *description; + char *price; + char *description; + char *number; char key; }; @@ -104,6 +105,7 @@ struct PaymentActivity int wallet_has_uri; }; +static size_t NrOfProducts; static nfc_context *context; @@ -127,29 +129,7 @@ static char *authorization; static struct PaymentActivity *payment_activity; - -/** - * FIXME: read from configuration file instead! - * GNUNET_CONFIGURATION_* iteration over values. - */ -static struct Product products[] = { - { - .price = "0.1", - .description = "Snickers", - .key = 's' - }, - { - .price = "0.1", - .description = "Twix", - .key = 't' - }, - { - .price = NULL, - .description = NULL, - .key = '\0' - } -}; - +static struct Product *products; static void SNACK_print_hex_info (const char*message, @@ -225,6 +205,15 @@ shutdown_task (void *cls) GNUNET_CURL_gnunet_rc_destroy (rc); rc = NULL; } + if (NULL != products) + { + for (unsigned int i = 0; NrOfProducts > i; i++) + { + GNUNET_free(products[i].description); + GNUNET_free(products[i].price); + GNUNET_free(products[i].number); + } + } GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Shutdown complete\n"); } @@ -275,7 +264,7 @@ wallet_transmit_uri (void *cls) GNUNET_log (GNUNET_ERROR_TYPE_WARNING, "'PUT DATA' command transmission failed, return code: %x%x\n", response[0], - response[1]); + response[1]); pa->task = GNUNET_SCHEDULER_add_now (&connect_target, pa); return; @@ -339,7 +328,7 @@ wallet_select_aid (void *cls) GNUNET_log (GNUNET_ERROR_TYPE_WARNING, "AID selection failure, return code: %x%x, trying to find another NFC client\n", response[0], - response[1]); + response[1]); pa->task = GNUNET_SCHEDULER_add_delayed (NFC_FAILURE_RETRY_FREQ, &connect_target, pa); @@ -642,7 +631,7 @@ read_keyboard_command (void *cls) start_read_keyboard (); return; } - for (unsigned int i = 0; NULL != products[i].price; i++) + for (unsigned int i = 0; NrOfProducts > i; i++) if (((char) input) == products[i].key) { payment_activity = launch_payment (&products[i]); @@ -655,14 +644,13 @@ read_keyboard_command (void *cls) start_read_keyboard (); } - static void start_read_keyboard () { struct GNUNET_DISK_FileHandle fh = { STDIN_FILENO }; GNUNET_assert (NULL == keyboard_task); - for (unsigned int i = 0; NULL != products[i].price; i++) + for (unsigned int i = 0; NrOfProducts > i; i++) printf ("'%c' to buy %s\n", products[i].key, products[i].description); @@ -674,6 +662,85 @@ start_read_keyboard () NULL); } +static void +read_products (void* cls, + const char *section) +{ + struct Product tmpProduct; + char* tmpKey; + + if(0 == strncmp(section, + "product", + strlen("product"))) + { + if (GNUNET_OK != + GNUNET_CONFIGURATION_get_value_string (cls, + section, + "description", + &tmpProduct.description)) + { + GNUNET_log_config_missing (GNUNET_ERROR_TYPE_ERROR, + section, + "description"); + return; + } + if (GNUNET_OK != + GNUNET_CONFIGURATION_get_value_string (cls, + section, + "price", + &tmpProduct.price)) + { + GNUNET_log_config_missing (GNUNET_ERROR_TYPE_ERROR, + section, + "price"); + return; + } + if (GNUNET_OK != + GNUNET_CONFIGURATION_get_value_string (cls, + section, + "key", + &tmpKey)) + { + GNUNET_log_config_missing (GNUNET_ERROR_TYPE_ERROR, + section, + "key"); + return; + } + tmpProduct.key = tmpKey[0]; + GNUNET_free(tmpKey); + if (GNUNET_OK != + GNUNET_CONFIGURATION_get_value_string (cls, + section, + "number", + &tmpProduct.number)) + { + GNUNET_log_config_missing (GNUNET_ERROR_TYPE_ERROR, + section, + "number"); + return; + } + NrOfProducts++; + if(NULL == products) + /*products = GNUNET_new_array(1, + sizeof(struct Product)); */ + products = GNUNET_new(struct Product); + else + /*GNUNET_array_grow(products, + sizeof(products), + sizeof(products)+sizeof(struct Product)); NOT WORKING ? */ + products = GNUNET_realloc(products, + NrOfProducts*sizeof(struct Product)); + + products[NrOfProducts-1].description = GNUNET_strdup(tmpProduct.description); + GNUNET_free(tmpProduct.description); + products[NrOfProducts-1].price = GNUNET_strdup(tmpProduct.price); + GNUNET_free(tmpProduct.price); + products[NrOfProducts-1].number = GNUNET_strdup(tmpProduct.number); + GNUNET_free(tmpProduct.number); + products[NrOfProducts-1].key = tmpProduct.key; + + } +} static void run (void *cls, @@ -753,6 +820,10 @@ run (void *cls, global_ret = EXIT_FAILURE; return; } + GNUNET_CONFIGURATION_iterate_sections(cfg, + &read_products, + (void*)cfg); + GNUNET_assert(NULL != products); GNUNET_SCHEDULER_add_shutdown (&shutdown_task, NULL); diff --git a/taler.conf b/taler.conf @@ -12,3 +12,30 @@ fulfillment-url = taler://fulfillment-success # will be concatenated with product # must be url - utf8 encoded fulfillment-msg = /Enjoy+your+ + +#Products +#end declaration +[product_3] +description = KitKat +price = 0.1 +key = k +number = 4 +[product_2] +description = Mars +price = 0.1 +key = m +number = 3 +#twix +[product_1] +description = Twix +price = 0.1 +key = t +number = 2 +#snickers +[product_0] +description = Snickers +price = 0.1 +key = s +number = 1 + +