📄 mainqqlistener.mm
字号:
/*
* 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 + -