package com.tomclaw.mandarin.im.icq;
import com.tomclaw.mandarin.core.GlobalProvider;
import com.tomclaw.mandarin.core.QueryHelper;
import com.tomclaw.mandarin.util.HttpParamsBuilder;
import com.tomclaw.mandarin.util.HttpUtil;
import org.json.JSONException;
import org.json.JSONObject;
import static com.tomclaw.mandarin.im.icq.WimConstants.DATA_OBJECT;
import static com.tomclaw.mandarin.im.icq.WimConstants.IM_STATES;
import static com.tomclaw.mandarin.im.icq.WimConstants.MSG_ID;
import static com.tomclaw.mandarin.im.icq.WimConstants.REQUEST_ID;
import static com.tomclaw.mandarin.im.icq.WimConstants.RESPONSE_OBJECT;
import static com.tomclaw.mandarin.im.icq.WimConstants.STATE;
import static com.tomclaw.mandarin.im.icq.WimConstants.STATUS_CODE;
/**
* Created with IntelliJ IDEA.
* User: solkin
* Date: 6/12/13
* Time: 1:38 PM
*/
public class IcqMessageRequest extends WimRequest {
private String to;
private String message;
private String cookie;
public IcqMessageRequest() {
}
public IcqMessageRequest(String to, String message, String cookie) {
this.to = to;
this.message = message;
this.cookie = cookie;
}
@Override
protected String getHttpRequestType() {
return HttpUtil.POST;
}
@Override
protected int parseJson(JSONObject response) throws JSONException {
JSONObject responseObject = response.getJSONObject(RESPONSE_OBJECT);
int statusCode = responseObject.getInt(STATUS_CODE);
// Check for server reply.
if (statusCode == WIM_OK) {
String requestId = responseObject.getString(REQUEST_ID);
JSONObject dataObject = responseObject.getJSONObject(DATA_OBJECT);
String state = dataObject.getString(STATE);
String msgId = dataObject.getString(MSG_ID);
// This will mark message with server-side msgId
// to provide message stated in fetch events.
QueryHelper.addMessageCookie(getAccountRoot().getContentResolver(), requestId, msgId);
// Checking for message state.
int messageState = GlobalProvider.HISTORY_MESSAGE_STATE_UNDETERMINED;
for (int i = 0; i < IM_STATES.length; i++) {
if (state.equals(IM_STATES[i])) {
messageState = i;
break;
}
}
if (messageState < GlobalProvider.HISTORY_MESSAGE_STATE_SENT
&& messageState != GlobalProvider.HISTORY_MESSAGE_STATE_ERROR) {
messageState = GlobalProvider.HISTORY_MESSAGE_STATE_SENT;
}
QueryHelper.updateMessageState(getAccountRoot().getContentResolver(), messageState, requestId, msgId);
return REQUEST_DELETE;
} else if (statusCode >= 460 && statusCode <= 606) {
// Target error. Mark message as error and delete request from pending operations.
String requestId = responseObject.getString(REQUEST_ID);
QueryHelper.updateMessageState(getAccountRoot().getContentResolver(),
GlobalProvider.HISTORY_MESSAGE_STATE_ERROR, requestId);
return REQUEST_DELETE;
}
// Maybe incorrect aim sid or other strange error we've not recognized.
return REQUEST_SKIP;
}
@Override
protected String getUrl() {
return getAccountRoot().getWellKnownUrls().getWebApiBase()
.concat("im/sendIM");
}
@Override
protected HttpParamsBuilder getParams() {
return new HttpParamsBuilder()
.appendParam("aimsid", getAccountRoot().getAimSid())
.appendParam("autoResponse", "false")
.appendParam("f", WimConstants.FORMAT_JSON)
.appendParam("message", message)
.appendParam("notifyDelivery", "true")
.appendParam("offlineIM", "true")
.appendParam("r", cookie)
.appendParam("t", to);
}
}