package com.tuit.ar.api;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.HttpVersion;
import org.apache.http.NameValuePair;
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.impl.client.DefaultHttpClient;
import org.apache.http.params.BasicHttpParams;
import org.apache.http.params.HttpParams;
import org.apache.http.params.HttpProtocolParams;
import org.apache.http.protocol.HTTP;
import android.os.Handler;
import com.tuit.ar.api.request.Options;
import com.tuit.ar.api.request.UniqueRequestException;
public class TwitterRequest extends Request {
static private int BUFFER_SIZE = 1024;
static public final int METHOD_GET = 0;
static public final int METHOD_POST = 1;
protected Runnable runnable = new Runnable() {
public void run() {
finishedRequest();
}
};
protected Handler handler = new Handler();
private Options url = null;
private int statusCode;
private String response;
private final TwitterAccount account;
private Exception communicationException = null;
public Options getUrl() { return url; }
public void setUrl(Options url) { this.url = url; }
public int getStatusCode() { return statusCode; }
public void setStatusCode(int statusCode) { this.statusCode = statusCode; }
public String getResponse() { return response; }
public void setResponse(String response) { this.response = response; }
protected void finishedRequest() {
account.finishedRequest(this);
}
public TwitterRequest(TwitterAccount _account, final Options url, final ArrayList <NameValuePair> nvps,
final int method) throws Exception {
// this avoid having 2 request of the same kind at a time
if (url.mustBeUnique() && _account.hasUrlOnRequest(url)) throw new UniqueRequestException();
account = _account;
setUrl(url);
run(url, nvps, method);
}
protected void run(final Options url, final ArrayList <NameValuePair> nvps, final int method) {
(new Thread() {
public void run() {
account.addUrlOnRequest(url);
DefaultHttpClient http = new DefaultHttpClient();
String full_url = "http" + (Twitter.isSecure ? "s" :"") + "://" + Twitter.BASE_URL + url.toString() + ".json";
HttpRequestBase request;
if (method == TwitterRequest.METHOD_POST) {
request = new HttpPost(full_url);
try {
((HttpPost) request).setEntity(new UrlEncodedFormEntity(nvps, HTTP.UTF_8));
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
else {
String queryString = "";
if (nvps != null && nvps.size() > 0) {
try {
UrlEncodedFormEntity entities = new UrlEncodedFormEntity(nvps, HTTP.UTF_8);
ByteArrayOutputStream output = new ByteArrayOutputStream();
InputStream input = entities.getContent();
int read = 0;
byte[] buffer = new byte[BUFFER_SIZE];
while ((read = input.read(buffer, 0, BUFFER_SIZE)) != -1) {
output.write(buffer, 0, read);
}
queryString = "?" + new String(output.toByteArray());
} catch (Exception e) {
e.printStackTrace();
}
}
request = new HttpGet(full_url + queryString);
}
final HttpParams params = new BasicHttpParams();
HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);
HttpProtocolParams.setContentCharset(params, "UTF_8");
HttpProtocolParams.setUseExpectContinue(params, false);
http.setParams(params);
try {
account.getConsumer().sign(request);
HttpResponse response = http.execute(request);
HttpEntity resEntity = response.getEntity();
setStatusCode(response.getStatusLine().getStatusCode());
//if (resEntity != null && statusCode >= 200 && statusCode < 300)
{
ByteArrayOutputStream output = new ByteArrayOutputStream();
resEntity.writeTo(output);
byte[] bytes = output.toByteArray();
setResponse(new String(bytes));
}
} catch (Exception e) {
e.printStackTrace();
communicationException = e;
}
handler.post(runnable);
account.removeUrlOnRequest(url);
}
}).start();
}
public String getErrorMessage() {
return communicationException.getMessage();
}
}