Home | History | Annotate | Download | only in mms
      1 /*
      2  * Copyright (C) 2015 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 package android.support.v7.mms;
     18 
     19 import android.app.PendingIntent;
     20 import android.content.ContentResolver;
     21 import android.content.Context;
     22 import android.content.Intent;
     23 import android.net.Uri;
     24 import android.os.Bundle;
     25 import android.os.Parcel;
     26 import android.os.ParcelFileDescriptor;
     27 import android.os.Parcelable;
     28 import android.text.TextUtils;
     29 import android.util.Log;
     30 
     31 import java.io.IOException;
     32 import java.util.concurrent.Callable;
     33 import java.util.concurrent.Future;
     34 import java.util.concurrent.TimeUnit;
     35 
     36 /**
     37  * Request to download an MMS
     38  */
     39 class DownloadRequest extends MmsRequest {
     40 
     41     DownloadRequest(final String locationUrl, final Uri pduUri,
     42             final PendingIntent sentIntent) {
     43         super(locationUrl, pduUri, sentIntent);
     44     }
     45 
     46     @Override
     47     protected boolean loadRequest(final Context context, final Bundle mmsConfig) {
     48         // No need to load PDU from app. Always true.
     49         return true;
     50     }
     51 
     52     @Override
     53     protected boolean transferResponse(Context context, Intent fillIn, byte[] response) {
     54         return writePduToContentUri(context, mPduUri, response);
     55     }
     56 
     57     @Override
     58     protected byte[] doHttp(Context context, MmsNetworkManager netMgr, ApnSettingsLoader.Apn apn,
     59             Bundle mmsConfig, String userAgent, String uaProfUrl) throws MmsHttpException {
     60         final MmsHttpClient httpClient = netMgr.getHttpClient();
     61         return httpClient.execute(getHttpRequestUrl(apn), null/*pdu*/, MmsHttpClient.METHOD_GET,
     62                 !TextUtils.isEmpty(apn.getMmsProxy()), apn.getMmsProxy(), apn.getMmsProxyPort(),
     63                 mmsConfig, userAgent, uaProfUrl);
     64 
     65     }
     66 
     67     @Override
     68     protected String getHttpRequestUrl(final ApnSettingsLoader.Apn apn) {
     69         return mLocationUrl;
     70     }
     71 
     72     /**
     73      * Write pdu bytes to content provider uri
     74      *
     75      * @param contentUri content provider uri to which bytes should be written
     76      * @param pdu Bytes to write
     77      * @return true if all bytes successfully written else false
     78      */
     79     public boolean writePduToContentUri(final Context context, final Uri contentUri,
     80             final byte[] pdu) {
     81         if (contentUri == null || pdu == null) {
     82             return false;
     83         }
     84         final Callable<Boolean> copyDownloadedPduToOutput = new Callable<Boolean>() {
     85             public Boolean call() {
     86                 ParcelFileDescriptor.AutoCloseOutputStream outStream = null;
     87                 try {
     88                     final ContentResolver cr = context.getContentResolver();
     89                     final ParcelFileDescriptor pduFd = cr.openFileDescriptor(contentUri, "w");
     90                     outStream = new ParcelFileDescriptor.AutoCloseOutputStream(pduFd);
     91                     outStream.write(pdu);
     92                     return true;
     93                 } catch (IOException e) {
     94                     Log.e(MmsService.TAG, "Writing PDU to downloader: IO exception", e);
     95                     return false;
     96                 } finally {
     97                     if (outStream != null) {
     98                         try {
     99                             outStream.close();
    100                         } catch (IOException ex) {
    101                             // Ignore
    102                         }
    103                     }
    104                 }
    105             }
    106         };
    107         final Future<Boolean> pendingResult =
    108                 mPduTransferExecutor.submit(copyDownloadedPduToOutput);
    109         try {
    110             return pendingResult.get(TASK_TIMEOUT_MS, TimeUnit.MILLISECONDS);
    111         } catch (Exception e) {
    112             // Typically a timeout occurred - cancel task
    113             pendingResult.cancel(true);
    114         }
    115         return false;
    116     }
    117 
    118     public static final Parcelable.Creator<DownloadRequest> CREATOR
    119             = new Parcelable.Creator<DownloadRequest>() {
    120         public DownloadRequest createFromParcel(Parcel in) {
    121             return new DownloadRequest(in);
    122         }
    123 
    124         public DownloadRequest[] newArray(int size) {
    125             return new DownloadRequest[size];
    126         }
    127     };
    128 
    129     private DownloadRequest(Parcel in) {
    130         super(in);
    131     }
    132 }
    133