/*
- * Copyright © 2020 Damyan Ivanov.
+ * Copyright © 2021 Damyan Ivanov.
* This file is part of MoLe.
* MoLe is free software: you can distribute it and/or modify it
* under the term of the GNU General Public License as published by
import android.os.AsyncTask;
import android.util.Log;
+import net.ktnx.mobileledger.db.Profile;
import net.ktnx.mobileledger.json.API;
+import net.ktnx.mobileledger.json.ApiNotSupportedException;
import net.ktnx.mobileledger.json.Gateway;
import net.ktnx.mobileledger.model.LedgerTransaction;
import net.ktnx.mobileledger.model.LedgerTransactionAccount;
-import net.ktnx.mobileledger.model.MobileLedgerProfile;
import net.ktnx.mobileledger.utils.Globals;
import net.ktnx.mobileledger.utils.Logger;
import net.ktnx.mobileledger.utils.NetworkUtil;
public class SendTransactionTask extends AsyncTask<LedgerTransaction, Void, Void> {
private final TaskCallback taskCallback;
- private final MobileLedgerProfile mProfile;
+ private final Profile mProfile;
private final boolean simulate;
protected String error;
private String token;
private String session;
private LedgerTransaction transaction;
- public SendTransactionTask(TaskCallback callback, MobileLedgerProfile profile,
+ public SendTransactionTask(TaskCallback callback, Profile profile,
boolean simulate) {
taskCallback = callback;
mProfile = profile;
this.simulate = simulate;
}
- public SendTransactionTask(TaskCallback callback, MobileLedgerProfile profile) {
+ public SendTransactionTask(TaskCallback callback, Profile profile) {
taskCallback = callback;
mProfile = profile;
simulate = false;
}
- private boolean sendOK(API apiVersion) throws IOException {
+ private void sendOK(API apiVersion) throws IOException, ApiNotSupportedException {
HttpURLConnection http = NetworkUtil.prepareConnection(mProfile, "add");
http.setRequestMethod("PUT");
http.setRequestProperty("Content-Type", "application/json");
Gateway gateway = Gateway.forApiVersion(apiVersion);
String body = gateway.transactionSaveRequest(transaction);
- return sendRequest(http, body);
+ Logger.debug("network", "Sending using API " + apiVersion);
+ sendRequest(http, body);
}
- private boolean sendRequest(HttpURLConnection http, String body) throws IOException {
+ private void sendRequest(HttpURLConnection http, String body)
+ throws IOException, ApiNotSupportedException {
if (simulate) {
debug("network", "The request would be: " + body);
try {
Logger.debug("network", ex.toString());
}
- return true;
+ return;
}
byte[] bodyBytes = body.getBytes(StandardCharsets.UTF_8);
case 400:
case 405: {
BufferedReader reader = new BufferedReader(new InputStreamReader(resp));
- String line;
+ StringBuilder errorLines = new StringBuilder();
int count = 0;
while (count <= 5) {
- line = reader.readLine();
+ String line = reader.readLine();
if (line == null)
break;
Logger.debug("network", line);
+
+ if (errorLines.length() != 0)
+ errorLines.append("\n");
+
+ errorLines.append(line);
count++;
}
- return false; // will cause a retry with another method
+ throw new ApiNotSupportedException(errorLines.toString());
}
default:
BufferedReader reader = new BufferedReader(new InputStreamReader(resp));
}
}
}
-
- return true;
}
private boolean legacySendOK() throws IOException {
HttpURLConnection http = NetworkUtil.prepareConnection(mProfile, "add");
try {
transaction = ledgerTransactions[0];
- final API profileApiVersion = mProfile.getApiVersion();
+ final API profileApiVersion = API.valueOf(mProfile.getApiVersion());
switch (profileApiVersion) {
case auto:
boolean sendOK = false;
for (API ver : API.allVersions) {
Logger.debug("network", "Trying version " + ver);
- if (sendOK(ver)) {
+ try {
+ sendOK(ver);
sendOK = true;
Logger.debug("network", "Version " + ver + " request succeeded");
break;
}
+ catch (ApiNotSupportedException e) {
+ Logger.debug("network", "Version " + ver + " seems not supported");
+ }
}
+
if (!sendOK) {
Logger.debug("network", "Trying HTML form emulation");
legacySendOkWithRetry();
throw new IllegalStateException("Unexpected API version: " + profileApiVersion);
}
}
- catch (Exception e) {
+ catch (ApiNotSupportedException | Exception e) {
e.printStackTrace();
error = e.getMessage();
}
@Override
protected void onPostExecute(Void aVoid) {
super.onPostExecute(aVoid);
- taskCallback.done(error);
+ taskCallback.done(error, transaction);
}
}
\ No newline at end of file