package com.integreight.onesheeld.model; import android.util.Base64; import com.integreight.onesheeld.shields.controller.InternetShield; import com.integreight.onesheeld.shields.controller.utils.InternetManager; import com.loopj.android.http.AsyncHttpResponseHandler; import com.loopj.android.http.RequestParams; import com.snappydb.SnappydbException; import org.apache.commons.io.FileUtils; import java.io.File; import java.io.FileNotFoundException; import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; import java.util.Map; import cz.msebera.android.httpclient.HeaderElement; import cz.msebera.android.httpclient.ParseException; /** * Created by Saad on 1/26/15. */ public class InternetRequest { private String url; private int id; private boolean isCancelled = false; private REQUEST_STATUS status; private AsyncHttpResponseHandler mCallback; private InternetShield.CallBack shieldCallback; private Map<String, String> headers; private Map<String, String> params; private Map<String, String> files; private String contentType; private boolean isIgnored = false; private ArrayList<String> registeredCallbacks; private String entity = null; private String fileEntity = null; private String encoding = null; public InternetRequest() { status = REQUEST_STATUS.IN_QUEUE; mCallback = null; registeredCallbacks = new ArrayList<>(); headers = new HashMap<>(); params = new HashMap<>(); files = new HashMap<>(); shieldCallback = new InternetShield.CallBack() { @Override public void onSuccess(int statusCode, cz.msebera.android.httpclient.Header[] headers, byte[] responseBody, int RequestID) { } @Override public void onFailure(int statusCode, cz.msebera.android.httpclient.Header[] headers, byte[] responseBody, Throwable error, int RequestID) { } @Override public void onFinish(int requestID) { } @Override public void onStart(int requestID) { } }; setCallback(shieldCallback); } public InternetRequest(String url, int id, InternetShield.CallBack callback) { this(); this.url = url; this.id = id; this.shieldCallback = callback; setCallback(shieldCallback); this.headers = new HashMap<>(); this.params = new HashMap<>(); this.files = new HashMap<>(); } public String getUrl() { return url; } public void setUrl(String url) { this.url = url; if (url != null) { // this.url = this.url.replace(" ", ""); this.url = this.url.replace("\\", "/"); } } public int getId() { return id; } public void setId(int id) { this.id = id; } public REQUEST_STATUS getStatus() { return status; } public void setStatus(REQUEST_STATUS status) { this.status = status; } public AsyncHttpResponseHandler getCallback() { return mCallback; } public void setCallback(final InternetShield.CallBack callback) { this.shieldCallback = new InternetShield.CallBack() { @Override public void onSuccess(int statusCode, cz.msebera.android.httpclient.Header[] headers, byte[] responseBody, int RequestID) { if (callback != null) callback.onSuccess(statusCode, headers, responseBody, RequestID); } @Override public void onFailure(int statusCode, cz.msebera.android.httpclient.Header[] headers, byte[] responseBody, Throwable error, int requestID) { if (callback != null) callback.onFailure(statusCode, headers, responseBody, error, requestID); } @Override public void onFinish(int requestID) { if (callback != null) callback.onFinish(requestID); } @Override public void onStart(int requestID) { if (callback != null) callback.onStart(requestID); } }; this.mCallback = new AsyncHttpResponseHandler() { @Override public void onStart() { status = REQUEST_STATUS.SENT; if (!isIgnored && registeredCallbacks.contains(CALLBACK.ON_START.name())) shieldCallback.onStart(id); isIgnored = false; super.onStart(); } @Override public void onSuccess(int statusCode, cz.msebera.android.httpclient.Header[] headers, byte[] responseBody) { status = REQUEST_STATUS.EXECUTED; setResponse(new InternetResponse(responseBody, statusCode, InternetResponse.RESPONSE_STATUS.SUCCESSFUL, headers)); if (!isIgnored && registeredCallbacks.contains(CALLBACK.ON_SUCCESS.name())) shieldCallback.onSuccess(statusCode, headers, responseBody, id); } @Override public void onFailure(int statusCode, cz.msebera.android.httpclient.Header[] headers, byte[] responseBody, Throwable error) { status = REQUEST_STATUS.EXECUTED; setResponse(new InternetResponse(responseBody, statusCode, InternetResponse.RESPONSE_STATUS.FAILURE, headers)); if (!isIgnored && registeredCallbacks.contains(CALLBACK.ON_FAILURE.name())) shieldCallback.onFailure(statusCode, headers, responseBody, error, id); } @Override public void onFinish() { status = REQUEST_STATUS.EXECUTED; if (!isIgnored && registeredCallbacks.contains(CALLBACK.ON_FINISH.name())) shieldCallback.onFinish(id); isIgnored = false; super.onFinish(); } }; } public InternetResponse getResponse() { try { return InternetManager.getInstance().getCachDB().get(id + "", InternetResponse.class); } catch (SnappydbException e) { return null; } } public void setResponse(InternetResponse response) { try { InternetManager.getInstance().getCachDB().put(id + "", response); } catch (SnappydbException e) { e.printStackTrace(); } } public void addHeader(String key, String value) { // try { // headers.put(URLEncoder.encode(key, "UTF-8"), URLEncoder.encode(value, "UTF-8")); // } catch (UnsupportedEncodingException e) { headers.put(key, value); // e.printStackTrace(); // } } public void removeHeader(String key) { if (headers.get(key) != null) headers.remove(key); } public void removeAllHeaders() { if (headers != null) headers.clear(); headers = new HashMap<>(); } public void addParam(String key, String value) { params.put(key, value); } public void addFile(String key, String filePath) { files.put(key, filePath); } public void addBase64File(String key, File file) { try { params.put(key, Base64.encodeToString(FileUtils.readFileToByteArray(file), Base64.DEFAULT)); } catch (IOException e) { e.printStackTrace(); } } public void removeParam(String key) { if (params.get(key) != null) params.remove(key); } public void removeFile(String key) { if (files.get(key) != null) files.remove(key); } public void removeAllParams() { params = new HashMap<>(); files = new HashMap<>(); entity = null; fileEntity = null; } public cz.msebera.android.httpclient.Header[] getHeaders() { if (headers == null || headers.size() == 0) return null; cz.msebera.android.httpclient.Header[] returnedHeaders = new cz.msebera.android.httpclient.Header[headers.keySet().size()]; int i = 0; for (final String key : headers.keySet()) { returnedHeaders[i] = new cz.msebera.android.httpclient.Header() { @Override public String getName() { return key; } @Override public String getValue() { return headers.get(key); } @Override public cz.msebera.android.httpclient.HeaderElement[] getElements() throws ParseException { return new cz.msebera.android.httpclient.HeaderElement[0]; } }; i++; } return returnedHeaders; } public RequestParams getParams() { RequestParams paramsI = new RequestParams(); if (getEncoding() != null) paramsI.setContentEncoding(getEncoding()); for (final String key : params.keySet()) { paramsI.add(key, params.get(key)); } for (final String key : files.keySet()) { try { paramsI.put(key, new File(files.get(key))); } catch (FileNotFoundException e) { e.printStackTrace(); } } return paramsI; } public HashMap<String, String> getParamsAsMap() { return new HashMap<>(params); } public HashMap<String, String> getFilesAsMap() { return new HashMap<>(files); } public void setParams(Map<String, String> params) { this.params = params; } public void setFiles(Map<String, String> files) { this.files = files; } public HashMap<String, String> getHeadersAsMap() { return new HashMap<>(headers); } public void setHeaders(Map<String, String> headers) { this.headers = headers; } public String getContentType() { return contentType; } public void setContentType(String contentType) { this.contentType = contentType; } public void ignoreResponse() { isIgnored = true; } public void addRegisteredCallbacks(CALLBACK... callbacks) { if (registeredCallbacks == null) registeredCallbacks = new ArrayList<>(); for (CALLBACK callback : callbacks) registeredCallbacks.add(callback.name()); } public void setCancelled() { this.isCancelled = true; } public boolean isCancelled() { return isCancelled; } public String getEntity() { return entity; } public String getFileEntity() { return fileEntity; } public void setEntity(String entity) { this.entity = entity; } public void setFileEntity(String fileEntity) { this.fileEntity = fileEntity; } public String getEncoding() { return encoding; } public void setEncoding(String encoding) { this.encoding = encoding; } public ArrayList<String> getRegisteredCallbacks() { return registeredCallbacks; } public enum CALLBACK { ON_SUCCESS, ON_FAILURE, ON_START, ON_FINISH, ON_PROGRESS } public static enum REQUEST_STATUS { CALLED, SENT, IN_QUEUE, EXECUTED } }