/** * Copyright (C) 2011 Whisper Systems * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ package org.thoughtcrime.securesms.service; import android.content.Context; import android.content.Intent; import android.os.Handler; import android.telephony.TelephonyManager; import android.util.Log; import org.thoughtcrime.securesms.R; import org.thoughtcrime.securesms.crypto.MasterSecret; import org.thoughtcrime.securesms.crypto.SessionCipher; import org.thoughtcrime.securesms.database.DatabaseFactory; import org.thoughtcrime.securesms.database.MmsDatabase; import org.thoughtcrime.securesms.mms.MmsSendHelper; import org.thoughtcrime.securesms.mms.TextTransport; import org.thoughtcrime.securesms.notifications.MessageNotifier; import org.thoughtcrime.securesms.protocol.WirePrefix; import org.thoughtcrime.securesms.recipients.Recipient; import org.thoughtcrime.securesms.recipients.Recipients; import org.thoughtcrime.securesms.util.Hex; import ws.com.google.android.mms.ContentType; import ws.com.google.android.mms.MmsException; import ws.com.google.android.mms.pdu.EncodedStringValue; import ws.com.google.android.mms.pdu.PduBody; import ws.com.google.android.mms.pdu.PduComposer; import ws.com.google.android.mms.pdu.PduHeaders; import ws.com.google.android.mms.pdu.PduParser; import ws.com.google.android.mms.pdu.PduPart; import ws.com.google.android.mms.pdu.SendConf; import ws.com.google.android.mms.pdu.SendReq; import java.io.IOException; import java.util.Arrays; import java.util.LinkedList; public class MmsSender extends MmscProcessor { private final LinkedList pendingMessages = new LinkedList(); private final Handler toastHandler; public MmsSender(Context context, Handler toastHandler) { super(context); this.toastHandler = toastHandler; } public void process(MasterSecret masterSecret, Intent intent) { if (intent.getAction().equals(SendReceiveService.SEND_MMS_ACTION)) { long messageId = intent.getLongExtra("message_id", -1); MmsDatabase database = DatabaseFactory.getEncryptingMmsDatabase(context, masterSecret); try { SendReq[] sendRequests; if (messageId == -1) { sendRequests = database.getOutgoingMessages(); } else { sendRequests = new SendReq[1]; sendRequests[0] = database.getSendRequest(messageId); } if (sendRequests != null && sendRequests.length > 0) handleSendMms(sendRequests, messageId != -1); } catch (MmsException me) { Log.w("MmsSender", me); if (messageId != -1) database.markAsSentFailed(messageId); } } else if (intent.getAction().equals(SendReceiveService.SEND_MMS_CONNECTIVITY_ACTION)) { handleConnectivityChange(masterSecret); } } protected void handleConnectivityChange(MasterSecret masterSecret) { if (!isConnected()) return; if (!pendingMessages.isEmpty()) handleSendMmsContinued(masterSecret, pendingMessages.remove()); else finishConnectivity(); } private void handleSendMms(SendReq[] sendRequests, boolean targeted) { if (!isConnectivityPossible()) { if (targeted) { toastHandler .obtainMessage(0, context.getString(R.string.MmsSender_currently_unable_to_send_your_mms_message)) .sendToTarget(); } // for (int i=0;i