diff --git a/IRCClient.xcodeproj/project.pbxproj b/IRCClient.xcodeproj/project.pbxproj index 0e5fad8..6dee4e3 100644 --- a/IRCClient.xcodeproj/project.pbxproj +++ b/IRCClient.xcodeproj/project.pbxproj @@ -8,6 +8,8 @@ /* Begin PBXBuildFile section */ 8657E6E21C2B55B900BD4E50 /* IRC_Numerics.plist in Resources */ = {isa = PBXBuildFile; fileRef = 8657E6E11C2B55B900BD4E50 /* IRC_Numerics.plist */; }; + 86627E21276648E400AEFEB7 /* NSData+SA_NSDataExtensions.h in Headers */ = {isa = PBXBuildFile; fileRef = 86627E1F276648E400AEFEB7 /* NSData+SA_NSDataExtensions.h */; }; + 86627E22276648E400AEFEB7 /* NSData+SA_NSDataExtensions.m in Sources */ = {isa = PBXBuildFile; fileRef = 86627E20276648E400AEFEB7 /* NSData+SA_NSDataExtensions.m */; }; 86769D6D1C94DC5300B86A72 /* config.h in Headers */ = {isa = PBXBuildFile; fileRef = 86769D5B1C94DC5300B86A72 /* config.h */; }; 86769D6E1C94DC5300B86A72 /* dcc.h in Headers */ = {isa = PBXBuildFile; fileRef = 86769D5C1C94DC5300B86A72 /* dcc.h */; }; 86769D6F1C94DC5300B86A72 /* libirc_errors.h in Headers */ = {isa = PBXBuildFile; fileRef = 86769D5D1C94DC5300B86A72 /* libirc_errors.h */; }; @@ -24,8 +26,6 @@ 86B0D3ED22C5FF1300E60877 /* NSArray+SA_NSArrayExtensions.m in Sources */ = {isa = PBXBuildFile; fileRef = 86B0D3EB22C5FF1300E60877 /* NSArray+SA_NSArrayExtensions.m */; }; 86BAE5A1232ABFD200936147 /* NSIndexSet+SA_NSIndexSetExtensions.m in Sources */ = {isa = PBXBuildFile; fileRef = 86BAE59F232ABFD200936147 /* NSIndexSet+SA_NSIndexSetExtensions.m */; }; 86BAE5A2232ABFD200936147 /* NSIndexSet+SA_NSIndexSetExtensions.h in Headers */ = {isa = PBXBuildFile; fileRef = 86BAE5A0232ABFD200936147 /* NSIndexSet+SA_NSIndexSetExtensions.h */; }; - 86D02CD6275B79FB00876E93 /* NSData+SA_NSDataExtensions.h in Headers */ = {isa = PBXBuildFile; fileRef = 86D02CD4275B79FB00876E93 /* NSData+SA_NSDataExtensions.h */; }; - 86D02CD7275B79FB00876E93 /* NSData+SA_NSDataExtensions.m in Sources */ = {isa = PBXBuildFile; fileRef = 86D02CD5275B79FB00876E93 /* NSData+SA_NSDataExtensions.m */; }; 86D02CE0275B9E6B00876E93 /* NSString+SA_NSStringExtensions.h in Headers */ = {isa = PBXBuildFile; fileRef = 86D02CDE275B9E6B00876E93 /* NSString+SA_NSStringExtensions.h */; }; 86D02CE1275B9E6B00876E93 /* NSString+SA_NSStringExtensions.m in Sources */ = {isa = PBXBuildFile; fileRef = 86D02CDF275B9E6B00876E93 /* NSString+SA_NSStringExtensions.m */; }; 86F2EFF81C21F81900B033A4 /* IRCClientChannel_Private.h in Headers */ = {isa = PBXBuildFile; fileRef = 86F2EFF11C21F81900B033A4 /* IRCClientChannel_Private.h */; }; @@ -39,6 +39,8 @@ /* Begin PBXFileReference section */ 8657E6E11C2B55B900BD4E50 /* IRC_Numerics.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = IRC_Numerics.plist; sourceTree = ""; }; + 86627E1F276648E400AEFEB7 /* NSData+SA_NSDataExtensions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "NSData+SA_NSDataExtensions.h"; path = "../../SA_NSDataExtensions/NSData+SA_NSDataExtensions.h"; sourceTree = ""; }; + 86627E20276648E400AEFEB7 /* NSData+SA_NSDataExtensions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "NSData+SA_NSDataExtensions.m"; path = "../../SA_NSDataExtensions/NSData+SA_NSDataExtensions.m"; sourceTree = ""; }; 86769D5B1C94DC5300B86A72 /* config.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = config.h; sourceTree = ""; }; 86769D5C1C94DC5300B86A72 /* dcc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = dcc.h; sourceTree = ""; }; 86769D5D1C94DC5300B86A72 /* libirc_errors.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = libirc_errors.h; sourceTree = ""; }; @@ -55,8 +57,6 @@ 86B0D3EB22C5FF1300E60877 /* NSArray+SA_NSArrayExtensions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; name = "NSArray+SA_NSArrayExtensions.m"; path = "../../OS X Projects/SA_IRCBotServer/NSArray+SA_NSArrayExtensions/NSArray+SA_NSArrayExtensions.m"; sourceTree = ""; }; 86BAE59F232ABFD200936147 /* NSIndexSet+SA_NSIndexSetExtensions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "NSIndexSet+SA_NSIndexSetExtensions.m"; path = "../../OS X Projects/XGopher/NSIndexSet+SA_NSIndexSetExtensions/NSIndexSet+SA_NSIndexSetExtensions.m"; sourceTree = ""; }; 86BAE5A0232ABFD200936147 /* NSIndexSet+SA_NSIndexSetExtensions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "NSIndexSet+SA_NSIndexSetExtensions.h"; path = "../../OS X Projects/XGopher/NSIndexSet+SA_NSIndexSetExtensions/NSIndexSet+SA_NSIndexSetExtensions.h"; sourceTree = ""; }; - 86D02CD4275B79FB00876E93 /* NSData+SA_NSDataExtensions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "NSData+SA_NSDataExtensions.h"; path = "../../SA_NSDataExtensions/NSData+SA_NSDataExtensions.h"; sourceTree = ""; }; - 86D02CD5275B79FB00876E93 /* NSData+SA_NSDataExtensions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "NSData+SA_NSDataExtensions.m"; path = "../../SA_NSDataExtensions/NSData+SA_NSDataExtensions.m"; sourceTree = ""; }; 86D02CDE275B9E6B00876E93 /* NSString+SA_NSStringExtensions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "NSString+SA_NSStringExtensions.h"; path = "../SA_NSStringExtensions/NSString+SA_NSStringExtensions.h"; sourceTree = ""; }; 86D02CDF275B9E6B00876E93 /* NSString+SA_NSStringExtensions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "NSString+SA_NSStringExtensions.m"; path = "../SA_NSStringExtensions/NSString+SA_NSStringExtensions.m"; sourceTree = ""; }; 86F2EFE61C21F73600B033A4 /* IRCClient.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = IRCClient.framework; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -84,8 +84,8 @@ 866B9D4F1C97530E00F460BB /* NSData+SA_NSDataExtensions */ = { isa = PBXGroup; children = ( - 86D02CD4275B79FB00876E93 /* NSData+SA_NSDataExtensions.h */, - 86D02CD5275B79FB00876E93 /* NSData+SA_NSDataExtensions.m */, + 86627E1F276648E400AEFEB7 /* NSData+SA_NSDataExtensions.h */, + 86627E20276648E400AEFEB7 /* NSData+SA_NSDataExtensions.m */, ); name = "NSData+SA_NSDataExtensions"; path = SA_NSDataExtensions; @@ -203,6 +203,7 @@ 86769D751C94DC5300B86A72 /* session.h in Headers */, 86769D6E1C94DC5300B86A72 /* dcc.h in Headers */, 86B0D3E922C5A3D700E60877 /* NSRange-Conventional.h in Headers */, + 86627E21276648E400AEFEB7 /* NSData+SA_NSDataExtensions.h in Headers */, 86F2EFFB1C21F81900B033A4 /* IRCClientChannelDelegate.h in Headers */, 86769D721C94DC5300B86A72 /* libirc_rfcnumeric.h in Headers */, 86D02CE0275B9E6B00876E93 /* NSString+SA_NSStringExtensions.h in Headers */, @@ -214,7 +215,6 @@ 86BAE5A2232ABFD200936147 /* NSIndexSet+SA_NSIndexSetExtensions.h in Headers */, 86B0D3EC22C5FF1300E60877 /* NSArray+SA_NSArrayExtensions.h in Headers */, 86769D6F1C94DC5300B86A72 /* libirc_errors.h in Headers */, - 86D02CD6275B79FB00876E93 /* NSData+SA_NSDataExtensions.h in Headers */, 86769D711C94DC5300B86A72 /* libirc_options.h in Headers */, 86F2EFF81C21F81900B033A4 /* IRCClientChannel_Private.h in Headers */, ); @@ -291,9 +291,9 @@ 86BAE5A1232ABFD200936147 /* NSIndexSet+SA_NSIndexSetExtensions.m in Sources */, 86F2EFFD1C21F81900B033A4 /* IRCClientSession.m in Sources */, 86B0D3ED22C5FF1300E60877 /* NSArray+SA_NSArrayExtensions.m in Sources */, - 86D02CD7275B79FB00876E93 /* NSData+SA_NSDataExtensions.m in Sources */, 86D02CE1275B9E6B00876E93 /* NSString+SA_NSStringExtensions.m in Sources */, 86F2EFFA1C21F81900B033A4 /* IRCClientChannel.m in Sources */, + 86627E22276648E400AEFEB7 /* NSData+SA_NSDataExtensions.m in Sources */, 86769D791C94DC5300B86A72 /* libircclient.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; diff --git a/IRCClient/IRCClientChannel.m b/IRCClient/IRCClientChannel.m index 3db8a5d..bf60a6b 100644 --- a/IRCClient/IRCClientChannel.m +++ b/IRCClient/IRCClientChannel.m @@ -138,7 +138,8 @@ return irc_send_raw(_irc_session, "PRIVMSG %s :%s", _name.terminatedCString, - irc_color_convert_to_mirc(message.terminatedCString)); +// irc_color_convert_to_mirc(message.terminatedCString)); + [self.session colorConvertToMIRC:message].terminatedCString); } -(int) action:(NSData *)action { @@ -148,7 +149,8 @@ return irc_send_raw(_irc_session, "PRIVMSG %s :\x01" "ACTION %s\x01", _name.terminatedCString, - irc_color_convert_to_mirc(action.terminatedCString)); +// irc_color_convert_to_mirc(action.terminatedCString)); + [self.session colorConvertToMIRC:action].terminatedCString); } -(int) notice:(NSData *)notice { diff --git a/IRCClient/IRCClientChannel_Private.h b/IRCClient/IRCClientChannel_Private.h index 286bf6a..1cf9dd3 100644 --- a/IRCClient/IRCClientChannel_Private.h +++ b/IRCClient/IRCClientChannel_Private.h @@ -8,6 +8,7 @@ // See LICENSE and README.md for more info. #import "IRCClientChannel.h" +#import "IRCClientSession.h" #include "libircclient.h" /********************************************/ diff --git a/IRCClient/IRCClientSession.h b/IRCClient/IRCClientSession.h index 154dd98..235512f 100644 --- a/IRCClient/IRCClientSession.h +++ b/IRCClient/IRCClientSession.h @@ -168,6 +168,18 @@ */ -(void) run; +/** Convert libircclient markup in a message to mIRC format codes. + */ +-(NSData *) colorConvertToMIRC:(NSData *)message; + +/** Convert mIRC format codes in a message to libircclient markup. + */ +-(NSData *) colorConvertFromMIRC:(NSData *)message; + +/** Remove mIRC format codes from a message. + */ +-(NSData *) colorStripFromMIRC:(NSData *)message; + /**************************/ #pragma mark - IRC commands /**************************/ diff --git a/IRCClient/IRCClientSession.m b/IRCClient/IRCClientSession.m index 2ac3028..fca68e6 100644 --- a/IRCClient/IRCClientSession.m +++ b/IRCClient/IRCClientSession.m @@ -21,6 +21,7 @@ #import "NSData+SA_NSDataExtensions.h" #import "NSString+SA_NSStringExtensions.h" #import "NSRange-Conventional.h" +#import "NSIndexSet+SA_NSIndexSetExtensions.h" /********************************************/ #pragma mark - Callback function declarations @@ -190,6 +191,73 @@ static NSDictionary* ircNumericCodeList; nickUserHost.length - (rangeOfUserHostSeparator.location + 1))]); } +// TODO: implement color support +-(NSData *) colorConvertToMIRC:(NSData *)message { + NSMutableData *workingCopy = [message mutableCopy]; + + [@[ @[ @"[B]", @"[/B]", [NSData dataFromCString:"\x02"] ], + @[ @"[I]", @"[/I]", [NSData dataFromCString:"\x16"] ], + @[ @"[U]", @"[/U]", [NSData dataFromCString:"\x1F"] ] ] forEach:^(NSArray *tags) { + NSData *openingTag = [tags[0] dataUsingEncoding:self.encoding]; + NSData *closingTag = [tags[1] dataUsingEncoding:self.encoding]; + NSData *mircCode = tags[2]; + + NSRange rangeOfOpeningTag, rangeOfClosingTag; + do { + // Find next opening tag. + rangeOfOpeningTag = [workingCopy rangeOfData:openingTag + options:(NSDataSearchOptions) 0 + range:workingCopy.fullRange]; + if (rangeOfOpeningTag.location != NSNotFound) { + // Replace opening tag. + [workingCopy replaceBytesInRange:rangeOfOpeningTag + withBytes:mircCode.bytes + length:mircCode.length]; + + // Find next closing tag. + rangeOfClosingTag = [workingCopy rangeOfData:closingTag + options:(NSDataSearchOptions) 0 + range:[workingCopy rangeAfterRange:NSMakeRange(rangeOfOpeningTag.location, + mircCode.length)]]; + if (rangeOfClosingTag.location != NSNotFound) { + // Replace closing tag, if any. + [workingCopy replaceBytesInRange:rangeOfClosingTag + withBytes:mircCode.bytes + length:mircCode.length]; + } else { + // Otherwise, end the string with a closing tag. + [workingCopy appendBytes:mircCode.bytes + length:mircCode.length]; + } + } + } while (rangeOfOpeningTag.location != NSNotFound); + + // Clean up stray closing tags. + do { + rangeOfClosingTag = [workingCopy rangeOfData:closingTag + options:(NSDataSearchOptions) 0 + range:workingCopy.fullRange]; + if (rangeOfClosingTag.location != NSNotFound) { + [workingCopy replaceBytesInRange:rangeOfClosingTag + withBytes:mircCode.bytes + length:mircCode.length]; + } + } while (rangeOfClosingTag.location != NSNotFound); + }]; + + return [workingCopy copy]; +} + +-(NSData *) colorConvertFromMIRC:(NSData *)message { + // TODO: Implement this for real! + return [self colorStripFromMIRC:message]; +} + +// TODO: implement this! +-(NSData *) colorStripFromMIRC:(NSData *)message { + return message; +} + /*************************************/ #pragma mark - Class methods (private) /*************************************/ @@ -347,7 +415,8 @@ static NSDictionary* ircNumericCodeList; return irc_send_raw(_irc_session, "PRIVMSG %s :%s", target.terminatedCString, - irc_color_convert_to_mirc(message.terminatedCString)); +// irc_color_convert_to_mirc(message.terminatedCString)); + [self colorConvertToMIRC:message].terminatedCString); } -(int) action:(NSData *)action @@ -359,7 +428,8 @@ static NSDictionary* ircNumericCodeList; return irc_send_raw(_irc_session, "PRIVMSG %s :\x01" "ACTION %s\x01", target.terminatedCString, - irc_color_convert_to_mirc(action.terminatedCString)); +// irc_color_convert_to_mirc(action.terminatedCString)); + [self colorConvertToMIRC:action].terminatedCString); } -(int) notice:(NSData *)notice @@ -425,17 +495,18 @@ static NSDictionary* ircNumericCodeList; || !strcmp(event, "SERVNOTICE") || !strcmp(event, "CTCP_ACTION") )) { - char* (*process_color_codes) (const char *) = (whatAboutColors == SA_IRC_ParseColorCodes - ? irc_color_convert_from_mirc - : irc_color_strip_from_mirc); - params_array = [NSMutableArray arrayWithCapacity:count]; - for (NSUInteger i = 0; i < count; i++) { - [params_array addObject:[NSData dataFromCString:(*process_color_codes)(params[i])]]; - } + [NSIndexSet from:0 + for:count + do:^(NSUInteger idx) { + NSData *param = (whatAboutColors == SA_IRC_ParseColorCodes + ? [self colorConvertFromMIRC:[NSData dataFromCString:params[idx]]] + : [self colorStripFromMIRC:[NSData dataFromCString:params[idx]]]); + [params_array addObject:param]; + }]; } else { - params_array = (NSMutableArray *) [NSArray arrayOfCStringData:params - count:count]; + params_array = [NSMutableArray arrayOfCStringData:params + count:count]; } NSData *origin_data = origin ? [NSData dataFromCString:origin] : nil; diff --git a/libircclient/src/colors.c b/libircclient/src/colors.c index adc5c68..284f846 100644 --- a/libircclient/src/colors.c +++ b/libircclient/src/colors.c @@ -15,11 +15,11 @@ #include #define LIBIRC_COLORPARSER_BOLD (1<<1) -#define LIBIRC_COLORPARSER_UNDERLINE (1<<2) +#define LIBIRC_COLORPARSER_UNDERLINE (1<<2) #define LIBIRC_COLORPARSER_REVERSE (1<<3) #define LIBIRC_COLORPARSER_COLOR (1<<4) -#define LIBIRC_COLORPARSER_MAXCOLORS 15 +#define LIBIRC_COLORPARSER_MAXCOLORS 15 #define max(a,b) \