cash2ecash

cash2ecash: cash acceptor that issues digital cash (experimental)
Log | Files | Refs | Submodules | README | LICENSE

commit 0fa8927937997f9b836b3ea0902ab14bee65b795
parent d633387c68d7db430d39cfa34fb1b9006a38db20
Author: Manuel Geissbühler <manuel@debian>
Date:   Wed,  1 Jan 2025 20:51:50 +0100

draft of bank communication ready for testing

Diffstat:
Msrc/bank/bankCommunication.hpp | 50++++++++++++++++++++++++++++++++++++++++++++++++--
Msrc/bank/bank_lib.c | 75+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++----------------
Msrc/bank/bank_lib.h | 15++++++++++-----
Msrc/cash2ecash.cpp | 35++++++++++++++++++++---------------
Msrc/gui/screenConnection.hpp | 2+-
Msrc/include/bank.hpp | 2+-
Msrc/include/global.hpp | 2+-
7 files changed, 140 insertions(+), 41 deletions(-)

diff --git a/src/bank/bankCommunication.hpp b/src/bank/bankCommunication.hpp @@ -1,14 +1,60 @@ #ifndef BANK_COMMUNICATION_H #define BANK_COMMUNICATION_H -#include "taler_bank_service_cash2ecash.h" +#include "bank_lib.h" +#include "global.hpp" +#include <cstdlib> +#include <cstring> +#include <iostream> +#include <ostream> class BankCommunication{ private: + + static const char **status; + + static void initCallback(){ + eventHandler(EVENT_BANK_TOKEN_DONE); + } + + static void withdrawalRequestCallback(){ + eventHandler(EVENT_BANK_WITHDRAWAL_DONE); + } + + static void withdrawalConfirmRequestCallback(){ + eventHandler(EVENT_BANK_W_CONFIRMATION_DONE); + } + + static void withdrawalIDInfoRequestCallback(){ + if (0 == strcmp(*status, "pending")){ + eventHandler(EVENT_BANK_W_STATUS_PENDING); + }else if (0 == strcmp(*status, "selected")) { + eventHandler(EVENT_BANK_W_STATUS_SELECTED); + }else if (0 == strcmp(*status, "aborted")) { + eventHandler(EVENT_BUTTON_ABORT); + }else{ + std::cerr << "Unexpected Withdrawal Staus: " << *status << std::endl; + exit(EXIT_FAILURE); + } + } + protected: public: - + void init(){ + bankCommunicationInit(initCallback); + } + + void withdrawalRequest(struct TALER_Amount *amount, struct TALER_Amount *suggestedAmount, const char **res_withdrawal_id, const char **res_taler_withdraw_uri){ + bankCommunicationWithdrawalRequest(amount, suggestedAmount, res_withdrawal_id, res_taler_withdraw_uri, withdrawalRequestCallback); + } + + void withdrawalConfirmReques(const char *withdrawal_id, struct TALER_Amount *amount){ + bankCommunicationWithdrawalConfirmRequest(withdrawal_id, amount, withdrawalConfirmRequestCallback); + } + void withrawalStatusRequest(const char *withdrawal_id){ + bankCommunicationWithdrawalIDInfoRequest(withdrawal_id, status, withdrawalIDInfoRequestCallback); + } }; #endif diff --git a/src/bank/bank_lib.c b/src/bank/bank_lib.c @@ -1,4 +1,3 @@ -#include <string.h> #include <taler/taler_bank_service.h> #include <taler/taler_util.h> #include <gnunet/gnunet_common.h> @@ -7,6 +6,9 @@ #include <gnunet/gnunet_curl_lib.h> #include <gnunet/gnunet_util_lib.h> #include "taler_bank_service_cash2ecash.h" + + + #include "bank_lib.h" char *programname = "cash2ecash"; @@ -25,24 +27,31 @@ static struct TALER_BANK_WithdrawalIDInfoHandle *awih; // static const char *taler_withdraw_uri; /** + *Parameters of Init (Token Request) call. + */ +static bankCommunicationInitCallback_t extInitCallback; + +/** *Parameters of Withdrawal Request call. */ static bankCommunicationWithdrawalCallback_t extWithdrawalCallback; -static struct TALER_Amount parAmount, parSuggestedAmount; +static struct TALER_Amount *parAmount, *parSuggestedAmount; +const char **par_res_withdrawal_id, **par_res_taler_withdraw_uri; /** *Parameters of Withdrawal Confirm Request call. */ -static bankCommunicationWithdrawalConfirmatCallback_t extWithdrawalConfirmCallback; -static char *parWithdrawal_id; -static struct TALER_Amount parConfirmAmount; +static bankCommunicationWithdrawalConfirmCallback_t extWithdrawalConfirmCallback; +static const char *parWithdrawal_id; +static struct TALER_Amount *parConfirmAmount; /** *Parameters of Withdrawal ID info Request call. */ static bankCommunicationWithdrawalIDInfoCallback_t extWithdrawalIDInfoCallback; -static char *parInfoWithdrawal_id; +static const char *parInfoWithdrawal_id; +const char **par_res_status; /** *Function to do the cleanup @@ -62,6 +71,10 @@ static void do_shutdown(void *cls){ TALER_BANK_account_withdrawal_confirm_cancel(awch); } + if (NULL != awih) { + TALER_BANK_withdrawalID_info_cancel(awih); + } + if (NULL != ctx){ GNUNET_CURL_fini(ctx); } @@ -86,8 +99,10 @@ static void account_withdrawal_cb(void *cls, stderr, JSON_INDENT (2)); - //Call callback with results. - extWithdrawalCallback(awr->details.ok.withdrawal_id, awr->details.ok.taler_withdraw_uri); + //Assign pointer to results and call callback + *par_res_withdrawal_id = awr->details.ok.withdrawal_id; //maybe need to strdup? + *par_res_taler_withdraw_uri = awr->details.ok.taler_withdraw_uri; //maybe need to strdup? + extWithdrawalCallback(); } @@ -115,6 +130,8 @@ static void account_token_cb(void *cls, const struct TALER_BANK_AccountTokenResp stderr, JSON_INDENT (2)); break; + + extInitCallback(); } //Switch Authentification method to Bearer and add Token @@ -184,7 +201,8 @@ static void withdrawalID_info_cb(void *cls, const struct TALER_BANK_WithdrawalID break; } - //Call callback with the results + //Assign pointer to results and call callback + *par_res_status = widr->details.ok.status; //maybe need to strdup? extWithdrawalIDInfoCallback(); GNUNET_SCHEDULER_shutdown(); @@ -239,7 +257,6 @@ static void runToken(void *cls, char *const *args, const char *cfgfile, const st bankCommunicationRunInit(cfg); - //Request an access Token //Make Token request struct GNUNET_TIME_Relative duration = {UINT64_MAX}; ath = TALER_BANK_account_token(ctx, @@ -270,8 +287,8 @@ static void runWithdrawalRequest(void *cls, char *const *args, const char *cfgfi awh = TALER_BANK_account_withdrawal(ctx, &auth, "finsteraarhorn", - &parAmount, - &parSuggestedAmount, + parAmount, + parSuggestedAmount, account_withdrawal_cb, NULL); @@ -295,7 +312,7 @@ static void runWithdrawalConfirmRequest(void *cls, char *const *args, const char &auth, "finsteraarhorn", parWithdrawal_id, - &parConfirmAmount, + parConfirmAmount, account_withdrawal_confirm_cb, NULL); @@ -332,16 +349,42 @@ static void runWithdrawalIDInfoRequest(void *cls, char *const *args, const char *Interface functions */ -void bankCommunicationInit() { bankCommunicationRun(runToken); } - +void bankCommunicationInit(bankCommunicationInitCallback_t callback) { + extInitCallback = callback; + bankCommunicationRun(runToken); +} -void bankCommunicationWithdrawalRequest(struct TALER_Amount amount, struct TALER_Amount suggestedAmount, bankCommunicationWithdrawalCallback_t callback){ +void bankCommunicationWithdrawalRequest(struct TALER_Amount *amount, struct TALER_Amount *suggestedAmount, const char **res_withdrawal_id, const char **res_taler_withdraw_uri, bankCommunicationWithdrawalCallback_t callback){ //Store the parameters globaly extWithdrawalCallback = callback; parAmount = amount; parSuggestedAmount = suggestedAmount; + par_res_withdrawal_id = res_withdrawal_id; + par_res_taler_withdraw_uri = res_taler_withdraw_uri; + //Run request trough gnunet program run bankCommunicationRun(runWithdrawalRequest); } +void bankCommunicationWithdrawalIDInfoRequest(const char *withdrawal_id, const char **res_status, bankCommunicationWithdrawalIDInfoCallback_t callback){ + //Store the parameters globaly + extWithdrawalIDInfoCallback = callback; + parInfoWithdrawal_id = withdrawal_id; + par_res_status = res_status; + + //Run request trough gnunet program run + bankCommunicationRun(runWithdrawalIDInfoRequest); +} + +void bankCommunicatonWithdrawalConfirmRequest(const char *withdrawal_id, struct TALER_Amount *amount, bankCommunicationWithdrawalConfirmCallback_t callback){ + //Store the parameters globaly + extWithdrawalConfirmCallback = callback; + parWithdrawal_id = withdrawal_id; + parConfirmAmount = amount; + + //Run request trough gnunet program run + bankCommunicationRun(runWithdrawalConfirmRequest); +} + + diff --git a/src/bank/bank_lib.h b/src/bank/bank_lib.h @@ -6,15 +6,20 @@ extern "C" #endif +//Allow to directly include amount lib, might lead to other bugs.. +#define __TALER_UTIL_LIB_H_INSIDE__ +#include <taler/taler_amount_lib.h> - -typedef void (*bankCommunicationWithdrawalCallback_t)(const char *withdrawal_id, const char *taler_withdraw_uri); -typedef void (*bankCommunicationWithdrawalConfirmatCallback_t)(); +typedef void (*bankCommunicationInitCallback_t)(); +typedef void (*bankCommunicationWithdrawalCallback_t)(); +typedef void (*bankCommunicationWithdrawalConfirmCallback_t)(); typedef void (*bankCommunicationWithdrawalIDInfoCallback_t)(); -void bankCommunicationInit(); -void bankCommunicationWithdrawalRequest(struct TALER_Amount amount, struct TALER_Amount suggestedAmount, bankCommunicationWithdrawalCallback_t callback); +void bankCommunicationInit(bankCommunicationInitCallback_t callback); +void bankCommunicationWithdrawalRequest(struct TALER_Amount *amount, struct TALER_Amount *suggestedAmount, const char **res_withdrawal_id, const char **res_taler_withdraw_uri, bankCommunicationWithdrawalCallback_t callback); +void bankCommunicationWithdrawalIDInfoRequest(const char *withdrawal_id, const char **res_status, bankCommunicationWithdrawalIDInfoCallback_t callback); +void bankCommunicationWithdrawalConfirmRequest(const char *withdrawal_id, struct TALER_Amount *amount, bankCommunicationWithdrawalConfirmCallback_t callback); diff --git a/src/cash2ecash.cpp b/src/cash2ecash.cpp @@ -4,7 +4,7 @@ #include <ostream> #include <src/misc/lv_types.h> #include <vector> -#include "bank/bank_lib.h" +#include "bank/bankCommunication.hpp" #include "cashacceptors.hpp" #include "gui/screen.hpp" #include "gui/screenAcceptCash.hpp" @@ -31,18 +31,22 @@ enum state_e { enum state_e state = INIT; +const char **withdrawal_id; +const char **taler_withdraw_uri; char hello[] = "hello"; char world[] = "wold"; char *string = hello; Gui gui; +Timer withdrawalStatusTimer; ScreenWelcome *screenWelcome = new ScreenWelcome; ScreenIdentification *screenIdentification = new ScreenIdentification; ScreenConnection *screenConnection = new ScreenConnection; ScreenAcceptCash *screenAcceptCash = new ScreenAcceptCash(string); void guiDriver(); +BankCommunication bankCommunication; typedef void(*action_t)(); @@ -57,13 +61,6 @@ stateEventPair stateEventTable[NUMBER_OF_STATES][NUMBER_OF_EVENTS]; void actionEventInitialize() { std::cout << "Event action initialze called" << std::endl; - //testing - bankCommunicationInit(); - std::cout << "fertig in Main" << std::endl; - - - - //end testing gui.setActiveScreen(screenWelcome); } @@ -97,25 +94,32 @@ void actionEventSleep() { std::cout << "Action Event xx called" << std::endl; } void actionEventWakeup() { std::cout << "Action Event xx called" << std::endl; } void actionEventIdentificationSuccess(){ - std::cout << "Action Event xx called" << std::endl; + std::cout << "Action Event Identification Success called" << std::endl; gui.setActiveScreen(screenConnection); + bankCommunication.init(); } void actionEventBankTokenDone(){ std::cout << "Action Event Bank Token called" << std::endl; + static struct TALER_Amount amountZero; + TALER_amount_set_zero("KUDOS", &amountZero); + bankCommunication.withdrawalRequest(NULL, &amountZero, withdrawal_id, taler_withdraw_uri); } void actionEventBankWithdrawalDone(){ - std::cout << "Action Event Bank Withdrawal called" << std::endl; + std::cout << "Action Event Bank Withdrawal Done called" << std::endl; + screenConnection->generateQR(*taler_withdraw_uri); + bankCommunication.withrawalStatusRequest(*withdrawal_id); } -void actionEventBankWStatusConfirmed(){ +void actionEventBankWStatusSelected(){ std::cout << "Action Event Bank Withdrawal Status Confirmed called" << std::endl; gui.setActiveScreen(screenAcceptCash); } void actionEventBankWStatusPending(){ std::cout << "Action Event Bank Withdrawal Status Pending called" << std::endl; + bankCommunication.withrawalStatusRequest(*withdrawal_id); } void actionEventWConfirmationDone(){ @@ -130,7 +134,9 @@ void actionEventIdentificationTimeout(){ void actionEventAcceptCashTimeout(){ std::cout << "Action Event Acceptcash Timeout called" << std::endl; - gui.setActiveScreen(screenWelcome); + static struct TALER_Amount confirmedAmount; + TALER_string_to_amount("KUDOS:2.0", &confirmedAmount); + bankCommunication.withdrawalConfirmReques(*withdrawal_id, &confirmedAmount); } void actionEventConnectionTimeout(){ @@ -183,8 +189,8 @@ void initStateEvent(){ stateEventTable[CONNECTION][EVENT_BANK_WITHDRAWAL_DONE].nextState = CONNECTION; stateEventTable[CONNECTION][EVENT_BANK_W_STATUS_PENDING].action = actionEventBankWStatusPending; stateEventTable[CONNECTION][EVENT_BANK_W_STATUS_PENDING].nextState = CONNECTION; - stateEventTable[CONNECTION][EVENT_BANK_W_STATUS_CONFIRMED].action = actionEventBankWStatusConfirmed; - stateEventTable[CONNECTION][EVENT_BANK_W_STATUS_CONFIRMED].nextState = ACCEPTCASH; + stateEventTable[CONNECTION][EVENT_BANK_W_STATUS_SELECTED].action = actionEventBankWStatusSelected; + stateEventTable[CONNECTION][EVENT_BANK_W_STATUS_SELECTED].nextState = ACCEPTCASH; stateEventTable[CONNECTION][EVENT_TIMEOUT].action = actionEventConnectionTimeout; stateEventTable[CONNECTION][EVENT_TIMEOUT].nextState = IDLE; @@ -205,7 +211,6 @@ void eventHandler(event_e event){ int main(int argc, char *argv[]){ char serialpath[] = "/dev/ttyAMA3"; std::cout << "The Program is running" <<std::endl; - //DG600F cashacceptor(serialpath); Timer timer1; timer1.setTimeMillis(10000); TALER_Amount testamount; diff --git a/src/gui/screenConnection.hpp b/src/gui/screenConnection.hpp @@ -39,7 +39,7 @@ class ScreenConnection : public Screen{ lv_qrcode_set_light_color(qrCode, lv_color_white()); } - void generateQR(char* uri){ + void generateQR(const char* uri){ lv_qrcode_update(qrCode, uri, strlen(uri)); lv_obj_center(qrCode); } diff --git a/src/include/bank.hpp b/src/include/bank.hpp @@ -1,6 +1,6 @@ #ifndef BANK_H #define BANK_H -#include "../bank/bank_lib.h" +#include "../bank/bankCommunication.hpp" #endif diff --git a/src/include/global.hpp b/src/include/global.hpp @@ -12,7 +12,7 @@ enum event_e { EVENT_IDENTIFICATION_SUCCESS, EVENT_BANK_TOKEN_DONE, EVENT_BANK_WITHDRAWAL_DONE, - EVENT_BANK_W_STATUS_CONFIRMED, + EVENT_BANK_W_STATUS_SELECTED, EVENT_BANK_W_STATUS_PENDING, EVENT_BANK_W_CONFIRMATION_DONE, ENUM_EVENT_END