merge of '571d9bfb5bd40cb2435fe9c4ecec1069f13f7a7d'

and 'b8d56bd5a31be825cfe66b8fe9f9a15269a09fbc'

Monotone-Parent: 571d9bfb5bd40cb2435fe9c4ecec1069f13f7a7d
Monotone-Parent: b8d56bd5a31be825cfe66b8fe9f9a15269a09fbc
Monotone-Revision: 787fab4426e6ea6fab09ccfcc61ecc658e06ed5e

Monotone-Author: flachapelle@inverse.ca
Monotone-Date: 2009-06-12T15:56:10
Monotone-Branch: ca.inverse.sogo
This commit is contained in:
Francis Lachapelle
2009-06-12 15:56:10 +00:00
12 changed files with 645 additions and 517 deletions
+5 -1
View File
@@ -53,9 +53,13 @@
@interface NSMutableArray (SOGoArrayUtilities)
- (void) addNonNSObject: (void *) objectPtr
withSize: (size_t) objectSize
copy: (BOOL) doCopy;
- (void) freeNonNSObjects;
- (void) addObjectUniquely: (id) object;
- (void) addRange: (NSRange) newRange;
- (BOOL) hasRangeIntersection: (NSRange) testRange;
@end
+31 -5
View File
@@ -24,6 +24,7 @@
#import <Foundation/NSEnumerator.h>
#import <Foundation/NSNull.h>
#import <Foundation/NSString.h>
#import <Foundation/NSValue.h>
#import "NSArray+Utilities.h"
@@ -199,17 +200,42 @@
@implementation NSMutableArray (SOGoArrayUtilities)
- (void) addNonNSObject: (void *) objectPtr
withSize: (size_t) objectSize
copy: (BOOL) doCopy
{
void *newObjectPtr;
if (doCopy)
{
newObjectPtr = NSZoneMalloc (NULL, objectSize);
memcpy (newObjectPtr, objectPtr, objectSize);
}
else
newObjectPtr = objectPtr;
[self addObject: [NSValue valueWithPointer: newObjectPtr]];
}
- (void) freeNonNSObjects
{
unsigned int count, max;
void *objectPtr;
max = [self count];
for (count = 0; count < max; count++)
{
objectPtr = [[self objectAtIndex: count] pointerValue];
NSZoneFree (NULL, objectPtr);
}
}
- (void) addObjectUniquely: (id) object
{
if (![self containsObject: object])
[self addObject: object];
}
- (void) addRange: (NSRange) newRange
{
[self addObject: NSStringFromRange (newRange)];
}
- (BOOL) hasRangeIntersection: (NSRange) testRange
{
NSEnumerator *ranges;
+26 -23
View File
@@ -23,6 +23,7 @@
#import <Foundation/NSArray.h>
#import <Foundation/NSCharacterSet.h>
#import <Foundation/NSEnumerator.h>
#import <Foundation/NSValue.h>
#import <EOControl/EOQualifier.h>
@@ -88,7 +89,7 @@ static NSMutableCharacterSet *urlStartChars = nil;
r = [self rangeOfString:@"?" options: NSBackwardsSearch];
if (r.length > 0)
newUrl = [self substringToIndex: NSMaxRange(r) - 1];
newUrl = [self substringToIndex: NSMaxRange (r) - 1];
else
newUrl = self;
@@ -132,11 +133,10 @@ static NSMutableCharacterSet *urlStartChars = nil;
{
nsEnclosing = [self rangeOfString: @"}"];
length = [self length];
if (nsEnclosing.length > 0
&& nsEnclosing.location < (length - 1))
if (nsEnclosing.length > 0 && nsEnclosing.location < (length - 1))
{
methodEnclosing = NSMakeRange(nsEnclosing.location + 1,
length - nsEnclosing.location - 1);
methodEnclosing = NSMakeRange (nsEnclosing.location + 1,
length - nsEnclosing.location - 1);
nsEnclosing.length = nsEnclosing.location - 1;
nsEnclosing.location = 1;
davInvocation = [NSMutableDictionary dictionaryWithCapacity: 2];
@@ -176,7 +176,7 @@ static NSMutableCharacterSet *urlStartChars = nil;
start--;
start++;
length = [self length] - start;
workRange = NSMakeRange(start, length);
workRange = NSMakeRange (start, length);
workRange = [self rangeOfCharacterFromSet: urlAfterEndingChars
options: NSLiteralSearch range: workRange];
if (workRange.location != NSNotFound)
@@ -198,7 +198,8 @@ static NSMutableCharacterSet *urlStartChars = nil;
NSEnumerator *enumRanges;
NSMutableArray *newRanges;
NSRange matchRange, currentUrlRange, rest;
NSString *urlText, *newUrlText, *range;
NSRange *rangePtr;
NSString *urlText, *newUrlText;
unsigned int length, matchLength, offset;
int startLocation;
@@ -209,10 +210,11 @@ static NSMutableCharacterSet *urlStartChars = nil;
@"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
@"0123456789:@"];
}
newRanges = [NSMutableArray new];
newRanges = [NSMutableArray array];
matchLength = [match length];
rest.location = -1;
matchRange = [selfCopy rangeOfString: match];
while (matchRange.location != NSNotFound)
{
@@ -225,12 +227,14 @@ static NSMutableCharacterSet *urlStartChars = nil;
currentUrlRange = [selfCopy _rangeOfURLInRange: matchRange];
if ([ranges hasRangeIntersection: currentUrlRange])
rest.location = NSMaxRange(currentUrlRange);
rest.location = NSMaxRange (currentUrlRange);
else
{
if (currentUrlRange.length > matchLength)
[newRanges addRange: currentUrlRange];
rest.location = NSMaxRange(currentUrlRange);
[newRanges addNonNSObject: &currentUrlRange
withSize: sizeof (NSRange)
copy: YES];
rest.location = NSMaxRange (currentUrlRange);
}
length = [selfCopy length];
@@ -242,25 +246,24 @@ static NSMutableCharacterSet *urlStartChars = nil;
// Make the substitutions, keep track of the new offset
offset = 0;
enumRanges = [newRanges objectEnumerator];
range = [enumRanges nextObject];
while (range)
while ((rangePtr = [[enumRanges nextObject] pointerValue]))
{
currentUrlRange = NSRangeFromString(range);
currentUrlRange.location += offset;
urlText = [selfCopy substringFromRange: currentUrlRange];
rangePtr->location += offset;
urlText = [selfCopy substringFromRange: *rangePtr];
if ([urlText hasPrefix: prefix]) prefix = @"";
newUrlText = [NSString stringWithFormat: @"<a href=\"%@%@\">%@</a>",
prefix, urlText, urlText];
[selfCopy replaceCharactersInRange: currentUrlRange
[selfCopy replaceCharactersInRange: *rangePtr
withString: newUrlText];
offset += ([newUrlText length] - [urlText length]);
// Add range for further substitutions
currentUrlRange = NSMakeRange (currentUrlRange.location, [newUrlText length]);
[ranges addRange: currentUrlRange];
range = [enumRanges nextObject];
[ranges addNonNSObject: &currentUrlRange
withSize: sizeof (NSRange)
copy: YES];
}
[newRanges freeNonNSObjects];
}
- (NSString *) stringByDetectingURLs
@@ -268,7 +271,7 @@ static NSMutableCharacterSet *urlStartChars = nil;
NSMutableString *selfCopy;
NSMutableArray *ranges;
ranges = [NSMutableArray new];
ranges = [NSMutableArray array];
selfCopy = [NSMutableString stringWithString: self];
[self _handleURLs: selfCopy
textToMatch: @"://"
@@ -278,7 +281,7 @@ static NSMutableCharacterSet *urlStartChars = nil;
textToMatch: @"@"
prefix: @"mailto:"
inRanges: ranges];
[ranges release];
[ranges freeNonNSObjects];
return selfCopy;
}
+1 -1
View File
@@ -718,7 +718,7 @@ static NSArray *childRecordFields = nil;
currentUser = [localContext activeUser];
if (delegatedUsers && [delegatedUsers count])
if ([delegatedUsers count])
{
if (![currentUser isSuperUser])
{
+23 -20
View File
@@ -129,7 +129,8 @@ static NSString *LDAPContactInfoAttribute = nil;
for (count = 0; count < max; count++)
{
node = [children objectAtIndex: count];
componentName = [[(id<DOMElement>)node attribute: @"name"] lowercaseString];
componentName = [[(id<DOMElement>)node attribute: @"name"]
lowercaseString];
[filter setObject: [node textValue] forKey: componentName];
}
@@ -381,13 +382,14 @@ static NSString *LDAPContactInfoAttribute = nil;
LDAPUserManager *um;
NSMutableString *fetch;
NSDictionary *currentUser;
NSString *field;
NSString *field, *login;
NSArray *users;
int i;
#warning the attributes returned here should match the one requested in the query
fetch = [NSMutableString string];
login = [[context activeUser] login];
um = [LDAPUserManager sharedUserManager];
// We sort our array - this is pretty useful for the
@@ -397,25 +399,26 @@ static NSString *LDAPContactInfoAttribute = nil;
for (i = 0; i < [users count]; i++)
{
currentUser = [users objectAtIndex: i];
[fetch appendString: @"<user>"];
field = [currentUser objectForKey: @"c_uid"];
[fetch appendFormat: @"<id>%@</id>",
[field stringByEscapingXMLString]];
field = [currentUser objectForKey: @"cn"];
[fetch appendFormat: @"<displayName>%@</displayName>",
[field stringByEscapingXMLString]];
field = [currentUser objectForKey: @"c_email"];
[fetch appendFormat: @"<email>%@</email>",
[field stringByEscapingXMLString]];
if (LDAPContactInfoAttribute)
{
field = [currentUser objectForKey: LDAPContactInfoAttribute];
if ([field length])
[fetch appendFormat: @"<info>%@</info>",
[field stringByEscapingXMLString]];
}
[fetch appendString: @"</user>"];
if (![field isEqualToString: login])
{
[fetch appendFormat: @"<user><id>%@</id>",
[field stringByEscapingXMLString]];
field = [currentUser objectForKey: @"cn"];
[fetch appendFormat: @"<displayName>%@</displayName>",
[field stringByEscapingXMLString]];
field = [currentUser objectForKey: @"c_email"];
[fetch appendFormat: @"<email>%@</email>",
[field stringByEscapingXMLString]];
if (LDAPContactInfoAttribute)
{
field = [currentUser objectForKey: LDAPContactInfoAttribute];
if ([field length])
[fetch appendFormat: @"<info>%@</info>",
[field stringByEscapingXMLString]];
}
[fetch appendString: @"</user>"];
}
}
return fetch;