merge of 'fd79ef01a0501707aa8528f31eb9128418310ceb'

and 'ff27cb5c0c118c485e7cf9d8e62d4428edafdb32'

Monotone-Parent: fd79ef01a0501707aa8528f31eb9128418310ceb
Monotone-Parent: ff27cb5c0c118c485e7cf9d8e62d4428edafdb32
Monotone-Revision: 795ed6a3f28d9a8fa693fa6e21822111e70c29e7

Monotone-Author: flachapelle@inverse.ca
Monotone-Date: 2008-12-12T18:44:44
Monotone-Branch: ca.inverse.sogo
maint-2.0.2
Francis Lachapelle 2008-12-12 18:44:44 +00:00
commit 4f18914a64
17 changed files with 591 additions and 492 deletions

View File

@ -19,8 +19,10 @@
02111-1307, USA.
*/
#include "EOAdaptorChannel+GCS.h"
#include "common.h"
#import <Foundation/NSArray.h>
#import <Foundation/NSString.h>
#import "EOAdaptorChannel+GCS.h"
@implementation EOAdaptorChannel(GCS)

View File

@ -19,8 +19,13 @@
02111-1307, USA.
*/
#include "EOQualifier+GCS.h"
#include "common.h"
#import <Foundation/NSValue.h>
#import <Foundation/NSString.h>
#import <NGExtensions/NSNull+misc.h>
#import <NGExtensions/NSObject+Logs.h>
#import "EOQualifier+GCS.h"
@implementation EOQualifier(GCS)

View File

@ -19,106 +19,126 @@
02111-1307, USA.
*/
#include "GCSChannelManager.h"
#include "NSURL+GCS.h"
#include "EOAdaptorChannel+GCS.h"
#include <GDLAccess/EOAdaptor.h>
#include <GDLAccess/EOAdaptorContext.h>
#include <GDLAccess/EOAdaptorChannel.h>
#include "common.h"
#import <Foundation/NSArray.h>
#import <Foundation/NSCalendarDate.h>
#import <Foundation/NSDictionary.h>
#import <Foundation/NSEnumerator.h>
#import <Foundation/NSTimer.h>
#import <Foundation/NSUserDefaults.h>
#import <NGExtensions/NSNull+misc.h>
#import <NGExtensions/NSObject+Logs.h>
#import <GDLAccess/EOAdaptor.h>
#import <GDLAccess/EOAdaptorContext.h>
#import <GDLAccess/EOAdaptorChannel.h>
#import "GCSChannelManager.h"
#import "NSURL+GCS.h"
#import "EOAdaptorChannel+GCS.h"
/*
TODO:
- implemented pooling
- auto-close channels which are very old?!
(eg missing release due to an exception)
- auto-close channels which are very old?!
(eg missing release due to an exception)
*/
@interface GCSChannelHandle : NSObject
{
@public
NSURL *url;
NSURL *url;
EOAdaptorChannel *channel;
NSDate *creationTime;
NSDate *lastReleaseTime;
NSDate *lastAcquireTime;
NSDate *creationTime;
NSDate *lastReleaseTime;
NSDate *lastAcquireTime;
}
- (EOAdaptorChannel *)channel;
- (BOOL)canHandleURL:(NSURL *)_url;
- (NSTimeInterval)age;
- (EOAdaptorChannel *) channel;
- (BOOL) canHandleURL: (NSURL *) _url;
- (NSTimeInterval) age;
@end
@implementation GCSChannelManager
static BOOL debugOn = NO;
static BOOL debugPools = NO;
static int ChannelExpireAge = 180;
static BOOL debugOn = NO;
static BOOL debugPools = NO;
static int ChannelExpireAge = 180;
static NSTimeInterval ChannelCollectionTimer = 5 * 60;
+ (void)initialize {
+ (void) initialize
{
NSUserDefaults *ud = [NSUserDefaults standardUserDefaults];
debugOn = [ud boolForKey:@"GCSChannelManagerDebugEnabled"];
debugPools = [ud boolForKey:@"GCSChannelManagerPoolDebugEnabled"];
ChannelExpireAge = [[ud objectForKey:@"GCSChannelExpireAge"] intValue];
debugOn = [ud boolForKey: @"GCSChannelManagerDebugEnabled"];
debugPools = [ud boolForKey: @"GCSChannelManagerPoolDebugEnabled"];
ChannelExpireAge = [[ud objectForKey: @"GCSChannelExpireAge"] intValue];
if (ChannelExpireAge < 1)
ChannelExpireAge = 180;
ChannelCollectionTimer =
[[ud objectForKey:@"GCSChannelCollectionTimer"] intValue];
ChannelCollectionTimer =
[[ud objectForKey: @"GCSChannelCollectionTimer"] intValue];
if (ChannelCollectionTimer < 1)
ChannelCollectionTimer = 5*60;
}
+ (NSString *)adaptorNameForURLScheme:(NSString *)_scheme {
// TODO: map scheme to adaptors (eg 'postgresql://' to PostgreSQL
+ (NSString *) adaptorNameForURLScheme: (NSString *) _scheme
{
// TODO: map scheme to adaptors (eg 'postgresql: //' to PostgreSQL
return @"PostgreSQL";
}
+ (id)defaultChannelManager {
+ (id) defaultChannelManager
{
static GCSChannelManager *cm = nil;
if (cm == nil)
cm = [[self alloc] init];
if (!cm)
cm = [self new];
return cm;
}
- (id)init {
if ((self = [super init])) {
self->urlToAdaptor = [[NSMutableDictionary alloc] initWithCapacity:4];
self->availableChannels = [[NSMutableArray alloc] initWithCapacity:16];
self->busyChannels = [[NSMutableArray alloc] initWithCapacity:16];
- (id) init
{
if ((self = [super init]))
{
urlToAdaptor = [[NSMutableDictionary alloc] initWithCapacity: 4];
availableChannels = [[NSMutableArray alloc] initWithCapacity: 16];
busyChannels = [[NSMutableArray alloc] initWithCapacity: 16];
gcTimer = [[NSTimer scheduledTimerWithTimeInterval:
ChannelCollectionTimer
target: self selector: @selector (_garbageCollect: )
userInfo: nil repeats: YES] retain];
}
self->gcTimer = [[NSTimer scheduledTimerWithTimeInterval:
ChannelCollectionTimer
target:self selector:@selector(_garbageCollect:)
userInfo:nil repeats:YES] retain];
}
return self;
}
- (void)dealloc {
if (self->gcTimer) [self->gcTimer invalidate];
[self->gcTimer release];
- (void) dealloc
{
if (gcTimer)
[gcTimer invalidate];
[self->busyChannels release];
[self->availableChannels release];
[self->urlToAdaptor release];
[busyChannels release];
[availableChannels release];
[urlToAdaptor release];
[super dealloc];
}
/* DB key */
- (NSString *)databaseKeyForURL:(NSURL *)_url {
- (NSString *) databaseKeyForURL: (NSURL *) _url
{
/*
We need to build a proper key that omits passwords and URL path components
which are not required.
*/
NSString *key;
key = [NSString stringWithFormat:@"%@\n%@\n%@\n%@",
key = [NSString stringWithFormat: @"%@\n%@\n%@\n%@",
[_url host], [_url port],
[_url user], [_url gcsDatabaseName]];
return key;
@ -126,307 +146,343 @@ static NSTimeInterval ChannelCollectionTimer = 5 * 60;
/* adaptors */
- (NSDictionary *)connectionDictionaryForURL:(NSURL *)_url {
- (NSDictionary *) connectionDictionaryForURL: (NSURL *) _url
{
NSMutableDictionary *md;
id tmp;
md = [NSMutableDictionary dictionaryWithCapacity:4];
if ((tmp = [_url host]) != nil)
[md setObject:tmp forKey:@"hostName"];
if ((tmp = [_url port]) != nil)
[md setObject:tmp forKey:@"port"];
if ((tmp = [_url user]) != nil)
[md setObject:tmp forKey:@"userName"];
if ((tmp = [_url password]) != nil)
[md setObject:tmp forKey:@"password"];
if ((tmp = [_url gcsDatabaseName]) != nil)
[md setObject:tmp forKey:@"databaseName"];
[self debugWithFormat:@"build connection dictionary for URL %@: %@",
md = [NSMutableDictionary dictionaryWithCapacity: 4];
if ((tmp = [_url host]))
[md setObject: tmp forKey: @"hostName"];
if ((tmp = [_url port]))
[md setObject: tmp forKey: @"port"];
if ((tmp = [_url user]))
[md setObject: tmp forKey: @"userName"];
if ((tmp = [_url password]))
[md setObject: tmp forKey: @"password"];
if ((tmp = [_url gcsDatabaseName]))
[md setObject: tmp forKey: @"databaseName"];
[self debugWithFormat: @"build connection dictionary for URL %@: %@",
[_url absoluteString], md];
return md;
}
- (EOAdaptor *)adaptorForURL:(NSURL *)_url {
- (EOAdaptor *) adaptorForURL: (NSURL *) _url
{
EOAdaptor *adaptor;
NSString *key;
if (_url == nil)
return nil;
if ((key = [self databaseKeyForURL:_url]) == nil)
return nil;
if ((adaptor = [self->urlToAdaptor objectForKey:key]) != nil) {
[self debugWithFormat:@"using cached adaptor: %@", adaptor];
return adaptor; /* cached :-) */
}
[self debugWithFormat:@"creating new adaptor for URL: %@", _url];
if ([EOAdaptor respondsToSelector:@selector(adaptorForURL:)]) {
adaptor = [EOAdaptor adaptorForURL:_url];
}
else {
NSString *adaptorName;
NSDictionary *condict;
adaptorName = [[self class] adaptorNameForURLScheme:[_url scheme]];
if ([adaptorName length] == 0) {
[self errorWithFormat:@"cannot handle URL: %@", _url];
return nil;
NSString *key;
NSString *adaptorName;
NSDictionary *condict;
adaptor = nil;
if (_url)
{
if ((key = [self databaseKeyForURL: _url]))
{
adaptor = [urlToAdaptor objectForKey: key];
if (adaptor)
[self debugWithFormat: @"using cached adaptor: %@", adaptor];
else
{
[self debugWithFormat: @"creating new adaptor for URL: %@", _url];
if ([EOAdaptor respondsToSelector: @selector (adaptorForURL: )])
adaptor = [EOAdaptor adaptorForURL: _url];
else
{
adaptorName = [[self class]
adaptorNameForURLScheme: [_url scheme]];
if ([adaptorName length])
{
condict = [self connectionDictionaryForURL: _url];
adaptor = [EOAdaptor adaptorWithName: adaptorName];
if (adaptor)
[adaptor setConnectionDictionary: condict];
else
[self errorWithFormat:
@"did not find adaptor '%@' for URL: %@",
adaptorName, _url];
}
else
[self errorWithFormat: @"cannot handle URL: %@", _url];
}
[urlToAdaptor setObject: adaptor forKey: key];
}
}
}
condict = [self connectionDictionaryForURL:_url];
if ((adaptor = [EOAdaptor adaptorWithName:adaptorName]) == nil) {
[self errorWithFormat:@"did not find adaptor '%@' for URL: %@",
adaptorName, _url];
return nil;
}
[adaptor setConnectionDictionary:condict];
}
[self->urlToAdaptor setObject:adaptor forKey:key];
return adaptor;
}
/* channels */
- (GCSChannelHandle *)findBusyChannelHandleForChannel:(EOAdaptorChannel *)_ch {
- (GCSChannelHandle *)
findBusyChannelHandleForChannel: (EOAdaptorChannel *) _ch
{
NSEnumerator *e;
GCSChannelHandle *handle;
e = [self->busyChannels objectEnumerator];
while ((handle = [e nextObject])) {
if ([handle channel] == _ch)
return handle;
}
return nil;
}
- (GCSChannelHandle *)findAvailChannelHandleForURL:(NSURL *)_url {
NSEnumerator *e;
GCSChannelHandle *handle;
e = [self->availableChannels objectEnumerator];
while ((handle = [e nextObject])) {
if ([handle canHandleURL:_url])
return handle;
if (debugPools) {
[self logWithFormat:@"DBPOOL: cannot use handle (%@ vs %@)",
[_url absoluteString], [handle->url absoluteString]];
}
}
return nil;
GCSChannelHandle *handle, *currentHandle;
handle = NULL;
e = [busyChannels objectEnumerator];
while (!handle && (currentHandle = [e nextObject]))
if ([currentHandle channel] == _ch)
handle = currentHandle;
return handle;
}
- (EOAdaptorChannel *)_createChannelForURL:(NSURL *)_url {
EOAdaptor *adaptor;
- (GCSChannelHandle *) findAvailChannelHandleForURL: (NSURL *) _url
{
NSEnumerator *e;
GCSChannelHandle *handle, *currentHandle;
handle = nil;
e = [availableChannels objectEnumerator];
while (!handle && (currentHandle = [e nextObject]))
if ([currentHandle canHandleURL: _url])
handle = currentHandle;
else if (debugPools)
[self logWithFormat: @"DBPOOL: cannot use handle (%@ vs %@) ",
[_url absoluteString], [handle->url absoluteString]];
return handle;
}
- (EOAdaptorChannel *) _createChannelForURL: (NSURL *) _url
{
EOAdaptor *adaptor;
EOAdaptorContext *adContext;
EOAdaptorChannel *adChannel;
if ((adaptor = [self adaptorForURL:_url]) == nil)
return nil;
if ((adContext = [adaptor createAdaptorContext]) == nil) {
[self errorWithFormat:@"could not create adaptor context!"];
return nil;
}
if ((adChannel = [adContext createAdaptorChannel]) == nil) {
[self errorWithFormat:@"could not create adaptor channel!"];
return nil;
}
adChannel = nil;
adaptor = [self adaptorForURL: _url];
if (adaptor)
{
adContext = [adaptor createAdaptorContext];
if (adContext)
{
adChannel = [adContext createAdaptorChannel];
if (!adChannel)
[self errorWithFormat: @"could not create adaptor channel!"];
}
else
[self errorWithFormat: @"could not create adaptor context!"];
}
return adChannel;
}
- (EOAdaptorChannel *)acquireOpenChannelForURL:(NSURL *)_url {
- (EOAdaptorChannel *) acquireOpenChannelForURL: (NSURL *) _url
{
// TODO: naive implementation, add pooling!
EOAdaptorChannel *channel;
GCSChannelHandle *handle;
NSCalendarDate *now;
NSCalendarDate *now;
channel = nil;
now = [NSCalendarDate date];
/* look for cached handles */
if ((handle = [self findAvailChannelHandleForURL:_url]) != nil) {
// TODO: check age?
[self->busyChannels addObject:handle];
[self->availableChannels removeObject:handle];
ASSIGN(handle->lastAcquireTime, now);
if (debugPools)
[self logWithFormat:@"DBPOOL: reused cached DB channel!"];
return [[handle channel] retain];
}
if (debugPools) {
[self logWithFormat:@"DBPOOL: create new DB channel for URL: %@",
[_url absoluteString]];
}
/* create channel */
if ((channel = [self _createChannelForURL:_url]) == nil)
return nil;
if ([channel isOpen])
;
else if (![channel openChannel]) {
[self errorWithFormat:@"could not open channel %@ for URL: %@",
channel, [_url absoluteString]];
return nil;
}
/* create handle for channel */
handle = [[GCSChannelHandle alloc] init];
handle->url = [_url retain];
handle->channel = [channel retain];
handle->creationTime = [now retain];
handle->lastAcquireTime = [now retain];
[self->busyChannels addObject:handle];
[handle release];
return [channel retain];
handle = [self findAvailChannelHandleForURL: _url];
if (handle)
{
// TODO: check age?
[busyChannels addObject: handle];
[availableChannels removeObject: handle];
ASSIGN (handle->lastAcquireTime, now);
channel = [handle channel];
if (debugPools)
[self logWithFormat: @"DBPOOL: reused cached DB channel! (%p)",
channel];
}
else
{
if (debugPools)
{
[self logWithFormat: @"DBPOOL: create new DB channel for URL: %@",
[_url absoluteString]];
}
/* create channel */
channel = [self _createChannelForURL: _url];
if (channel)
{
if ([channel isOpen]
|| [channel openChannel])
{
/* create handle for channel */
handle = [[GCSChannelHandle alloc] init];
handle->url = [_url retain];
handle->channel = [channel retain];
handle->creationTime = [now retain];
handle->lastAcquireTime = [now retain];
[busyChannels addObject: handle];
[handle release];
}
else
[self errorWithFormat: @"could not open channel %@ for URL: %@",
channel, [_url absoluteString]];
}
}
return channel;
}
- (void)releaseChannel:(EOAdaptorChannel *)_channel {
- (void) releaseChannel: (EOAdaptorChannel *) _channel
{
GCSChannelHandle *handle;
if ((handle = [self findBusyChannelHandleForChannel:_channel]) != nil) {
NSCalendarDate *now;
now = [NSCalendarDate date];
handle = [handle retain];
ASSIGN(handle->lastReleaseTime, now);
[self->busyChannels removeObject:handle];
if ([[handle channel] isOpen] && [handle age] < ChannelExpireAge) {
// TODO: consider age
[self->availableChannels addObject:handle];
if (debugPools) {
handle = [self findBusyChannelHandleForChannel: _channel];
if (handle)
{
handle = [handle retain];
ASSIGN (handle->lastReleaseTime, [NSCalendarDate date]);
[busyChannels removeObject: handle];
if ([_channel isOpen] && [handle age] < ChannelExpireAge)
{
// TODO: consider age
[availableChannels addObject: handle];
if (debugPools)
[self logWithFormat:
@"DBPOOL: keeping channel (age %ds, #%d, %p) : %@",
(int)
[handle age], [availableChannels count],
[handle->url absoluteString],
_channel];
}
else if (debugPools)
[self logWithFormat:
@"DBPOOL: keeping channel (age %ds, #%d): %@",
(int)[handle age], [self->availableChannels count],
[handle->url absoluteString]];
}
[_channel release];
@"DBPOOL: freeing old channel (age %ds, %p) ", (int)
[handle age], _channel];
[handle release];
return;
}
else
{
if ([_channel isOpen])
[_channel closeChannel];
if (debugPools) {
[self logWithFormat:
@"DBPOOL: freeing old channel (age %ds)", (int)[handle age]];
[_channel release];
}
/* not reusing channel */
[handle release]; handle = nil;
}
if ([_channel isOpen])
[_channel closeChannel];
[_channel release];
}
/* checking for tables */
- (BOOL)canConnect:(NSURL *)_url {
/*
this can check for DB connect as well as for table URLs (whether a table
exists)
- (BOOL) canConnect: (NSURL *) _url
{
/*
this can check for DB connect as well as for table URLs (whether a table
exists)
*/
EOAdaptorChannel *channel;
NSString *table;
BOOL result;
if ((channel = [self acquireOpenChannelForURL:_url]) == nil) {
if (debugOn) [self debugWithFormat:@"could not acquire channel: %@", _url];
return NO;
}
if (debugOn) [self debugWithFormat:@"acquired channel: %@", channel];
result = YES; /* could open channel */
/* check whether table exists */
table = [_url gcsTableName];
if ([table length] > 0)
result = [channel tableExistsWithName:table];
/* release channel */
[self releaseChannel:channel]; channel = nil;
BOOL result;
channel = [self acquireOpenChannelForURL: _url];
if (channel)
{
if (debugOn)
[self debugWithFormat: @"acquired channel: %@", channel];
/* check whether table exists */
table = [_url gcsTableName];
if ([table length] > 0)
result = [channel tableExistsWithName: table];
else
result = YES; /* could open channel */
/* release channel */
[self releaseChannel: channel];
}
else
{
if (debugOn)
[self debugWithFormat: @"could not acquire channel: %@", _url];
result = NO;
}
return result;
}
/* collect old channels */
- (void)_garbageCollect:(NSTimer *)_timer {
- (void) _garbageCollect: (NSTimer *) _timer
{
NSMutableArray *handlesToRemove;
unsigned i, count;
if ((count = [self->availableChannels count]) == 0)
/* no available channels */
return;
GCSChannelHandle *handle;
/* collect channels to expire */
handlesToRemove = [[NSMutableArray alloc] initWithCapacity:4];
for (i = 0; i < count; i++) {
GCSChannelHandle *handle;
handle = [self->availableChannels objectAtIndex:i];
if (![[handle channel] isOpen]) {
[handlesToRemove addObject:handle];
continue;
count = [availableChannels count];
if (count)
{
/* collect channels to expire */
handlesToRemove = [[NSMutableArray alloc] initWithCapacity: count];
for (i = 0; i < count; i++)
{
handle = [availableChannels objectAtIndex: i];
if ([[handle channel] isOpen])
{
if ([handle age] > ChannelExpireAge)
[handlesToRemove addObject: handle];
}
else
[handlesToRemove addObject: handle];
}
/* remove channels */
count = [handlesToRemove count];
if (debugPools)
[self logWithFormat: @"DBPOOL: garbage collecting %d channels.", count];
for (i = 0; i < count; i++)
{
handle = [handlesToRemove objectAtIndex: i];
[handle retain];
[availableChannels removeObject: handle];
if ([[handle channel] isOpen])
[[handle channel] closeChannel];
[handle release];
}
[handlesToRemove release];
}
if ([handle age] > ChannelExpireAge) {
[handlesToRemove addObject:handle];
continue;
}
}
/* remove channels */
count = [handlesToRemove count];
if (debugPools)
[self logWithFormat:@"DBPOOL: garbage collecting %d channels.", count];
for (i = 0; i < count; i++) {
GCSChannelHandle *handle;
handle = [[handlesToRemove objectAtIndex:i] retain];
[self->availableChannels removeObject:handle];
if ([[handle channel] isOpen])
[[handle channel] closeChannel];
[handle release];
}
[handlesToRemove release];
}
/* debugging */
- (BOOL)isDebuggingEnabled {
- (BOOL) isDebuggingEnabled
{
return debugOn;
}
/* description */
- (NSString *)description {
- (NSString *) description
{
NSMutableString *ms;
ms = [NSMutableString stringWithCapacity:256];
[ms appendFormat:@"<0x%p[%@]:", self, NSStringFromClass([self class])];
[ms appendFormat:@" #adaptors=%d", [self->urlToAdaptor count]];
[ms appendString:@">"];
ms = [NSMutableString stringWithCapacity: 256];
[ms appendFormat: @"<0x%p[%@]: ", self, NSStringFromClass ([self class])];
[ms appendFormat: @" #adaptors=%d", [urlToAdaptor count]];
[ms appendString: @">"];
return ms;
}
@ -434,82 +490,95 @@ static NSTimeInterval ChannelCollectionTimer = 5 * 60;
@implementation GCSChannelHandle
- (void)dealloc {
[self->channel release];
[self->creationTime release];
[self->lastReleaseTime release];
[self->lastAcquireTime release];
- (void) dealloc
{
[channel release];
[creationTime release];
[lastReleaseTime release];
[lastAcquireTime release];
[super dealloc];
}
/* accessors */
- (EOAdaptorChannel *)channel {
return self->channel;
- (EOAdaptorChannel *) channel
{
return channel;
}
- (BOOL)canHandleURL:(NSURL *)_url {
BOOL isSQLite;
if (_url == nil) {
[self logWithFormat:@"MISMATCH: no url .."];
return NO;
}
if (_url == self->url)
return YES;
- (BOOL) canHandleURL: (NSURL *) _url
{
BOOL result;
isSQLite = [[_url scheme] isEqualToString:@"sqlite"];
if (!isSQLite && ![[self->url host] isEqual:[_url host]]) {
[self logWithFormat:@"MISMATCH: different host (%@ vs %@)",
[self->url host], [_url host]];
return NO;
}
if (![[self->url gcsDatabaseName] isEqualToString:[_url gcsDatabaseName]]) {
[self logWithFormat:@"MISMATCH: different db .."];
return NO;
}
if (!isSQLite) {
if (![[self->url user] isEqual:[_url user]]) {
[self logWithFormat:@"MISMATCH: different user .."];
return NO;
result = NO;
if (_url)
{
if (_url == url
|| [[_url scheme] isEqualToString: @"sqlite"])
result = YES;
else if ([[url host] isEqual: [_url host]])
{
if ([[url gcsDatabaseName]
isEqualToString: [_url gcsDatabaseName]])
{
if ([[url user] isEqual: [_url user]])
{
if ([[url port] intValue] == [[_url port] intValue])
result = YES;
else
[self logWithFormat:
@"MISMATCH: different port (%@ vs %@) ..",
[url port], [_url port]];
}
else
[self logWithFormat: @"MISMATCH: different user .."];
}
else
[self logWithFormat: @"MISMATCH: different db .."];
}
else
[self logWithFormat: @"MISMATCH: different host (%@ vs %@) ",
[url host], [_url host]];
}
if ([[self->url port] intValue] != [[_url port] intValue]) {
[self logWithFormat:@"MISMATCH: different port (%@ vs %@) ..",
[self->url port], [_url port]];
return NO;
}
}
return YES;
else
[self logWithFormat: @"MISMATCH: no url .."];
return result;
}
- (NSTimeInterval)age {
return [[NSCalendarDate calendarDate]
timeIntervalSinceDate:self->creationTime];
- (NSTimeInterval) age
{
return [[NSCalendarDate calendarDate]
timeIntervalSinceDate: creationTime];
}
/* NSCopying */
- (id)copyWithZone:(NSZone *)_zone {
- (id) copyWithZone: (NSZone *) _zone
{
return [self retain];
}
/* description */
- (NSString *)description {
- (NSString *) description
{
NSMutableString *ms;
ms = [NSMutableString stringWithCapacity:256];
[ms appendFormat:@"<0x%p[%@]:", self, NSStringFromClass([self class])];
[ms appendFormat:@" channel=0x%p", self->channel];
if (self->creationTime) [ms appendFormat:@" created=%@", self->creationTime];
if (self->lastReleaseTime)
[ms appendFormat:@" last-released=%@", self->lastReleaseTime];
if (self->lastAcquireTime)
[ms appendFormat:@" last-acquired=%@", self->lastAcquireTime];
[ms appendString:@">"];
ms = [NSMutableString stringWithCapacity: 256];
[ms appendFormat: @"<0x%p[%@]: ", self, NSStringFromClass ([self class])];
[ms appendFormat: @" channel=0x%p", channel];
if (creationTime)
[ms appendFormat: @" created=%@", creationTime];
if (lastReleaseTime)
[ms appendFormat: @" last-released=%@", lastReleaseTime];
if (lastAcquireTime)
[ms appendFormat: @" last-acquired=%@", lastAcquireTime];
[ms appendString: @">"];
return ms;
}

View File

@ -19,8 +19,7 @@
02111-1307, USA.
*/
#include "GCSContext.h"
#include "common.h"
#import "GCSContext.h"
@implementation GCSContext
@end /* GCSContext */

View File

@ -19,8 +19,7 @@
02111-1307, USA.
*/
#include "GCSFieldExtractor.h"
#include "common.h"
#import "GCSFieldExtractor.h"
@implementation GCSFieldExtractor

View File

@ -19,8 +19,14 @@
02111-1307, USA.
*/
#include "GCSFieldInfo.h"
#include "common.h"
#import <Foundation/NSArray.h>
#import <Foundation/NSDictionary.h>
#import <Foundation/NSString.h>
#import <NGExtensions/NSNull+misc.h>
#import <NGExtensions/NSObject+Logs.h>
#import "GCSFieldInfo.h"
@implementation GCSFieldInfo

View File

@ -21,6 +21,17 @@
02111-1307, USA.
*/
#import <NGExtensions/NSNull+misc.h>
#import <NGExtensions/NSObject+Logs.h>
#import <EOControl/EOFetchSpecification.h>
#import <EOControl/EOSortOrdering.h>
#import <GDLAccess/EOEntity.h>
#import <GDLAccess/EOAttribute.h>
#import <GDLAccess/EOSQLQualifier.h>
#import <GDLAccess/EOAdaptorContext.h>
#import "GCSFieldInfo.h"
#import "GCSFolder.h"
#import "GCSFolderManager.h"
@ -31,12 +42,6 @@
#import "EOAdaptorChannel+GCS.h"
#import "EOQualifier+GCS.h"
#import "GCSStringFormatter.h"
#import "common.h"
#import <GDLAccess/EOEntity.h>
#import <GDLAccess/EOAttribute.h>
#import <GDLAccess/EOSQLQualifier.h>
#import <GDLAccess/EOAdaptorContext.h>
typedef enum {
noTableRequired = 0,

View File

@ -19,13 +19,23 @@
02111-1307, USA.
*/
#include "GCSFolderType.h"
#include "GCSFolder.h"
#include "GCSFieldInfo.h"
#include "GCSFieldExtractor.h"
#include "common.h"
#include <EOControl/EOKeyValueCoding.h>
#include <NGExtensions/NGResourceLocator.h>
#import <Foundation/NSDictionary.h>
#import <Foundation/NSSet.h>
#import <Foundation/NSString.h>
#import <NGExtensions/NSNull+misc.h>
#import <NGExtensions/NSObject+Logs.h>
#import <NGExtensions/NSString+misc.h>
#import <EOControl/EOQualifier.h>
#import <EOControl/EOKeyValueCoding.h>
#import <NGExtensions/NGResourceLocator.h>
#import "GCSFolderType.h"
#import "GCSFolder.h"
#import "GCSFieldInfo.h"
#import "GCSFieldExtractor.h"
@implementation GCSFolderType

View File

@ -19,8 +19,9 @@
02111-1307, USA.
*/
#include "GCSStringFormatter.h"
#include "common.h"
#import <Foundation/NSCharacterSet.h>
#import "GCSStringFormatter.h"
@implementation GCSStringFormatter

View File

@ -19,8 +19,10 @@
02111-1307, USA.
*/
#include "NSURL+GCS.h"
#include "common.h"
#import <Foundation/NSArray.h>
#import <Foundation/NSString.h>
#import "NSURL+GCS.h"
@implementation NSURL(GCS)

View File

@ -1,36 +0,0 @@
/*
Copyright (C) 2004 SKYRIX Software AG
This file is part of OpenGroupware.org.
OGo is free software; you can redistribute it and/or modify it under
the terms of the GNU Lesser General Public License as published by the
Free Software Foundation; either version 2, or (at your option) any
later version.
OGo 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 Lesser General Public
License for more details.
You should have received a copy of the GNU Lesser General Public
License along with OGo; see the file COPYING. If not, write to the
Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
02111-1307, USA.
*/
// $Id: common.h 673 2005-03-20 19:09:53Z helge $
#import <Foundation/Foundation.h>
#import <Foundation/NSURL.h>
#include <NGExtensions/NGExtensions.h>
#if NeXT_RUNTIME || APPLE_RUNTIME
# define objc_free(__mem__) free(__mem__)
# define objc_malloc(__size__) malloc(__size__)
# define objc_calloc(__cnt__, __size__) calloc(__cnt__, __size__)
# define objc_realloc(__ptr__, __size__) realloc(__ptr__, __size__)
# ifndef sel_eq
# define sel_eq(sela,selb) (sela==selb?YES:NO)
# endif
#endif

View File

@ -19,7 +19,17 @@
02111-1307, USA.
*/
#import <Foundation/NSObject.h>
#import <Foundation/NSArray.h>
#import <Foundation/NSAutoreleasePool.h>
#import <Foundation/NSEnumerator.h>
#import <Foundation/NSUserDefaults.h>
#import <NGExtensions/NSNull+misc.h>
#import <NGExtensions/NSObject+Logs.h>
#import <NGExtensions/NSProcessInfo+misc.h>
#import <GDLContentStore/GCSFolder.h>
#import <GDLContentStore/GCSFolderManager.h>
@class NSUserDefaults, NSArray;
@class GCSFolderManager;
@ -35,10 +45,6 @@
@end
#include <GDLContentStore/GCSFolder.h>
#include <GDLContentStore/GCSFolderManager.h>
#include "common.h"
@implementation Tool
- (id)init {

View File

@ -19,7 +19,17 @@
02111-1307, USA.
*/
#import <Foundation/NSObject.h>
#import <Foundation/NSArray.h>
#import <Foundation/NSAutoreleasePool.h>
#import <Foundation/NSEnumerator.h>
#import <Foundation/NSUserDefaults.h>
#import <NGExtensions/NSNull+misc.h>
#import <NGExtensions/NSObject+Logs.h>
#import <NGExtensions/NSProcessInfo+misc.h>
#import <GDLContentStore/GCSFolderType.h>
@class NSUserDefaults, NSArray;
@class GCSFolderManager;
@ -34,9 +44,6 @@
@end
#include <GDLContentStore/GCSFolderType.h>
#include "common.h"
@implementation Tool
- (id)init {

View File

@ -19,7 +19,20 @@
02111-1307, USA.
*/
#import <Foundation/NSObject.h>
#import <Foundation/NSArray.h>
#import <Foundation/NSAutoreleasePool.h>
#import <Foundation/NSDictionary.h>
#import <Foundation/NSEnumerator.h>
#import <Foundation/NSProcessInfo.h>
#import <Foundation/NSURL.h>
#import <Foundation/NSUserDefaults.h>
#import <NGExtensions/NSNull+misc.h>
#import <NGExtensions/NSObject+Logs.h>
#import <NGExtensions/NSProcessInfo+misc.h>
#import <GDLContentStore/GCSFolder.h>
#import <GDLContentStore/GCSFolderManager.h>
@class NSUserDefaults, NSArray;
@class GCSFolderManager;
@ -35,10 +48,6 @@
@end
#include <GDLContentStore/GCSFolder.h>
#include <GDLContentStore/GCSFolderManager.h>
#include "common.h"
@implementation Tool
- (id)init {

View File

@ -19,7 +19,17 @@
02111-1307, USA.
*/
#import <Foundation/NSObject.h>
#import <Foundation/NSArray.h>
#import <Foundation/NSAutoreleasePool.h>
#import <Foundation/NSEnumerator.h>
#import <Foundation/NSUserDefaults.h>
#import <NGExtensions/NSNull+misc.h>
#import <NGExtensions/NSObject+Logs.h>
#import <NGExtensions/NSProcessInfo+misc.h>
#import <GDLContentStore/GCSFolder.h>
#import <GDLContentStore/GCSFolderManager.h>
@class NSUserDefaults, NSArray;
@class GCSFolderManager;
@ -35,10 +45,6 @@
@end
#include <GDLContentStore/GCSFolder.h>
#include <GDLContentStore/GCSFolderManager.h>
#include "common.h"
@implementation Tool
- (id)init {

View File

@ -19,7 +19,17 @@
02111-1307, USA.
*/
#import <Foundation/NSObject.h>
#import <Foundation/NSArray.h>
#import <Foundation/NSAutoreleasePool.h>
#import <Foundation/NSEnumerator.h>
#import <Foundation/NSUserDefaults.h>
#import <NGExtensions/NSNull+misc.h>
#import <NGExtensions/NSObject+Logs.h>
#import <NGExtensions/NSProcessInfo+misc.h>
#import <GDLContentStore/GCSFolder.h>
#import <GDLContentStore/GCSFolderManager.h>
@class NSUserDefaults, NSArray;
@class GCSFolderManager;
@ -35,10 +45,6 @@
@end
#include <GDLContentStore/GCSFolder.h>
#include <GDLContentStore/GCSFolderManager.h>
#include "common.h"
@implementation Tool
- (id)init {

View File

@ -1,6 +1,6 @@
Index: sope-gdl1/PostgreSQL/PostgreSQL72Channel.m
===================================================================
--- sope-gdl1/PostgreSQL/PostgreSQL72Channel.m (révision 1626)
--- sope-gdl1/PostgreSQL/PostgreSQL72Channel.m (révision 1630)
+++ sope-gdl1/PostgreSQL/PostgreSQL72Channel.m (copie de travail)
@@ -713,6 +713,39 @@
return ms;
@ -44,7 +44,7 @@ Index: sope-gdl1/PostgreSQL/PostgreSQL72Channel.m
@implementation PostgreSQL72Channel(PrimaryKeyGeneration)
Index: sope-gdl1/Oracle8/OracleAdaptorChannel.m
===================================================================
--- sope-gdl1/Oracle8/OracleAdaptorChannel.m (révision 1626)
--- sope-gdl1/Oracle8/OracleAdaptorChannel.m (révision 1630)
+++ sope-gdl1/Oracle8/OracleAdaptorChannel.m (copie de travail)
@@ -30,6 +30,7 @@
@ -139,7 +139,7 @@ Index: sope-gdl1/Oracle8/OracleAdaptorChannel.m
@" c_lastmodified INTEGER NOT NULL,\n"
Index: sope-gdl1/Oracle8/OracleAdaptorChannelController.m
===================================================================
--- sope-gdl1/Oracle8/OracleAdaptorChannelController.m (révision 1626)
--- sope-gdl1/Oracle8/OracleAdaptorChannelController.m (révision 1630)
+++ sope-gdl1/Oracle8/OracleAdaptorChannelController.m (copie de travail)
@@ -31,6 +31,8 @@
#import <Foundation/Foundation.h>
@ -187,7 +187,7 @@ Index: sope-gdl1/Oracle8/OracleAdaptorChannelController.m
Index: sope-mime/NGImap4/NGImap4Client.h
===================================================================
--- sope-mime/NGImap4/NGImap4Client.h (révision 1626)
--- sope-mime/NGImap4/NGImap4Client.h (révision 1630)
+++ sope-mime/NGImap4/NGImap4Client.h (copie de travail)
@@ -62,6 +62,8 @@
NGImap4ResponseNormalizer *normer;
@ -217,7 +217,7 @@ Index: sope-mime/NGImap4/NGImap4Client.h
- (NSDictionary *)copyUid:(unsigned)_uid toFolder:(NSString *)_folder;
Index: sope-mime/NGImap4/NGImap4Client.m
===================================================================
--- sope-mime/NGImap4/NGImap4Client.m (révision 1626)
--- sope-mime/NGImap4/NGImap4Client.m (révision 1630)
+++ sope-mime/NGImap4/NGImap4Client.m (copie de travail)
@@ -24,6 +24,8 @@
#include "NGImap4Client.h"
@ -526,7 +526,7 @@ Index: sope-mime/NGImap4/NGImap4Client.m
__PRETTY_FUNCTION__, [_exception name], [_exception reason]];
Index: sope-mime/NGImap4/NGSieveClient.m
===================================================================
--- sope-mime/NGImap4/NGSieveClient.m (révision 1626)
--- sope-mime/NGImap4/NGSieveClient.m (révision 1630)
+++ sope-mime/NGImap4/NGSieveClient.m (copie de travail)
@@ -294,8 +294,8 @@
return con;
@ -562,7 +562,7 @@ Index: sope-mime/NGImap4/NGSieveClient.m
/* write */
Index: sope-mime/NGImap4/NGImap4Connection.h
===================================================================
--- sope-mime/NGImap4/NGImap4Connection.h (révision 1626)
--- sope-mime/NGImap4/NGImap4Connection.h (révision 1630)
+++ sope-mime/NGImap4/NGImap4Connection.h (copie de travail)
@@ -89,6 +89,7 @@
@ -574,7 +574,7 @@ Index: sope-mime/NGImap4/NGImap4Connection.h
Index: sope-mime/NGImap4/NGImap4Connection.m
===================================================================
--- sope-mime/NGImap4/NGImap4Connection.m (révision 1626)
--- sope-mime/NGImap4/NGImap4Connection.m (révision 1630)
+++ sope-mime/NGImap4/NGImap4Connection.m (copie de travail)
@@ -381,7 +381,7 @@
@ -622,7 +622,7 @@ Index: sope-mime/NGImap4/NGImap4Connection.m
- (id)infoForMailboxAtURL:(NSURL *)_url {
Index: sope-mime/NGImap4/NGImap4ResponseNormalizer.m
===================================================================
--- sope-mime/NGImap4/NGImap4ResponseNormalizer.m (révision 1626)
--- sope-mime/NGImap4/NGImap4ResponseNormalizer.m (révision 1630)
+++ sope-mime/NGImap4/NGImap4ResponseNormalizer.m (copie de travail)
@@ -292,7 +292,7 @@
/*
@ -671,7 +671,7 @@ Index: sope-mime/NGImap4/NGImap4ResponseNormalizer.m
if (objs) free(objs);
Index: sope-mime/NGImap4/NGImap4ResponseParser.m
===================================================================
--- sope-mime/NGImap4/NGImap4ResponseParser.m (révision 1626)
--- sope-mime/NGImap4/NGImap4ResponseParser.m (révision 1630)
+++ sope-mime/NGImap4/NGImap4ResponseParser.m (copie de travail)
@@ -31,6 +31,7 @@
@interface NGImap4ResponseParser(ParsingPrivates)
@ -1122,7 +1122,7 @@ Index: sope-mime/NGImap4/NGImap4ResponseParser.m
self->serverResponseDebug =
Index: sope-mime/NGImap4/ChangeLog
===================================================================
--- sope-mime/NGImap4/ChangeLog (révision 1626)
--- sope-mime/NGImap4/ChangeLog (révision 1630)
+++ sope-mime/NGImap4/ChangeLog (copie de travail)
@@ -1,3 +1,29 @@
+2008-10-23 Wolfgang Sourdeau <wsourdeau@inverse.ca>
@ -1156,7 +1156,7 @@ Index: sope-mime/NGImap4/ChangeLog
* NGImap4Connection.m: some fix for folders ending with a slash (OGo
Index: sope-mime/NGImap4/NGImap4ConnectionManager.m
===================================================================
--- sope-mime/NGImap4/NGImap4ConnectionManager.m (révision 1626)
--- sope-mime/NGImap4/NGImap4ConnectionManager.m (révision 1630)
+++ sope-mime/NGImap4/NGImap4ConnectionManager.m (copie de travail)
@@ -38,6 +38,9 @@
debugCache = [ud boolForKey:@"NGImap4EnableIMAP4CacheDebug"];
@ -1283,7 +1283,7 @@ Index: sope-mime/NGImap4/NGImap4ConnectionManager.m
/* client object */
Index: sope-mime/NGImap4/NSString+Imap4.m
===================================================================
--- sope-mime/NGImap4/NSString+Imap4.m (révision 1626)
--- sope-mime/NGImap4/NSString+Imap4.m (révision 1630)
+++ sope-mime/NGImap4/NSString+Imap4.m (copie de travail)
@@ -20,11 +20,56 @@
02111-1307, USA.
@ -1805,7 +1805,7 @@ Index: sope-mime/NGImap4/NSString+Imap4.m
+@end /* NSString(Imap4) */
Index: sope-mime/NGMail/NGSmtpClient.m
===================================================================
--- sope-mime/NGMail/NGSmtpClient.m (révision 1626)
--- sope-mime/NGMail/NGSmtpClient.m (révision 1630)
+++ sope-mime/NGMail/NGSmtpClient.m (copie de travail)
@@ -24,6 +24,82 @@
#include "NGSmtpReplyCodes.h"
@ -1961,7 +1961,7 @@ Index: sope-mime/NGMail/NGSmtpClient.m
reply = [self receiveReply];
Index: sope-mime/NGMail/NGMailAddressParser.h
===================================================================
--- sope-mime/NGMail/NGMailAddressParser.h (révision 1626)
--- sope-mime/NGMail/NGMailAddressParser.h (révision 1630)
+++ sope-mime/NGMail/NGMailAddressParser.h (copie de travail)
@@ -24,7 +24,9 @@
@ -1999,7 +1999,7 @@ Index: sope-mime/NGMail/NGMailAddressParser.h
Index: sope-mime/NGMail/NGMimeMessageGenerator.m
===================================================================
--- sope-mime/NGMail/NGMimeMessageGenerator.m (révision 1626)
--- sope-mime/NGMail/NGMimeMessageGenerator.m (révision 1630)
+++ sope-mime/NGMail/NGMimeMessageGenerator.m (copie de travail)
@@ -86,37 +86,40 @@
char *des = NULL;
@ -2065,7 +2065,7 @@ Index: sope-mime/NGMail/NGMimeMessageGenerator.m
unsigned isoEndLen = 2;
Index: sope-mime/NGMail/NGMailAddressParser.m
===================================================================
--- sope-mime/NGMail/NGMailAddressParser.m (révision 1626)
--- sope-mime/NGMail/NGMailAddressParser.m (révision 1630)
+++ sope-mime/NGMail/NGMailAddressParser.m (copie de travail)
@@ -52,9 +52,9 @@
StrClass = [NSString class];
@ -2210,7 +2210,7 @@ Index: sope-mime/NGMail/NGMailAddressParser.m
self->dataPos = 0;
Index: sope-mime/NGMime/NGMimeRFC822DateHeaderFieldParser.m
===================================================================
--- sope-mime/NGMime/NGMimeRFC822DateHeaderFieldParser.m (révision 1626)
--- sope-mime/NGMime/NGMimeRFC822DateHeaderFieldParser.m (révision 1630)
+++ sope-mime/NGMime/NGMimeRFC822DateHeaderFieldParser.m (copie de travail)
@@ -19,88 +19,45 @@
02111-1307, USA.
@ -2615,7 +2615,7 @@ Index: sope-mime/NGMime/NGMimeRFC822DateHeaderFieldParser.m
#if 0
Index: sope-mime/NGMime/NGMimeMultipartBodyParser.m
===================================================================
--- sope-mime/NGMime/NGMimeMultipartBodyParser.m (révision 1626)
--- sope-mime/NGMime/NGMimeMultipartBodyParser.m (révision 1630)
+++ sope-mime/NGMime/NGMimeMultipartBodyParser.m (copie de travail)
@@ -428,6 +428,7 @@
NSString *boundary = nil;
@ -2640,7 +2640,7 @@ Index: sope-mime/NGMime/NGMimeMultipartBodyParser.m
if (rawBodyParts) {
Index: sope-mime/NGMime/NGMimeHeaderFieldGeneratorSet.m
===================================================================
--- sope-mime/NGMime/NGMimeHeaderFieldGeneratorSet.m (révision 1626)
--- sope-mime/NGMime/NGMimeHeaderFieldGeneratorSet.m (révision 1630)
+++ sope-mime/NGMime/NGMimeHeaderFieldGeneratorSet.m (copie de travail)
@@ -77,6 +77,7 @@
[rfc822Set setGenerator:gen forField:@"bcc"];
@ -2652,7 +2652,7 @@ Index: sope-mime/NGMime/NGMimeHeaderFieldGeneratorSet.m
Index: sope-mime/NGMime/NGMimeType.m
===================================================================
--- sope-mime/NGMime/NGMimeType.m (révision 1626)
--- sope-mime/NGMime/NGMimeType.m (révision 1630)
+++ sope-mime/NGMime/NGMimeType.m (copie de travail)
@@ -120,28 +120,23 @@
@ -2750,7 +2750,7 @@ Index: sope-mime/NGMime/NGMimeType.m
- (NSString *)stringValue {
Index: sope-mime/NGMime/NGMimeBodyPart.m
===================================================================
--- sope-mime/NGMime/NGMimeBodyPart.m (révision 1626)
--- sope-mime/NGMime/NGMimeBodyPart.m (révision 1630)
+++ sope-mime/NGMime/NGMimeBodyPart.m (copie de travail)
@@ -31,18 +31,6 @@
return 2;
@ -2788,7 +2788,7 @@ Index: sope-mime/NGMime/NGMimeBodyPart.m
- (NSString *)contentId {
Index: sope-mime/NGMime/ChangeLog
===================================================================
--- sope-mime/NGMime/ChangeLog (révision 1626)
--- sope-mime/NGMime/ChangeLog (révision 1630)
+++ sope-mime/NGMime/ChangeLog (copie de travail)
@@ -1,3 +1,25 @@
+2008-09-08 Wolfgang Sourdeau <wsourdeau@inverse.ca>
@ -2818,7 +2818,7 @@ Index: sope-mime/NGMime/ChangeLog
* fixes for OGo bug #789 (reply-to QP encoding)
Index: sope-mime/NGMime/NGMimeContentTypeHeaderFieldGenerator.m
===================================================================
--- sope-mime/NGMime/NGMimeContentTypeHeaderFieldGenerator.m (révision 1626)
--- sope-mime/NGMime/NGMimeContentTypeHeaderFieldGenerator.m (révision 1630)
+++ sope-mime/NGMime/NGMimeContentTypeHeaderFieldGenerator.m (copie de travail)
@@ -36,8 +36,7 @@
NGMimeType *type = nil; // only one content-type field
@ -2958,7 +2958,7 @@ Index: sope-mime/NGMime/NGMimeContentTypeHeaderFieldGenerator.m
}
Index: sope-mime/NGMime/NGMimePartGenerator.m
===================================================================
--- sope-mime/NGMime/NGMimePartGenerator.m (révision 1626)
--- sope-mime/NGMime/NGMimePartGenerator.m (révision 1630)
+++ sope-mime/NGMime/NGMimePartGenerator.m (copie de travail)
@@ -155,8 +155,9 @@
BOOL isMultiValue, isFirst;
@ -2983,7 +2983,7 @@ Index: sope-mime/NGMime/NGMimePartGenerator.m
Index: sope-mime/NGMime/NGMimeBodyParser.m
===================================================================
--- sope-mime/NGMime/NGMimeBodyParser.m (révision 1626)
--- sope-mime/NGMime/NGMimeBodyParser.m (révision 1630)
+++ sope-mime/NGMime/NGMimeBodyParser.m (copie de travail)
@@ -67,7 +67,10 @@
if (_data == nil) return nil;
@ -2999,7 +2999,7 @@ Index: sope-mime/NGMime/NGMimeBodyParser.m
Index: sope-mime/NGMime/NGMimePartParser.h
===================================================================
--- sope-mime/NGMime/NGMimePartParser.h (révision 1626)
--- sope-mime/NGMime/NGMimePartParser.h (révision 1630)
+++ sope-mime/NGMime/NGMimePartParser.h (copie de travail)
@@ -117,6 +117,7 @@
BOOL parserParseRawBodyDataOfPart:1;
@ -3021,7 +3021,7 @@ Index: sope-mime/NGMime/NGMimePartParser.h
@interface NSObject(NGMimePartParser)
Index: sope-mime/NGMime/NGMimePartParser.m
===================================================================
--- sope-mime/NGMime/NGMimePartParser.m (révision 1626)
--- sope-mime/NGMime/NGMimePartParser.m (révision 1630)
+++ sope-mime/NGMime/NGMimePartParser.m (copie de travail)
@@ -227,7 +227,7 @@
}
@ -3046,7 +3046,7 @@ Index: sope-mime/NGMime/NGMimePartParser.m
: [NGMimeType mimeType:[ctype stringValue]];
Index: sope-mime/NGMime/NGMimeAddressHeaderFieldGenerator.m
===================================================================
--- sope-mime/NGMime/NGMimeAddressHeaderFieldGenerator.m (révision 1626)
--- sope-mime/NGMime/NGMimeAddressHeaderFieldGenerator.m (révision 1630)
+++ sope-mime/NGMime/NGMimeAddressHeaderFieldGenerator.m (copie de travail)
@@ -105,10 +105,10 @@
}
@ -3132,7 +3132,7 @@ Index: sope-mime/NGMime/NGMimeAddressHeaderFieldGenerator.m
return data;
Index: sope-mime/NGMime/NGMimeContentDispositionHeaderFieldGenerator.m
===================================================================
--- sope-mime/NGMime/NGMimeContentDispositionHeaderFieldGenerator.m (révision 1626)
--- sope-mime/NGMime/NGMimeContentDispositionHeaderFieldGenerator.m (révision 1630)
+++ sope-mime/NGMime/NGMimeContentDispositionHeaderFieldGenerator.m (copie de travail)
@@ -49,80 +49,70 @@
@ -3268,7 +3268,7 @@ Index: sope-mime/NGMime/NGMimeContentDispositionHeaderFieldGenerator.m
}
Index: sope-core/NGExtensions/NGExtensions/NSString+Ext.h
===================================================================
--- sope-core/NGExtensions/NGExtensions/NSString+Ext.h (révision 1626)
--- sope-core/NGExtensions/NGExtensions/NSString+Ext.h (révision 1630)
+++ sope-core/NGExtensions/NGExtensions/NSString+Ext.h (copie de travail)
@@ -30,6 +30,7 @@
@ -3306,7 +3306,7 @@ Index: sope-core/NGExtensions/NGExtensions/NSString+Ext.h
/* specific to libFoundation */
Index: sope-core/NGExtensions/FdExt.subproj/NSString+Ext.m
===================================================================
--- sope-core/NGExtensions/FdExt.subproj/NSString+Ext.m (révision 1626)
--- sope-core/NGExtensions/FdExt.subproj/NSString+Ext.m (révision 1630)
+++ sope-core/NGExtensions/FdExt.subproj/NSString+Ext.m (copie de travail)
@@ -39,18 +39,6 @@
: (NSString *)[[self copy] autorelease];
@ -3395,7 +3395,7 @@ Index: sope-core/NGExtensions/FdExt.subproj/NSString+Ext.m
- (BOOL)isAbsoluteURL
Index: sope-core/NGExtensions/FdExt.subproj/NSString+Encoding.m
===================================================================
--- sope-core/NGExtensions/FdExt.subproj/NSString+Encoding.m (révision 1626)
--- sope-core/NGExtensions/FdExt.subproj/NSString+Encoding.m (révision 1630)
+++ sope-core/NGExtensions/FdExt.subproj/NSString+Encoding.m (copie de travail)
@@ -140,8 +140,12 @@
@ -3438,7 +3438,7 @@ Index: sope-core/NGExtensions/FdExt.subproj/NSString+Encoding.m
static char *iconv_wrapper(id self, char *_src, unsigned _srcLen,
Index: sope-core/NGExtensions/NGQuotedPrintableCoding.m
===================================================================
--- sope-core/NGExtensions/NGQuotedPrintableCoding.m (révision 1626)
--- sope-core/NGExtensions/NGQuotedPrintableCoding.m (révision 1630)
+++ sope-core/NGExtensions/NGQuotedPrintableCoding.m (copie de travail)
@@ -278,7 +278,12 @@
@ -3456,7 +3456,7 @@ Index: sope-core/NGExtensions/NGQuotedPrintableCoding.m
((c > 31) && (c < 61)) ||
Index: sope-core/NGExtensions/EOExt.subproj/EOGlobalID+Ext.m
===================================================================
--- sope-core/NGExtensions/EOExt.subproj/EOGlobalID+Ext.m (révision 1626)
--- sope-core/NGExtensions/EOExt.subproj/EOGlobalID+Ext.m (révision 1630)
+++ sope-core/NGExtensions/EOExt.subproj/EOGlobalID+Ext.m (copie de travail)
@@ -19,6 +19,7 @@
02111-1307, USA.
@ -3468,7 +3468,7 @@ Index: sope-core/NGExtensions/EOExt.subproj/EOGlobalID+Ext.m
Index: sope-core/NGStreams/GNUmakefile.preamble
===================================================================
--- sope-core/NGStreams/GNUmakefile.preamble (révision 1626)
--- sope-core/NGStreams/GNUmakefile.preamble (révision 1630)
+++ sope-core/NGStreams/GNUmakefile.preamble (copie de travail)
@@ -1,7 +1,10 @@
# compilation settings
@ -3483,7 +3483,7 @@ Index: sope-core/NGStreams/GNUmakefile.preamble
-I..
Index: sope-xml/libxmlSAXDriver/libxmlHTMLSAXDriver.h
===================================================================
--- sope-xml/libxmlSAXDriver/libxmlHTMLSAXDriver.h (révision 1626)
--- sope-xml/libxmlSAXDriver/libxmlHTMLSAXDriver.h (révision 1630)
+++ sope-xml/libxmlSAXDriver/libxmlHTMLSAXDriver.h (copie de travail)
@@ -19,6 +19,8 @@
02111-1307, USA.
@ -3505,7 +3505,7 @@ Index: sope-xml/libxmlSAXDriver/libxmlHTMLSAXDriver.h
id<NSObject,SaxEntityResolver> entityResolver;
Index: sope-xml/libxmlSAXDriver/libxmlHTMLSAXDriver.m
===================================================================
--- sope-xml/libxmlSAXDriver/libxmlHTMLSAXDriver.m (révision 1626)
--- sope-xml/libxmlSAXDriver/libxmlHTMLSAXDriver.m (révision 1630)
+++ sope-xml/libxmlSAXDriver/libxmlHTMLSAXDriver.m (copie de travail)
@@ -30,6 +30,12 @@
#include <libxml/HTMLparser.h>
@ -3565,7 +3565,7 @@ Index: sope-xml/libxmlSAXDriver/libxmlHTMLSAXDriver.m
- (void)tearDownParser {
Index: sope-xml/libxmlSAXDriver/libxmlSAXDriver.m
===================================================================
--- sope-xml/libxmlSAXDriver/libxmlSAXDriver.m (révision 1626)
--- sope-xml/libxmlSAXDriver/libxmlSAXDriver.m (révision 1630)
+++ sope-xml/libxmlSAXDriver/libxmlSAXDriver.m (copie de travail)
@@ -614,7 +614,7 @@
xmlParseDocument(ctxt);
@ -3587,7 +3587,7 @@ Index: sope-xml/libxmlSAXDriver/libxmlSAXDriver.m
xmlFreeParserCtxt(self->ctxt);
Index: sope-appserver/mod_ngobjweb/config.c
===================================================================
--- sope-appserver/mod_ngobjweb/config.c (révision 1626)
--- sope-appserver/mod_ngobjweb/config.c (révision 1630)
+++ sope-appserver/mod_ngobjweb/config.c (copie de travail)
@@ -21,7 +21,7 @@
@ -3600,7 +3600,7 @@ Index: sope-appserver/mod_ngobjweb/config.c
if (buf == NULL)
Index: sope-appserver/mod_ngobjweb/GNUmakefile
===================================================================
--- sope-appserver/mod_ngobjweb/GNUmakefile (révision 1626)
--- sope-appserver/mod_ngobjweb/GNUmakefile (révision 1630)
+++ sope-appserver/mod_ngobjweb/GNUmakefile (copie de travail)
@@ -82,7 +82,7 @@
@ -3623,7 +3623,7 @@ Index: sope-appserver/mod_ngobjweb/GNUmakefile
$(INSTALL_PROGRAM) $(product) /usr/libexec/httpd/
Index: sope-appserver/mod_ngobjweb/NGBufferedDescriptor.c
===================================================================
--- sope-appserver/mod_ngobjweb/NGBufferedDescriptor.c (révision 1626)
--- sope-appserver/mod_ngobjweb/NGBufferedDescriptor.c (révision 1630)
+++ sope-appserver/mod_ngobjweb/NGBufferedDescriptor.c (copie de travail)
@@ -23,6 +23,7 @@
#include <unistd.h>
@ -3635,7 +3635,7 @@ Index: sope-appserver/mod_ngobjweb/NGBufferedDescriptor.c
// returns the number of bytes which where read from the buffer
Index: sope-appserver/NGObjWeb/GNUmakefile.postamble
===================================================================
--- sope-appserver/NGObjWeb/GNUmakefile.postamble (révision 1626)
--- sope-appserver/NGObjWeb/GNUmakefile.postamble (révision 1630)
+++ sope-appserver/NGObjWeb/GNUmakefile.postamble (copie de travail)
@@ -23,14 +23,20 @@
@ -3667,7 +3667,7 @@ Index: sope-appserver/NGObjWeb/GNUmakefile.postamble
+ $(DESTDIR)/$(GNUSTEP_MAKEFILES)/wobundle.make
Index: sope-appserver/NGObjWeb/WOContext.m
===================================================================
--- sope-appserver/NGObjWeb/WOContext.m (révision 1626)
--- sope-appserver/NGObjWeb/WOContext.m (révision 1630)
+++ sope-appserver/NGObjWeb/WOContext.m (copie de travail)
@@ -64,11 +64,13 @@
static BOOL testNSURLs = NO;
@ -3707,9 +3707,12 @@ Index: sope-appserver/NGObjWeb/WOContext.m
serverURL = [@"http://" stringByAppendingString:host];
Index: sope-appserver/NGObjWeb/ChangeLog
===================================================================
--- sope-appserver/NGObjWeb/ChangeLog (révision 1626)
--- sope-appserver/NGObjWeb/ChangeLog (révision 1630)
+++ sope-appserver/NGObjWeb/ChangeLog (copie de travail)
@@ -1,3 +1,8 @@
@@ -3,6 +3,11 @@
* WOHttpAdaptor/WOHttpAdaptor.m: properly embed threaded request
handler in a top-level pool (v4.7.27)
+2008-09-01 Ludovic Marcotte <lmarcotte@inverse.ca>
+
+ * WORequest.m ([WORequest -browserLanguages]): we ensure
@ -3720,7 +3723,7 @@ Index: sope-appserver/NGObjWeb/ChangeLog
* WOHTTPURLHandle.m: add 'query' component of URL to request path
Index: sope-appserver/NGObjWeb/DAVPropMap.plist
===================================================================
--- sope-appserver/NGObjWeb/DAVPropMap.plist (révision 1626)
--- sope-appserver/NGObjWeb/DAVPropMap.plist (révision 1630)
+++ sope-appserver/NGObjWeb/DAVPropMap.plist (copie de travail)
@@ -24,13 +24,19 @@
"{DAV:}status" = "davStatus";
@ -3798,7 +3801,7 @@ Index: sope-appserver/NGObjWeb/DAVPropMap.plist
"{http://groupdav.org/}component-set" = gdavComponentSet;
Index: sope-appserver/NGObjWeb/WebDAV/SaxDAVHandler.m
===================================================================
--- sope-appserver/NGObjWeb/WebDAV/SaxDAVHandler.m (révision 1626)
--- sope-appserver/NGObjWeb/WebDAV/SaxDAVHandler.m (révision 1630)
+++ sope-appserver/NGObjWeb/WebDAV/SaxDAVHandler.m (copie de travail)
@@ -655,6 +655,7 @@
if (self->responses == nil)
@ -3810,7 +3813,7 @@ Index: sope-appserver/NGObjWeb/WebDAV/SaxDAVHandler.m
case 'n':
Index: sope-appserver/NGObjWeb/WebDAV/SoObjectWebDAVDispatcher.m
===================================================================
--- sope-appserver/NGObjWeb/WebDAV/SoObjectWebDAVDispatcher.m (révision 1626)
--- sope-appserver/NGObjWeb/WebDAV/SoObjectWebDAVDispatcher.m (révision 1630)
+++ sope-appserver/NGObjWeb/WebDAV/SoObjectWebDAVDispatcher.m (copie de travail)
@@ -1523,16 +1523,16 @@
- (id)doREPORT:(WOContext *)_ctx {
@ -3898,7 +3901,7 @@ Index: sope-appserver/NGObjWeb/WebDAV/SoObjectWebDAVDispatcher.m
/* DAV access control lists */
Index: sope-appserver/NGObjWeb/WebDAV/SoWebDAVRenderer.m
===================================================================
--- sope-appserver/NGObjWeb/WebDAV/SoWebDAVRenderer.m (révision 1626)
--- sope-appserver/NGObjWeb/WebDAV/SoWebDAVRenderer.m (révision 1630)
+++ sope-appserver/NGObjWeb/WebDAV/SoWebDAVRenderer.m (copie de travail)
@@ -277,7 +277,8 @@
ok = [self renderLockToken:_object inContext:_ctx];
@ -3912,7 +3915,7 @@ Index: sope-appserver/NGObjWeb/WebDAV/SoWebDAVRenderer.m
ok = [self renderStatusResult:_object
Index: sope-appserver/NGObjWeb/WebDAV/SoObject+SoDAV.h
===================================================================
--- sope-appserver/NGObjWeb/WebDAV/SoObject+SoDAV.h (révision 1626)
--- sope-appserver/NGObjWeb/WebDAV/SoObject+SoDAV.h (révision 1630)
+++ sope-appserver/NGObjWeb/WebDAV/SoObject+SoDAV.h (copie de travail)
@@ -62,6 +62,7 @@
properties:(NSDictionary *)_props
@ -3924,7 +3927,7 @@ Index: sope-appserver/NGObjWeb/WebDAV/SoObject+SoDAV.h
inContext:(id)_ctx;
Index: sope-appserver/NGObjWeb/WODirectAction.m
===================================================================
--- sope-appserver/NGObjWeb/WODirectAction.m (révision 1626)
--- sope-appserver/NGObjWeb/WODirectAction.m (révision 1630)
+++ sope-appserver/NGObjWeb/WODirectAction.m (copie de travail)
@@ -46,7 +46,7 @@
}
@ -3959,7 +3962,7 @@ Index: sope-appserver/NGObjWeb/WODirectAction.m
Index: sope-appserver/NGObjWeb/DynamicElements/WOHyperlinkInfo.m
===================================================================
--- sope-appserver/NGObjWeb/DynamicElements/WOHyperlinkInfo.m (révision 1626)
--- sope-appserver/NGObjWeb/DynamicElements/WOHyperlinkInfo.m (révision 1630)
+++ sope-appserver/NGObjWeb/DynamicElements/WOHyperlinkInfo.m (copie de travail)
@@ -216,6 +216,12 @@
assocCount++;
@ -3976,7 +3979,7 @@ Index: sope-appserver/NGObjWeb/DynamicElements/WOHyperlinkInfo.m
Index: sope-appserver/NGObjWeb/DynamicElements/_WOComplexHyperlink.m
===================================================================
--- sope-appserver/NGObjWeb/DynamicElements/_WOComplexHyperlink.m (révision 1626)
--- sope-appserver/NGObjWeb/DynamicElements/_WOComplexHyperlink.m (révision 1630)
+++ sope-appserver/NGObjWeb/DynamicElements/_WOComplexHyperlink.m (copie de travail)
@@ -41,6 +41,7 @@
WOAssociation *string;
@ -4009,7 +4012,7 @@ Index: sope-appserver/NGObjWeb/DynamicElements/_WOComplexHyperlink.m
return NO;
Index: sope-appserver/NGObjWeb/DynamicElements/WOHyperlinkInfo.h
===================================================================
--- sope-appserver/NGObjWeb/DynamicElements/WOHyperlinkInfo.h (révision 1626)
--- sope-appserver/NGObjWeb/DynamicElements/WOHyperlinkInfo.h (révision 1630)
+++ sope-appserver/NGObjWeb/DynamicElements/WOHyperlinkInfo.h (copie de travail)
@@ -41,7 +41,8 @@
WOAssociation *pageName;
@ -4023,7 +4026,7 @@ Index: sope-appserver/NGObjWeb/DynamicElements/WOHyperlinkInfo.h
/* 'ivar' associations */
Index: sope-appserver/NGObjWeb/SoObjects/SoObject.m
===================================================================
--- sope-appserver/NGObjWeb/SoObjects/SoObject.m (révision 1626)
--- sope-appserver/NGObjWeb/SoObjects/SoObject.m (révision 1630)
+++ sope-appserver/NGObjWeb/SoObjects/SoObject.m (copie de travail)
@@ -39,22 +39,34 @@
static int debugLookup = -1;
@ -4174,7 +4177,7 @@ Index: sope-appserver/NGObjWeb/SoObjects/SoObject.m
Index: sope-appserver/NGObjWeb/SoObjects/SoObject+Traversal.m
===================================================================
--- sope-appserver/NGObjWeb/SoObjects/SoObject+Traversal.m (révision 1626)
--- sope-appserver/NGObjWeb/SoObjects/SoObject+Traversal.m (révision 1630)
+++ sope-appserver/NGObjWeb/SoObjects/SoObject+Traversal.m (copie de travail)
@@ -195,7 +195,8 @@
isCreateIfMissingMethod = YES;
@ -4188,7 +4191,7 @@ Index: sope-appserver/NGObjWeb/SoObjects/SoObject+Traversal.m
// TODO: the following are only create-if-missing on the target!
Index: sope-appserver/NGObjWeb/WOHttpAdaptor/WOHttpTransaction.m
===================================================================
--- sope-appserver/NGObjWeb/WOHttpAdaptor/WOHttpTransaction.m (révision 1626)
--- sope-appserver/NGObjWeb/WOHttpAdaptor/WOHttpTransaction.m (révision 1630)
+++ sope-appserver/NGObjWeb/WOHttpAdaptor/WOHttpTransaction.m (copie de travail)
@@ -32,6 +32,7 @@
#include <NGObjWeb/WOCookie.h>
@ -4213,7 +4216,7 @@ Index: sope-appserver/NGObjWeb/WOHttpAdaptor/WOHttpTransaction.m
@implementation WOCoreApplication(SimpleParserSelection)
Index: sope-appserver/NGObjWeb/Defaults.plist
===================================================================
--- sope-appserver/NGObjWeb/Defaults.plist (révision 1626)
--- sope-appserver/NGObjWeb/Defaults.plist (révision 1630)
+++ sope-appserver/NGObjWeb/Defaults.plist (copie de travail)
@@ -216,7 +216,7 @@
SoWebDAVDisableCrossHostMoveCheck = NO;
@ -4234,7 +4237,7 @@ Index: sope-appserver/NGObjWeb/Defaults.plist
DELETE,
Index: sope-appserver/NGObjWeb/WORequest.m
===================================================================
--- sope-appserver/NGObjWeb/WORequest.m (révision 1626)
--- sope-appserver/NGObjWeb/WORequest.m (révision 1630)
+++ sope-appserver/NGObjWeb/WORequest.m (copie de travail)
@@ -597,6 +597,8 @@
if (r.length > 0)
@ -4247,7 +4250,7 @@ Index: sope-appserver/NGObjWeb/WORequest.m
if ((tmp = [self languageForBrowserLanguageCode:language]))
Index: sope-appserver/NGObjWeb/NGHttp/NGHttpRequest.h
===================================================================
--- sope-appserver/NGObjWeb/NGHttp/NGHttpRequest.h (révision 1626)
--- sope-appserver/NGObjWeb/NGHttp/NGHttpRequest.h (révision 1630)
+++ sope-appserver/NGObjWeb/NGHttp/NGHttpRequest.h (copie de travail)
@@ -62,6 +62,10 @@
/* RFC 3253 (DeltaV) */
@ -4262,7 +4265,7 @@ Index: sope-appserver/NGObjWeb/NGHttp/NGHttpRequest.h
Index: sope-appserver/NGObjWeb/NGHttp/NGHttpRequest.m
===================================================================
--- sope-appserver/NGObjWeb/NGHttp/NGHttpRequest.m (révision 1626)
--- sope-appserver/NGObjWeb/NGHttp/NGHttpRequest.m (révision 1630)
+++ sope-appserver/NGObjWeb/NGHttp/NGHttpRequest.m (copie de travail)
@@ -59,6 +59,10 @@
/* RFC 3253 (DeltaV) */