summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/lib/exchange_api_reserve.c163
1 files changed, 90 insertions, 73 deletions
diff --git a/src/lib/exchange_api_reserve.c b/src/lib/exchange_api_reserve.c
index d63d169b..f843f242 100644
--- a/src/lib/exchange_api_reserve.c
+++ b/src/lib/exchange_api_reserve.c
@@ -196,7 +196,6 @@ parse_reserve_history (struct TALER_EXCHANGE_Handle *exchange,
&withdraw_purpose.h_coin_envelope),
GNUNET_JSON_spec_end ()
};
- unsigned int i;
rhistory[off].type = TALER_EXCHANGE_RTT_WITHDRAWAL;
if (GNUNET_OK !=
@@ -236,7 +235,7 @@ parse_reserve_history (struct TALER_EXCHANGE_Handle *exchange,
duplicates. */GNUNET_CRYPTO_hash (&withdraw_purpose,
ntohl (withdraw_purpose.purpose.size),
&uuid[uuid_off]);
- for (i = 0; i<uuid_off; i++)
+ for (unsigned int i = 0; i<uuid_off; i++)
{
if (0 == GNUNET_memcmp (&uuid[uuid_off],
&uuid[i]))
@@ -464,6 +463,91 @@ free_rhistory (struct TALER_EXCHANGE_ReserveHistory *rhistory,
/**
+ * We received an #MHD_HTTP_OK status code. Handle the JSON
+ * response.
+ *
+ * @param rsh handle of the request
+ * @param j JSON response
+ * @return #GNUNET_OK on success
+ */
+static int
+handle_reserve_status_ok (struct TALER_EXCHANGE_ReserveStatusHandle *rsh,
+ const json_t *j)
+{
+ json_t *history;
+ unsigned int len;
+ struct TALER_Amount balance;
+ struct TALER_Amount balance_from_history;
+ struct GNUNET_JSON_Specification spec[] = {
+ TALER_JSON_spec_amount ("balance", &balance),
+ GNUNET_JSON_spec_end ()
+ };
+
+ if (GNUNET_OK !=
+ GNUNET_JSON_parse (j,
+ spec,
+ NULL,
+ NULL))
+ {
+ GNUNET_break_op (0);
+ return GNUNET_SYSERR;
+ }
+ history = json_object_get (j,
+ "history");
+ if (NULL == history)
+ {
+ GNUNET_break_op (0);
+ return GNUNET_SYSERR;
+ }
+ len = json_array_size (history);
+ {
+ struct TALER_EXCHANGE_ReserveHistory *rhistory;
+
+ rhistory = GNUNET_new_array (len,
+ struct TALER_EXCHANGE_ReserveHistory);
+ if (GNUNET_OK !=
+ parse_reserve_history (rsh->exchange,
+ history,
+ &rsh->reserve_pub,
+ balance.currency,
+ &balance_from_history,
+ len,
+ rhistory))
+ {
+ GNUNET_break_op (0);
+ free_rhistory (rhistory,
+ len);
+ return GNUNET_SYSERR;
+ }
+ if (0 !=
+ TALER_amount_cmp (&balance_from_history,
+ &balance))
+ {
+ /* exchange cannot add up balances!? */
+ GNUNET_break_op (0);
+ free_rhistory (rhistory,
+ len);
+ return GNUNET_SYSERR;
+ }
+ if (NULL != rsh->cb)
+ {
+ rsh->cb (rsh->cb_cls,
+ MHD_HTTP_OK,
+ TALER_EC_NONE,
+ j,
+ &balance,
+ len,
+ rhistory);
+ rsh->cb = NULL;
+ }
+ free_rhistory (rhistory,
+ len);
+ }
+ return GNUNET_OK;
+}
+
+
+/**
* Function called when we're done processing the
* HTTP /reserve/status request.
*
@@ -485,77 +569,10 @@ handle_reserve_status_finished (void *cls,
case 0:
break;
case MHD_HTTP_OK:
- {
- /* TODO: move into separate function... */
- json_t *history;
- unsigned int len;
- struct TALER_Amount balance;
- struct TALER_Amount balance_from_history;
- struct GNUNET_JSON_Specification spec[] = {
- TALER_JSON_spec_amount ("balance", &balance),
- GNUNET_JSON_spec_end ()
- };
-
- if (GNUNET_OK !=
- GNUNET_JSON_parse (j,
- spec,
- NULL,
- NULL))
- {
- GNUNET_break_op (0);
- response_code = 0;
- break;
- }
- history = json_object_get (j,
- "history");
- if (NULL == history)
- {
- GNUNET_break_op (0);
- response_code = 0;
- break;
- }
- len = json_array_size (history);
- {
- struct TALER_EXCHANGE_ReserveHistory *rhistory;
-
- rhistory = GNUNET_new_array (len,
- struct TALER_EXCHANGE_ReserveHistory);
- if (GNUNET_OK !=
- parse_reserve_history (rsh->exchange,
- history,
- &rsh->reserve_pub,
- balance.currency,
- &balance_from_history,
- len,
- rhistory))
- {
- GNUNET_break_op (0);
- response_code = 0;
- }
- if ( (0 != response_code) &&
- (0 !=
- TALER_amount_cmp (&balance_from_history,
- &balance)) )
- {
- /* exchange cannot add up balances!? */
- GNUNET_break_op (0);
- response_code = 0;
- }
- if (0 != response_code)
- {
- rsh->cb (rsh->cb_cls,
- response_code,
- TALER_EC_NONE,
- j,
- &balance,
- len,
- rhistory);
- rsh->cb = NULL;
- }
- free_rhistory (rhistory,
- len);
- }
- }
+ if (GNUNET_OK !=
+ handle_reserve_status_ok (rsh,
+ j))
+ response_code = 0;
break;
case MHD_HTTP_BAD_REQUEST:
/* This should never happen, either us or the exchange is buggy