package cn.rongcloud.im.server.network.http;
import android.content.Context;
import org.apache.http.Header;
import org.apache.http.HttpEntity;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
public class FileAsyncHttpResponseHandler extends AsyncHttpResponseHandler {
private File mFile;
private static final String LOG_TAG = "FileAsyncHttpResponseHandler";
public FileAsyncHttpResponseHandler(File file) {
super();
assert (file != null);
this.mFile = file;
}
public FileAsyncHttpResponseHandler(Context c) {
super();
assert (c != null);
this.mFile = getTemporaryFile(c);
}
protected File getTemporaryFile(Context c) {
try {
return File.createTempFile("temp_", "_handled", c.getCacheDir());
} catch (Throwable t) {
}
return null;
}
protected File getTargetFile() {
assert (mFile != null);
return mFile;
}
public void onSuccess(File file) {
}
public void onSuccess(int statusCode, File file) {
onSuccess(file);
}
public void onSuccess(int statusCode, Header[] headers, File file) {
onSuccess(statusCode, file);
}
@SuppressWarnings("deprecation")
public void onFailure(Throwable e, File response) {
// By default call lower chain method
onFailure(e);
}
public void onFailure(int statusCode, Throwable e, File response) {
// By default call lower chain method
onFailure(e, response);
}
public void onFailure(int statusCode, Header[] headers, Throwable e, File response) {
// By default call lower chain method
onFailure(statusCode, e, response);
}
@Override
public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) {
onFailure(statusCode, headers, error, getTargetFile());
}
@Override
public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) {
onSuccess(statusCode, headers, getTargetFile());
}
@Override
byte[] getResponseData(HttpEntity entity) throws IOException {
if (entity != null) {
InputStream instream = entity.getContent();
long contentLength = entity.getContentLength();
FileOutputStream buffer = new FileOutputStream(getTargetFile());
if (instream != null) {
try {
byte[] tmp = new byte[BUFFER_SIZE];
int l, count = 0;
// do not send messages if request has been cancelled
while ((l = instream.read(tmp)) != -1 && !Thread.currentThread().isInterrupted()) {
count += l;
buffer.write(tmp, 0, l);
sendProgressMessage(count, (int) contentLength);
}
} finally {
instream.close();
buffer.flush();
buffer.close();
}
}
}
return null;
}
}