2014-10-13 23:06:45 +00:00
|
|
|
package eu.siacs.conversations.http;
|
|
|
|
|
|
|
|
import java.io.BufferedInputStream;
|
|
|
|
import java.io.IOException;
|
|
|
|
import java.io.OutputStream;
|
|
|
|
import java.net.HttpURLConnection;
|
|
|
|
import java.net.MalformedURLException;
|
|
|
|
import java.net.URL;
|
|
|
|
|
|
|
|
import javax.net.ssl.HttpsURLConnection;
|
|
|
|
|
2014-10-14 16:16:03 +00:00
|
|
|
import android.graphics.BitmapFactory;
|
2014-10-13 23:06:45 +00:00
|
|
|
|
|
|
|
import eu.siacs.conversations.entities.Downloadable;
|
2014-10-14 10:02:48 +00:00
|
|
|
import eu.siacs.conversations.entities.DownloadableFile;
|
2014-10-13 23:06:45 +00:00
|
|
|
import eu.siacs.conversations.entities.Message;
|
|
|
|
import eu.siacs.conversations.services.XmppConnectionService;
|
|
|
|
|
|
|
|
public class HttpConnection implements Downloadable {
|
|
|
|
|
|
|
|
private HttpConnectionManager mHttpConnectionManager;
|
|
|
|
private XmppConnectionService mXmppConnectionService;
|
|
|
|
|
|
|
|
private URL mUrl;
|
|
|
|
private Message message;
|
|
|
|
private DownloadableFile file;
|
2014-10-15 17:32:12 +00:00
|
|
|
private long mPreviousFileSize = 0;
|
|
|
|
private int mStatus = Downloadable.STATUS_UNKNOWN;
|
2014-10-13 23:06:45 +00:00
|
|
|
|
|
|
|
public HttpConnection(HttpConnectionManager manager) {
|
|
|
|
this.mHttpConnectionManager = manager;
|
|
|
|
this.mXmppConnectionService = manager.getXmppConnectionService();
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public void start() {
|
2014-10-15 17:32:12 +00:00
|
|
|
changeStatus(STATUS_DOWNLOADING);
|
2014-10-13 23:06:45 +00:00
|
|
|
new Thread(new FileDownloader()).start();
|
|
|
|
}
|
|
|
|
|
|
|
|
public void init(Message message) {
|
|
|
|
this.message = message;
|
|
|
|
this.message.setDownloadable(this);
|
|
|
|
try {
|
|
|
|
mUrl = new URL(message.getBody());
|
2014-10-15 17:32:12 +00:00
|
|
|
this.file = mXmppConnectionService.getFileBackend()
|
|
|
|
.getConversationsFile(message, false);
|
2014-10-13 23:06:45 +00:00
|
|
|
checkFileSize();
|
|
|
|
} catch (MalformedURLException e) {
|
|
|
|
this.cancel();
|
|
|
|
}
|
|
|
|
}
|
2014-10-15 17:32:12 +00:00
|
|
|
|
2014-10-14 17:27:49 +00:00
|
|
|
public void init(Message message, URL url) {
|
|
|
|
this.message = message;
|
|
|
|
this.message.setDownloadable(this);
|
|
|
|
this.mUrl = url;
|
2014-10-15 17:32:12 +00:00
|
|
|
this.file = mXmppConnectionService.getFileBackend()
|
|
|
|
.getConversationsFile(message, false);
|
2014-10-14 17:27:49 +00:00
|
|
|
this.mPreviousFileSize = message.getImageParams().size;
|
|
|
|
checkFileSize();
|
|
|
|
}
|
2014-10-15 17:32:12 +00:00
|
|
|
|
2014-10-13 23:06:45 +00:00
|
|
|
private void checkFileSize() {
|
2014-10-15 17:32:12 +00:00
|
|
|
changeStatus(STATUS_CHECKING);
|
2014-10-13 23:06:45 +00:00
|
|
|
new Thread(new FileSizeChecker()).start();
|
|
|
|
}
|
|
|
|
|
|
|
|
public void cancel() {
|
2014-10-14 17:27:49 +00:00
|
|
|
mHttpConnectionManager.finishConnection(this);
|
2014-10-15 17:32:12 +00:00
|
|
|
message.setDownloadable(null);
|
|
|
|
message.setBody(mUrl.toString());
|
|
|
|
mXmppConnectionService.updateMessage(message);
|
2014-10-14 17:27:49 +00:00
|
|
|
}
|
2014-10-15 17:32:12 +00:00
|
|
|
|
2014-10-14 17:27:49 +00:00
|
|
|
private void finish() {
|
2014-10-15 17:32:12 +00:00
|
|
|
message.setDownloadable(null);
|
2014-10-14 17:27:49 +00:00
|
|
|
mHttpConnectionManager.finishConnection(this);
|
2014-10-13 23:06:45 +00:00
|
|
|
}
|
|
|
|
|
2014-10-15 17:32:12 +00:00
|
|
|
private void changeStatus(int status) {
|
|
|
|
this.mStatus = status;
|
|
|
|
mXmppConnectionService.updateConversationUi();
|
|
|
|
}
|
|
|
|
|
2014-10-13 23:06:45 +00:00
|
|
|
private class FileSizeChecker implements Runnable {
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public void run() {
|
2014-10-14 17:27:49 +00:00
|
|
|
long size;
|
2014-10-13 23:06:45 +00:00
|
|
|
try {
|
2014-10-14 17:27:49 +00:00
|
|
|
size = retrieveFileSize();
|
2014-10-13 23:06:45 +00:00
|
|
|
} catch (IOException e) {
|
|
|
|
cancel();
|
2014-10-14 17:27:49 +00:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
file.setExpectedSize(size);
|
2014-10-15 17:32:12 +00:00
|
|
|
message.setType(Message.TYPE_IMAGE);
|
|
|
|
if (size <= mHttpConnectionManager.getAutoAcceptFileSize()
|
|
|
|
|| size == mPreviousFileSize) {
|
2014-10-14 17:27:49 +00:00
|
|
|
start();
|
|
|
|
} else {
|
2014-10-15 17:32:12 +00:00
|
|
|
changeStatus(STATUS_OFFER);
|
2014-10-13 23:06:45 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
private long retrieveFileSize() throws IOException {
|
2014-10-15 17:32:12 +00:00
|
|
|
HttpURLConnection connection = (HttpURLConnection) mUrl
|
|
|
|
.openConnection();
|
2014-10-13 23:06:45 +00:00
|
|
|
connection.setRequestMethod("HEAD");
|
|
|
|
if (connection instanceof HttpsURLConnection) {
|
2014-10-15 17:32:12 +00:00
|
|
|
|
2014-10-13 23:06:45 +00:00
|
|
|
}
|
|
|
|
String contentLength = connection.getHeaderField("Content-Length");
|
|
|
|
if (contentLength == null) {
|
|
|
|
throw new IOException();
|
|
|
|
}
|
|
|
|
try {
|
|
|
|
return Long.parseLong(contentLength, 10);
|
|
|
|
} catch (NumberFormatException e) {
|
|
|
|
throw new IOException();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
2014-10-15 17:32:12 +00:00
|
|
|
|
2014-10-13 23:06:45 +00:00
|
|
|
private class FileDownloader implements Runnable {
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public void run() {
|
|
|
|
try {
|
|
|
|
download();
|
2014-10-14 16:16:03 +00:00
|
|
|
updateImageBounds();
|
2014-10-14 17:27:49 +00:00
|
|
|
finish();
|
2014-10-13 23:06:45 +00:00
|
|
|
} catch (IOException e) {
|
|
|
|
cancel();
|
|
|
|
}
|
|
|
|
}
|
2014-10-15 17:32:12 +00:00
|
|
|
|
2014-10-13 23:06:45 +00:00
|
|
|
private void download() throws IOException {
|
2014-10-15 17:32:12 +00:00
|
|
|
HttpURLConnection connection = (HttpURLConnection) mUrl
|
|
|
|
.openConnection();
|
2014-10-13 23:06:45 +00:00
|
|
|
if (connection instanceof HttpsURLConnection) {
|
2014-10-15 17:32:12 +00:00
|
|
|
|
2014-10-13 23:06:45 +00:00
|
|
|
}
|
2014-10-15 17:32:12 +00:00
|
|
|
BufferedInputStream is = new BufferedInputStream(
|
|
|
|
connection.getInputStream());
|
2014-10-13 23:06:45 +00:00
|
|
|
OutputStream os = file.createOutputStream();
|
|
|
|
int count = -1;
|
|
|
|
byte[] buffer = new byte[1024];
|
|
|
|
while ((count = is.read(buffer)) != -1) {
|
|
|
|
os.write(buffer, 0, count);
|
|
|
|
}
|
|
|
|
os.flush();
|
|
|
|
os.close();
|
|
|
|
is.close();
|
2014-10-14 16:16:03 +00:00
|
|
|
}
|
2014-10-15 17:32:12 +00:00
|
|
|
|
2014-10-14 16:16:03 +00:00
|
|
|
private void updateImageBounds() {
|
|
|
|
BitmapFactory.Options options = new BitmapFactory.Options();
|
|
|
|
options.inJustDecodeBounds = true;
|
|
|
|
BitmapFactory.decodeFile(file.getAbsolutePath(), options);
|
|
|
|
int imageHeight = options.outHeight;
|
|
|
|
int imageWidth = options.outWidth;
|
2014-10-15 17:32:12 +00:00
|
|
|
message.setBody(mUrl.toString() + "," + file.getSize() + ','
|
2014-10-14 16:16:03 +00:00
|
|
|
+ imageWidth + ',' + imageHeight);
|
2014-10-15 17:32:12 +00:00
|
|
|
mXmppConnectionService.updateMessage(message);
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public int getStatus() {
|
|
|
|
return this.mStatus;
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public long getFileSize() {
|
|
|
|
if (this.file != null) {
|
|
|
|
return this.file.getExpectedSize();
|
|
|
|
} else {
|
|
|
|
return 0;
|
2014-10-13 23:06:45 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|