diff --git a/library/src/org/whispersystems/textsecure/push/PushServiceSocket.java b/library/src/org/whispersystems/textsecure/push/PushServiceSocket.java index 0993840806..104574696a 100644 --- a/library/src/org/whispersystems/textsecure/push/PushServiceSocket.java +++ b/library/src/org/whispersystems/textsecure/push/PushServiceSocket.java @@ -134,10 +134,10 @@ public class PushServiceSocket { return new Gson().fromJson(response.second, AttachmentKey.class).getId(); } - public List retrieveAttachments(List attachmentIds) + public List> retrieveAttachments(List attachmentIds) throws IOException { - List attachments = new LinkedList(); + List> attachments = new LinkedList>(); for (PushAttachmentPointer attachmentId : attachmentIds) { Pair response = makeRequestForResponseHeader(String.format(ATTACHMENT_PATH, attachmentId.getKey()), @@ -146,9 +146,10 @@ public class PushServiceSocket { Log.w("PushServiceSocket", "Attachment: " + attachmentId.getKey() + " is at: " + response.first); File attachment = File.createTempFile("attachment", ".tmp", context.getFilesDir()); - downloadExternalFile(response.first, attachment); + attachment.deleteOnExit(); - attachments.add(attachment); + downloadExternalFile(response.first, attachment); + attachments.add(new Pair(attachment, attachmentId.getContentType())); } return attachments; diff --git a/library/src/org/whispersystems/textsecure/util/Util.java b/library/src/org/whispersystems/textsecure/util/Util.java index 2a895fd983..6982a5461b 100644 --- a/library/src/org/whispersystems/textsecure/util/Util.java +++ b/library/src/org/whispersystems/textsecure/util/Util.java @@ -5,8 +5,11 @@ import android.content.Context; import android.widget.EditText; import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; +import java.io.OutputStream; import java.security.NoSuchAlgorithmException; import java.security.SecureRandom; import java.util.Collection; @@ -44,6 +47,10 @@ public class Util { } } + public static String readFully(File file) throws IOException { + return readFully(new FileInputStream(file)); + } + public static String readFully(InputStream in) throws IOException { ByteArrayOutputStream bout = new ByteArrayOutputStream(); byte[] buffer = new byte[4096]; @@ -58,6 +65,18 @@ public class Util { return new String(bout.toByteArray()); } + public static void copy(InputStream in, OutputStream out) throws IOException { + byte[] buffer = new byte[4096]; + int read; + + while ((read = in.read(buffer)) != -1) { + out.write(buffer, 0, read); + } + + in.close(); + out.close(); + } + public static String join(Collection list, String delimiter) { StringBuilder result = new StringBuilder(); int i=0; diff --git a/src/org/thoughtcrime/securesms/mms/IncomingMediaMessage.java b/src/org/thoughtcrime/securesms/mms/IncomingMediaMessage.java index 343876670c..65636b2550 100644 --- a/src/org/thoughtcrime/securesms/mms/IncomingMediaMessage.java +++ b/src/org/thoughtcrime/securesms/mms/IncomingMediaMessage.java @@ -1,15 +1,14 @@ package org.thoughtcrime.securesms.mms; import android.util.Log; +import android.util.Pair; import org.thoughtcrime.securesms.util.Util; import org.whispersystems.textsecure.push.IncomingPushMessage; -import org.whispersystems.textsecure.push.PushAttachmentPointer; import java.io.File; import java.io.FileInputStream; import java.io.IOException; -import java.util.Iterator; import java.util.List; import ws.com.google.android.mms.pdu.CharacterSets; @@ -29,7 +28,8 @@ public class IncomingMediaMessage { this.body = retreived.getBody(); } - public IncomingMediaMessage(String localNumber, IncomingPushMessage message, List attachments) + public IncomingMediaMessage(String localNumber, IncomingPushMessage message, + List> attachments) throws IOException { this.headers = new PduHeaders(); @@ -53,20 +53,18 @@ public class IncomingMediaMessage { body.addPart(text); } - Iterator descriptors = message.getAttachments().iterator(); - if (attachments != null) { - for (File attachment : attachments) { + for (Pair attachment : attachments) { PduPart media = new PduPart(); - FileInputStream fin = new FileInputStream(attachment); + FileInputStream fin = new FileInputStream(attachment.first); byte[] data = Util.readFully(fin); - PushAttachmentPointer descriptor = descriptors.next(); - Log.w("IncomingMediaMessage", "Adding part: " + descriptor.getContentType() + " with length: " + data.length); + Log.w("IncomingMediaMessage", "Adding part: " + attachment.second + " with length: " + data.length); - media.setContentType(descriptor.getContentType().getBytes(CharacterSets.MIMENAME_ISO_8859_1)); + media.setContentType(attachment.second.getBytes(CharacterSets.MIMENAME_ISO_8859_1)); media.setData(data); body.addPart(media); + attachment.first.delete(); } } } diff --git a/src/org/thoughtcrime/securesms/service/MmsReceiver.java b/src/org/thoughtcrime/securesms/service/MmsReceiver.java index 9f07762c3b..85fe9ef0a4 100644 --- a/src/org/thoughtcrime/securesms/service/MmsReceiver.java +++ b/src/org/thoughtcrime/securesms/service/MmsReceiver.java @@ -81,8 +81,8 @@ public class MmsReceiver { PushServiceSocket socket = new PushServiceSocket(context, localNumber, password); try { - List attachments = socket.retrieveAttachments(pushMessage.getAttachments()); - IncomingMediaMessage message = new IncomingMediaMessage(localNumber, pushMessage, attachments); + List> attachments = socket.retrieveAttachments(pushMessage.getAttachments()); + IncomingMediaMessage message = new IncomingMediaMessage(localNumber, pushMessage, attachments); DatabaseFactory.getMmsDatabase(context).insertMessageInbox(masterSecret, message, "", -1); } catch (IOException e) {