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

📄 mainqqlistener.mm

📁 lumaqq
💻 MM
📖 第 1 页 / 共 5 页
字号:
/*
 * LumaQQ - Cross platform QQ client, special edition for Mac
 *
 * Copyright (C) 2007 luma <stubma@163.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
 */

#import "MainQQListener.h"
#import "MainWindowController.h"
#import "AlertTool.h"
#import "SystemTool.h"
#import "ByteTool.h"
#import "TimerTaskManager.h"
#import "SoundHelper.h"
#import "Constants.h"
#import "ModelEffectTask.h"
#import "PreferenceCache.h"
#import "MessageWingTask.h"
#import "SystemMessageBlinkTask.h"
#import "SignatureChangedNotification.h"
#import "SendSMSPacket.h"
#import "SignatureOpPacket.h"
#import "TempClusterSendIMPacket.h"
#import <Growl/GrowlApplicationBridge.h>
#import "LQGrowlNotifyHelper.h"
#import "GetUserPropertyJob.h"
#import "GetFriendLevelJob.h"
#import "GetSignatureJob.h"
#import "GetRemarkJob.h"
#import "GetCustomHeadInfoJob.h"
#import "GetCustomHeadDataJob.h"

@implementation MainQQListener

- (id)initWithMainWindow:(MainWindowController*)main {
	self = [super init];
	if(self) {
		m_main = [main retain];
		m_groupManager = [[main groupManager] retain];
		m_me = [[main me] retain];
		
		m_onlines = [[NSMutableDictionary dictionary] retain];
		m_onlineCache = [[NSMutableArray array] retain];
		m_firstOnlineCheckAfterLogin = YES;
	}
	return self;
}

- (void) dealloc {
	[m_friendGroupMapping release];
	[m_main release];
	[m_groupManager release];
	[m_me release];
	[m_onlines release];
	[m_onlineCache release];
	[m_allUserQQs release];
	[super dealloc];
}

#pragma mark -
#pragma mark helper

- (void)uploadGroupNames {
	[m_main setProgressWindowHint:L(@"LQHintUploadGroupName", @"MainWindow")];
	[[m_main client] uploadGroupNames:[m_groupManager friendlyGroupNamesExceptMyFriends]];
}

- (void)uploadFriendGroups {
	int start = m_nextUploadPage * kQQMaxUploadGroupFriendCount;
	int to = start + MIN([m_allUserQQs count] - start, kQQMaxUploadGroupFriendCount);
	NSMutableDictionary* dict = [NSMutableDictionary dictionary];
	for(int i = start; i < to; i++) {
		NSNumber* qq = [m_allUserQQs objectAtIndex:i];
		[dict setObject:[m_friendGroupMapping objectForKey:qq] forKey:qq];
	}
	[[m_main client] uploadFriendGroup:dict];
}

#pragma mark -
#pragma mark qq event handler

- (BOOL)handleQQEvent:(QQNotification*)event {
	BOOL ret = NO;
	
	switch([event eventId]) {
		case kQQEventNetworkStarted:
			ret = [self handleNetworkStarted];
			break;
		case kQQEventNetworkConnectionEstablished:
			ret = [self handleConnectionEstablished:event];
			break;
		case kQQEventNetworkError:
			ret = [self handleNetworkError:event];
			break;
		case kQQEventSelectServerOK:
			ret = [self handleSelectServerOK:event];
			break;
		case kQQEventGetServerTokenOK:
			ret = [self handleGetServerTokenOK:event];
			break;
		case kQQEventGetLoginTokenOK:
			ret = [self handleGetLoginTokenOK:event];
			break;
		case kQQEventPasswordVerifyOK:
			ret = [self handlePasswordVerifyOK:event];
			break;
		case kQQEventNeedVerifyCode:
			ret = [self handleNeedVerifyCode:event];
			ret = YES;
			break;
		case kQQEventTimeoutBasic:
			ret = [self handleTimeout:event];
			break;
		case kQQEventLoginOK:
			ret = [self handleLoginOK:event];
			break;
		case kQQEventLoginFailed:
			ret = [self handleLoginFailed:event];
			break;
		case kQQEventPasswordVerifyFailed:
			ret = [self handlePasswordVerifyFailed:event];
			break;
		case kQQEventModifyInfoOK:
			ret = [self handleModifyInfoOK:event];
			break;
		case kQQEventGetUserInfoOK:
			ret = [self handleGetUserInfoOK:event];
			break;
		case kQQEventChangeStatusOK:
			ret = [self handleChangeStatusOK:event];
			break;
		case kQQEventFriendStatusChanged:
			ret = [self handleFriendStatusChanged:event];
			break;
		case kQQEventGetFriendListOK:
			ret = [self handleGetFriendListOK:event];
			break;
		case kQQEventGetFriendGroupOK:
			ret = [self handleGetFriendGroupOK:event];
			break;
		case kQQEventDownloadGroupNamesOK:
			ret = [self handleDownloadGroupNameOK:event];
			break;
		case kQQEventKeepAliveOK:
			ret = [self handleKeepAliveOK:event];
			break;
		case kQQEventGetOnlineFriendOK:
			ret = [self handleGetOnlineFriendOK:event];
			break;
		case kQQEventGetUserPropertyOK:
			ret = [self handleGetUserPropertyOK:event];
			break;
		case kQQEventGetFriendLevelOK:
			ret = [self handleGetFriendLevelOK:event];
			break;
		case kQQEventGetSignatureOK:
			ret = [self handleGetSignatureOK:event];
			break;
		case kQQEventModifySigatureOK:
			ret = [self handleModifySignatureOK:event];
			break;
		case kQQEventBatchGetFriendRemarkOK:
			ret = [self handleBatchGetFriendRemarkOK:event];
			break;
		case kQQEventClusterGetMessageSettingOK:
			ret = [self handleGetClusterMessageSettingOK:event];
			break;
		case kQQEventClusterGetInfoOK:
			ret = [self handleGetClusterInfoOK:event];
			break;
		case kQQEventClusterGetVersionIdOK:
			ret = [self handleGetClusterVersionIdOK:event];
			break;
		case kQQEventClusterBatchGetCardOK:
			ret = [self handleBatchGetClusterNameCardOK:event];
			break;
		case kQQEventClusterGetSubjectsOK:
			ret = [self handleGetSubjectsOK:event];
			break;
		case kQQEventClusterGetSubjectsFailed:
			ret = [self handleGetSubjectsFailed:event];
			break;
		case kQQEventClusterUpdateOrganizationOK:
			ret = [self handleUpdateOrganizationOK:event];
			break;
		case kQQEventClusterUpdateOrganizationFailed:
			ret = [self handleUpdateOrganizationFailed:event];
			break;
		case kQQEventClusterGetMemberInfoOK:
			ret = [self handleGetMemberInfoOK:event];
			break;
		case kQQEventClusterGetOnlineMemberOK:
			ret = [self handleGetOnlineMemberOK:event];
			break;
		case kQQEventTempClusterGetInfoOK:
			ret = [self handleGetTempClusterInfoOK:event];
			break;
		case kQQEventRemoveFriendFromListOK:
			ret = [self handleRemoveFriendFromServerListOK:event];
			break;
		case kQQEventSendIMOK:
			ret = [self handleSendIMOK:event];
			break;
		case kQQEventClusterSendIMOK:
			ret = [self handleSendClusterIMOK:event];
			break;
		case kQQEventSMSSent:
			ret = [self handleSMSSent:event];
			break;
		case kQQEventTempClusterSendIMOK:
			ret = [self handleSendTempClusterIMOK:event];
			break;
		case kQQEventReceivedIM:
			ret = [self handleReceivedIM:event];
			break;
		case kQQEventReceivedSystemNotification:
			ret = [self handleReceivedSystemNotification:event];
			break;
		case kQQEventClusterExitOK:
			ret = [self handleExitClusterOK:event];
			break;
		case kQQEventTempClusterExitOK:
			ret = [self handleExitTempClusterOK:event];
			break;
		case kQQEventUploadGroupNamesOK:
			ret = [self handleUploadGroupNameOK:event];
			break;
		case kQQEventUploadGroupNamesFailed:
			ret = [self handleUploadGroupNameFailed:event];
			break;
		case kQQEventUploadFriendGroupOK:
			ret = [self handleUploadFriendGroupOK:event];
			break;
		case kQQEventUploadFriendGroupFailed:
			ret = [self handleUploadFriendGroupFailed:event];
			break;
	}
	
	return ret;
}

- (BOOL)handleConnectionTimeout:(QQNotification*)event {
	if([event connectionId] == [[m_main client] mainConnectionId]) {
		// restore from auto hide
		[m_main onRestoreFromAutoHide:self];
		
		[m_main shutdownNetwork];
		[m_main restartNetwork];
	}
	return NO;
}

- (BOOL)handleNetworkError:(QQNotification*)event {
	if([event connectionId] == [[m_main client] mainConnectionId]) {
		// restore from auto hide
		[m_main onRestoreFromAutoHide:self];
		
		[m_main shutdownNetwork];
		[m_main restartNetwork];
	}
	return NO;
}

- (BOOL)handleSelectServerOK:(QQNotification*)event {
	[m_main setHint:L(@"LQHintGetServerToken", @"MainWindow")];
	return YES;
}

- (BOOL)handleGetServerTokenOK:(QQNotification*)event {
	[m_main setHint:L(@"LQHintGetLoginToken", @"MainWindow")];
	return YES;
}

- (BOOL)handleGetLoginTokenOK:(QQNotification*)event {
	[m_main setHint:L(@"LQHintVerifyPassword", @"MainWindow")];
	return YES;
}

- (BOOL)handlePasswordVerifyOK:(QQNotification*)event {
	[m_main setHint:L(@"LQHintLogin", @"MainWindow")];
	return YES;
}

- (BOOL)handleGetUserInfoOK:(QQNotification*)event {
	GetUserInfoReplyPacket* packet = (GetUserInfoReplyPacket*)[event object];
	
	// set user info in global
	User* u = [m_groupManager user:[[packet contact] QQ]];
	if(u) {
		[u setContact:[packet contact]];
		[[[m_main client] user] setContact:[packet contact]];
		
		if([u QQ] == [m_me QQ]) {
			[m_me setContact:[packet contact]];
			
			// set mm icon if I am mm
			[m_main refreshDockIcon];
			
			// refresh UI
			[m_main refreshStatusUI];
			
			// set flag
			[m_main setMyInfoGot:YES];
		} else
			[[m_main userOutline] reloadItem:u];
	}
	
	return NO;
}

- (BOOL)handleModifyInfoOK:(QQNotification*)event {
	ModifyInfoPacket* packet = (ModifyInfoPacket*)[event outPacket];
	if([[packet user] QQ] == [m_me QQ]) {
		[(HeadControl*)[[m_main headItem] view] setHead:[[packet contact] head]];
	}
	return NO;
}

- (BOOL)handleConnectionEstablished:(QQNotification*)event {
	if([event connectionId] == [[m_main client] mainConnectionId]) {
		[m_main setHint:L(@"LQHintSelectServer", @"MainWindow")];
	}		
	return NO;
}

- (BOOL)handleNetworkStarted {
	[m_main setHint:L(@"LQHintConnectInitialServer", @"MainWindow")];
	return YES;
}

- (BOOL)handleNeedVerifyCode:(QQNotification*)event {
	GetLoginTokenReplyPacket* packet = (GetLoginTokenReplyPacket*)[event object];
	
	if([[[m_main verifyCodeWindowController] window] isVisible])
		[[m_main verifyCodeWindowController] refresh:packet];
	else
		[[m_main verifyCodeWindowController] beginSheet:packet];
	return YES;
}

- (BOOL)handleTimeout:(QQNotification*)event {
	OutPacket* packet = (OutPacket*)[event outPacket];
	
	switch([packet command]) {
		case kQQCommandGetLoginToken:
		case kQQCommandLogin:
			[m_main shutdownNetwork];
			[m_main restartNetwork];
			return YES;
		case kQQCommandKeepAlive:
			[self handleConnectionTimeout:event];
			return YES;
		case kQQCommandGetFriendGroup:
		case kQQCommandGetFriendList:
			[[m_main client] sendPacket:packet];
			return NO;
		case kQQCommandCluster:
			switch([(ClusterCommandPacket*)packet subCommand]) {
				case kQQSubCommandClusterUpdateOrganization:
					return [self handleUpdateOrganizationTimeout:event];
				case kQQSubCommandClusterSubOp:
					return [self handleClusterSubOpTimeout:event];
			}
			return NO;
		case kQQCommandUploadGroupFriend:
			[m_main showProgressWindow:NO];
			return YES;
		case kQQCommandGroupDataOp:
			GroupDataOpPacket* gop = (GroupDataOpPacket*)packet;
			switch([gop subCommand]) {
				case kQQSubCommandDownloadGroupName:
					[[m_main client] sendPacket:packet];
					return NO;

⌨️ 快捷键说明

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