package tk.djcrazy.libCC98;
import android.app.Application;
import android.graphics.Bitmap;
import android.util.Log;
import com.android.volley.AuthFailureError;
import com.android.volley.Request;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.ImageLoader;
import com.android.volley.toolbox.ImageRequest;
import com.android.volley.toolbox.StringRequest;
import com.google.inject.Inject;
import com.google.inject.Singleton;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.net.UnknownServiceException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import ch.boye.httpclientandroidlib.cookie.Cookie;
import ch.boye.httpclientandroidlib.entity.mime.MultipartEntity;
import ch.boye.httpclientandroidlib.entity.mime.content.FileBody;
import ch.boye.httpclientandroidlib.entity.mime.content.StringBody;
import ch.boye.httpclientandroidlib.impl.cookie.BasicClientCookie;
import tk.djcrazy.MyCC98.application.MyApplication;
import tk.djcrazy.MyCC98.config.Config;
import tk.djcrazy.libCC98.data.BoardEntity;
import tk.djcrazy.libCC98.data.BoardStatus;
import tk.djcrazy.libCC98.data.HotTopicEntity;
import tk.djcrazy.libCC98.data.InboxInfo;
import tk.djcrazy.libCC98.data.LoginType;
import tk.djcrazy.libCC98.data.PostContentEntity;
import tk.djcrazy.libCC98.data.PostEntity;
import tk.djcrazy.libCC98.data.SearchResultEntity;
import tk.djcrazy.libCC98.data.UserData;
import tk.djcrazy.libCC98.data.UserProfileEntity;
import tk.djcrazy.libCC98.exception.NoUserFoundException;
import tk.djcrazy.libCC98.util.ParamMapBuilder;
import tk.djcrazy.libCC98.util.RequestResultListener;
/**
* Created by DJ on 13-7-28.
*/
@Singleton
public class NewCC98Service {
@Inject
private ICC98UrlManager mUrlManager;
@Inject
private Application mApplication;
@Inject
private NewCC98Parser mCC98Parser;
public void submitPmInfoRequest(Object tag, int type, int page, final RequestResultListener<InboxInfo> listener) {
String url = type==0? mUrlManager.getInboxUrl(page):mUrlManager.getOutboxUrl(page);
Request request = new StringRequest(url, new Response.Listener<String>() {
@Override
public void onResponse(String response) {
try {
InboxInfo info = mCC98Parser.parsePmList(response);
listener.onRequestComplete(info);
} catch (Exception e) {
e.printStackTrace();
listener.onRequestError(e.getMessage());
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
error.printStackTrace();
listener.onRequestError(error.getMessage());
}
});
request.setTag(tag);
getApplication().mRequestQueue.add(request);
}
public void submitUpdateRequest(Object tag, final RequestResultListener<JSONObject> listener) {
Request request = new StringRequest(Request.Method.GET, Config.UPDATE_LINK,new Response.Listener<String>() {
@Override
public void onResponse(String result) {
try {
listener.onRequestComplete(new JSONObject(result));
} catch (JSONException e) {
e.printStackTrace();
}
}
},new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError volleyError) {
listener.onRequestError("更新遇到问题");
}
});
request.setTag(tag);
getApplication().mRequestQueue.add(request);
}
public void login(final Object tag, final String userName, final String pwd32, final String pwd16, String proxyName,
String proxyPwd, String proxyHost, LoginType type ,final RequestResultListener<Boolean> listener) {
Log.d(this.getClass().getSimpleName(), userName+pwd32+proxyName+proxyPwd+proxyHost+type);
final UserData userData = new UserData();
userData.setProxyUserName(proxyName);
userData.setProxyHost(proxyHost);
userData.setProxyPassword(proxyPwd);
userData.setLoginType(type);
userData.setUserName(userName);
userData.setPassword16(pwd16);
userData.setPassword32(pwd32);
StringRequest request = new StringRequest(Request.Method.POST, mUrlManager.getLoginUrl(type, proxyHost),new Response.Listener<String>() {
@Override
public void onResponse(String response) {
if (response.contains("9898")){
getUserAvatar1(tag, userData,listener);
} else {
listener.onRequestError("用户名或密码错误");
getApplication().syncUserDataAndHttpClient();
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
listener.onRequestError(error.getMessage());
getApplication().syncUserDataAndHttpClient();
}
}) {
@Override
protected Map<String, String> getParams() throws AuthFailureError {
return new ParamMapBuilder()
.param("a", "i").param("u", userName).param("p", pwd32).param("userhidden", "2").buildMap();
}
};
getApplication().syncUserDataAndHttpClient(userData);
request.setTag(tag);
getApplication().mRequestQueue.add(request);
}
private void getUserAvatar1(final Object tag, final UserData userData, final RequestResultListener<Boolean> listener) {
Request request = new StringRequest(mUrlManager.getUserProfileUrl(
userData.getLoginType(),userData.getProxyHost(), userData.getUserName()), new Response.Listener<String>() {
@Override
public void onResponse(String response) {
try {
userData.setCookies(castToAnother(getApplication().mHttpClient.getCookieStore().getCookies()));
String avatarLink = mCC98Parser.parseUserAvatar(response, userData.getLoginType(), userData.getProxyHost());
getUserAvatar2(tag, userData, avatarLink, listener);
} catch (Exception e) {
getApplication().syncUserDataAndHttpClient();
listener.onRequestError("解析头像地址失败,请重试");
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
listener.onRequestError("获取头像地址失败,请重试");
}
});
request.setTag(tag);
getApplication().mRequestQueue.add(request);
}
private void getUserAvatar2(final Object tag, final UserData userData, String url, final RequestResultListener<Boolean> listener){
Request request = new ImageRequest(url, new Response.Listener<Bitmap>() {
@Override
public void onResponse(Bitmap response) {
getApplication().addNewUser(userData, response, true);
listener.onRequestComplete(true);
}
}, 200, 200, Bitmap.Config.ARGB_8888, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Log.d(this.getClass().getSimpleName(),"download image failed", error);
getApplication().syncUserDataAndHttpClient();
listener.onRequestError("下载头像失败,请重试");
}
});
request.setTag(tag);
getApplication().mRequestQueue.add(request);
}
public void submitBitmapRequest(final Object tag, String url, final RequestResultListener<Bitmap> listener) {
Request request = new ImageRequest(url, new Response.Listener<Bitmap>() {
@Override
public void onResponse(Bitmap response) {
listener.onRequestComplete(response);
}
}, 0, 0, Bitmap.Config.ARGB_8888, new Response.ErrorListener(){
@Override
public void onErrorResponse(VolleyError error) {
listener.onRequestError("图片加载失败");
}
});
request.setTag(tag);
getApplication().mRequestQueue.add(request);
}
public void submitPostContentRequest(final Object tag, String boardId, String postId, int pageNum,
boolean aForceRefresh, final RequestResultListener<List<PostContentEntity>> listener) {
Request request = new StringRequest(mUrlManager.getPostUrl(boardId,postId,pageNum),new Response.Listener<String>() {
@Override
public void onResponse(String response) {
try {
List<PostContentEntity> result = mCC98Parser.parsePostContentList(response);
listener.onRequestComplete(result);
} catch (Exception e) {
e.printStackTrace();
listener.onRequestError(e.getMessage());
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
error.printStackTrace();
listener.onRequestError(error.getMessage());
}
});
request.setTag(tag);
getApplication().mRequestQueue.add(request);
}
public void submitGetMsgContent(final Object tag, int pmId, final RequestResultListener<String> listener) {
Request request = new StringRequest(mUrlManager.getMessagePageUrl(pmId), new Response.Listener<String>() {
@Override
public void onResponse(String response) {
try {
String res = mCC98Parser.parseMsgContent(response);
listener.onRequestComplete(res);
} catch (Exception e) {
listener.onRequestError(e.getMessage());
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
listener.onRequestError(error.getMessage());
}
});
request.setTag(tag);
getApplication().mRequestQueue.add(request);
}
public void submitAddFriendRequest(final Object tag, final String userName, final RequestResultListener<Boolean> listener) {
Request request = new StringRequest(Request.Method.POST, mUrlManager.getAddFriendUrl(), new Response.Listener<String>() {
@Override
public void onResponse(String response) {
if (response.contains("好友添加成功")) {
listener.onRequestComplete(true);
} else if (response.contains("论坛没有这个用户,操作未成功")) {
listener.onRequestError("论坛没有这个用户");
} else {
listener.onRequestError("未知错误");
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
listener.onRequestError(error.getMessage());
}
}){
@Override
protected Map<String, String> getParams() throws AuthFailureError {
return new ParamMapBuilder().param("todo", "saveF").param("touser", userName)
.param("Submit", "保存").buildMap();
}
@Override
public Map<String, String> getHeaders() throws AuthFailureError {
return new ParamMapBuilder().param("Referer", mUrlManager.getAddFriendUrlReferrer()).buildMap();
}
};
request.setTag(tag);
getApplication().mRequestQueue.add(request);
}
public void submitUserProfileRequest(final Object tag, String userName, final RequestResultListener<UserProfileEntity> listener) {
Request request = new StringRequest(mUrlManager.getUserProfileUrl(userName), new Response.Listener<String>() {
@Override
public void onResponse(String response) {
try {
listener.onRequestComplete(mCC98Parser.parseUserProfile(response));
} catch (Exception e) {
listener.onRequestError(e.getMessage());
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
listener.onRequestError(error.getMessage());
}
});
request.setTag(tag);
getApplication().mRequestQueue.add(request);
}
public void submitUploadFileRequest(final Object tag, final File file, final RequestResultListener<String> listener) {
Request request = new StringRequest(Request.Method.POST, mUrlManager.getUploadPictureUrl(),new Response.Listener<String>() {
@Override
public void onResponse(String response) {
try {
System.out.println(response);
String res = mCC98Parser.parseUploadPicture(response);
listener.onRequestComplete(res);
} catch (Exception e) {
e.printStackTrace();
listener.onRequestError(e.getMessage());
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
error.printStackTrace();
listener.onRequestError(error.getMessage());
}
}){
@Override
public byte[] getBody() throws AuthFailureError {
try {
MultipartEntity reqEntity = new MultipartEntity();
reqEntity.addPart("act", new StringBody("upload"));
reqEntity.addPart("fname", new StringBody(file.getName()));
reqEntity.addPart("file1", new FileBody(file));
ByteArrayOutputStream bos = new ByteArrayOutputStream();
reqEntity.writeTo(bos);
return bos.toByteArray();
} catch (Exception e) {
Log.e(NewCC98Service.class.getSimpleName(), "",e);
return super.getBody();
}
}
};
request.setTag(tag);
getApplication().mRequestQueue.add(request);
}
public void submitPersonalBoardList(final Object tag, final RequestResultListener<List<BoardEntity>> listener) {
Request request = new StringRequest(mUrlManager.getPersonalBoardUrl(),new Response.Listener<String>() {
@Override
public void onResponse(String response) {
try {
List<BoardEntity> list = mCC98Parser.parsePersonalBoardList(response);
listener.onRequestComplete(list);
} catch (Exception e) {
listener.onRequestError(e.getMessage());
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
listener.onRequestError(error.getMessage());
}
});
request.setTag(tag);
getApplication().mRequestQueue.add(request);
}
public void submitHotTopicList(final Object tag, final RequestResultListener<List<HotTopicEntity>> listener) {
Request request = new StringRequest(mUrlManager.getHotTopicUrl(),new Response.Listener<String>() {
@Override
public void onResponse(String response) {
try {
List<HotTopicEntity> list = mCC98Parser.parseHotTopicList(response);
listener.onRequestComplete(list);
} catch (Exception e) {
listener.onRequestError(e.getMessage());
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
listener.onRequestError(error.getMessage());
}
});
request.setTag(tag);
getApplication().mRequestQueue.add(request);
}
public void submitNewTopicList(final Object tag,int pageNumber, final RequestResultListener<List<SearchResultEntity>> listener) {
Request request = new StringRequest(mUrlManager.getNewPostUrl(pageNumber),new Response.Listener<String>() {
@Override
public void onResponse(String response) {
try {
List<SearchResultEntity> list = mCC98Parser.parseQueryResult(response);
listener.onRequestComplete(list);
} catch (Exception e) {
Log.e(NewCC98Service.class.getSimpleName(), "submitNewTopicList failed", e);
listener.onRequestError(e.getMessage());
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Log.e(NewCC98Service.class.getSimpleName(), "submitNewTopicList failed", error.getCause());
listener.onRequestError(error.getMessage());
}
});
request.setTag(tag);
getApplication().mRequestQueue.add(request);
}
public void submitBoardList(final Object tag, final String boardId, final RequestResultListener<List<BoardEntity>> listener) {
Request request = new StringRequest(mUrlManager.getBoardUrl(boardId),new Response.Listener<String>() {
@Override
public void onResponse(String response) {
try {
List<BoardEntity> list = mCC98Parser.parseBoardList(response);
listener.onRequestComplete(list);
} catch (Exception e) {
listener.onRequestError(e.getMessage());
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
listener.onRequestError(error.getMessage());
}
});
request.setTag(tag);
getApplication().mRequestQueue.add(request);
}
public void submitPostList(final Object tag, final String boardId, int pageNumber, final RequestResultListener<List<PostEntity>> listener) {
Request request = new StringRequest(mUrlManager.getBoardUrl(boardId, pageNumber),new Response.Listener<String>() {
@Override
public void onResponse(String response) {
try {
List<PostEntity> list = mCC98Parser.parsePostList(response);
listener.onRequestComplete(list);
} catch (Exception e) {
listener.onRequestError(e.getMessage());
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
listener.onRequestError(error.getMessage());
}
});
request.setTag(tag);
getApplication().mRequestQueue.add(request);
}
public void submitPostSearch(final Object tag, String keyword, String boardId, String type, int pageNumber, final RequestResultListener<List<SearchResultEntity>> listener) {
Request request = new StringRequest(mUrlManager.getSearchUrl(keyword, boardId, type, pageNumber),new Response.Listener<String>() {
@Override
public void onResponse(String response) {
try {
List<SearchResultEntity> list = mCC98Parser.parseQueryResult(response);
listener.onRequestComplete(list);
} catch (Exception e) {
listener.onRequestError(e.getMessage());
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
listener.onRequestError(error.getMessage());
}
});
request.setTag(tag);
getApplication().mRequestQueue.add(request);
}
public void submitTodayBoardlList(final Object tag, final RequestResultListener<List<BoardStatus>> listener) {
Request request = new StringRequest(mUrlManager.getTodayBoardList(), new Response.Listener<String>() {
@Override
public void onResponse(String response) {
try {
List<BoardStatus> list = mCC98Parser.parseTodayBoardList(response);
listener.onRequestComplete(list);
} catch (Exception e) {
listener.onRequestError("版面列表加载失败");
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
listener.onRequestError("版面列表加载失败");
}
});
request.setTag(tag);
getApplication().mRequestQueue.add(request);
}
private List<BasicClientCookie> castToAnother(List<Cookie> list) {
List<BasicClientCookie> res = new ArrayList<BasicClientCookie>();
for (Cookie cookie: list) {
res.add((BasicClientCookie)cookie);
}
return res;
}
public void cancelRequest(Object object) {
getApplication().mRequestQueue.cancelAll(object);
}
public ImageLoader getImageLoader() {
return getApplication().mImageLoader;
}
public Bitmap getCurrentUserAvatar(){
return getApplication().getCurrentUserAvatar();
}
public UserData getCurrentUserData() {
return getApplication().getCurrentUserData();
}
public String getDomain() {
return mUrlManager.getClientUrl();
}
private MyApplication getApplication() {
return (MyApplication) mApplication;
}
}