package czd.lib.network; import android.util.Log; import org.apache.http.Header; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.StatusLine; import org.apache.http.client.HttpResponseException; import org.apache.http.client.methods.HttpUriRequest; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; /** * Created with IntelliJ IDEA. * User: chenzhidong * Date: 14-3-3 * Time: 下午10:46 */ public abstract class RangeFileAsyncHttpResponseHandler extends FileAsyncHttpResponseHandler { private static final String LOG_TAG = "RangeFileAsyncHttpResponseHandler"; private long current=0; private boolean append = false; public RangeFileAsyncHttpResponseHandler(File file) { super(file); } @Override public void sendResponseMessage(HttpResponse response) throws IOException { if (!Thread.currentThread().isInterrupted()) { StatusLine status = response.getStatusLine(); if (status.getStatusCode() == 416) { //already finished if (!Thread.currentThread().isInterrupted()) sendSuccessMessage(status.getStatusCode(), response.getAllHeaders(), null); } else if (status.getStatusCode() >= 300) { if (!Thread.currentThread().isInterrupted()) sendFailureMessage(status.getStatusCode(), response.getAllHeaders(), null, new HttpResponseException(status.getStatusCode(), status.getReasonPhrase())); } else { if (!Thread.currentThread().isInterrupted()) { Header[] headers = response.getHeaders("Content-Range"); if (headers == null || headers.length == 0) { append = false; current = 0; } else { for (Header h : headers) { Log.v(LOG_TAG, h.getName() + " : " + h.getValue()); } } sendSuccessMessage(status.getStatusCode(), response.getAllHeaders(), getResponseData(response.getEntity())); } } } } @Override protected byte[] getResponseData(HttpEntity entity) throws IOException { if (entity != null) { InputStream instream = entity.getContent(); long contentLength = entity.getContentLength()+current; FileOutputStream buffer = new FileOutputStream(getTargetFile(), append); if (instream != null) { try { byte[] tmp = new byte[BUFFER_SIZE]; int l; while (current<contentLength && (l = instream.read(tmp)) != -1 && !Thread.currentThread().isInterrupted()) { current += l; buffer.write(tmp, 0, l); sendProgressMessage((int)current, (int)contentLength); } } finally { instream.close(); buffer.flush(); buffer.close(); } } } return null; } public void updateRequestHeaders(HttpUriRequest uriRequest) { if (mFile.exists() && mFile.canWrite()) current = mFile.length(); if (current > 0) { append = true; uriRequest.setHeader("Range", "bytes=" + current + "-"); } } }