summaryrefslogtreecommitdiff
path: root/src/lib
diff options
context:
space:
mode:
authorChristian Grothoff <christian@grothoff.org>2022-07-11 15:16:15 +0200
committerChristian Grothoff <christian@grothoff.org>2022-07-11 15:16:15 +0200
commit962f9e5f6494da301f491623c289d7fd2c16d1d6 (patch)
tree74d16483081d91772a8e16bd3303f8186b062f11 /src/lib
parent6741a252e5f69cae36a2119fd183b26539863784 (diff)
downloadmerchant-962f9e5f6494da301f491623c289d7fd2c16d1d6.tar.gz
merchant-962f9e5f6494da301f491623c289d7fd2c16d1d6.tar.bz2
merchant-962f9e5f6494da301f491623c289d7fd2c16d1d6.zip
improve C API
Diffstat (limited to 'src/lib')
-rw-r--r--src/lib/merchant_api_merchant_get_order.c220
-rw-r--r--src/lib/merchant_api_wallet_get_order.c95
2 files changed, 141 insertions, 174 deletions
diff --git a/src/lib/merchant_api_merchant_get_order.c b/src/lib/merchant_api_merchant_get_order.c
index 167e46be..f3181a3c 100644
--- a/src/lib/merchant_api_merchant_get_order.c
+++ b/src/lib/merchant_api_merchant_get_order.c
@@ -72,47 +72,48 @@ struct TALER_MERCHANT_OrderMerchantGetHandle
* the response and call the callback.
*
* @param omgh handle for the request
- * @param[in,out] hr HTTP response we got
+ * @param[in,out] osr HTTP response we got
*/
static void
handle_unpaid (struct TALER_MERCHANT_OrderMerchantGetHandle *omgh,
- struct TALER_MERCHANT_HttpResponse *hr)
+ struct TALER_MERCHANT_OrderStatusResponse *osr)
{
- struct TALER_MERCHANT_OrderStatusResponse osr = {
- .status = TALER_MERCHANT_OSC_UNPAID
- };
struct GNUNET_JSON_Specification spec[] = {
- TALER_JSON_spec_amount_any ("total_amount",
- &osr.details.unpaid.contract_amount),
+ TALER_JSON_spec_amount_any (
+ "total_amount",
+ &osr->details.success.details.unpaid.contract_amount),
GNUNET_JSON_spec_mark_optional (
- GNUNET_JSON_spec_string ("already_paid_order_id",
- &osr.details.unpaid.already_paid_order_id),
+ GNUNET_JSON_spec_string (
+ "already_paid_order_id",
+ &osr->details.success.details.unpaid.already_paid_order_id),
NULL),
- GNUNET_JSON_spec_string ("taler_pay_uri",
- &osr.details.unpaid.taler_pay_uri),
- GNUNET_JSON_spec_string ("summary",
- &osr.details.unpaid.summary),
- GNUNET_JSON_spec_timestamp ("creation_time",
- &osr.details.unpaid.creation_time),
+ GNUNET_JSON_spec_string (
+ "taler_pay_uri",
+ &osr->details.success.details.unpaid.taler_pay_uri),
+ GNUNET_JSON_spec_string (
+ "summary",
+ &osr->details.success.details.unpaid.summary),
+ GNUNET_JSON_spec_timestamp (
+ "creation_time",
+ &osr->details.success.details.unpaid.creation_time),
GNUNET_JSON_spec_end ()
};
if (GNUNET_OK !=
- GNUNET_JSON_parse (hr->reply,
+ GNUNET_JSON_parse (osr->hr.reply,
spec,
NULL, NULL))
{
GNUNET_break_op (0);
- hr->http_status = 0;
- hr->ec = TALER_EC_GENERIC_REPLY_MALFORMED;
+ osr->hr.http_status = 0;
+ osr->hr.ec = TALER_EC_GENERIC_REPLY_MALFORMED;
omgh->cb (omgh->cb_cls,
- hr,
- NULL);
+ osr);
return;
}
+ osr->details.success.status = TALER_MERCHANT_OSC_UNPAID;
omgh->cb (omgh->cb_cls,
- hr,
- &osr);
+ osr);
}
@@ -122,37 +123,34 @@ handle_unpaid (struct TALER_MERCHANT_OrderMerchantGetHandle *omgh,
* paid. Parse the response and call the callback.
*
* @param omgh handle for the request
- * @param[in,out] hr HTTP response we got
+ * @param[in,out] osr HTTP response we got
*/
static void
handle_claimed (struct TALER_MERCHANT_OrderMerchantGetHandle *omgh,
- struct TALER_MERCHANT_HttpResponse *hr)
+ struct TALER_MERCHANT_OrderStatusResponse *osr)
{
- struct TALER_MERCHANT_OrderStatusResponse osr = {
- .status = TALER_MERCHANT_OSC_CLAIMED
- };
struct GNUNET_JSON_Specification spec[] = {
GNUNET_JSON_spec_json ("contract_terms",
- (json_t **) &osr.details.claimed.contract_terms),
+ (json_t **) &osr->details.success.details.claimed.
+ contract_terms),
GNUNET_JSON_spec_end ()
};
if (GNUNET_OK !=
- GNUNET_JSON_parse (hr->reply,
+ GNUNET_JSON_parse (osr->hr.reply,
spec,
NULL, NULL))
{
GNUNET_break_op (0);
- hr->http_status = 0;
- hr->ec = TALER_EC_GENERIC_REPLY_MALFORMED;
+ osr->hr.http_status = 0;
+ osr->hr.ec = TALER_EC_GENERIC_REPLY_MALFORMED;
omgh->cb (omgh->cb_cls,
- hr,
- NULL);
+ osr);
return;
}
+ osr->details.success.status = TALER_MERCHANT_OSC_CLAIMED;
omgh->cb (omgh->cb_cls,
- hr,
- &osr);
+ osr);
GNUNET_JSON_parse_free (spec);
}
@@ -163,37 +161,35 @@ handle_claimed (struct TALER_MERCHANT_OrderMerchantGetHandle *omgh,
* the response and call the callback.
*
* @param omgh handle for the request
- * @param[in,out] hr HTTP response we got
+ * @param[in,out] osr HTTP response we got
*/
static void
handle_paid (struct TALER_MERCHANT_OrderMerchantGetHandle *omgh,
- struct TALER_MERCHANT_HttpResponse *hr)
+ struct TALER_MERCHANT_OrderStatusResponse *osr)
{
uint32_t ec32;
uint32_t hc32;
json_t *wire_details;
json_t *wire_reports;
json_t *refund_details;
- struct TALER_MERCHANT_OrderStatusResponse osr = {
- .status = TALER_MERCHANT_OSC_PAID
- };
struct GNUNET_JSON_Specification spec[] = {
GNUNET_JSON_spec_bool ("refunded",
- &osr.details.paid.refunded),
+ &osr->details.success.details.paid.refunded),
GNUNET_JSON_spec_bool ("refund_pending",
- &osr.details.paid.refund_pending),
+ &osr->details.success.details.paid.refund_pending),
GNUNET_JSON_spec_bool ("wired",
- &osr.details.paid.wired),
+ &osr->details.success.details.paid.wired),
TALER_JSON_spec_amount_any ("deposit_total",
- &osr.details.paid.deposit_total),
+ &osr->details.success.details.paid.deposit_total),
GNUNET_JSON_spec_uint32 ("exchange_code",
&ec32),
GNUNET_JSON_spec_uint32 ("exchange_http_status",
&hc32),
TALER_JSON_spec_amount_any ("refund_amount",
- &osr.details.paid.refund_amount),
- GNUNET_JSON_spec_json ("contract_terms",
- (json_t **) &osr.details.paid.contract_terms),
+ &osr->details.success.details.paid.refund_amount),
+ GNUNET_JSON_spec_json (
+ "contract_terms",
+ (json_t **) &osr->details.success.details.paid.contract_terms),
GNUNET_JSON_spec_json ("wire_details",
&wire_details),
GNUNET_JSON_spec_json ("wire_reports",
@@ -204,34 +200,33 @@ handle_paid (struct TALER_MERCHANT_OrderMerchantGetHandle *omgh,
};
if (GNUNET_OK !=
- GNUNET_JSON_parse (hr->reply,
+ GNUNET_JSON_parse (osr->hr.reply,
spec,
NULL, NULL))
{
GNUNET_break_op (0);
- hr->http_status = 0;
- hr->ec = TALER_EC_GENERIC_REPLY_MALFORMED;
+ osr->hr.http_status = 0;
+ osr->hr.ec = TALER_EC_GENERIC_REPLY_MALFORMED;
omgh->cb (omgh->cb_cls,
- hr,
- NULL);
+ osr);
return;
}
if (! (json_is_array (wire_details) &&
json_is_array (wire_reports) &&
json_is_array (refund_details) &&
- json_is_object (osr.details.paid.contract_terms)) )
+ json_is_object (osr->details.success.details.paid.contract_terms)) )
{
GNUNET_break_op (0);
- hr->http_status = 0;
- hr->ec = TALER_EC_GENERIC_REPLY_MALFORMED;
+ osr->hr.http_status = 0;
+ osr->hr.ec = TALER_EC_GENERIC_REPLY_MALFORMED;
omgh->cb (omgh->cb_cls,
- hr,
- NULL);
+ osr);
GNUNET_JSON_parse_free (spec);
return;
}
- osr.details.paid.exchange_ec = (enum TALER_ErrorCode) ec32;
- osr.details.paid.exchange_hc = (unsigned int) hc32;
+ osr->details.success.status = TALER_MERCHANT_OSC_PAID;
+ osr->details.success.details.paid.exchange_ec = (enum TALER_ErrorCode) ec32;
+ osr->details.success.details.paid.exchange_hc = (unsigned int) hc32;
{
unsigned int wts_len = json_array_size (wire_details);
unsigned int wrs_len = json_array_size (wire_reports);
@@ -265,11 +260,10 @@ handle_paid (struct TALER_MERCHANT_OrderMerchantGetHandle *omgh,
NULL, NULL))
{
GNUNET_break_op (0);
- hr->http_status = 0;
- hr->ec = TALER_EC_GENERIC_REPLY_MALFORMED;
+ osr->hr.http_status = 0;
+ osr->hr.ec = TALER_EC_GENERIC_REPLY_MALFORMED;
omgh->cb (omgh->cb_cls,
- hr,
- NULL);
+ osr);
GNUNET_JSON_parse_free (spec);
return;
}
@@ -302,11 +296,10 @@ handle_paid (struct TALER_MERCHANT_OrderMerchantGetHandle *omgh,
NULL, NULL))
{
GNUNET_break_op (0);
- hr->http_status = 0;
- hr->ec = TALER_EC_GENERIC_REPLY_MALFORMED;
+ osr->hr.http_status = 0;
+ osr->hr.ec = TALER_EC_GENERIC_REPLY_MALFORMED;
omgh->cb (omgh->cb_cls,
- hr,
- NULL);
+ osr);
GNUNET_JSON_parse_free (spec);
return;
}
@@ -336,25 +329,23 @@ handle_paid (struct TALER_MERCHANT_OrderMerchantGetHandle *omgh,
NULL, NULL))
{
GNUNET_break_op (0);
- hr->http_status = 0;
- hr->ec = TALER_EC_GENERIC_REPLY_MALFORMED;
+ osr->hr.http_status = 0;
+ osr->hr.ec = TALER_EC_GENERIC_REPLY_MALFORMED;
omgh->cb (omgh->cb_cls,
- hr,
- NULL);
+ osr);
GNUNET_JSON_parse_free (spec);
return;
}
}
- osr.details.paid.wts = wts;
- osr.details.paid.wts_len = wts_len;
- osr.details.paid.wrs = wrs;
- osr.details.paid.wrs_len = wrs_len;
- osr.details.paid.refunds = ref;
- osr.details.paid.refunds_len = ref_len;
+ osr->details.success.details.paid.wts = wts;
+ osr->details.success.details.paid.wts_len = wts_len;
+ osr->details.success.details.paid.wrs = wrs;
+ osr->details.success.details.paid.wrs_len = wrs_len;
+ osr->details.success.details.paid.refunds = ref;
+ osr->details.success.details.paid.refunds_len = ref_len;
omgh->cb (omgh->cb_cls,
- hr,
- &osr);
+ osr);
}
GNUNET_JSON_parse_free (spec);
}
@@ -376,9 +367,9 @@ handle_merchant_order_get_finished (void *cls,
struct TALER_MERCHANT_OrderMerchantGetHandle *omgh = cls;
const json_t *json = response;
const char *order_status;
- struct TALER_MERCHANT_HttpResponse hr = {
- .http_status = (unsigned int) response_code,
- .reply = json
+ struct TALER_MERCHANT_OrderStatusResponse osr = {
+ .hr.http_status = (unsigned int) response_code,
+ .hr.reply = json
};
omgh->job = NULL;
@@ -388,78 +379,79 @@ handle_merchant_order_get_finished (void *cls,
/* see below */
break;
case MHD_HTTP_UNAUTHORIZED:
- hr.ec = TALER_JSON_get_error_code (json);
- hr.hint = TALER_JSON_get_error_hint (json);
- /* Nothing really to verify, merchant says we need to authenticate. */
- break;
+ osr.hr.ec = TALER_JSON_get_error_code (json);
+ osr.hr.hint = TALER_JSON_get_error_hint (json);
+ omgh->cb (omgh->cb_cls,
+ &osr);
+ TALER_MERCHANT_merchant_order_get_cancel (omgh);
+ return;
case MHD_HTTP_NOT_FOUND:
- hr.ec = TALER_JSON_get_error_code (json);
- hr.hint = TALER_JSON_get_error_hint (json);
+ osr.hr.ec = TALER_JSON_get_error_code (json);
+ osr.hr.hint = TALER_JSON_get_error_hint (json);
omgh->cb (omgh->cb_cls,
- &hr,
- NULL);
+ &osr);
TALER_MERCHANT_merchant_order_get_cancel (omgh);
return;
case MHD_HTTP_GATEWAY_TIMEOUT:
- hr.ec = TALER_JSON_get_error_code (json);
- hr.hint = TALER_JSON_get_error_hint (json);
+ osr.hr.ec = TALER_JSON_get_error_code (json);
+ osr.hr.hint = TALER_JSON_get_error_hint (json);
omgh->cb (omgh->cb_cls,
- &hr,
- NULL);
+ &osr);
TALER_MERCHANT_merchant_order_get_cancel (omgh);
return;
default:
- hr.ec = TALER_JSON_get_error_code (json);
- hr.hint = TALER_JSON_get_error_hint (json);
+ osr.hr.ec = TALER_JSON_get_error_code (json);
+ osr.hr.hint = TALER_JSON_get_error_hint (json);
GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
"Polling payment failed with HTTP status code %u/%d\n",
(unsigned int) response_code,
- (int) hr.ec);
+ (int) osr.hr.ec);
GNUNET_break_op (0);
omgh->cb (omgh->cb_cls,
- &hr,
- NULL);
+ &osr);
TALER_MERCHANT_merchant_order_get_cancel (omgh);
return;
}
- order_status = json_string_value (json_object_get (json, "order_status"));
+ order_status = json_string_value (json_object_get (json,
+ "order_status"));
if (NULL == order_status)
{
GNUNET_break_op (0);
- hr.http_status = 0;
- hr.ec = TALER_EC_GENERIC_REPLY_MALFORMED;
+ osr.hr.http_status = 0;
+ osr.hr.ec = TALER_EC_GENERIC_REPLY_MALFORMED;
omgh->cb (omgh->cb_cls,
- &hr,
- NULL);
+ &osr);
TALER_MERCHANT_merchant_order_get_cancel (omgh);
return;
}
- if (0 == strcmp ("paid", order_status))
+ if (0 == strcmp ("paid",
+ order_status))
{
handle_paid (omgh,
- &hr);
+ &osr);
}
- else if (0 == strcmp ("claimed", order_status))
+ else if (0 == strcmp ("claimed",
+ order_status))
{
handle_claimed (omgh,
- &hr);
+ &osr);
}
- else if (0 == strcmp ("unpaid", order_status))
+ else if (0 == strcmp ("unpaid",
+ order_status))
{
handle_unpaid (omgh,
- &hr);
+ &osr);
}
else
{
GNUNET_break_op (0);
- hr.http_status = 0;
- hr.ec = TALER_EC_GENERIC_REPLY_MALFORMED;
+ osr.hr.http_status = 0;
+ osr.hr.ec = TALER_EC_GENERIC_REPLY_MALFORMED;
omgh->cb (omgh->cb_cls,
- &hr,
- NULL);
+ &osr);
}
TALER_MERCHANT_merchant_order_get_cancel (omgh);
}
diff --git a/src/lib/merchant_api_wallet_get_order.c b/src/lib/merchant_api_wallet_get_order.c
index 4037ea57..9c24204a 100644
--- a/src/lib/merchant_api_wallet_get_order.c
+++ b/src/lib/merchant_api_wallet_get_order.c
@@ -1,6 +1,6 @@
/*
This file is part of TALER
- Copyright (C) 2018, 2020 Taler Systems SA
+ Copyright (C) 2018, 2020, 2022 Taler Systems SA
TALER is free software; you can redistribute it and/or modify it under the
terms of the GNU Lesser General Public License as published by the Free Software
@@ -79,19 +79,13 @@ cb_failure (struct TALER_MERCHANT_OrderWalletGetHandle *owgh,
enum TALER_ErrorCode ec,
const json_t *reply)
{
- struct TALER_MERCHANT_HttpResponse hr = {
- .ec = ec,
- .reply = reply
+ struct TALER_MERCHANT_OrderWalletGetResponse owgr = {
+ .hr.ec = ec,
+ .hr.reply = reply
};
owgh->cb (owgh->cb_cls,
- &hr,
- GNUNET_SYSERR,
- GNUNET_SYSERR,
- GNUNET_SYSERR,
- NULL,
- NULL,
- NULL);
+ &owgr);
}
@@ -115,22 +109,19 @@ handle_wallet_get_order_finished (void *cls,
{
case MHD_HTTP_OK:
{
- struct TALER_Amount refund_amount;
- bool refunded;
- bool refund_pending;
+ struct TALER_MERCHANT_OrderWalletGetResponse owgr = {
+ .hr.reply = json,
+ .hr.http_status = MHD_HTTP_OK
+ };
struct GNUNET_JSON_Specification spec[] = {
GNUNET_JSON_spec_bool ("refunded",
- &refunded),
+ &owgr.details.success.refunded),
GNUNET_JSON_spec_bool ("refund_pending",
- &refund_pending),
+ &owgr.details.success.refund_pending),
TALER_JSON_spec_amount_any ("refund_amount",
- &refund_amount),
+ &owgr.details.success.refund_amount),
GNUNET_JSON_spec_end ()
};
- struct TALER_MERCHANT_HttpResponse hr = {
- .reply = json,
- .http_status = MHD_HTTP_OK
- };
if (GNUNET_OK !=
GNUNET_JSON_parse (json,
@@ -144,70 +135,54 @@ handle_wallet_get_order_finished (void *cls,
TALER_MERCHANT_wallet_order_get_cancel (owgh);
return;
}
-
owgh->cb (owgh->cb_cls,
- &hr,
- GNUNET_YES,
- refunded ? GNUNET_YES : GNUNET_NO,
- refund_pending ? GNUNET_YES : GNUNET_NO,
- refunded ? &refund_amount : NULL,
- NULL, /* paid! */
- NULL);/* paid! */
+ &owgr);
GNUNET_JSON_parse_free (spec);
break;
}
case MHD_HTTP_PAYMENT_REQUIRED:
{
+ struct TALER_MERCHANT_OrderWalletGetResponse owgr = {
+ .hr.reply = json,
+ .hr.http_status = MHD_HTTP_PAYMENT_REQUIRED
+ };
+
/* Status is: unpaid */
- const char *taler_pay_uri = json_string_value (json_object_get (json,
- "taler_pay_uri"));
- const char *already_paid = json_string_value (json_object_get (json,
- "already_paid_order_id"));
- if (NULL == taler_pay_uri)
+ owgr.details.payment_required.taler_pay_uri
+ = json_string_value (json_object_get (json,
+ "taler_pay_uri"));
+ owgr.details.payment_required.already_paid_order_id
+ = json_string_value (json_object_get (json,
+ "already_paid_order_id"));
+ if (NULL == owgr.details.payment_required.taler_pay_uri)
{
GNUNET_break_op (0);
cb_failure (owgh,
TALER_EC_GENERIC_REPLY_MALFORMED,
json);
+ break;
}
- else
- {
- struct TALER_MERCHANT_HttpResponse hr = {
- .reply = json,
- .http_status = MHD_HTTP_OK
- };
-
- owgh->cb (owgh->cb_cls,
- &hr,
- GNUNET_NO,
- GNUNET_NO,
- GNUNET_NO,
- NULL,
- taler_pay_uri,
- already_paid);
- }
+ owgh->cb (owgh->cb_cls,
+ &owgr);
break;
}
default:
{
- struct TALER_MERCHANT_HttpResponse hr;
+ struct TALER_MERCHANT_OrderWalletGetResponse owgr = {
+ .hr.reply = json,
+ .hr.http_status = response_code
+ };
TALER_MERCHANT_parse_error_details_ (response,
response_code,
- &hr);
+ &owgr.hr);
GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
"Checking order status failed with HTTP status code %u/%d\n",
(unsigned int) response_code,
- (int) hr.ec);
+ (int) owgr.hr.ec);
GNUNET_break_op (0);
owgh->cb (owgh->cb_cls,
- &hr,
- GNUNET_SYSERR,
- GNUNET_SYSERR,
- GNUNET_SYSERR,
- NULL,
- NULL,
- NULL);
+ &owgr);
break;
}
}