From 962f9e5f6494da301f491623c289d7fd2c16d1d6 Mon Sep 17 00:00:00 2001 From: Christian Grothoff Date: Mon, 11 Jul 2022 15:16:15 +0200 Subject: improve C API --- src/lib/merchant_api_merchant_get_order.c | 220 ++++++++++++++---------------- src/lib/merchant_api_wallet_get_order.c | 95 +++++-------- 2 files changed, 141 insertions(+), 174 deletions(-) (limited to 'src/lib') 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; } } -- cgit v1.2.3