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

📄 faceconfigparser.mm

📁 lumaqq
💻 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 "FaceConfigParser.h"#import "FaceGroup.h"#define TAG_CUSTOMFACEGROUP @"<CUSTOMFACEGROUP"#define TAG_CUSTOMFACE @"<CUSTOMFACE version"#define TAG_FACE @"<FACE"#define TAG_FILE_ORG @"<FILE ORG>"#define TAG_END_FILE_ORG @"</FILE ORG>"#define TAG_FILE_FIXED @"<FILE FIXED>"#define TAG_END_FILE_FIXED @"</FILE FIXED>"#define ATTR_NAME @"name=\""#define ATTR_ID @"id=\""#define ATTR_SHORTCUT @"shortcut=\""#define ATTR_TIP @"tip=\""#define ATTR_MULTIFRAME @"multiframe=\""#define ATTR_FILEINDEX @"FileIndex=\""@implementation FaceConfigParser- (id)initWithData:(NSData*)data {	self = [super init];	if (self != nil) {		m_data = [data retain];		m_groups = [[NSMutableArray array] retain];		m_faces = [[NSMutableArray array] retain];	}	return self;}- (void) dealloc {	[m_data release];	[m_groups release];	[m_faces release];	[super dealloc];}- (NSArray*)faces {	return m_faces;}- (NSArray*)groups {	return m_groups;}- (void)parse {	NSString* content = (NSString*)CFStringCreateFromExternalRepresentation(kCFAllocatorDefault, (CFDataRef)m_data, kCFStringEncodingGB_18030_2000);	int length = [content length];		int start = 0;	FaceGroup* group = nil;	NSRange nextGroupRange;	NSRange range = [content rangeOfString:TAG_CUSTOMFACEGROUP options:NSCaseInsensitiveSearch];	while(range.location != NSNotFound) {		start = range.location + range.length;				// get next group range		nextGroupRange = [content rangeOfString:TAG_CUSTOMFACEGROUP options:NSCaseInsensitiveSearch range:NSMakeRange(start, length - start)];				// serach name attr		range = [content rangeOfString:ATTR_NAME options:NSCaseInsensitiveSearch range:NSMakeRange(start, length - start)];		if(range.location != NSNotFound) {			start = range.location + range.length;						range = [content rangeOfString:@"\"" options:NSCaseInsensitiveSearch range:NSMakeRange(start, length - start)];			if(range.location != NSNotFound) {				// create group				NSString* name = [content substringWithRange:NSMakeRange(start, range.location - start)];				group = [[[FaceGroup alloc] initWithName:name] autorelease];				[m_groups addObject:group];				start = range.location + range.length;								// search face now				range = [content rangeOfString:TAG_FACE options:NSCaseInsensitiveSearch range:NSMakeRange(start, length - start)];				while(range.location != NSNotFound) {					// if the face range is before next group, then the group is not changed					if(nextGroupRange.location == NSNotFound || range.location < nextGroupRange.location) {						start = range.location + range.length;						Face* face = [self readFace:content start:&start length:length];						if(face)							[group addFace:face];						range = [content rangeOfString:TAG_FACE options:NSCaseInsensitiveSearch range:NSMakeRange(start, length - start)];					} else						break;				}			}		}				// set next group range		range = nextGroupRange;	}		//	// search for ungrouped face	//		range = [content rangeOfString:TAG_CUSTOMFACE options:NSCaseInsensitiveSearch];	while(range.location != NSNotFound) {		start = range.location + range.length;				// search face now		range = [content rangeOfString:TAG_FACE options:NSCaseInsensitiveSearch range:NSMakeRange(start, length - start)];		while(range.location != NSNotFound) {			start = range.location + range.length;			Face* face = [self readFace:content start:&start length:length];			if(face)				[m_faces addObject:face];			range = [content rangeOfString:TAG_FACE options:NSCaseInsensitiveSearch range:NSMakeRange(start, length - start)];		}	}		[content release];}- (Face*)readFace:(NSString*)content start:(int*)start length:(int)length {	// create face	Face* face = [[[Face alloc] init] autorelease];	BOOL bValid = YES;		// search id attr	NSRange range = [content rangeOfString:ATTR_ID options:NSCaseInsensitiveSearch range:NSMakeRange(*start, length - *start)];	if(range.location != NSNotFound) {		*start = range.location + range.length;		range = [content rangeOfString:@"\"" options:NSCaseInsensitiveSearch range:NSMakeRange(*start, length - *start)];		if(range.location != NSNotFound) {			NSString* md5 = [content substringWithRange:NSMakeRange(*start, range.location - *start)];			[face setMd5:md5];		} else			bValid = NO;	} else		bValid = NO;		*start = range.location + range.length;		// search shortcut attr	range = [content rangeOfString:ATTR_SHORTCUT options:NSCaseInsensitiveSearch range:NSMakeRange(*start, length - *start)];	if(range.location != NSNotFound) {		*start = range.location + range.length;		range = [content rangeOfString:@"\"" options:NSCaseInsensitiveSearch range:NSMakeRange(*start, length - *start)];		if(range.location != NSNotFound) {			NSString* shortcut = [content substringWithRange:NSMakeRange(*start, range.location - *start)];			[face setShortcut:shortcut];		}	}		*start = range.location + range.length;		// search tip attr	range = [content rangeOfString:ATTR_TIP options:NSCaseInsensitiveSearch range:NSMakeRange(*start, length - *start)];	if(range.location != NSNotFound) {		*start = range.location + range.length;		range = [content rangeOfString:@"\"" options:NSCaseInsensitiveSearch range:NSMakeRange(*start, length - *start)];		if(range.location != NSNotFound) {			NSString* tip = [content substringWithRange:NSMakeRange(*start, range.location - *start)];			[face setTip:tip];		}	}		*start = range.location + range.length;		// search multiframe attr	range = [content rangeOfString:ATTR_MULTIFRAME options:NSCaseInsensitiveSearch range:NSMakeRange(*start, length - *start)];	if(range.location != NSNotFound) {		*start = range.location + range.length;		range = [content rangeOfString:@"\"" options:NSCaseInsensitiveSearch range:NSMakeRange(*start, length - *start)];		if(range.location != NSNotFound) {			NSString* multiframe = [content substringWithRange:NSMakeRange(*start, range.location - *start)];			[face setMultiframe:([multiframe intValue] > 0)];		}	}		*start = range.location + range.length;		// search fileindex attr	range = [content rangeOfString:ATTR_FILEINDEX options:NSCaseInsensitiveSearch range:NSMakeRange(*start, length - *start)];	if(range.location != NSNotFound) {		*start = range.location + range.length;		range = [content rangeOfString:@"\"" options:NSCaseInsensitiveSearch range:NSMakeRange(*start, length - *start)];		if(range.location != NSNotFound) {			NSString* index = [content substringWithRange:NSMakeRange(*start, range.location - *start)];			[face setIndex:[index intValue]];		}	}		// search file org	range = [content rangeOfString:TAG_FILE_ORG options:NSCaseInsensitiveSearch range:NSMakeRange(*start, length - *start)];	if(range.location != NSNotFound) {		*start = range.location + range.length;				range = [content rangeOfString:TAG_END_FILE_ORG options:NSCaseInsensitiveSearch range:NSMakeRange(*start, length - *start)];		if(range.location != NSNotFound) {			NSString* fileOrg = [content substringWithRange:NSMakeRange(*start, range.location - *start)];			[face setOriginal:fileOrg];		} else			bValid = NO;	} else		bValid = NO;		// search file fixed	range = [content rangeOfString:TAG_FILE_FIXED options:NSCaseInsensitiveSearch range:NSMakeRange(*start, length - *start)];	if(range.location != NSNotFound) {		*start = range.location + range.length;				range = [content rangeOfString:TAG_END_FILE_FIXED options:NSCaseInsensitiveSearch range:NSMakeRange(*start, length - *start)];		if(range.location != NSNotFound) {			NSString* fileFixed = [content substringWithRange:NSMakeRange(*start, range.location - *start)];			[face setThumbnail:fileFixed];		} else			bValid = NO;	} else		bValid = NO;		if(bValid)		return face;	else		return nil;}@end

⌨️ 快捷键说明

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