package in.srain.cube.update;
import android.webkit.URLUtil;
import in.srain.cube.cache.DiskFileUtils;
import in.srain.cube.concurrent.SimpleTask;
import in.srain.cube.diskcache.FileUtils;
import in.srain.cube.util.CLog;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
public class DownloadTask extends SimpleTask {
private static final String LOG_TAG = "cube-update";
public static final int RESULT_OK = 1;
public static final int RESULT_URL_ERROR = 2;
public static final int RESULT_DOWNLOAD_ERROR = 3;
public static final int RESULT_NO_ENOUGH_SPACE = 4;
private int mResult = RESULT_OK;
private String mUrl;
private String mFileName;
private DownLoadListener mDownLoadListener;
public DownloadTask(DownLoadListener listener, String url, String fileName) {
mDownLoadListener = listener;
mUrl = url;
mFileName = fileName;
}
private void setResult(int result) {
mResult = result;
}
@Override
public void doInBackground() {
if (!URLUtil.isNetworkUrl(mUrl)) {
setResult(RESULT_URL_ERROR);
return;
}
int updatePercent;
String updateUrl = mUrl;
int totalRead = 0;
int totalSize = 0;
try {
URL myURL = new URL(updateUrl);
HttpURLConnection conn = (HttpURLConnection) myURL.openConnection();
conn.setConnectTimeout(30 * 1000);
conn.connect();
totalSize = conn.getContentLength();
File dstFile = new File(mFileName);
if (dstFile.exists() && totalSize == dstFile.length()) {
if (conn != null) {
conn.disconnect();
}
setResult(RESULT_OK);
return;
}
if (dstFile.exists()) {
dstFile.delete();
}
File dir = dstFile.getParentFile();
if (!dir.exists() && !dir.mkdirs()) {
setResult(RESULT_DOWNLOAD_ERROR);
return;
}
long free = DiskFileUtils.getUsableSpace(dir);
if (free < totalSize) {
setResult(RESULT_NO_ENOUGH_SPACE);
return;
}
InputStream is = conn.getInputStream();
if (is == null) {
setResult(RESULT_DOWNLOAD_ERROR);
return;
}
FileOutputStream fos = new FileOutputStream(dstFile);
byte buf[] = new byte[409200];
while (!isCancelled()) {
int read = is.read(buf);
if (read <= 0) {
break;
}
fos.write(buf, 0, read);
totalRead += read;
updatePercent = (int) (100f * totalRead / totalSize);
if (!isCancelled()) {
mDownLoadListener.onPercentUpdate(updatePercent);
}
}
if (is != null) {
try {
is.close();
} catch (Exception e) {
e.printStackTrace();
}
}
if (fos != null) {
try {
fos.close();
} catch (Exception e) {
e.printStackTrace();
}
}
if (conn != null) {
conn.disconnect();
}
} catch (Exception e) {
setResult(RESULT_DOWNLOAD_ERROR);
return;
}
if (isCancelled()) {
CLog.d(LOG_TAG, "task has been canceled");
return;
}
if (totalRead != totalSize) {
CLog.d(LOG_TAG, "download fail, file not complete");
setResult(RESULT_DOWNLOAD_ERROR);
} else {
FileUtils.chmod("666", mFileName);
setResult(RESULT_OK);
}
}
@Override
protected void onCancel() {
mDownLoadListener.onCancel();
}
@Override
public void onFinish(boolean canceled) {
mDownLoadListener.onDone(canceled, mResult);
}
}