package com.wyp.materialqqlite.qqclient.task;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStreamReader;
import org.apache.http.client.HttpClient;
//import android.os.Bundle;
//import android.os.Handler;
//import android.os.Message;
//
//import com.wyp.materialqqlite.qqclient.QQManager;
import com.wyp.materialqqlite.Utils;
import com.wyp.materialqqlite.qqclient.protocol.QQProtocol;
import com.wyp.materialqqlite.qqclient.protocol.protocoldata.BuddyInfoResult;
import com.wyp.materialqqlite.qqclient.protocol.protocoldata.BuddyListResult;
import com.wyp.materialqqlite.qqclient.protocol.protocoldata.GetSignResult;
import com.wyp.materialqqlite.qqclient.protocol.protocoldata.GroupListResult;
import com.wyp.materialqqlite.qqclient.protocol.protocoldata.OnlineBuddyListResult;
import com.wyp.materialqqlite.qqclient.protocol.protocoldata.QQCallBackMsg;
import com.wyp.materialqqlite.qqclient.protocol.protocoldata.QQLoginResultCode;
import com.wyp.materialqqlite.qqclient.protocol.protocoldata.RecentListResult;
public class LoginTask extends HttpTask {
public TaskManager m_recvMsgTaskMgr;
public LoginTask(String strTaskName, HttpClient httpClient) {
super(strTaskName, httpClient);
}
// 写数据
private void writeFile(String fileName, byte[] bytData) {
try {
FileOutputStream fos = new FileOutputStream(fileName);
fos.write(bytData);
fos.close();
} catch (Exception e) {
e.printStackTrace();
}
}
public String readFile(String filePath) {
try {
String encoding="GBK";
File file=new File(filePath);
if (file.isFile() && file.exists()) {
InputStreamReader read = new InputStreamReader(
new FileInputStream(file),encoding);//考虑到编码格式
BufferedReader bufferedReader = new BufferedReader(read);
String strText = bufferedReader.readLine();
read.close();
return strText;
}
} catch (Exception e) {
}
return null;
}
@Override
public void doTask() {
if (null == m_httpClient || null == m_QQUser)
return;
try {
boolean bRet;
if (Utils.isEmptyStr(m_QQUser.m_strVerifyCode)) { // 验证码为空
// bRet = QQProtocol.checkVerifyCode(m_httpClient, // 检测是否需要输入验证码
// m_QQUser.m_strQQNum, QQProtocol.WEBQQ_APP_ID, m_QQUser.m_VerifyCodeInfo);
// 获取登录信令
m_QQUser.m_VerifyCodeInfo.m_strLoginSig = QQProtocol.getLoginSig(
m_httpClient, QQProtocol.WEBQQ_APP_ID);
// 检测是否需要输入验证码
bRet = QQProtocol.checkVerifyCode(m_httpClient, m_QQUser.m_strQQNum,
QQProtocol.WEBQQ_APP_ID, m_QQUser.m_VerifyCodeInfo);
if (!bRet || m_bCancel) {
sendLoginResultMsg(QQLoginResultCode.FAILED);
return;
}
if (m_QQUser.m_VerifyCodeInfo.m_nNeedVerify == 1) { // 需要验证码
// 获取验证码图片
m_QQUser.m_VerifyCodePic = QQProtocol.getVerifyCodePic(
m_httpClient, QQProtocol.WEBQQ_APP_ID,
m_QQUser.m_strQQNum, m_QQUser.m_VerifyCodeInfo);
// m_QQUser.m_strQQNum, m_QQUser.m_VerifyCodeInfo.m_strVCType);
if (!bRet || m_bCancel) {
sendLoginResultMsg(QQLoginResultCode.FAILED);
return;
}
//writeFile("D:/abc.png", m_QQUser.m_VerifyCodePic);
//m_QQUser.m_strVerifyCode = readFile("D:/vc.txt");
sendLoginResultMsg(QQLoginResultCode.NEED_VERIFY_CODE);
return;
}
else // 不需要验证码
{
m_QQUser.m_strVerifyCode = m_QQUser.m_VerifyCodeInfo.m_strVerifyCode;
}
}
// bRet = QQProtocol.login1(m_httpClient, m_QQUser.m_strQQNum, // 第一次登录
bRet = QQProtocol.login1(m_httpClient, m_QQUser.m_nQQUin, // 第一次登录
m_QQUser.m_strQQPwd, m_QQUser.m_strVerifyCode,
// m_QQUser.m_VerifyCodeInfo.m_bytPtUin,
m_QQUser.m_VerifyCodeInfo.m_strLoginSig,
m_QQUser.m_VerifyCodeInfo.m_strVerifySession,
m_QQUser.m_VerifyCodeInfo.m_strPtUin,
QQProtocol.WEBQQ_APP_ID, m_QQUser.m_LoginResult1);
if (!bRet || m_bCancel) {
m_QQUser.m_strVerifyCode = null;
m_QQUser.m_VerifyCodePic = null;
sendLoginResultMsg(QQLoginResultCode.FAILED);
return;
}
m_QQUser.m_strVerifyCode = null;
m_QQUser.m_VerifyCodePic = null;
if (m_QQUser.m_LoginResult1.m_nRetCode != 0) { // 登录失败
if (m_QQUser.m_LoginResult1.m_nRetCode == 4) { // 验证码错误
m_QQUser.m_VerifyCodePic = QQProtocol.getVerifyCodePic(m_httpClient, // 获取验证码图片
QQProtocol.WEBQQ_APP_ID, m_QQUser.m_strQQNum,
m_QQUser.m_VerifyCodeInfo);
// m_QQUser.m_VerifyCodeInfo.m_strVCType);
if (!bRet || m_bCancel) {
sendLoginResultMsg(QQLoginResultCode.FAILED);
return;
}
sendLoginResultMsg(QQLoginResultCode.VERIFY_CODE_ERROR);
return;
}
else if (m_QQUser.m_LoginResult1.m_nRetCode == 3) { // 密码错误
sendLoginResultMsg(QQLoginResultCode.PASSWORD_ERROR);
return;
}
else { // 未知错误
sendLoginResultMsg(QQLoginResultCode.FAILED);
return;
}
}
bRet = QQProtocol.login2(m_httpClient, // 第二次登录
m_QQUser.m_nLoginStatus, m_QQUser.m_LoginResult1.m_strPtWebQq,
QQProtocol.WEBQQ_CLIENT_ID, m_QQUser.m_LoginResult2);
if (!bRet || m_QQUser.m_LoginResult2.m_nRetCode != 0 || m_bCancel) {
sendLoginResultMsg(QQLoginResultCode.FAILED);
return;
}
BuddyInfoResult buddyInfoResult = getUserInfo(); // 获取用户信息
if (m_bCancel) {
sendLoginResultMsg(QQLoginResultCode.FAILED);
return;
}
GetSignResult getSignResult = getUserSign(); // 获取用户签名
if (m_bCancel) {
sendLoginResultMsg(QQLoginResultCode.FAILED);
return;
}
BuddyListResult buddyListResult = getBuddyList(); // 获取好友列表
if (m_bCancel) {
sendLoginResultMsg(QQLoginResultCode.FAILED);
return;
}
GroupListResult groupListResult = getGroupList(); // 获取群列表
if (m_bCancel) {
sendLoginResultMsg(QQLoginResultCode.FAILED);
return;
}
RecentListResult recentListResult = getRecentList(); // 获取最近联系人列表
if (m_bCancel) {
sendLoginResultMsg(QQLoginResultCode.FAILED);
return;
}
bRet = startPollTask(); // 启动轮循消息任务
m_QQUser.m_nStatus = m_QQUser.m_LoginResult2.m_nStatus;
sendLoginResultMsg(QQLoginResultCode.SUCCESS);
sendMessage(QQCallBackMsg.UPDATE_BUDDY_INFO, 0, 0, buddyInfoResult);
sendMessage(QQCallBackMsg.UPDATE_BUDDY_SIGN, 0, 0, getSignResult);
sendMessage(QQCallBackMsg.UPDATE_BUDDY_LIST, 0, 0, buddyListResult);
sendMessage(QQCallBackMsg.UPDATE_GROUP_LIST, 0, 0, groupListResult);
sendMessage(QQCallBackMsg.UPDATE_RECENT_LIST, 0, 0, recentListResult);
} catch (Exception e) {
e.printStackTrace();
} finally {
}
}
// 获取用户信息
private BuddyInfoResult getUserInfo() {
BuddyInfoResult result = new BuddyInfoResult();
boolean bRet = QQProtocol.getBuddyInfo(m_httpClient, m_QQUser.m_nQQUin,
m_QQUser.m_LoginResult2.m_strVfWebQq, result);
if (!bRet || result.m_nRetCode != 0 || m_bCancel)
return null;
return result;
}
// 获取用户签名
private GetSignResult getUserSign() {
GetSignResult result = new GetSignResult();
boolean bRet = QQProtocol.getQQSign(m_httpClient, m_QQUser.m_nQQUin,
m_QQUser.m_LoginResult2.m_strVfWebQq, result);
if (!bRet || result.m_nRetCode != 0 || m_bCancel)
return null;
return result;
}
// 获取好友列表
private BuddyListResult getBuddyList() {
BuddyListResult result1 = new BuddyListResult();
boolean bRet = QQProtocol.getBuddyList(m_httpClient,
m_QQUser.m_nQQUin, m_QQUser.m_LoginResult1.m_strPtWebQq,
m_QQUser.m_LoginResult2.m_strVfWebQq, result1);
if (!bRet || result1.m_nRetCode != 0 || m_bCancel)
return null;
OnlineBuddyListResult result2 = new OnlineBuddyListResult();
bRet = QQProtocol.getOnlineBuddyList(m_httpClient, QQProtocol.WEBQQ_CLIENT_ID,
m_QQUser.m_LoginResult2.m_strPSessionId, result2);
if (!bRet || result2.m_nRetCode != 0 || m_bCancel) {
result2.reset();
result1.reset();
return null;
}
result1.setOnlineBuddyList(result2);
result1.sortBuddy();
result2.reset();
return result1;
}
// 获取群列表
private GroupListResult getGroupList() {
GroupListResult result = new GroupListResult();
boolean bRet = QQProtocol.getGroupList(m_httpClient,
m_QQUser.m_nQQUin, m_QQUser.m_LoginResult1.m_strPtWebQq,
m_QQUser.m_LoginResult2.m_strVfWebQq, result);
if (!bRet || result.m_nRetCode != 0 || m_bCancel)
return null;
return result;
}
// 获取最近联系人列表
private RecentListResult getRecentList() {
RecentListResult result = new RecentListResult();
boolean bRet = QQProtocol.getRecentList(m_httpClient,
m_QQUser.m_LoginResult2.m_strVfWebQq, QQProtocol.WEBQQ_CLIENT_ID,
m_QQUser.m_LoginResult2.m_strPSessionId, result);
if (!bRet || result.m_nRetCode != 0 || m_bCancel)
return null;
return result;
}
// 启动轮询任务
private boolean startPollTask() {
String strTaskName = "PollTask";
PollTask task = new PollTask(strTaskName, m_httpClient.getHttpClient());
task.m_QQUser = m_QQUser;
task.m_recvMsgTaskMgr = m_recvMsgTaskMgr;
return m_taskMgr.addTask(task);
}
private void sendLoginResultMsg(int nRetCode) {
if (m_bCancel)
nRetCode = QQLoginResultCode.USER_CANCEL_LOGIN;
sendMessage(QQCallBackMsg.LOGIN_RESULT, nRetCode, 0, null);
}
}