package cn.koolcloud.ipos.appstore.common;
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.net.ConnectException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.methods.HttpRequestBase;
import org.apache.http.client.params.HttpClientParams;
import org.apache.http.entity.AbstractHttpEntity;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.params.BasicHttpParams;
import org.apache.http.params.HttpConnectionParams;
import org.apache.http.params.HttpParams;
import org.apache.http.params.HttpProtocolParams;
import org.apache.http.protocol.HTTP;
import org.apache.http.util.EntityUtils;
import org.json.JSONArray;
import org.json.JSONObject;
import android.content.Context;
import android.os.AsyncTask;
import cn.koolcloud.ipos.appstore.entity.ResultSet;
import cn.koolcloud.ipos.appstore.interfaces.CallBack;
import cn.koolcloud.ipos.appstore.utils.Logger;
import cn.koolcloud.ipos.appstore.utils.NetUtil;
/**
* <p>Title: AsyncHttpTask.java</p>
* <p>Description: custom http Async task</p>
* <p>Copyright: Copyright (c) 2013</p>
* <p>Company: All In Pay</p>
* @author Teddy
* @date 2013-11-5
* @version
*/
public class AsyncHttpTask extends AsyncTask<Object, Object, Object> {
static final String LOG_TAG = "AsyncHttpTask";
/*public static int CONNECTION_TIMEOUT = 30 * 1000;// 1;
public static int SO_TIMEOUT = 30 * 1000;*/
Context context;
String url;
JSONObject parameters;
CallBack callBack;
int responseType;
String requestMethod = "post";
/*private static final String USER_AGENT = "AllInPay-Network";
public static final HttpParams HTTP_PARAMS;
static {
// Prepare HTTP parameters.
HttpParams params = new BasicHttpParams();
HttpConnectionParams.setStaleCheckingEnabled(params, true);
HttpConnectionParams.setConnectionTimeout(params, CONNECTION_TIMEOUT);
HttpConnectionParams.setSoTimeout(params, CONNECTION_TIMEOUT);
HttpClientParams.setRedirecting(params, true);
HttpProtocolParams.setUserAgent(params, USER_AGENT);
HttpProtocolParams.setUseExpectContinue(params, false);
HTTP_PARAMS = params;
}*/
public AsyncHttpTask(Context context, String url,
JSONObject parameters, CallBack callBack, int responseType) {
this.context = context;
this.url = url;
this.parameters = parameters;
this.callBack = callBack;
this.responseType = responseType;
}
public AsyncHttpTask(Context context, String method, String url,
JSONObject parameters, CallBack callBack, int responseType) {
this(context, url, parameters, callBack, responseType);
requestMethod = method;
}
@Override
protected Object doInBackground(Object... params) {
Map<String, Object> results = new HashMap<String, Object>();
try {
// first check network allowed or not
if (!NetUtil.isAvailable(context)) {
results.put(ResultSet.Response.RETCODE,
ResultSet.CURRENT_NET_NOT_ALLOWED.retcode);
results.put(ResultSet.Response.DESCRIBE,
ResultSet.CURRENT_NET_NOT_ALLOWED.describe);
return results;
}
HttpRequestBase request = null;
if ("get".equals(this.requestMethod)) {
request = new HttpGet(url);
request.setHeader("Accept", "*/*");
} else {
request = new HttpPost(url);
request.setHeader("Content-Type", "application/json;charset=UTF8");
}
if ("post".equals(this.requestMethod)) {
StringEntity ent = new StringEntity(parameters.toString(), HTTP.UTF_8);
// AbstractHttpEntity ent = new UrlEncodedFormEntity(parameters,
// HTTP.UTF_8);
// ent.setContentType("application/x-www-form-urlencoded; charset=UTF-8");
ent.setContentEncoding("UTF-8");
((HttpPost) request).setEntity(ent);
}
Logger.d("==url==" + url);
Logger.d("==parameters==" + parameters.toString());
// HttpClient httpClient = new DefaultHttpClient(HTTP_PARAMS);
HttpClient httpClient = AsyncHttpClient.getDefaultHttpClient();//https request
HttpResponse response = httpClient.execute(request);
if (response != null) {
int statusCode = response.getStatusLine().getStatusCode();
Logger.d("==statusCode==" + statusCode);
HttpEntity entity = response.getEntity();
if (statusCode == 200) {
onResponse(results, entity);
} else {
Logger.d("==response.getEntity()=="
+ EntityUtils.toString(entity, HTTP.UTF_8));
results.put(ResultSet.Response.RETCODE,
ResultSet.FAIL.retcode);
results.put(ResultSet.Response.DESCRIBE,
ResultSet.SERVER_ERROR.describe + statusCode);
}
}
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
Logger.d("UnsupportedEncodingException");
results.put(ResultSet.Response.RETCODE, ResultSet.FAIL.retcode);
results.put(ResultSet.Response.DESCRIBE,
ResultSet.NET_ENCODING_ERROR.describe);
} catch (ClientProtocolException e) {
e.printStackTrace();
Logger.d("ClientProtocolException");
results.put(ResultSet.Response.RETCODE, ResultSet.FAIL.retcode);
results.put(ResultSet.Response.DESCRIBE,
ResultSet.NET_ERROR.describe);
} catch (IOException e) {
e.printStackTrace();
Logger.d("IOException");
results.put(ResultSet.Response.RETCODE, ResultSet.FAIL.retcode);
results.put(ResultSet.Response.DESCRIBE,
ResultSet.NET_ERROR.describe);
} catch (OutOfMemoryError e) {
e.printStackTrace();
Logger.d("OutOfMemoryError");
results.put(ResultSet.Response.RETCODE, ResultSet.FAIL.retcode);
results.put(ResultSet.Response.DESCRIBE, ResultSet.FAIL.describe);
}
return results;
}
@Override
protected void onCancelled() {
super.onCancelled();
if (callBack != null) {
callBack.onCancelled();
}
}
@SuppressWarnings("unchecked")
@Override
protected void onPostExecute(Object result) {
super.onPostExecute(result);
if (isCancelled()) {
return;
}
Map<String, Object> res = (Map<String, Object>) result;
int retcode = (Integer) res.get(ResultSet.Response.RETCODE);
if (ResultSet.SUCCESS.retcode == retcode) {
Object content = res.get(ResultSet.Response.CONTENT);
if (callBack != null) {
parseResponse(content);
}
} else {
if (callBack != null) {
callBack.onFailure(ResultSet.NET_ERROR.describe);
}
}
}
private void parseResponse(Object content) {
switch (responseType) {
case ResultSet.RESPONSETYPE.RESPONSE_TYPE_JSON_ARRAY:
try {
callBack.onSuccess((JSONArray) content);
} catch (Exception e) {
e.printStackTrace();
}
break;
case ResultSet.RESPONSETYPE.RESPONSE_TYPE_JSON_OBJECT:
try {
callBack.onSuccess((JSONObject) content);
} catch (Exception e) {
e.printStackTrace();
}
break;
case ResultSet.RESPONSETYPE.RESPONSE_TYPE_STREAM:
try {
callBack.onSuccess((InputStream) content);
} catch (Exception e) {
e.printStackTrace();
}
break;
}
}
@Override
protected void onPreExecute() {
super.onPreExecute();
if (callBack != null) {
callBack.onStart();
}
}
@Override
protected void onProgressUpdate(Object... values) {
super.onProgressUpdate(values);
}
public void onResponse(Map<String, Object> results, HttpEntity entity) {
Logger.d("****************onResponse******************");
results.put(ResultSet.Response.RETCODE, ResultSet.SUCCESS.retcode);
results.put(ResultSet.Response.RESPONSE_TYPE, responseType);
results.put(ResultSet.Response.DESCRIBE, ResultSet.SUCCESS.describe);
switch (responseType) {
case ResultSet.RESPONSETYPE.RESPONSE_TYPE_JSON_ARRAY:
try {
String entityContent = EntityUtils.toString(entity, HTTP.UTF_8);
Logger.d("response type= RESPONSE_TYPE_JSON_ARRAY , entityContent ="
+ entityContent);
results.put(ResultSet.Response.CONTENT, new JSONArray(
entityContent));
} catch (Exception e) {
e.printStackTrace();
}
break;
case ResultSet.RESPONSETYPE.RESPONSE_TYPE_JSON_OBJECT:
try {
String entityContent = EntityUtils.toString(entity, HTTP.UTF_8);
Logger.d("response type= RESPONSE_TYPE_JSON_OBJECT , entityContent ="
+ entityContent);
results.put(ResultSet.Response.CONTENT, new JSONObject(
entityContent));
} catch (Exception e) {
e.printStackTrace();
}
break;
case ResultSet.RESPONSETYPE.RESPONSE_TYPE_STREAM:
InputStream is;
try {
is = entity.getContent();
results.put(ResultSet.Response.CONTENT, is);
// Logger.debug(this,
// "response type= RESPONSE_TYPE_STREAM , entityContent ="+FileManager.convertStreamToString((InputStream)
// results.get(ResultSet.Response.CONTENT)));
} catch (IllegalStateException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
break;
}
}
}