aboutsummaryrefslogtreecommitdiffstats
path: root/src/main/java/de/thedevstack/conversationsplus/services/filetransfer/httpupload
diff options
context:
space:
mode:
authorsteckbrief <steckbrief@chefmail.de>2016-08-23 09:49:06 +0200
committersteckbrief <steckbrief@chefmail.de>2016-08-23 09:49:06 +0200
commite91e8a30b1f4a806d77d74871df5af6cdb87ca0e (patch)
tree6c47043d16707bf2acd8cd813e168aa7863077d4 /src/main/java/de/thedevstack/conversationsplus/services/filetransfer/httpupload
parent2d462a746ea6e733f9f2836b181795c80de5aae5 (diff)
services.filetransfer.httpupload moved to new namespace services.filetransfer.http.upload; delete parts of services.filetransfer.http moved to .delete package
Diffstat (limited to 'src/main/java/de/thedevstack/conversationsplus/services/filetransfer/httpupload')
-rw-r--r--src/main/java/de/thedevstack/conversationsplus/services/filetransfer/httpupload/HttpFileTransferEntity.java87
-rw-r--r--src/main/java/de/thedevstack/conversationsplus/services/filetransfer/httpupload/HttpFileUploader.java149
-rw-r--r--src/main/java/de/thedevstack/conversationsplus/services/filetransfer/httpupload/HttpUploadFileTransferService.java91
-rw-r--r--src/main/java/de/thedevstack/conversationsplus/services/filetransfer/httpupload/HttpUploadSlotRequestReceived.java35
-rw-r--r--src/main/java/de/thedevstack/conversationsplus/services/filetransfer/httpupload/HttpUploadedFileEncryptionUiCallback.java34
5 files changed, 0 insertions, 396 deletions
diff --git a/src/main/java/de/thedevstack/conversationsplus/services/filetransfer/httpupload/HttpFileTransferEntity.java b/src/main/java/de/thedevstack/conversationsplus/services/filetransfer/httpupload/HttpFileTransferEntity.java
deleted file mode 100644
index f6596b0c..00000000
--- a/src/main/java/de/thedevstack/conversationsplus/services/filetransfer/httpupload/HttpFileTransferEntity.java
+++ /dev/null
@@ -1,87 +0,0 @@
-package de.thedevstack.conversationsplus.services.filetransfer.httpupload;
-
-import java.net.MalformedURLException;
-import java.net.URL;
-
-import de.thedevstack.android.logcat.Logging;
-import de.thedevstack.conversationsplus.Config;
-import de.thedevstack.conversationsplus.ConversationsPlusApplication;
-import de.thedevstack.conversationsplus.entities.Message;
-import de.thedevstack.conversationsplus.services.filetransfer.FileTransferEntity;
-import de.thedevstack.conversationsplus.services.filetransfer.FileTransferFailureReason;
-import de.thedevstack.conversationsplus.utils.CryptoHelper;
-import de.thedevstack.conversationsplus.utils.MessageUtil;
-import de.thedevstack.conversationsplus.xmpp.filetransfer.http.upload.HttpUploadSlot;
-
-/**
- *
- */
-public class HttpFileTransferEntity extends FileTransferEntity {
- private HttpUploadSlot slot;
- private final byte[] key;
- private final boolean delayed;
-
- public HttpFileTransferEntity(Message message, boolean delayed) {
- super(message);
- this.getMessage().setHttpUploaded(true);
- this.getMessage().setNoDownloadable();
- if (Config.ENCRYPT_ON_HTTP_UPLOADED
- || message.getEncryption() == Message.ENCRYPTION_AXOLOTL
- || message.getEncryption() == Message.ENCRYPTION_OTR) {
- this.key = new byte[48];
- ConversationsPlusApplication.getSecureRandom().nextBytes(this.key);
- this.getFile().setKeyAndIv(this.key);
- } else {
- this.key = null;
- }
- this.delayed = delayed;
- }
-
- public void setSlot(HttpUploadSlot slot) {
- this.slot = slot;
- }
-
- public String getGetUrl() {
- return this.slot.getGetUrl();
- }
-
- public String getPutUrl() {
- return this.slot.getPutUrl();
- }
-
- public byte[] getKey() {
- return key;
- }
-
- public boolean isDelayed() {
- return this.delayed;
- }
-
- @Override
- public void fail(FileTransferFailureReason failureReason) {
- this.getMessage().setHttpUploaded(false);
- super.fail(failureReason);
- }
-
- @Override
- public void cancel() {
- this.getMessage().setHttpUploaded(false);
- super.cancel();
- }
-
- @Override
- public void transferred() {
- try {
- URL getUrl = new URL(this.getGetUrl());
- if (this.getKey() != null) {
- getUrl = new URL(getUrl.toString() + "#" + CryptoHelper.bytesToHex(this.getKey()));
- }
-
- MessageUtil.updateFileParams(this.getMessage(), getUrl);
- } catch (MalformedURLException e) {
- Logging.e("httpupload", "Not a valid get url");
- }
-
- super.transferred();
- }
-}
diff --git a/src/main/java/de/thedevstack/conversationsplus/services/filetransfer/httpupload/HttpFileUploader.java b/src/main/java/de/thedevstack/conversationsplus/services/filetransfer/httpupload/HttpFileUploader.java
deleted file mode 100644
index 705dd23c..00000000
--- a/src/main/java/de/thedevstack/conversationsplus/services/filetransfer/httpupload/HttpFileUploader.java
+++ /dev/null
@@ -1,149 +0,0 @@
-package de.thedevstack.conversationsplus.services.filetransfer.httpupload;
-
-import android.os.PowerManager;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.net.HttpURLConnection;
-import java.net.URL;
-import java.net.UnknownHostException;
-import java.util.Scanner;
-
-import javax.net.ssl.HttpsURLConnection;
-
-import de.thedevstack.android.logcat.Logging;
-import de.thedevstack.conversationsplus.ConversationsPlusApplication;
-import de.thedevstack.conversationsplus.entities.DownloadableFile;
-import de.thedevstack.conversationsplus.entities.Message;
-import de.thedevstack.conversationsplus.http.HttpConnectionManager;
-import de.thedevstack.conversationsplus.persistance.FileBackend;
-import de.thedevstack.conversationsplus.services.filetransfer.FileTransferFailureReason;
-import de.thedevstack.conversationsplus.utils.StreamUtil;
-import de.thedevstack.conversationsplus.utils.UiUpdateHelper;
-import de.thedevstack.conversationsplus.utils.XmppConnectionServiceAccessor;
-import de.thedevstack.conversationsplus.xmpp.filetransfer.http.upload.HttpUpload;
-
-public class HttpFileUploader implements Runnable {
- private static final String HTTP_METHOD = "PUT";
- private static final String MIME_REQUEST_PROPERTY_NAME = "Content-Type";
- private static final String USER_AGENT_REQUEST_PROPERTY_NAME = "User-Agent";
- private static final int BUFFER_LENGTH = 4096;
- private final HttpFileTransferEntity entity;
-
- public HttpFileUploader(HttpFileTransferEntity entity) {
- this.entity = entity;
- }
-
- @Override
- public void run() {
- this.upload();
- }
-
- private void upload() {
- OutputStream os = null;
-
- HttpURLConnection connection = null;
- InputStream fileInputStream = null;
- DownloadableFile file = this.entity.getFile();
- PowerManager.WakeLock wakeLock = ConversationsPlusApplication.createPartialWakeLock("http_upload_" + entity.getMessage().getUuid());
- try {
- wakeLock.acquire();
- Logging.d("httpupload", "uploading file to " + this.entity.getPutUrl());
- URL putUrl = new URL(this.entity.getPutUrl());
- fileInputStream = this.entity.getFileInputStream();
- connection = (HttpURLConnection) putUrl.openConnection();
-
- if (connection instanceof HttpsURLConnection) {
- HttpConnectionManager.setupTrustManager((HttpsURLConnection) connection, true);
- }
- connection.setRequestMethod(HTTP_METHOD);
- connection.setFixedLengthStreamingMode((int) file.getExpectedSize());
- String mime = file.getMimeType();
- connection.setRequestProperty(MIME_REQUEST_PROPERTY_NAME, mime == null ? HttpUpload.DEFAULT_MIME_TYPE : mime);
- connection.setRequestProperty(USER_AGENT_REQUEST_PROPERTY_NAME, ConversationsPlusApplication.getNameAndVersion());
- connection.setDoOutput(true);
- connection.connect();
- os = connection.getOutputStream();
- int count = -1;
- byte[] buffer = new byte[BUFFER_LENGTH];
- while (((count = fileInputStream.read(buffer)) != -1) && !this.entity.isCanceled()) {
- this.entity.updateProgress(count);
- os.write(buffer, 0, count);
- UiUpdateHelper.updateConversationUi();
- }
- os.flush();
- os.close();
- fileInputStream.close();
- int code = connection.getResponseCode();
- if (code == 200 || code == 201) {
- Logging.d("httpupload", "finished uploading file");
- this.entity.transferred();
-
- FileBackend.updateMediaScanner(file, XmppConnectionServiceAccessor.xmppConnectionService); // Why???
-
- // Send the URL to the counterpart
- Message message = this.entity.getMessage();
- message.setCounterpart(message.getConversation().getJid().toBareJid());
- if (message.getEncryption() == Message.ENCRYPTION_DECRYPTED) {
- XmppConnectionServiceAccessor.xmppConnectionService.getPgpEngine().encrypt(message, new HttpUploadedFileEncryptionUiCallback(this.entity));
- } else {
- XmppConnectionServiceAccessor.xmppConnectionService.resendMessage(message, this.entity.isDelayed());
- }
- } else {
- String httpResponseMessage = this.getErrorStreamContent(connection);
- String errorMessage = "file upload failed: http code (" + code + ") " + httpResponseMessage;
- Logging.e("httpupload", errorMessage);
- FileTransferFailureReason failureReason = null;
- switch (code) {
- case 403:
- failureReason = FileTransferFailureReason.createLimitedRecoverableFailureReason(errorMessage);
- break;
- case 404:
- failureReason = FileTransferFailureReason.createNonRecoverableFailureReason("Upload URL not found");
- break;
- case 500:
- failureReason = FileTransferFailureReason.createNonRecoverableFailureReason("Internal Server Error");
- break;
- default:
- failureReason = FileTransferFailureReason.createRecoverableFailureReason(errorMessage);
- }
- this.entity.fail(failureReason);
- }
- } catch (UnknownHostException e) {
- Logging.e("httpupload", "File upload failed due to unknown host. " + e.getMessage());
- //if (!HAS_INTERNET_CONNECTION) {
- this.entity.fail(FileTransferFailureReason.createRecoverableFailureReason(e, "Missing internet connection"));
- //}
- } catch (IOException e) {
- String httpResponseMessage = this.getErrorStreamContent(connection);
- Logging.e("httpupload", ((null != httpResponseMessage) ? ("http response: " + httpResponseMessage + ", ") : "") + "exception message: " + e.getMessage());
- // TODO: Differentiate IOException while internet connection wasn't available and others
- this.entity.fail(FileTransferFailureReason.createRecoverableFailureReason(e, httpResponseMessage));
- } finally {
- StreamUtil.close(os);
- StreamUtil.close(fileInputStream);
- if (connection != null) {
- connection.disconnect();
- }
- wakeLock.release();
- }
- }
-
- private String getErrorStreamContent(HttpURLConnection connection) {
- InputStream errorStream = null;
- String httpResponseMessage = null;
- try {
- errorStream = connection.getErrorStream();
- if (null != errorStream) {
- Scanner scanner = new Scanner(errorStream).useDelimiter("\\A");
- if (scanner.hasNext()) {
- httpResponseMessage = scanner.next();
- }
- }
- } finally {
- StreamUtil.close(errorStream);
- }
- return httpResponseMessage;
- }
-} \ No newline at end of file
diff --git a/src/main/java/de/thedevstack/conversationsplus/services/filetransfer/httpupload/HttpUploadFileTransferService.java b/src/main/java/de/thedevstack/conversationsplus/services/filetransfer/httpupload/HttpUploadFileTransferService.java
deleted file mode 100644
index 6fd458a9..00000000
--- a/src/main/java/de/thedevstack/conversationsplus/services/filetransfer/httpupload/HttpUploadFileTransferService.java
+++ /dev/null
@@ -1,91 +0,0 @@
-package de.thedevstack.conversationsplus.services.filetransfer.httpupload;
-
-import android.util.Pair;
-
-import java.io.FileNotFoundException;
-import java.io.InputStream;
-
-import de.thedevstack.android.logcat.Logging;
-import de.thedevstack.conversationsplus.entities.Account;
-import de.thedevstack.conversationsplus.entities.DownloadableFile;
-import de.thedevstack.conversationsplus.entities.Message;
-import de.thedevstack.conversationsplus.persistance.FileBackend;
-import de.thedevstack.conversationsplus.services.AbstractConnectionManager;
-import de.thedevstack.conversationsplus.services.FileTransferService;
-import de.thedevstack.conversationsplus.services.filetransfer.AbstractFileTransferService;
-import de.thedevstack.conversationsplus.utils.MessageUtil;
-import de.thedevstack.conversationsplus.utils.XmppSendUtil;
-import de.thedevstack.conversationsplus.xmpp.filetransfer.http.upload.HttpUpload;
-import de.thedevstack.conversationsplus.xmpp.filetransfer.http.upload.HttpUploadRequestSlotPacketGenerator;
-import de.thedevstack.conversationsplus.xmpp.jid.Jid;
-import de.thedevstack.conversationsplus.xmpp.stanzas.IqPacket;
-
-/**
- *
- */
-public class HttpUploadFileTransferService extends AbstractFileTransferService implements FileTransferService {
-
- public HttpUploadFileTransferService() {
- }
-
- /**
- * Transfers a file for the corresponding message.
- *
- * @param message the message containing the file to transfer
- * @return <code>true</code> if the file transfer was started successfully, <code>false</code> otherwise
- */
- @Override
- public boolean transferFile(Message message) {
- return this.transferFile(message, false);
- }
-
- /**
- * Transfers a file for the corresponding message.
- *
- * @param message the message containing the file to transfer
- * @param delay whether the message is delayed or not
- * @return <code>true</code> if the file transfer was started successfully, <code>false</code> otherwise
- */
- @Override
- public boolean transferFile(Message message, boolean delay) {
- Logging.d("httpupload", "Starting to upload file");
- boolean started = false;
- try {
- final HttpFileTransferEntity entity = new HttpFileTransferEntity(message, delay);
- this.addStatusListenerToEntity(entity);
- entity.startAttempt();
- Account account = message.getConversation().getAccount();
- DownloadableFile file = entity.getFile();
- Pair<InputStream, Integer> inputStreamAndExpectedSize = AbstractConnectionManager.createInputStream(file, true);
-
- entity.setFileInputStream(inputStreamAndExpectedSize.first);
- file.setExpectedSize(inputStreamAndExpectedSize.second);
-
- Logging.d("httpupload", "Requesting upload slot for file upload");
- Jid host = account.getXmppConnection().findDiscoItemByFeature(HttpUpload.NAMESPACE);
- IqPacket request = HttpUploadRequestSlotPacketGenerator.generate(host, file.getName(), file.getSize(), file.getMimeType());
- XmppSendUtil.sendIqPacket(account, request, new HttpUploadSlotRequestReceived(entity));
- MessageUtil.markMessage(message, Message.STATUS_UNSEND);
-
- Logging.d("httpupload", "Upload slot for file upload requested");
- started = true;
- } catch (FileNotFoundException e) {
- Logging.e("httpupload", "Could not find file, exception message: " + e.getMessage());
- }
- return started;
- }
-
- /**
- * Checks whether a message can be sent using this service or not.
- *
- * @param message the message to be checked
- * @return <code>true</code> if the message can be processed, <code>false</code> otherwise
- */
- @Override
- public boolean accept(Message message) {
- return null != message
- && null != message.getConversation()
- && null != message.getConversation().getAccount()
- && message.getConversation().getAccount().httpUploadAvailable(FileBackend.getFile(message, false).getSize());
- }
-}
diff --git a/src/main/java/de/thedevstack/conversationsplus/services/filetransfer/httpupload/HttpUploadSlotRequestReceived.java b/src/main/java/de/thedevstack/conversationsplus/services/filetransfer/httpupload/HttpUploadSlotRequestReceived.java
deleted file mode 100644
index 75e793f1..00000000
--- a/src/main/java/de/thedevstack/conversationsplus/services/filetransfer/httpupload/HttpUploadSlotRequestReceived.java
+++ /dev/null
@@ -1,35 +0,0 @@
-package de.thedevstack.conversationsplus.services.filetransfer.httpupload;
-
-import de.thedevstack.android.logcat.Logging;
-import de.thedevstack.conversationsplus.entities.Account;
-import de.thedevstack.conversationsplus.services.filetransfer.FileTransferFailureReason;
-import de.thedevstack.conversationsplus.xmpp.OnIqPacketReceived;
-import de.thedevstack.conversationsplus.xmpp.exceptions.XmppException;
-import de.thedevstack.conversationsplus.xmpp.filetransfer.http.upload.HttpUploadSlot;
-import de.thedevstack.conversationsplus.xmpp.filetransfer.http.upload.SlotPacketParser;
-import de.thedevstack.conversationsplus.xmpp.stanzas.IqPacket;
-
-/**
- *
- */
-public class HttpUploadSlotRequestReceived implements OnIqPacketReceived {
- private final HttpFileTransferEntity entity;
-
- public HttpUploadSlotRequestReceived(HttpFileTransferEntity entity) {
- this.entity = entity;
- }
-
- @Override
- public void onIqPacketReceived(Account account, IqPacket packet) {
- try {
- HttpUploadSlot slot = SlotPacketParser.parseGetAndPutUrl(packet);
- this.entity.setSlot(slot);
- if (!this.entity.isCanceled()) {
- new Thread(new HttpFileUploader(this.entity)).start();
- }
- } catch (XmppException e) {
- Logging.e("httpupload", e.getMessage());
- this.entity.fail(FileTransferFailureReason.createNonRecoverableFailureReason(e));
- }
- }
-}
diff --git a/src/main/java/de/thedevstack/conversationsplus/services/filetransfer/httpupload/HttpUploadedFileEncryptionUiCallback.java b/src/main/java/de/thedevstack/conversationsplus/services/filetransfer/httpupload/HttpUploadedFileEncryptionUiCallback.java
deleted file mode 100644
index e3935252..00000000
--- a/src/main/java/de/thedevstack/conversationsplus/services/filetransfer/httpupload/HttpUploadedFileEncryptionUiCallback.java
+++ /dev/null
@@ -1,34 +0,0 @@
-package de.thedevstack.conversationsplus.services.filetransfer.httpupload;
-
-import android.app.PendingIntent;
-
-import de.thedevstack.conversationsplus.entities.Message;
-import de.thedevstack.conversationsplus.services.filetransfer.FileTransferFailureReason;
-import de.thedevstack.conversationsplus.ui.UiCallback;
-import de.thedevstack.conversationsplus.utils.XmppConnectionServiceAccessor;
-
-/**
- *
- */
-public class HttpUploadedFileEncryptionUiCallback implements UiCallback<Message> {
- private final HttpFileTransferEntity entity;
-
- public HttpUploadedFileEncryptionUiCallback(HttpFileTransferEntity entity) {
- this.entity = entity;
- }
-
- @Override
- public void success(Message message) {
- XmppConnectionServiceAccessor.xmppConnectionService.resendMessage(message, this.entity.isDelayed());
- }
-
- @Override
- public void error(int errorCode, Message object) {
- this.entity.fail(FileTransferFailureReason.createLimitedRecoverableFailureReason("Failed to encrypt"));
- }
-
- @Override
- public void userInputRequried(PendingIntent pi, Message object) {
- this.entity.fail(FileTransferFailureReason.createLimitedRecoverableFailureReason("Failed to encrypt, user input would have been required"));
- }
-}