⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 qqeventprocessor.java

📁 类似于MSN
💻 JAVA
📖 第 1 页 / 共 3 页
字号:
/*
* LumaQQ - Java QQ Client
*
* Copyright (C) 2004 luma <stubma@163.com>
*                    whg2001 <whg_2001@sohu.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
package edu.tsinghua.lumaqq.shells;

import java.util.ArrayList;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.List;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.MessageBox;

import edu.tsinghua.lumaqq.LumaQQ;
import edu.tsinghua.lumaqq.ModelUtils;
import edu.tsinghua.lumaqq.models.ClusterModel;
import edu.tsinghua.lumaqq.models.FriendModel;
import edu.tsinghua.lumaqq.models.GroupModel;
import edu.tsinghua.lumaqq.qq.QQ;
import edu.tsinghua.lumaqq.qq.Utils;
import edu.tsinghua.lumaqq.qq.beans.ClusterInfo;
import edu.tsinghua.lumaqq.qq.beans.DownloadFriendEntry;
import edu.tsinghua.lumaqq.qq.beans.FriendOnlineEntry;
import edu.tsinghua.lumaqq.qq.beans.FriendStatus;
import edu.tsinghua.lumaqq.qq.beans.QQFriend;
import edu.tsinghua.lumaqq.qq.beans.QQUser;
import edu.tsinghua.lumaqq.qq.events.QQEvent;
import edu.tsinghua.lumaqq.qq.events.QQListener;
import edu.tsinghua.lumaqq.qq.packets.in.ClusterCommandReplyPacket;
import edu.tsinghua.lumaqq.qq.packets.in.DownloadGroupFriendReplyPacket;
import edu.tsinghua.lumaqq.qq.packets.in.FriendChangeStatusPacket;
import edu.tsinghua.lumaqq.qq.packets.in.GetFriendListReplyPacket;
import edu.tsinghua.lumaqq.qq.packets.in.GetFriendOnlineReplyPacket;
import edu.tsinghua.lumaqq.qq.packets.in.GroupNameOpReplyPacket;
import edu.tsinghua.lumaqq.qq.packets.in.KeepAliveReplyPacket;
import edu.tsinghua.lumaqq.qq.packets.in.ReceiveIMPacket;
import edu.tsinghua.lumaqq.qq.packets.in.RequestKeyReplyPacket;
import edu.tsinghua.lumaqq.qq.packets.in.SystemNotificationPacket;
import edu.tsinghua.lumaqq.qq.packets.out.DeleteFriendPacket;
import edu.tsinghua.lumaqq.qq.packets.out.GetFriendListPacket;
import edu.tsinghua.lumaqq.qq.packets.out.RequestKeyPacket;
import edu.tsinghua.swt.models.DefaultShutterModel;

/**
 * QQ事件处理器
 * 
 * @author 马若劼 王华刚
 */
class QQEventProcessor implements QQListener {
    // Log对象
    static Log log = LogFactory.getLog(QQEventProcessor.class);
    // 主窗口对象
	private MainShell main;
	// 好友上线提示窗口
	private OnlineTipShell onlineTipShell;
	
	// 临时哈希表
	private Hashtable tempHash;
	// 组名list和组内好友的hash,用在下载分组信息的时候,因为下载分组信息是
	//     分两部分进行的,一部分得到组名称一部分得到组的好友,光完成一部分还不
	//     行,所以需要暂时保存一下结果
	private List groupNames;
	private List friends;
	// 是否是第一次得到好友列表,如果是,不需要弹出上线提示,对于后面的,需要
	private boolean firstTime;
    
	/**
	 * 构造函数
	 */
	public QQEventProcessor(MainShell main) {
		this.main = main;
		onlineTipShell = new OnlineTipShell(main);
		tempHash = new Hashtable();
		firstTime = true;
	}
	
	/**
	 * 重置变量状态
	 */
	public void clear() {
		main.currentOnlines.clear();
		tempHash.clear();
		firstTime = true;
	}
	
	/* (non-Javadoc)
	 * @see edu.tsinghua.lumaqq.qq.events.QQListener#qqEvent(edu.tsinghua.lumaqq.qq.events.QQEvent)
	 */
	public void qqEvent(QQEvent e) {
		switch(e.type) {
			case QQEvent.QQ_LOGIN_SUCCESS:
				processLoginSuccess();
				break;
			case QQEvent.QQ_GET_FRIEND_LIST_SUCCESS:
			case QQEvent.QQ_GET_FRIEND_LIST_END:
				processGetFriendList(e);
				break;			
			case QQEvent.QQ_GET_FRIEND_ONLINE_SUCCESS:
			case QQEvent.QQ_GET_FRIEND_ONLINE_END:
				processGetFriendOnline(e);
				break;
			case QQEvent.QQ_CHANGE_STATUS_SUCCESS:
				processChangeStatusSuccess();
				break;
			case QQEvent.QQ_CHANGE_STATUS_FAIL:
				processChangeStatusFail();
				break;
			case QQEvent.QQ_FRIEND_CHANGE_STATUS:
				processFriendChangeStatus(e);
				break;
			case QQEvent.QQ_RECEIVE_NORMAL_IM:
				processReceiveNormalIM(e);
				break;
		    case QQEvent.QQ_UNKNOWN_TYPE_IM:
		        processUnknownTypeIM(e);
		    	break;
			case QQEvent.QQ_REQUEST_SEND_FILE:
				processRequestSendFile(e);
				break;
			case QQEvent.QQ_KICKED_OUT_BY_SYSTEM:
				processKickedOutBySystem();
				break;
			case QQEvent.QQ_ADDED_BY_OTHERS:
			case QQEvent.QQ_REQUEST_ADD_ME:
			case QQEvent.QQ_REQUEST_ADD_OTHER_APPROVED:
			case QQEvent.QQ_REQUEST_ADD_OTHER_REJECTED:
				processReceiveSystemNotification(e);
				break;
			case QQEvent.QQ_LOGIN_PASSWROD_ERROR:
				processLoginPasswordError();
				break;
			case QQEvent.QQ_LOGIN_UNKNOWN_ERROR:
				processLoginUnknownError();
				break;
			case QQEvent.QQ_DELETE_FRIEND_SUCCESS:
			case QQEvent.QQ_DELETE_FRIEND_FAIL:
				processDeleteFriendSuccess(e);
				break;
			/*case QQEvent.QQ_DELETE_FRIEND_FAIL:
				processDeleteFriendFail(e);
				break;*/
			case QQEvent.QQ_KEEP_ALIVE_SUCCESS:
				processKeepAliveSuccess(e);
				break;
			case QQEvent.QQ_UPLOAD_GROUP_FRIEND_FAIL:
				processUploadGroupFriendFail(e);
				break;
			case QQEvent.QQ_UPLOAD_GROUP_FRIEND_SUCCESS:
				processUploadGroupFriendSuccess(e);
				break;
			case QQEvent.QQ_DOWNLOAD_GROUP_FRIEND_SUCCESS:
				processDownloadGroupFriendSuccess(e);
				break;
			case QQEvent.QQ_DOWNLOAD_GROUP_NAME_SUCCESS:
				processDownloadGroupNameSuccess(e);
				break;
			case QQEvent.QQ_CREATE_CLUSTER_SUCCESS:
				processClusterCreateSuccess(e);
				break;
			case QQEvent.QQ_GET_MEMBER_INFO_SUCCESS:
				processClusterGetMemberInfoSuccess(e);
				break;
			case QQEvent.QQ_EXIT_CLUSTER_SUCCESS:
				processClusterExitClusterSuccess(e);
				break;
			case QQEvent.QQ_RECEIVE_CLUSTER_IM:
				processReceiveClusterIM(e);
				break;
			case QQEvent.QQ_I_AM_ADDED_TO_CLUSTER:
				processIAmAddedToCluster(e);
				break;
			case QQEvent.QQ_I_AM_REMOVED_FROM_CLUSTER:
				processIAmRemovedFromCluster(e);
				break;
			case QQEvent.QQ_REQUEST_JOIN_CLUSTER:
				processRequestJoinCluster(e);
				break;
			case QQEvent.QQ_REQUEST_JOIN_CLUSTER_APPROVED:
				processRequestJoinClusterApproved(e);
				break;
			case QQEvent.QQ_REQUEST_JOIN_CLUSTER_REJECTED:
				processRequestJoinClusterRejected(e);
				break;
			case QQEvent.QQ_OPERATION_TIMEOUT:
				if(e.operation == QQ.QQ_CMD_GET_FRIEND_LIST)
					processGetFriendListTimeout(e);
				else if(e.operation == QQ.QQ_CMD_LOGIN)
					processLoginTimeout(e);
				else if(e.operation == QQ.QQ_CMD_UPLOAD_GROUP_FRIEND)
					processUploadGroupFriendFail(e);
				else if(e.operation == QQ.QQ_CMD_DOWNLOAD_GROUP_FRIEND)
					processDownloadGroupFriendFail(e);
				break;
			case QQEvent.QQ_CONNECTION_LOST:
				processConnectionLost();
				break;
		    case QQEvent.QQ_PROXY_ERROR:
		        processProxyError(e);
		    	break;
		    case QQEvent.QQ_REQUEST_KEY_SUCCESS:
		        processRequestKeySuccess(e);
		    	break;
		    case QQEvent.QQ_REQUEST_KEY_FAIL:
		        processRequestKeyFail(e);
		    	break;
		}
	}

	/**
	 * 处理请求密钥失败事件
     * @param e
     */
    private void processRequestKeyFail(QQEvent e) {
        RequestKeyPacket packet = (RequestKeyPacket)e.getSource();
        main.client.requestKey(packet.getRequest());
    }

    /**
	 * 处理请求密钥成功事件
     * @param e
     */
    private void processRequestKeySuccess(QQEvent e) {
        RequestKeyReplyPacket packet = (RequestKeyReplyPacket)e.getSource();
        QQUser me = main.client.getUser();
        if(packet.keyType == QQ.QQ_REQUEST_FILE_AGENT_KEY) {
	        me.setFileAgentKey(packet.key);
	        me.setFileAgentToken(packet.token);            
        } else if(packet.keyType == QQ.QQ_REQUEST_UNKNOWN_KEY) {
            me.setUnknownKey(packet.key);
            me.setUnknownToken(packet.token);
        }
    }

    /**
	 * 处理代理出错事件
     * @param e
     */
    private void processProxyError(final QQEvent e) {
        if(main.client.getUser().getStatus() != QQ.QQ_FRIEND_STATUS_OFFLINE) {
	        main.display.syncExec(new Runnable() {
	            public void run() {
	                Exception ex = (Exception)e.getSource();
	                String msg = ex.getMessage();
	                main.logout();
	                MessageBox box = new MessageBox(main.getShell(), SWT.ICON_ERROR | SWT.OK);
	                box.setText(LumaQQ.getResourceString("message.box.proxy.error.title"));
	                box.setMessage(msg);
	                box.open();
	            }
	        });            
        }
    }

    /**
	 * 处理未知IM事件,这个目前用来自动拒绝TCP方式的文件传输,等到TCP实现时,不再需要
     * @param e
     */
    private void processUnknownTypeIM(QQEvent e) {
        ReceiveIMPacket packet = (ReceiveIMPacket)e.getSource();
        if(packet.header.type == QQ.QQ_RECV_IM_TO_BUDDY || packet.header.type == QQ.QQ_RECV_IM_TO_UNKNOWN) {
            if(packet.normalHeader.type == QQ.QQ_IM_TCP_REQUEST)
                main.client.rejectSendFile(packet.normalHeader.sender, packet.normalHeader.sequence, false);
        }
    }

    // 处理对方拒绝我加入群的事件
	private void processRequestJoinClusterRejected(QQEvent e) {
		final ReceiveIMPacket packet = (ReceiveIMPacket)e.getSource();
		main.display.syncExec(
			new Runnable() {
				public void run() {
					main.putClusterNotificationAndUpdateAnimate(packet);
				}				
			}
		);
	}

	// 处理对方同意我加入群的事件
	private void processRequestJoinClusterApproved(QQEvent e) {
		final ReceiveIMPacket packet = (ReceiveIMPacket)e.getSource();
		ClusterModel c = main.findCluster(packet.header.sender);
		if(c == null) {
			main.display.syncExec(
				new Runnable() {
					public void run() {
						main.addCluster(packet.header.sender, false);
						main.putClusterNotificationAndUpdateAnimate(packet);
					}				
				}
			);
		}
	}

	// 处理别人申请加入群的事件
	private void processRequestJoinCluster(QQEvent e) {
		final ReceiveIMPacket packet = (ReceiveIMPacket)e.getSource();
		ClusterModel c = main.findCluster(packet.header.sender);
		if(c != null) {
			main.display.syncExec(
				new Runnable() {
					public void run() {
						main.putClusterNotificationAndUpdateAnimate(packet);
					}				
				}
			);
		}
	}

	// 处理我被从群中删除事件
	private void processIAmRemovedFromCluster(QQEvent e) {
		final ReceiveIMPacket packet = (ReceiveIMPacket)e.getSource();
		ClusterModel c = main.findCluster(packet.header.sender);
		if(c != null) {
			main.display.syncExec(
				new Runnable() {
					public void run() {
						main.removeCluster(packet.header.sender);
						main.putClusterNotificationAndUpdateAnimate(packet);
					}				

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -