receivedimpacket.mm

来自「lumaqq」· MM 代码 · 共 300 行

MM
300
字号
/* * 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 "ReceivedIMPacket.h"#import "CustomHead.h"#define _kKeyIMHeader @"ReceivedIMPacket_IMHeader"#define _kKeyNormalIMHeader @"ReceivedIMPacket_NormalIMHeader"#define _kKeyNormalIM @"ReceivedIMPacket_NormalIM"#define _kKeyClusterIM @"ReceivedIMPacket_ClusterIM"#define _kKeyMobileIM @"ReceivedIMPacket_MobileIM"#define _kKeyClusterNotification @"ReceivedIMPacket_ClusterNotification"#define _kKeyTempSesionIM @"ReceivedIMPacket_TempSesionIM"@implementation ReceivedIMPacket- (void) dealloc {	[m_imHeader release];	[m_normalIM release];	[m_normalIMHeader release];	[m_clusterIM release];	[m_mobileIM release];	[m_systemIM release];	[m_tempSessionIM release];	[m_clusterNotification release];	[m_signatureNotification release];	[m_customHeads release];	[super dealloc];}- (BOOL)isServerInitiative {	return YES;}- (void)parseBody:(ByteBuffer*)buf {	// read header	m_imHeader = [[ReceivedIMPacketHeader alloc] init];	[m_imHeader read:buf];		switch([m_imHeader type]) {		case kQQIMTypeFriend:		case kQQIMTypeStranger:		case kQQIMTypeFriendEx:		case kQQIMTypeStrangerEx:			m_normalIMHeader = [[NormalIMHeader alloc] init];			[m_normalIMHeader read:buf];			switch([m_normalIMHeader normalIMType]) {				case kQQNormalIMTypeText:					if([m_imHeader type] == kQQIMTypeFriendEx || [m_imHeader type] == kQQIMTypeStrangerEx) {						m_normalIM = [[NormalIM alloc] init];						[m_normalIM readEx:buf];					} else {						m_normalIM = [[NormalIM alloc] init];						[m_normalIM read:buf];					}					break;			}			break;		case kQQIMTypeTempSession:			m_tempSessionIM = [[TempSessionIM alloc] init];			[m_tempSessionIM read:buf];			break;		case kQQIMTypeMobileQQ:			m_mobileIM = [[MobileIM alloc] init];			[m_mobileIM readMobileQQ:buf];			break;		case kQQIMTypeMobileQQ2:			m_mobileIM = [[MobileIM alloc] init];			[m_mobileIM readMobileQQ2:buf];			break;		case kQQIMTypeCluster:			m_clusterIM = [[ClusterIM alloc] init];			[m_clusterIM read:buf];			break;		case kQQIMTypeClusterUnknown:			m_clusterIM = [[ClusterIM alloc] init];			[m_clusterIM read0020:buf];			break;		case kQQIMTypeTempCluster:			m_clusterIM = [[ClusterIM alloc] init];			[m_clusterIM read002A:buf];						// for temp cluster, the sender in header is still parent internal id			// I think no good comes from this, so I set back to temp cluster internal id			[m_imHeader setSender:[m_clusterIM internalId]];			break;		case kQQIMTypeJoinedCluster:			m_clusterNotification = [[ClusterNotification alloc] init];			[m_clusterNotification read0021:buf];			break;		case kQQIMTypeExitedCluster:			m_clusterNotification = [[ClusterNotification alloc] init];			[m_clusterNotification read0022:buf];			break;		case kQQIMTypeRequestJoinCluster:			m_clusterNotification = [[ClusterNotification alloc] init];			[m_clusterNotification read0023:buf];			break;		case kQQIMTypeApprovedJoinCluster:			m_clusterNotification = [[ClusterNotification alloc] init];			[m_clusterNotification read0024:buf];			break;		case kQQIMTypeRejectedJoinCluster:			m_clusterNotification = [[ClusterNotification alloc] init];			[m_clusterNotification read0025:buf];			break;		case kQQIMTypeClusterCreated:			m_clusterNotification = [[ClusterNotification alloc] init];			[m_clusterNotification read0026:buf];			break;		case kQQIMTypeClusterRoleChanged:			m_clusterNotification = [[ClusterNotification alloc] init];			[m_clusterNotification read002C:buf];			break;		case kQQIMTypeSystem:			m_systemIM = [[SystemIM alloc] init];			[m_systemIM read:buf];			break;		case kQQIMTypeSignatureChangedNotification:			m_signatureNotification = [[SignatureChangedNotification alloc] init];			[m_signatureNotification read:buf];			break;		case kQQIMTypeCustomHeadChangedNotification:			m_customHeads = [[NSMutableArray array] retain];			int count = [buf getByte] & 0xFF;			while(count-- > 0) {				CustomHead* head = [[[CustomHead alloc] init] autorelease];				[head read:buf];				[m_customHeads addObject:head];			}			break;	}}- (void)encodeWithCoder:(NSCoder*)encoder {	[encoder encodeObject:m_imHeader forKey:_kKeyIMHeader];		switch([m_imHeader type]) {		case kQQIMTypeFriend:		case kQQIMTypeStranger:		case kQQIMTypeFriendEx:		case kQQIMTypeStrangerEx:			[encoder encodeObject:m_normalIMHeader forKey:_kKeyNormalIMHeader];			[encoder encodeObject:m_normalIM forKey:_kKeyNormalIM];			break;		case kQQIMTypeTempSession:			[encoder encodeObject:m_tempSessionIM forKey:_kKeyTempSesionIM];			break;		case kQQIMTypeCluster:		case kQQIMTypeTempCluster:		case kQQIMTypeClusterUnknown:			[encoder encodeObject:m_clusterIM forKey:_kKeyClusterIM];			break;		case kQQIMTypeMobileQQ:		case kQQIMTypeMobileQQ2:			[encoder encodeObject:m_mobileIM forKey:_kKeyMobileIM];			break;		case kQQIMTypeJoinedCluster:		case kQQIMTypeExitedCluster:		case kQQIMTypeRequestJoinCluster:		case kQQIMTypeApprovedJoinCluster:		case kQQIMTypeRejectedJoinCluster:		case kQQIMTypeClusterCreated:		case kQQIMTypeClusterRoleChanged:			[encoder encodeObject:m_clusterNotification forKey:_kKeyClusterNotification];			break;	}		[super encodeWithCoder:encoder];}- (id)initWithCoder:(NSCoder*)decoder {	m_imHeader = [[decoder decodeObjectForKey:_kKeyIMHeader] retain];		switch([m_imHeader type]) {		case kQQIMTypeFriend:		case kQQIMTypeStranger:		case kQQIMTypeFriendEx:		case kQQIMTypeStrangerEx:			m_normalIMHeader = [[decoder decodeObjectForKey:_kKeyNormalIMHeader] retain];			m_normalIM = [[decoder decodeObjectForKey:_kKeyNormalIM] retain];			break;		case kQQIMTypeTempSession:			m_tempSessionIM = [[decoder decodeObjectForKey:_kKeyTempSesionIM] retain];			break;		case kQQIMTypeCluster:		case kQQIMTypeTempCluster:		case kQQIMTypeClusterUnknown:			m_clusterIM = [[decoder decodeObjectForKey:_kKeyClusterIM] retain];			break;		case kQQIMTypeMobileQQ:		case kQQIMTypeMobileQQ2:			m_mobileIM = [[decoder decodeObjectForKey:_kKeyMobileIM] retain];			break;		case kQQIMTypeJoinedCluster:		case kQQIMTypeExitedCluster:		case kQQIMTypeRequestJoinCluster:		case kQQIMTypeApprovedJoinCluster:		case kQQIMTypeRejectedJoinCluster:		case kQQIMTypeClusterCreated:		case kQQIMTypeClusterRoleChanged:			m_clusterNotification = [[decoder decodeObjectForKey:_kKeyClusterNotification] retain];			break;	}		return [super initWithCoder:decoder];}- (BOOL)isSystemMessage {	switch([m_imHeader type]) {		case kQQIMTypeJoinedCluster:		case kQQIMTypeExitedCluster:		case kQQIMTypeRequestJoinCluster:		case kQQIMTypeApprovedJoinCluster:		case kQQIMTypeRejectedJoinCluster:		case kQQIMTypeClusterCreated:		case kQQIMTypeClusterRoleChanged:			return YES;	}		return NO;}- (BOOL)isClusterMessage {	switch([m_imHeader type]) {		case kQQIMTypeCluster:		case kQQIMTypeTempCluster:		case kQQIMTypeClusterUnknown:			return YES;	}		return NO;}- (id)packetOwner {	return [NSNumber numberWithUnsignedInt:[m_imHeader sender]];}#pragma mark -#pragma mark getter and setter- (ReceivedIMPacketHeader*)imHeader {	return m_imHeader;}- (NormalIMHeader*)normalIMHeader {	return m_normalIMHeader;}- (NormalIM*)normalIM {	return m_normalIM;}- (ClusterIM*)clusterIM {	return m_clusterIM;}- (MobileIM*)mobileIM {	return m_mobileIM;}- (SystemIM*)systemIM {	return m_systemIM;}- (ClusterNotification*)clusterNotification {	return m_clusterNotification;}- (SignatureChangedNotification*)signatureNotification {	return m_signatureNotification;}- (TempSessionIM*)tempSessionIM {	return m_tempSessionIM;}- (NSArray*)customHeads {	return m_customHeads;}@end

⌨️ 快捷键说明

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