package de.thedevstack.conversationsplus.services.filetransfer.http.delete; import org.json.JSONException; import org.json.JSONObject; import java.io.IOException; import de.thedevstack.android.logcat.Logging; import de.thedevstack.conversationsplus.enums.FileStatus; import de.thedevstack.conversationsplus.http.HttpClient; import de.thedevstack.conversationsplus.utils.MessageUtil; import de.thedevstack.conversationsplus.xmpp.exceptions.XmppException; import de.thedevstack.conversationsplus.xmpp.filetransfer.http.delete.DeleteSlotPacketParser; import eu.siacs.conversations.entities.Account; import eu.siacs.conversations.xmpp.stanzas.IqPacket; import eu.siacs.conversations.xmpp.OnIqPacketReceived; import okhttp3.Call; import okhttp3.Callback; import okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.Response; /** * */ public class DeleteTokenReceived implements OnIqPacketReceived { private static final String HEADER_NAME_DELETE_TOKEN = "X-FILETRANSFER-HTTP-DELETE-TOKEN"; private final DeleteRemoteFile remoteFile; public DeleteTokenReceived(DeleteRemoteFile remoteFile) { this.remoteFile = remoteFile; } @Override public void onIqPacketReceived(Account account, IqPacket packet) { try { String url = this.remoteFile.getPath(); String deleteToken = DeleteSlotPacketParser.parseDeleteToken(packet); Logging.d("filetransfer.http.delete", "Got delete token '" + deleteToken + "' for remote file '" + remoteFile.getPath() + "'"); OkHttpClient client = HttpClient.getClient(true); Request request = new Request.Builder() .url(url) .addHeader(HEADER_NAME_DELETE_TOKEN, deleteToken) .delete() .build(); client.newCall(request).enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { Logging.e("filetransfer.http.delete", "Error while connecting to '" + call.request().url() + "': " + e.getMessage()); MessageUtil.setAndSaveFileStatus(remoteFile.getMessage(), FileStatus.DELETE_FAILED); } @Override public void onResponse(Call call, Response response) throws IOException { if (response.isSuccessful()) { MessageUtil.setAndSaveFileStatus(remoteFile.getMessage(), FileStatus.DELETED); Logging.i("filetransfer.http.delete", "Remote file successfully deleted '" + remoteFile.getPath() + "'"); } else { String detailedMessage = response.body().string(); FileStatus fileStatus = FileStatus.DELETE_FAILED; switch (response.code()) { case 403: case 500: try { JSONObject jsonObject = new JSONObject(detailedMessage); detailedMessage = jsonObject.getString("msg"); } catch (JSONException e) { Logging.e("filetransfer.http.delete", "Failed to get error message from expected json response: " + detailedMessage); } break; case 404: fileStatus = FileStatus.DELETED; Logging.i("filetransfer.http.delete", "Failed to delete file - it was already deleted."); break; } Logging.e("filetransfer.http.delete", "Could not delete remote file '" + remoteFile.getPath() + "'. Response Code: " + response.code() + ", details: " + detailedMessage); MessageUtil.setAndSaveFileStatus(remoteFile.getMessage(), fileStatus); } } }); } catch (XmppException e) { Logging.e("filetransfer.http.delete", "Error while trying to get the delete token: " + e.getMessage()); MessageUtil.setAndSaveFileStatus(remoteFile.getMessage(), FileStatus.DELETE_FAILED); } } }