eliminate libtalerwire

This commit is contained in:
Christian Grothoff 2020-01-13 18:16:01 +01:00
parent 258ed8617b
commit 4d6ef1da29
No known key found for this signature in database
GPG Key ID: 939E6BE1E29FC3CC
31 changed files with 234 additions and 278 deletions

View File

@ -557,6 +557,5 @@ AC_CONFIG_FILES([Makefile
src/pq/Makefile
src/util/Makefile
src/util/taler-config
src/wire/Makefile
])
AC_OUTPUT

View File

@ -22,7 +22,7 @@ pkgcfg_DATA = \
EXTRA_DIST = \
taler.conf
SUBDIRS = include util wire json curl $(PQ_DIR) mhd $(BANK_LIB) exchangedb exchange exchange-tools auditordb auditor
SUBDIRS = include util json curl $(PQ_DIR) mhd $(BANK_LIB) exchangedb exchange exchange-tools auditordb auditor
if HAVE_LIBCURL
SUBDIRS += lib benchmark
else

View File

@ -40,7 +40,7 @@ taler_auditor_LDADD = \
$(LIBGCRYPT_LIBS) \
$(top_builddir)/src/util/libtalerutil.la \
$(top_builddir)/src/json/libtalerjson.la \
$(top_builddir)/src/wire/libtalerwire.la \
$(top_builddir)/src/bank-lib/libtalerbank.la \
$(top_builddir)/src/exchangedb/libtalerexchangedb.la \
$(top_builddir)/src/auditordb/libtalerauditordb.la \
-ljansson \

View File

@ -41,7 +41,7 @@
#include "taler_auditordb_plugin.h"
#include "taler_exchangedb_plugin.h"
#include "taler_json_lib.h"
#include "taler_wire_lib.h"
#include "taler_bank_service.h"
#include "taler_signatures.h"
@ -1459,7 +1459,7 @@ get_closing_fee (const char *receiver_account,
struct TALER_Amount wire_fee;
char *method;
method = TALER_WIRE_payto_get_method (receiver_account);
method = TALER_payto_get_method (receiver_account);
GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
"Method is `%s'\n",
method);
@ -2894,7 +2894,7 @@ check_wire_out_cb
}
/* Round down to amount supported by wire method */
GNUNET_break (TALER_WIRE_amount_round (&final_amount));
GNUNET_break (TALER_amount_round (&final_amount));
/* Calculate the exchange's gain as the fees plus rounding differences! */
if (GNUNET_OK !=

View File

@ -652,7 +652,7 @@ do_shutdown (void *cls)
wa_tail,
wa);
TALER_BANK_auth_free (&wa->auth);
TALER_WIRE_account_free (&wa->account);
TALER_BANK_account_free (&wa->account);
GNUNET_free (wa->section_name);
GNUNET_free (wa);
}
@ -2082,7 +2082,7 @@ process_account_cb (void *cls,
if (TALER_PAC_X_TALER_BANK != wa->account.type)
{
GNUNET_break (0);
TALER_WIRE_account_free (&wa->account);
TALER_BANK_account_free (&wa->account);
TALER_BANK_auth_free (&wa->auth);
GNUNET_free (wa->section_name);
GNUNET_free (wa);

View File

@ -41,6 +41,7 @@ libtalerbank_la_SOURCES = \
bank_api_credit.c \
bank_api_debit.c \
bank_api_transfer.c \
bank_api_payto.c \
bank_api_parse.c
libtalerbank_la_LIBADD = \
$(top_builddir)/src/json/libtalerjson.la \

View File

@ -50,7 +50,7 @@ TALER_BANK_account_parse_cfg (const struct GNUNET_CONFIGURATION_Handle *cfg,
return GNUNET_SYSERR;
}
if (TALER_EC_NONE !=
TALER_WIRE_payto_to_account (account_url,
TALER_BANK_payto_to_account (account_url,
acc))
{
GNUNET_log_config_invalid (GNUNET_ERROR_TYPE_ERROR,
@ -67,7 +67,7 @@ TALER_BANK_account_parse_cfg (const struct GNUNET_CONFIGURATION_Handle *cfg,
"URL",
"Malformed payto:// URL for x-taler-bank method");
GNUNET_free (account_url);
TALER_WIRE_account_free (acc);
TALER_BANK_account_free (acc);
return GNUNET_SYSERR;
}
GNUNET_free (account_url);

View File

@ -1,6 +1,6 @@
/*
This file is part of TALER
(C) 2015--2019 GNUnet e.V.
(C) 2015--2020 Taler Systems SA
TALER 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
@ -14,14 +14,13 @@
TALER; see the file COPYING. If not, see <http://www.gnu.org/licenses/>
*/
/**
* @file wire/payto.c
* @file bank-lib/bank_api_payto.c
* @brief Functions for parsing payto:// URIs
* @author Christian Grothoff <christian@grothoff.org>
*/
#include "platform.h"
#include "taler_util.h"
#include "taler_bank_service.h"
#include "taler_wire_lib.h"
/**
* Maximum legal 'value' for an account number, based on IEEE double (for JavaScript compatibility).
@ -35,7 +34,7 @@
* @param acc account to free, the pointer itself is NOT free'd.
*/
void
TALER_WIRE_account_free (struct TALER_Account *acc)
TALER_BANK_account_free (struct TALER_Account *acc)
{
switch (acc->type)
{
@ -482,11 +481,11 @@ typedef enum TALER_ErrorCode
* Parse @a payto_url and store the result in @a acc
*
* @param payto_url URL to parse
* @param acc[in,out] account to initialize, free using #TALER_WIRE_account_free() later
* @param acc[in,out] account to initialize, free using #TALER_BANK_account_free() later
* @return #TALER_EC_NONE if @a payto_url is well-formed
*/
enum TALER_ErrorCode
TALER_WIRE_payto_to_account (const char *payto_url,
TALER_BANK_payto_to_account (const char *payto_url,
struct TALER_Account *acc)
{
Parser parsers[] = {

View File

@ -858,7 +858,7 @@ main (int argc,
}
if (TALER_EC_NONE !=
TALER_WIRE_payto_to_account (exchange_payto_url,
TALER_BANK_payto_to_account (exchange_payto_url,
&exchange_bank_account))
{
GNUNET_log (GNUNET_ERROR_TYPE_ERROR,

View File

@ -172,7 +172,7 @@ struct AggregationUnit
/**
* Wire preparation handle.
*/
struct TALER_WIRE_PrepareHandle *ph;
struct TALER_BANK_PrepareHandle *ph;
/**
* Array of #aggregation_limit row_ids from the
@ -416,7 +416,7 @@ find_account_by_url (const char *url)
char *method;
struct WireAccount *wa;
method = TALER_WIRE_payto_get_method (url);
method = TALER_payto_get_method (url);
if (NULL == method)
{
fprintf (stderr,
@ -573,7 +573,7 @@ shutdown_task (void *cls)
GNUNET_CONTAINER_DLL_remove (wa_head,
wa_tail,
wa);
TALER_WIRE_account_free (&wa->account);
TALER_BANK_account_free (&wa->account);
TALER_BANK_auth_free (&wa->auth);
TALER_EXCHANGEDB_fees_free (wa->af);
GNUNET_free (wa->section_name);
@ -1117,7 +1117,7 @@ expired_reserve_cb (void *cls,
}
/* round down to enable transfer */
if (GNUNET_SYSERR ==
TALER_WIRE_amount_round (&amount_without_fee))
TALER_amount_round (&amount_without_fee))
{
GNUNET_break (0);
global_ret = GNUNET_SYSERR;
@ -1182,7 +1182,7 @@ expired_reserve_cb (void *cls,
ctc = GNUNET_new (struct CloseTransferContext);
ctc->wa = wa;
ctc->session = session;
ctc->method = TALER_WIRE_payto_get_method (account_details);
ctc->method = TALER_payto_get_method (account_details);
TALER_BANK_prepare_wire_transfer (account_details,
&amount_without_fee,
exchange_base_url,
@ -1449,7 +1449,7 @@ run_aggregation (void *cls)
&au->total_amount,
&au->wire_fee)) ||
(GNUNET_SYSERR ==
TALER_WIRE_amount_round (&au->final_amount)) ||
TALER_amount_round (&au->final_amount)) ||
( (0 == au->final_amount.value) &&
(0 == au->final_amount.fraction) ) )
{

View File

@ -146,7 +146,7 @@ load_account (void *cls,
*ret = GNUNET_SYSERR;
return;
}
method = TALER_WIRE_payto_get_method (ai->payto_url);
method = TALER_payto_get_method (ai->payto_url);
if (GNUNET_OK ==
load_fee (method))
{

View File

@ -213,7 +213,7 @@ shutdown_task (void *cls)
GNUNET_CONTAINER_DLL_remove (wa_head,
wa_tail,
wa);
TALER_WIRE_account_free (&wa->account);
TALER_BANK_account_free (&wa->account);
TALER_BANK_auth_free (&wa->auth);
GNUNET_free (wa->section_name);
GNUNET_free (wa);

View File

@ -422,7 +422,7 @@ postgres_create_tables (void *cls)
"(wireout_uuid BIGSERIAL PRIMARY KEY"
",execution_date INT8 NOT NULL"
",wtid_raw BYTEA UNIQUE NOT NULL CHECK (LENGTH(wtid_raw)="
TALER_WIRE_TRANSFER_IDENTIFIER_LEN_STR ")"
TALER_BANK_TRANSFER_IDENTIFIER_LEN_STR ")"
",wire_target TEXT NOT NULL"
",exchange_account_section TEXT NOT NULL"
",amount_val INT8 NOT NULL"

View File

@ -27,7 +27,6 @@ talerinclude_HEADERS = \
taler_json_lib.h \
taler_testing_auditor_lib.h \
taler_testing_lib.h \
taler_wire_lib.h \
taler_util.h \
taler_mhd_lib.h \
taler_pq_lib.h \

View File

@ -309,6 +309,18 @@ const char *
TALER_amount2s (const struct TALER_Amount *amount);
/**
* Round the amount to something that can be
* transferred on the wire.
*
* @param[in,out] amount amount to round down
* @return #GNUNET_OK on success, #GNUNET_NO if rounding was unnecessary,
* #GNUNET_SYSERR if the amount or currency was invalid
*/
int
TALER_amount_round (struct TALER_Amount *amount);
#if 0 /* keep Emacsens' auto-indent happy */
{
#endif

View File

@ -85,6 +85,83 @@ struct TALER_BANK_AuthenticationData
};
/**
* Different account types supported by payto://.
*/
enum TALER_PaytoAccountType
{
/**
* Used to indicate an uninitialized struct.
*/
TALER_PAC_NONE = 0,
/**
* Account type of a bank running the x-taler-bank protocol.
*/
TALER_PAC_X_TALER_BANK,
/**
* Account identified by IBAN number.
*/
TALER_PAC_IBAN
};
/**
* Information about an account extracted from a payto://-URL.
*/
struct TALER_Account
{
/**
* How this the account represented.
*/
enum TALER_PaytoAccountType type;
/**
* Internals depending on @e type.
*/
union
{
/**
* Taler bank address from x-taler-bank. Set if
* @e type is #TALER_AC_X_TALER_BANK.
*/
struct
{
/**
* Bank account base URL.
*/
char *account_base_url;
/**
* Only the hostname of the bank.
*/
char *hostname;
} x_taler_bank;
/**
* Taler bank address from iban. Set if
* @e type is #TALER_AC_IBAN.
*/
struct
{
/**
* IBAN number.
*/
char *number;
} iban;
} details;
};
/* ********************* /admin/add/incoming *********************** */
@ -447,6 +524,8 @@ void
TALER_BANK_debit_history_cancel (struct TALER_BANK_DebitHistoryHandle *hh);
/* ******************** Convenience functions **************** */
/**
* Convenience method for parsing configuration section with bank account data.
*
@ -460,6 +539,26 @@ TALER_BANK_account_parse_cfg (const struct GNUNET_CONFIGURATION_Handle *cfg,
const char *section,
struct TALER_Account *acc);
/**
* Release memory allocated in @a acc.
*
* @param acc account to free, the pointer itself is NOT free'd.
*/
void
TALER_BANK_account_free (struct TALER_Account *acc);
/**
* Parse @a payto_url and store the result in @a acc
*
* @param payto_url URL to parse
* @param acc[in,out] account to initialize, free using #TALER_BANK_account_free() later
* @return #TALER_EC_NONE if @a payto_url is well-formed
*/
enum TALER_ErrorCode
TALER_BANK_payto_to_account (const char *payto_url,
struct TALER_Account *acc);
/**
* Convenience method for parsing configuration section with bank
@ -486,4 +585,5 @@ TALER_BANK_auth_parse_cfg (const struct GNUNET_CONFIGURATION_Handle *cfg,
void
TALER_BANK_auth_free (struct TALER_BANK_AuthenticationData *auth);
#endif /* _TALER_BANK_SERVICE_H */

View File

@ -510,12 +510,12 @@ struct TALER_TransferSecretP
* Length of the raw value in the Taler wire transfer identifier
* (in binary representation).
*/
#define TALER_WIRE_TRANSFER_IDENTIFIER_LEN 32
#define TALER_BANK_TRANSFER_IDENTIFIER_LEN 32
/**
* #TALER_WIRE_TRANSFER_IDENTIFIER_LEN as a string.
* #TALER_BANK_TRANSFER_IDENTIFIER_LEN as a string.
*/
#define TALER_WIRE_TRANSFER_IDENTIFIER_LEN_STR "32"
#define TALER_BANK_TRANSFER_IDENTIFIER_LEN_STR "32"
/**
@ -536,7 +536,7 @@ struct TALER_WireTransferIdentifierRawP
* encode the actual value (i.e. a 256-bit / 32-byte public key or
* a hash code), and the last byte for a minimalistic checksum.
*/
uint8_t raw[TALER_WIRE_TRANSFER_IDENTIFIER_LEN];
uint8_t raw[TALER_BANK_TRANSFER_IDENTIFIER_LEN];
};

View File

@ -381,4 +381,14 @@ TALER_url_absolute_mhd (struct MHD_Connection *connection,
...);
/**
* Obtain the payment method from a @a payto_url
*
* @param payto_url the URL to parse
* @return NULL on error (malformed @a payto_url)
*/
char *
TALER_payto_get_method (const char *payto_url);
#endif

View File

@ -18,130 +18,10 @@
* @brief Interface for loading and unloading wire plugins
* @author Christian Grothoff <christian@grothoff.org>
*/
#ifndef TALER_WIRE_H
#define TALER_WIRE_H
#ifndef TALER_BANK_H
#define TALER_BANK_H
#include <gnunet/gnunet_util_lib.h>
/**
* Different account types supported by payto://.
*/
enum TALER_PaytoAccountType
{
/**
* Used to indicate an uninitialized struct.
*/
TALER_PAC_NONE = 0,
/**
* Account type of a bank running the x-taler-bank protocol.
*/
TALER_PAC_X_TALER_BANK,
/**
* Account identified by IBAN number.
*/
TALER_PAC_IBAN
};
/**
* Information about an account extracted from a payto://-URL.
*/
struct TALER_Account
{
/**
* How this the account represented.
*/
enum TALER_PaytoAccountType type;
/**
* Internals depending on @e type.
*/
union
{
/**
* Taler bank address from x-taler-bank. Set if
* @e type is #TALER_AC_X_TALER_BANK.
*/
struct
{
/**
* Bank account base URL.
*/
char *account_base_url;
/**
* Only the hostname of the bank.
*/
char *hostname;
} x_taler_bank;
/**
* Taler bank address from iban. Set if
* @e type is #TALER_AC_IBAN.
*/
struct
{
/**
* IBAN number.
*/
char *number;
} iban;
} details;
};
/**
* Release memory allocated in @a acc.
*
* @param acc account to free, the pointer itself is NOT free'd.
*/
void
TALER_WIRE_account_free (struct TALER_Account *acc);
/**
* Round the amount to something that can be
* transferred on the wire.
*
* @param[in,out] amount amount to round down
* @return #GNUNET_OK on success, #GNUNET_NO if rounding was unnecessary,
* #GNUNET_SYSERR if the amount or currency was invalid
*/
int
TALER_WIRE_amount_round (struct TALER_Amount *amount);
/**
* Parse @a payto_url and store the result in @a acc
*
* @param payto_url URL to parse
* @param acc[in,out] account to initialize, free using #TALER_WIRE_account_free() later
* @return #TALER_EC_NONE if @a payto_url is well-formed
*/
enum TALER_ErrorCode
TALER_WIRE_payto_to_account (const char *payto_url,
struct TALER_Account *acc);
/**
* Obtain the payment method from a @a payto_url
*
* @param payto_url the URL to parse
* @return NULL on error (malformed @a payto_url)
*/
char *
TALER_WIRE_payto_get_method (const char *payto_url);
#endif

View File

@ -18,7 +18,6 @@ libtalerjson_la_LDFLAGS = \
-export-dynamic -no-undefined
libtalerjson_la_LIBADD = \
-lgnunetjson \
$(top_builddir)/src/wire/libtalerwire.la \
$(top_builddir)/src/util/libtalerutil.la \
-lgnunetutil \
-ljansson \

View File

@ -197,7 +197,7 @@ TALER_JSON_wire_to_method (const json_t *wire_s)
"Fatally malformed wire record encountered: lacks payto://-url\n");
return NULL;
}
return TALER_WIRE_payto_get_method (payto_str);
return TALER_payto_get_method (payto_str);
}

View File

@ -133,7 +133,6 @@ libtalertesting_la_SOURCES = \
testing_api_trait_wtid.c
libtalertesting_la_LIBADD = \
libtalerexchange.la \
$(top_builddir)/src/wire/libtalerwire.la \
$(top_builddir)/src/json/libtalerjson.la \
$(top_builddir)/src/util/libtalerutil.la \
$(top_builddir)/src/bank-lib/libtalerbank.la \

View File

@ -301,7 +301,7 @@ handle_wire_finished (void *cls,
ec = TALER_EC_SERVER_JSON_INVALID;
break;
}
if (NULL == (method = TALER_WIRE_payto_get_method (wa->url)))
if (NULL == (method = TALER_payto_get_method (wa->url)))
{
/* bogus reply */
GNUNET_break_op (0);

View File

@ -109,7 +109,7 @@ wire_cb (void *cls,
{
char *method;
method = TALER_WIRE_payto_get_method (accounts[i].url);
method = TALER_payto_get_method (accounts[i].url);
if (0 == strcmp (ws->expected_method,
method))
{

View File

@ -17,15 +17,17 @@
<http://www.gnu.org/licenses/>
*/
/**
* @file bank-lib/testing_api_helpers.c
* @brief convenience functions for bank-lib tests.
* @file lib/testing_api_helpers_bank.c
* @brief convenience functions for bank tests.
* @author Marcello Stanisci
* @author Christian Grothoff
*/
#include "platform.h"
#include <gnunet/gnunet_util_lib.h>
#include "taler_testing_lib.h"
#include "taler_fakebank_lib.h"
#define EXCHANGE_ACCOUNT_NAME "2"
#define BANK_FAIL() \
do {GNUNET_break (0); return NULL; } while (0)
@ -332,14 +334,23 @@ TALER_TESTING_prepare_bank (const char *config_filename,
return GNUNET_SYSERR;
}
GNUNET_OS_process_destroy (dbreset_proc);
if (GNUNET_OK !=
TALER_BANK_auth_parse_cfg (cfg,
"account-" EXCHANGE_ACCOUNT_NAME,
&bc->exchange_auth))
{
GNUNET_break (0);
return GNUNET_SYSERR;
}
GNUNET_asprintf (&bc->bank_url,
"http://localhost:%llu/",
port);
// FIXME: initialize rest of 'bc':
bc->exchange_account_url = NULL; // FIXME
bc->exchange_auth; // FIXME
bc->exchange_payto = TALER_TESTING_make_xtalerbank_payto (bc->bank_url, "2");
GNUNET_asprintf (&bc->exchange_account_url,
"%s%s",
bc->bank_url,
EXCHANGE_ACCOUNT_NAME);
bc->exchange_payto = TALER_TESTING_make_xtalerbank_payto (bc->bank_url,
EXCHANGE_ACCOUNT_NAME);
bc->user42_payto = TALER_TESTING_make_xtalerbank_payto (bc->bank_url, "42");
bc->user43_payto = TALER_TESTING_make_xtalerbank_payto (bc->bank_url, "43");
return GNUNET_OK;
@ -412,9 +423,11 @@ TALER_TESTING_prepare_fakebank (const char *config_filename,
return GNUNET_SYSERR;
}
bc->bank_url = fakebank_url;
// FIXME: initialize rest of 'bc':
bc->exchange_account_url = NULL; // FIXME
bc->exchange_auth; // FIXME
GNUNET_asprintf (&bc->exchange_account_url,
"%s%s",
bc->bank_url,
EXCHANGE_ACCOUNT_NAME);
bc->exchange_auth.method = TALER_BANK_AUTH_NONE;
bc->exchange_payto = TALER_TESTING_make_xtalerbank_payto (bc->bank_url, "2");
bc->user42_payto = TALER_TESTING_make_xtalerbank_payto (bc->bank_url, "42");
bc->user43_payto = TALER_TESTING_make_xtalerbank_payto (bc->bank_url, "43");

View File

@ -18,7 +18,7 @@
*/
/**
* @file exchange-lib/testing_api_helpers.c
* @file lib/testing_api_helpers_exchange.c
* @brief helper functions
* @author Christian Grothoff
* @author Marcello Stanisci
@ -958,4 +958,4 @@ TALER_TESTING_url_port_free (const char *url)
}
/* end of testing_api_helpers.c */
/* end of testing_api_helpers_exchange.c */

View File

@ -672,4 +672,25 @@ TALER_amount_divide (struct TALER_Amount *result,
}
/**
* Round the amount to something that can be
* transferred on the wire.
*
* @param[in,out] amount amount to round down
* @return #GNUNET_OK on success, #GNUNET_NO if rounding was unnecessary,
* #GNUNET_SYSERR if the amount or currency was invalid
*/
int
TALER_amount_round (struct TALER_Amount *amount)
{
uint32_t delta;
delta = amount->fraction % (TALER_AMOUNT_FRAC_BASE / 100);
if (0 == delta)
return GNUNET_NO;
amount->fraction -= delta;
return GNUNET_OK;
}
/* end of amount.c */

View File

@ -744,4 +744,36 @@ TALER_buffer_write_vfstr (struct TALER_Buffer *buf,
}
/**
* Prefix of PAYTO URLs.
*/
#define PAYTO "payto://"
/**
* Obtain the payment method from a @a payto_url
*
* @param payto_url the URL to parse
* @return NULL on error (malformed @a payto_url)
*/
char *
TALER_payto_get_method (const char *payto_url)
{
const char *start;
const char *end;
if (0 != strncmp (payto_url,
PAYTO,
strlen (PAYTO)))
return NULL;
start = &payto_url[strlen (PAYTO)];
end = strchr (start,
(unsigned char) '/');
if (NULL == end)
return NULL;
return GNUNET_strndup (start,
end - start);
}
/* end of util.c */

3
src/wire/.gitignore vendored
View File

@ -1,3 +0,0 @@
test_wire_plugin
test_wire_plugin_transactions_test
test_sepa_wireformat

View File

@ -1,22 +0,0 @@
# This Makefile.am is in the public domain
AM_CPPFLAGS = -I$(top_srcdir)/src/include
if USE_COVERAGE
AM_CFLAGS = --coverage -O0
XLIB = -lgcov
endif
pkgcfgdir = $(prefix)/share/taler/config.d/
lib_LTLIBRARIES = \
libtalerwire.la
libtalerwire_la_SOURCES = \
payto.c \
wire_helper.c
libtalerwire_la_LIBADD = \
-lgnunetutil \
$(XLIB)
libtalerwire_la_LDFLAGS = \
-version-info 1:0:0 \
-export-dynamic -no-undefined

View File

@ -1,83 +0,0 @@
/*
This file is part of TALER
(C) 2018 Taler Systems SA
TALER 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.
TALER 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 TALER; see the file COPYING. If not, see
<http://www.gnu.org/licenses/>
*/
/**
* @file wire/wire_helper.c
* @brief Helper functions for dealing with wire formats
* @author Christian Grothoff <christian@grothoff.org>
*/
#include "platform.h"
#include "taler_util.h"
#include "taler_wire_lib.h"
/**
* Prefix of PAYTO URLs.
*/
#define PAYTO "payto://"
/**
* Obtain the payment method from a @a payto_url
*
* @param payto_url the URL to parse
* @return NULL on error (malformed @a payto_url)
*/
char *
TALER_WIRE_payto_get_method (const char *payto_url)
{
const char *start;
const char *end;
if (0 != strncmp (payto_url,
PAYTO,
strlen (PAYTO)))
return NULL;
start = &payto_url[strlen (PAYTO)];
end = strchr (start,
(unsigned char) '/');
if (NULL == end)
return NULL;
return GNUNET_strndup (start,
end - start);
}
/**
* Round the amount to something that can be
* transferred on the wire.
*
* @param[in,out] amount amount to round down
* @return #GNUNET_OK on success, #GNUNET_NO if rounding was unnecessary,
* #GNUNET_SYSERR if the amount or currency was invalid
*/
int
TALER_WIRE_amount_round (struct TALER_Amount *amount)
{
uint32_t delta;
delta = amount->fraction % (TALER_AMOUNT_FRAC_BASE / 100);
if (0 == delta)
return GNUNET_NO;
amount->fraction -= delta;
return GNUNET_OK;
}
/* end of wire_helper.c */