diff --git a/ChangeLog b/ChangeLog index a0a6cd11d..f1c620953 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2010-11-02 Wolfgang Sourdeau + + * SoObjects/SOGo/NSDictionary+BSJSONAdditions.[hm]: + SoObjects/SOGo/NSScanner+BSJSONAdditions.[hm]: removed classes, + obsoleted by the use of the SBJson library. + 2010-11-01 Francis Lachapelle * UI/WebServerResources/MailerUI.js (mailListToggleMessagesRead): diff --git a/SoObjects/SOGo/GNUmakefile b/SoObjects/SOGo/GNUmakefile index 88766c4e9..8733c5b15 100644 --- a/SoObjects/SOGo/GNUmakefile +++ b/SoObjects/SOGo/GNUmakefile @@ -56,9 +56,6 @@ SOGo_HEADER_FILES = \ SOGoGroup.h \ SOGoUser.h \ \ - NSDictionary+BSJSONAdditions.h \ - NSScanner+BSJSONAdditions.h \ - \ DOMNode+SOGo.h \ \ WORequest+SOGo.h \ @@ -121,9 +118,6 @@ SOGo_OBJC_FILES = \ SOGoGroup.m \ SOGoUser.m \ \ - NSDictionary+BSJSONAdditions.m \ - NSScanner+BSJSONAdditions.m \ - \ DOMNode+SOGo.m \ \ WORequest+SOGo.m \ diff --git a/SoObjects/SOGo/GNUmakefile.preamble b/SoObjects/SOGo/GNUmakefile.preamble index afd4c9796..9315cf6a2 100644 --- a/SoObjects/SOGo/GNUmakefile.preamble +++ b/SoObjects/SOGo/GNUmakefile.preamble @@ -20,7 +20,7 @@ SOGo_LIBRARIES_DEPEND_UPON += \ -lNGMime \ -lNGStreams -lNGExtensions -lEOControl \ -lXmlRpc -lDOM -lSaxObjC -lcrypt \ - -lNGLdap + -lNGLdap -lSBJson ADDITIONAL_TOOL_LIBS += \ -L$(GNUSTEP_OBJ_DIR)/ \ diff --git a/SoObjects/SOGo/NSDictionary+BSJSONAdditions.h b/SoObjects/SOGo/NSDictionary+BSJSONAdditions.h deleted file mode 100644 index 5d34e045d..000000000 --- a/SoObjects/SOGo/NSDictionary+BSJSONAdditions.h +++ /dev/null @@ -1,43 +0,0 @@ -// -// BSJSONAdditions -// -// Created by Blake Seely on 2/1/06. -// Copyright 2006 Blake Seely - http://www.blakeseely.com All rights reserved. -// Permission to use this code: -// -// Feel free to use this code in your software, either as-is or -// in a modified form. Either way, please include a credit in -// your software's "About" box or similar, mentioning at least -// my name (Blake Seely). -// -// Permission to redistribute this code: -// -// You can redistribute this code, as long as you keep these -// comments. You can also redistribute modified versions of the -// code, as long as you add comments to say that you've made -// modifications (keeping these original comments too). -// -// If you do use or redistribute this code, an email would be -// appreciated, just to let me know that people are finding my -// code useful. You can reach me at blakeseely@mac.com - -#import - -extern NSString *jsonIndentString; -extern const int jsonDoNotIndent; - -@interface NSDictionary (BSJSONAdditions) - -- (NSString *)jsonStringValue; - -@end - -@interface NSDictionary (PrivateBSJSONAdditions) - -- (NSString *)jsonStringValueWithIndentLevel:(int)level; -- (NSString *)jsonStringForValue:(id)value withIndentLevel:(int)level; -- (NSString *)jsonStringForArray:(NSArray *)array withIndentLevel:(int)level; -- (NSString *)jsonStringForString:(NSString *)string; -- (NSString *)jsonIndentStringForLevel:(int)level; - -@end diff --git a/SoObjects/SOGo/NSDictionary+BSJSONAdditions.m b/SoObjects/SOGo/NSDictionary+BSJSONAdditions.m deleted file mode 100644 index 147493ee4..000000000 --- a/SoObjects/SOGo/NSDictionary+BSJSONAdditions.m +++ /dev/null @@ -1,190 +0,0 @@ -// -// BSJSONAdditions -// -// Created by Blake Seely on 2/1/06. -// Copyright 2006 Blake Seely - http://www.blakeseely.com All rights reserved. -// Permission to use this code: -// -// Feel free to use this code in your software, either as-is or -// in a modified form. Either way, please include a credit in -// your software's "About" box or similar, mentioning at least -// my name (Blake Seely). -// -// Permission to redistribute this code: -// -// You can redistribute this code, as long as you keep these -// comments. You can also redistribute modified versions of the -// code, as long as you add comments to say that you've made -// modifications (keeping these original comments too). -// -// If you do use or redistribute this code, an email would be -// appreciated, just to let me know that people are finding my -// code useful. You can reach me at blakeseely@mac.com - -#import -#import -#import -#import -#import - -#import "NSDictionary+BSJSONAdditions.h" -#import "NSScanner+BSJSONAdditions.h" - -NSString *jsonIndentString = @"\t"; // Modify this string to change how the output formats. -const int jsonDoNotIndent = -1; - -@implementation NSDictionary (BSJSONAdditions) - -- (NSString *)jsonStringValue -{ - return [self jsonStringValueWithIndentLevel:0]; -} - -@end - -@implementation NSDictionary (PrivateBSJSONAdditions) - -- (NSString *)jsonStringValueWithIndentLevel:(int)level -{ - NSMutableString *jsonString = [[NSMutableString alloc] init]; - [jsonString appendString:jsonObjectStartString]; - - NSEnumerator *keyEnum = [self keyEnumerator]; - NSString *keyString = [keyEnum nextObject]; - NSString *valueString; - if (keyString != nil) { - valueString = [self jsonStringForValue:[self objectForKey:keyString] withIndentLevel:level]; - if (level != jsonDoNotIndent) { // indent before each key - [jsonString appendString:[self jsonIndentStringForLevel:level]]; - } - [jsonString appendFormat:@" %@ %@ %@", [self jsonStringForString:keyString], jsonKeyValueSeparatorString, valueString]; - } - - while ((keyString = [keyEnum nextObject])) { - valueString = [self jsonStringForValue:[self objectForKey:keyString] withIndentLevel:level]; // TODO bail if valueString is nil? How to bail successfully from here? - [jsonString appendString:jsonValueSeparatorString]; - if (level != jsonDoNotIndent) { // indent before each key - [jsonString appendFormat:@"%@", [self jsonIndentStringForLevel:level]]; - } - [jsonString appendFormat:@" %@ %@ %@", [self jsonStringForString:keyString], jsonKeyValueSeparatorString, valueString]; - } - - //[jsonString appendString:@"\n"]; - [jsonString appendString:jsonObjectEndString]; - - return [jsonString autorelease]; -} - -- (NSString *)jsonStringForValue:(id)value withIndentLevel:(int)level -{ - NSString *jsonString; - if ([value respondsToSelector:@selector(characterAtIndex:)]) // String - jsonString = [self jsonStringForString:(NSString *)value]; - else if ([value respondsToSelector:@selector(keyEnumerator)]) // Dictionary - jsonString = [(NSDictionary *)value jsonStringValueWithIndentLevel:(level + 1)]; - else if ([value respondsToSelector:@selector(objectAtIndex:)]) // Array - jsonString = [self jsonStringForArray:(NSArray *)value withIndentLevel:level]; - else if (value == [NSNull null]) // null - jsonString = jsonNullString; - else if ([value respondsToSelector:@selector(objCType)]) { // NSNumber - representing true, false, and any form of numeric - NSNumber *number = (NSNumber *)value; - const char *t = [number objCType]; - if (((*t == 'c') || *t == 'C') && ([number boolValue] == YES)) // true - jsonString = jsonTrueString; - else if (((*t == 'c') || *t == 'C') && ([number boolValue] == NO)) // false - jsonString = jsonFalseString; - else // attempt to handle as a decimal number - int, fractional, exponential - // TODO: values converted from exponential json to dict and back to json do not format as exponential again - jsonString = [[NSDecimalNumber decimalNumberWithDecimal:[number decimalValue]] stringValue]; - } else { - // TODO: error condition - it's not any of the types that I know about. - return nil; - } - - return jsonString; -} - -- (NSString *)jsonStringForArray:(NSArray *)array withIndentLevel:(int)level -{ - NSMutableString *jsonString = [[NSMutableString alloc] init]; - [jsonString appendString:jsonArrayStartString]; - - if ([array count] > 0) { - [jsonString appendString:[self jsonStringForValue:[array objectAtIndex:0] withIndentLevel:level]]; - } - - int i; - for (i = 1; i < [array count]; i++) { - [jsonString appendFormat:@"%@ %@", jsonValueSeparatorString, [self jsonStringForValue:[array objectAtIndex:i] withIndentLevel:level]]; - } - - [jsonString appendString:jsonArrayEndString]; - return [jsonString autorelease]; -} - -- (NSString *)jsonStringForString:(NSString *)string -{ - NSMutableString *jsonString = [[NSMutableString alloc] init]; - [jsonString appendString:jsonStringDelimiterString]; - - // Build the result one character at a time, inserting escaped characters as necessary - int i; - unichar nextChar; - for (i = 0; i < [string length]; i++) { - nextChar = [string characterAtIndex:i]; - switch (nextChar) { - case '\"': - [jsonString appendString:@"\\\""]; - break; - case '\\': - [jsonString appendString:@"\\\\"]; - break; - /* TODO: email out to json group on this - spec says to handlt his, examples and example code don't handle this. - case '\/': - [jsonString appendString:@"\\/"]; - break; - */ - case '\b': - [jsonString appendString:@"\\b"]; - break; - case '\f': - [jsonString appendString:@"\\f"]; - break; - case '\n': - [jsonString appendString:@"\\n"]; - break; - case '\r': - [jsonString appendString:@"\\r"]; - break; - case '\t': - [jsonString appendString:@"\\t"]; - break; - /* TODO: Find and encode unicode characters here? - case '\u': - [jsonString appendString:@"\\n"]; - break; - */ - default: - [jsonString appendString:[NSString stringWithCharacters:&nextChar length:1]]; - break; - } - } - [jsonString appendString:jsonStringDelimiterString]; - return [jsonString autorelease]; -} - -- (NSString *)jsonIndentStringForLevel:(int)level -{ - NSMutableString *indentString = [[NSMutableString alloc] init]; - if (level != jsonDoNotIndent) { - [indentString appendString:@"\n"]; - int i; - for (i = 0; i < level; i++) { - [indentString appendString:jsonIndentString]; - } - } - - return [indentString autorelease]; -} - -@end diff --git a/SoObjects/SOGo/NSScanner+BSJSONAdditions.h b/SoObjects/SOGo/NSScanner+BSJSONAdditions.h deleted file mode 100644 index 88059178e..000000000 --- a/SoObjects/SOGo/NSScanner+BSJSONAdditions.h +++ /dev/null @@ -1,64 +0,0 @@ -// -// BSJSONAdditions -// -// Created by Blake Seely on 2/1/06. -// Copyright 2006 Blake Seely - http://www.blakeseely.com All rights reserved. -// Permission to use this code: -// -// Feel free to use this code in your software, either as-is or -// in a modified form. Either way, please include a credit in -// your software's "About" box or similar, mentioning at least -// my name (Blake Seely). -// -// Permission to redistribute this code: -// -// You can redistribute this code, as long as you keep these -// comments. You can also redistribute modified versions of the -// code, as long as you add comments to say that you've made -// modifications (keeping these original comments too). -// -// If you do use or redistribute this code, an email would be -// appreciated, just to let me know that people are finding my -// code useful. You can reach me at blakeseely@mac.com -// - -#import - -@class NSArray; -@class NSDictionary; -@class NSNumber; -@class NSString; - -extern NSString *jsonObjectStartString; -extern NSString *jsonObjectEndString; -extern NSString *jsonArrayStartString; -extern NSString *jsonArrayEndString; -extern NSString *jsonKeyValueSeparatorString; -extern NSString *jsonValueSeparatorString; -extern NSString *jsonStringDelimiterString; -extern NSString *jsonStringEscapedDoubleQuoteString; -extern NSString *jsonStringEscapedSlashString; -extern NSString *jsonTrueString; -extern NSString *jsonFalseString; -extern NSString *jsonNullString; - - -@interface NSScanner (PrivateBSJSONAdditions) - -- (BOOL)scanJSONObject:(NSMutableDictionary **)dictionary; -- (BOOL)scanJSONArray:(NSArray **)array; -- (BOOL)scanJSONString:(NSString **)string; -- (BOOL)scanJSONValue:(id *)value; -- (BOOL)scanJSONNumber:(NSNumber **)number; - -- (BOOL)scanJSONWhiteSpace; -- (BOOL)scanJSONKeyValueSeparator; -- (BOOL)scanJSONValueSeparator; -- (BOOL)scanJSONObjectStartString; -- (BOOL)scanJSONObjectEndString; -- (BOOL)scanJSONArrayStartString; -- (BOOL)scanJSONArrayEndString; -- (BOOL)scanJSONArrayEndString; -- (BOOL)scanJSONStringDelimiterString; - -@end diff --git a/SoObjects/SOGo/NSScanner+BSJSONAdditions.m b/SoObjects/SOGo/NSScanner+BSJSONAdditions.m deleted file mode 100644 index 2e653b875..000000000 --- a/SoObjects/SOGo/NSScanner+BSJSONAdditions.m +++ /dev/null @@ -1,347 +0,0 @@ -// -// BSJSONAdditions -// -// Created by Blake Seely on 2/1/06. -// Copyright 2006 Blake Seely - http://www.blakeseely.com All rights reserved. -// Permission to use this code: -// -// Feel free to use this code in your software, either as-is or -// in a modified form. Either way, please include a credit in -// your software's "About" box or similar, mentioning at least -// my name (Blake Seely). -// -// Permission to redistribute this code: -// -// You can redistribute this code, as long as you keep these -// comments. You can also redistribute modified versions of the -// code, as long as you add comments to say that you've made -// modifications (keeping these original comments too). -// -// If you do use or redistribute this code, an email would be -// appreciated, just to let me know that people are finding my -// code useful. You can reach me at blakeseely@mac.com -// -// -// Version 1.2: Includes modifications by Bill Garrison: http://www.standardorbit.com , which included -// Unit Tests adapted from Jonathan Wight's CocoaJSON code: http://www.toxicsoftware.com -// I have included those adapted unit tests in this package. - -#include - -#import -#import -#import -#import - -#import "NSScanner+BSJSONAdditions.h" - -NSString *jsonObjectStartString = @"{"; -NSString *jsonObjectEndString = @"}"; -NSString *jsonArrayStartString = @"["; -NSString *jsonArrayEndString = @"]"; -NSString *jsonKeyValueSeparatorString = @":"; -NSString *jsonValueSeparatorString = @","; -NSString *jsonStringDelimiterString = @"\""; -NSString *jsonStringEscapedDoubleQuoteString = @"\\\""; -NSString *jsonStringEscapedSlashString = @"\\\\"; -NSString *jsonTrueString = @"true"; -NSString *jsonFalseString = @"false"; -NSString *jsonNullString = @"null"; - -@implementation NSScanner (PrivateBSJSONAdditions) - -- (BOOL)scanJSONObject:(NSMutableDictionary **)dictionary -{ - //[self setCharactersToBeSkipped:nil]; - - BOOL result = NO; - - /* START - April 21, 2006 - Updated to bypass irrelevant characters at the beginning of a JSON string */ - NSString *ignoredString; - [self scanUpToString:jsonObjectStartString intoString:&ignoredString]; - /* END - April 21, 2006 */ - - if (![self scanJSONObjectStartString]) { - // TODO: Error condition. For now, return false result, do nothing with the dictionary handle - } else { - NSMutableDictionary *jsonKeyValues = [[[NSMutableDictionary alloc] init] autorelease]; - NSString *key = nil; - id value; - [self scanJSONWhiteSpace]; - while (([self scanJSONString:&key]) && ([self scanJSONKeyValueSeparator]) && ([self scanJSONValue:&value])) { - [jsonKeyValues setObject:value forKey:key]; - [self scanJSONWhiteSpace]; - // check to see if the character at scan location is a value separator. If it is, do nothing. - if ([[[self string] substringWithRange:NSMakeRange([self scanLocation], 1)] isEqualToString:jsonValueSeparatorString]) { - [self scanJSONValueSeparator]; - } - } - if ([self scanJSONObjectEndString]) { - // whether or not we found a key-val pair, we found open and close brackets - completing an object - result = YES; - *dictionary = jsonKeyValues; - } - } - return result; -} - -- (BOOL)scanJSONArray:(NSArray **)array -{ - BOOL result = NO; - NSMutableArray *values = [[[NSMutableArray alloc] init] autorelease]; - [self scanJSONArrayStartString]; - id value = nil; - - while ([self scanJSONValue:&value]) { - [values addObject:value]; - [self scanJSONWhiteSpace]; - if ([[[self string] substringWithRange:NSMakeRange([self scanLocation], 1)] isEqualToString:jsonValueSeparatorString]) { - [self scanJSONValueSeparator]; - } - } - if ([self scanJSONArrayEndString]) { - result = YES; - *array = values; - } - - return result; -} - -- (BOOL)scanJSONString:(NSString **)string -{ - BOOL result = NO; - if ([self scanJSONStringDelimiterString]) { - NSMutableString *chars = [[[NSMutableString alloc] init] autorelease]; - NSString *characterFormat = @"%C"; - - // process character by character until we finish the string or reach another double-quote - while ((![self isAtEnd]) && ([[self string] characterAtIndex:[self scanLocation]] != '\"')) { - unichar currentChar = [[self string] characterAtIndex:[self scanLocation]]; - unichar nextChar; - if (currentChar != '\\') { - [chars appendFormat:characterFormat, currentChar]; - [self setScanLocation:([self scanLocation] + 1)]; - } else { - nextChar = [[self string] characterAtIndex:([self scanLocation] + 1)]; - switch (nextChar) { - case '\"': - [chars appendString:@"\""]; - [self setScanLocation:([self scanLocation] + 2)]; - break; - case '\\': - [chars appendString:@"\\"]; // debugger shows result as having two slashes, but final output is correct. Possible debugger error? - [self setScanLocation:([self scanLocation] + 2)]; - break; - /* TODO: json.org docs mention this seq, so does yahoo, but not recognized here by xcode, note from crockford: not a required escape - case '\/': - [chars appendString:@"\/"]; - [self setScanLocation:([self scanLocation] + 2)]; - break; - */ - case 'b': - [chars appendString:@"\b"]; - [self setScanLocation:([self scanLocation] + 2)]; - break; - case 'f': - [chars appendString:@"\f"]; - [self setScanLocation:([self scanLocation] + 2)]; - break; - case 'n': - [chars appendString:@"\n"]; - [self setScanLocation:([self scanLocation] + 2)]; - break; - case 'r': - [chars appendString:@"\r"]; - [self setScanLocation:([self scanLocation] + 2)]; - break; - case 't': - [chars appendString:@"\t"]; - [self setScanLocation:([self scanLocation] + 2)]; - break; - case 'u': // unicode sequence - get string of hex chars, convert to int, convert to unichar, append - [self setScanLocation:([self scanLocation] + 2)]; // advance past '\u' - NSString *digits = [[self string] substringWithRange:NSMakeRange([self scanLocation], 4)]; - /* START Updated code modified from code fix submitted by Bill Garrison - March 28, 2006 - http://www.standardorbit.net */ - NSScanner *hexScanner = [NSScanner scannerWithString:digits]; - NSString *verifiedHexDigits; - NSCharacterSet *hexDigitSet = [NSCharacterSet characterSetWithCharactersInString:@"0123456789ABCDEFabcdef"]; - if (NO == [hexScanner scanCharactersFromSet:hexDigitSet intoString:&verifiedHexDigits]) - return NO; - if (4 != [verifiedHexDigits length]) - return NO; - - // Read in the hex value - [hexScanner setScanLocation:0]; - unsigned unicodeHexValue; - if (NO == [hexScanner scanHexInt:&unicodeHexValue]) { - return NO; - } - [chars appendFormat:characterFormat, unicodeHexValue]; - /* END update - March 28, 2006 */ - [self setScanLocation:([self scanLocation] + 4)]; - break; - default: - [chars appendFormat:@"\\%C", nextChar]; - [self setScanLocation:([self scanLocation] + 2)]; - break; - } - } - } - - if (![self isAtEnd]) { - result = [self scanJSONStringDelimiterString]; - *string = chars; - } - - return result; - - /* this code is more appropriate if you have a separate method to unescape the found string - for example, between inputting json and outputting it, it may make more sense to have a category on NSString to perform - escaping and unescaping. Keeping this code and looking into this for a future update. - unsigned int searchLength = [[self string] length] - [self scanLocation]; - unsigned int quoteLocation = [[self string] rangeOfString:jsonStringDelimiterString options:0 range:NSMakeRange([self scanLocation], searchLength)].location; - searchLength = [[self string] length] - quoteLocation; - while (([[[self string] substringWithRange:NSMakeRange((quoteLocation - 1), 2)] isEqualToString:jsonStringEscapedDoubleQuoteString]) && - (quoteLocation != NSNotFound) && - (![[[self string] substringWithRange:NSMakeRange((quoteLocation -2), 2)] isEqualToString:jsonStringEscapedSlashString])){ - searchLength = [[self string] length] - (quoteLocation + 1); - quoteLocation = [[self string] rangeOfString:jsonStringDelimiterString options:0 range:NSMakeRange((quoteLocation + 1), searchLength)].location; - } - - *string = [[self string] substringWithRange:NSMakeRange([self scanLocation], (quoteLocation - [self scanLocation]))]; - // TODO: process escape sequences out of the string - replacing with their actual characters. a function that does just this belongs - // in another class. So it may make more sense to change this whole implementation to just go character by character instead. - [self setScanLocation:(quoteLocation + 1)]; - */ - result = YES; - - } - - return result; -} - -- (BOOL)scanJSONValue:(id *)value -{ - BOOL result = NO; - - [self scanJSONWhiteSpace]; - NSString *substring = [[self string] substringWithRange:NSMakeRange([self scanLocation], 1)]; - NSUInteger trueLocation = [[self string] rangeOfString:jsonTrueString options:0 range:NSMakeRange([self scanLocation], ([[self string] length] - [self scanLocation]))].location; - NSUInteger falseLocation = [[self string] rangeOfString:jsonFalseString options:0 range:NSMakeRange([self scanLocation], ([[self string] length] - [self scanLocation]))].location; - NSUInteger nullLocation = [[self string] rangeOfString:jsonNullString options:0 range:NSMakeRange([self scanLocation], ([[self string] length] - [self scanLocation]))].location; - - if ([substring isEqualToString:jsonStringDelimiterString]) { - result = [self scanJSONString:value]; - } else if ([substring isEqualToString:jsonObjectStartString]) { - result = [self scanJSONObject:value]; - } else if ([substring isEqualToString:jsonArrayStartString]) { - result = [self scanJSONArray:value]; - } else if ([self scanLocation] == trueLocation) { - result = YES; - *value = [NSNumber numberWithBool:YES]; - [self setScanLocation:([self scanLocation] + [jsonTrueString length])]; - } else if ([self scanLocation] == falseLocation) { - result = YES; - *value = [NSNumber numberWithBool:NO]; - [self setScanLocation:([self scanLocation] + [jsonFalseString length])]; - } else if ([self scanLocation] == nullLocation) { - result = YES; - *value = [NSNull null]; - [self setScanLocation:([self scanLocation] + [jsonNullString length])]; - } else if (([[NSCharacterSet decimalDigitCharacterSet] characterIsMember:[[self string] characterAtIndex:[self scanLocation]]]) || - ([[self string] characterAtIndex:[self scanLocation]] == '-')){ // check to make sure it's a digit or - - result = [self scanJSONNumber:value]; - } - return result; -} - -- (BOOL)scanJSONNumber:(NSNumber **)number -{ - //NSDecimal decimal; - //BOOL result = [self scanDecimal:&decimal]; - //*number = [NSDecimalNumber decimalNumberWithDecimal:decimal]; - long long intValue, commaValue; - double doubleValue; - NSUInteger curLocation, length; - NSString *stringValue; - - stringValue = [self string]; - - BOOL result = [self scanLongLong: &intValue]; - if (result) - { - curLocation = [self scanLocation]; - if (curLocation < [stringValue length] - && [stringValue characterAtIndex: curLocation] == '.') - { - [self scanString: @"." intoString: NULL]; - if ([self scanLongLong: &commaValue]) - { - result = YES; - length = [self scanLocation] - curLocation - 1; - if (intValue < 0) - commaValue = -commaValue; - doubleValue = intValue + commaValue / pow(10.0, length); - *number = [NSNumber numberWithDouble: doubleValue]; - } - else - *number = [NSNumber numberWithLongLong: intValue]; - } - else - *number = [NSNumber numberWithLongLong: intValue]; - } - else - *number = nil; - - return result; -} - -- (BOOL)scanJSONWhiteSpace -{ - //NSLog(@"Scanning white space - here are the next ten chars ---%@---", [[self string] substringWithRange:NSMakeRange([self scanLocation], 10)]); - BOOL result = NO; - NSCharacterSet *space = [NSCharacterSet whitespaceAndNewlineCharacterSet]; - while ([space characterIsMember:[[self string] characterAtIndex:[self scanLocation]]]) { - [self setScanLocation:([self scanLocation] + 1)]; - result = YES; - } - //NSLog(@"Done Scanning white space - here are the next ten chars ---%@---", [[self string] substringWithRange:NSMakeRange([self scanLocation], 10)]); - return result; -} - -- (BOOL)scanJSONKeyValueSeparator -{ - return [self scanString:jsonKeyValueSeparatorString intoString:NULL]; -} - -- (BOOL)scanJSONValueSeparator -{ - return [self scanString:jsonValueSeparatorString intoString:NULL]; -} - -- (BOOL)scanJSONObjectStartString -{ - return [self scanString:jsonObjectStartString intoString:NULL]; -} - -- (BOOL)scanJSONObjectEndString -{ - return [self scanString:jsonObjectEndString intoString:NULL]; -} - -- (BOOL)scanJSONArrayStartString -{ - return [self scanString:jsonArrayStartString intoString:NULL]; -} - -- (BOOL)scanJSONArrayEndString -{ - return [self scanString:jsonArrayEndString intoString:NULL]; -} - -- (BOOL)scanJSONStringDelimiterString; -{ - return [self scanString:jsonStringDelimiterString intoString:NULL]; -} - -@end diff --git a/SoObjects/SOGo/NSString+Utilities.m b/SoObjects/SOGo/NSString+Utilities.m index 0e37d761e..37f98aa2c 100644 --- a/SoObjects/SOGo/NSString+Utilities.m +++ b/SoObjects/SOGo/NSString+Utilities.m @@ -29,12 +29,13 @@ #import #import +#import #import +#import + #import "NSArray+Utilities.h" -#import "NSDictionary+BSJSONAdditions.h" #import "NSDictionary+URL.h" -#import "NSScanner+BSJSONAdditions.h" #import "NSString+Utilities.h" @@ -513,17 +514,24 @@ static NSMutableCharacterSet *safeLDIFStartChars = nil; - (id) objectFromJSONString { - NSScanner *scanner; + SBJsonParser *parser; NSObject *object; + NSError *error; object = nil; if ([self length] > 0) { - scanner = [[NSScanner alloc] initWithString: self]; - if (![scanner scanJSONValue: &object]) - object = nil; - [scanner autorelease]; + parser = [SBJsonParser new]; + [parser autorelease]; + error = nil; + object = [parser objectWithString: self + error: &error]; + if (error) + { + [self errorWithFormat: @"json parser: %@", error]; + object = nil; + } } return object; diff --git a/SoObjects/SOGo/SOGoCASSession.m b/SoObjects/SOGo/SOGoCASSession.m index dbefa1683..9104dbe03 100644 --- a/SoObjects/SOGo/SOGoCASSession.m +++ b/SoObjects/SOGo/SOGoCASSession.m @@ -35,7 +35,7 @@ #import #import -#import "NSDictionary+BSJSONAdditions.h" +#import "NSDictionary+Utilities.h" #import "NSString+Utilities.h" #import "SOGoCache.h" #import "SOGoObject.h" @@ -167,7 +167,7 @@ [sessionDict setObject: identifier forKey: @"identifier"]; if ([proxyTickets count]) [sessionDict setObject: proxyTickets forKey: @"proxyTickets"]; - jsonSession = [sessionDict jsonStringValue]; + jsonSession = [sessionDict jsonRepresentation]; [cache setCASSession: jsonSession withTicket: ticket forIdentifier: identifier]; diff --git a/SoObjects/SOGo/SOGoCache.m b/SoObjects/SOGo/SOGoCache.m index e2e25b5c8..457de6d83 100644 --- a/SoObjects/SOGo/SOGoCache.m +++ b/SoObjects/SOGo/SOGoCache.m @@ -48,7 +48,7 @@ #import #import -#import "NSDictionary+BSJSONAdditions.h" +#import "NSDictionary+Utilities.h" #import "NSString+Utilities.h" #import "SOGoObject.h" #import "SOGoSystemDefaults.h" @@ -484,7 +484,7 @@ static memcached_st *handle = NULL; forPath: (NSString *) thePath { if (theACLs) - [self _cacheValues: [theACLs jsonStringValue] + [self _cacheValues: [theACLs jsonRepresentation] ofType: @"acl" forKey: thePath]; else diff --git a/SoObjects/SOGo/SOGoUserManager.m b/SoObjects/SOGo/SOGoUserManager.m index 274bc9ee7..d98edd1fd 100644 --- a/SoObjects/SOGo/SOGoUserManager.m +++ b/SoObjects/SOGo/SOGoUserManager.m @@ -30,8 +30,8 @@ #import #import "NSArray+Utilities.h" -#import "NSDictionary+BSJSONAdditions.h" #import "NSString+Utilities.h" +#import "NSObject+Utilities.h" #import "SOGoDomainDefaults.h" #import "SOGoSource.h" #import "SOGoSystemDefaults.h" @@ -440,7 +440,7 @@ // internal cache. [currentUser setObject: _pwd forKey: @"password"]; [[SOGoCache sharedCache] - setUserAttributes: [currentUser jsonStringValue] + setUserAttributes: [currentUser jsonRepresentation] forLogin: _login]; } else @@ -481,7 +481,7 @@ // internal cache. [currentUser setObject: newPassword forKey: @"password"]; [[SOGoCache sharedCache] - setUserAttributes: [currentUser jsonStringValue] + setUserAttributes: [currentUser jsonRepresentation] forLogin: login]; } else @@ -595,13 +595,13 @@ key = [newUser objectForKey: @"c_uid"]; if (key) [[SOGoCache sharedCache] - setUserAttributes: [newUser jsonStringValue] + setUserAttributes: [newUser jsonRepresentation] forLogin: key]; emails = [[newUser objectForKey: @"emails"] objectEnumerator]; while ((key = [emails nextObject])) [[SOGoCache sharedCache] - setUserAttributes: [newUser jsonStringValue] + setUserAttributes: [newUser jsonRepresentation] forLogin: key]; } diff --git a/SoObjects/SOGo/SOGoUserProfile.m b/SoObjects/SOGo/SOGoUserProfile.m index 27d07f6a7..87d0b2c2c 100644 --- a/SoObjects/SOGo/SOGoUserProfile.m +++ b/SoObjects/SOGo/SOGoUserProfile.m @@ -21,6 +21,7 @@ */ #import +#import #import #import @@ -30,7 +31,6 @@ #import "NSObject+Utilities.h" #import "NSString+Utilities.h" -#import "NSDictionary+BSJSONAdditions.h" #import "SOGoCache.h" #import "SOGoUserProfile.h" @@ -139,7 +139,7 @@ { [self logWithFormat: @"database value for %@" @" (uid: '%@') is a plist", [self profileTypeName], uid]; - jsonValue = [plist jsonStringValue]; + jsonValue = [plist jsonRepresentation]; } else { @@ -223,7 +223,7 @@ SOGoCache *cache; BOOL rc; - jsonRepresentation = [values jsonStringValue]; + jsonRepresentation = [values jsonRepresentation]; if (jsonRepresentation) { rc = [self storeJSONProfileInDB: jsonRepresentation]; diff --git a/SoObjects/common.make b/SoObjects/common.make index aa2cb9da2..0232c3894 100644 --- a/SoObjects/common.make +++ b/SoObjects/common.make @@ -32,6 +32,6 @@ BUNDLE_LIBS += \ -lNGObjWeb \ -lNGCards -lNGMime -lNGLdap \ -lNGStreams -lNGExtensions -lEOControl \ - -lXmlRpc -lDOM -lSaxObjC + -lXmlRpc -lDOM -lSaxObjC -lSBJson ADDITIONAL_BUNDLE_LIBS += $(BUNDLE_LIBS) diff --git a/UI/PreferencesUI/UIxPreferences.m b/UI/PreferencesUI/UIxPreferences.m index 77893bc63..555b9228d 100644 --- a/UI/PreferencesUI/UIxPreferences.m +++ b/UI/PreferencesUI/UIxPreferences.m @@ -33,7 +33,6 @@ #import #import -#import #import #import #import @@ -659,9 +658,7 @@ [capabilities retain]; } - return [[NSDictionary dictionary] - jsonStringForArray: capabilities - withIndentLevel: 0]; + return [capabilities jsonRepresentation]; } - (BOOL) isVacationEnabled @@ -683,9 +680,7 @@ - (NSString *) sieveFiltersValue { - return [[NSDictionary dictionary] - jsonStringForArray: sieveFilters - withIndentLevel: 0]; + return [sieveFilters jsonRepresentation]; } - (void) setEnableVacation: (BOOL) enableVacation