From 4df426caa06f7a7d3b806ccff9de51b289c7aeaa Mon Sep 17 00:00:00 2001 From: Wolfgang Sourdeau Date: Tue, 26 Sep 2006 22:27:34 +0000 Subject: [PATCH] Monotone-Parent: ee6d5acdac6159d8fbb65889d8a847a6de96dcce Monotone-Revision: f6c0e7b189ab5cb8693eed0b3a987d07e64bf77a Monotone-Author: wsourdeau@inverse.ca Monotone-Date: 2006-09-26T22:27:34 Monotone-Branch: ca.inverse.sogo --- ChangeLog | 6 + .../Appointments/SOGoAppointmentFolder.m | 142 +++++++++++++++++- 2 files changed, 145 insertions(+), 3 deletions(-) diff --git a/ChangeLog b/ChangeLog index 52bea6068..96ce383d2 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,11 @@ 2006-09-26 Wolfgang Sourdeau + * SoObjects/Appointments/SOGoAppointmentFolder.m + ([SOGoAppointmentFolder -lookupName:inContext:acquire:]): be + sensitive to the CalDAV method names. + ([SOGoAppointmentFolder -doCalendarQuery:context]): method for the + "calendar-query" CalDAV method name. + * UI/WebServerResources/ContactsUI.js: removed a lot of useless code coming originally from MailerUI.js. diff --git a/SoObjects/Appointments/SOGoAppointmentFolder.m b/SoObjects/Appointments/SOGoAppointmentFolder.m index e9f2f71dc..7352377a1 100644 --- a/SoObjects/Appointments/SOGoAppointmentFolder.m +++ b/SoObjects/Appointments/SOGoAppointmentFolder.m @@ -29,12 +29,43 @@ #include #include "common.h" +#import "SOGoAppointmentObject.h" + #if APPLE_Foundation_LIBRARY || NeXT_Foundation_LIBRARY @interface NSDate(UsedPrivates) - (id)initWithTimeIntervalSince1970:(NSTimeInterval)_interval; @end #endif +@interface NSString (SOGoExtensions) + +- calDavMethodToObjC; + +@end + +@implementation NSString (SOGoExtensions) + +- calDavMethodToObjC +{ + NSMutableString *newName; + NSEnumerator *components; + NSString *component; + + newName = [NSMutableString new]; + [newName autorelease]; + components = [[self componentsSeparatedByString: @"-"] objectEnumerator]; + component = [components nextObject]; + while (component) + { + [newName appendString: [component capitalizedString]]; + component = [components nextObject]; + } + + return newName; +} + +@end + @implementation SOGoAppointmentFolder static NGLogger *logger = nil; @@ -63,6 +94,13 @@ static NSNumber *sharedYes = nil; sharedYes = [[NSNumber numberWithBool:YES] retain]; } +- (id) REPORTAction: (id) _ctx +{ + NSLog (@"report action..."); + + return @"coucou"; +} + - (void) dealloc { [self->uidToFilename release]; @@ -101,7 +139,6 @@ static NSNumber *sharedYes = nil; inContext: (id)_ctx { static Class aptClass = Nil; - id apt; if (aptClass == Nil) aptClass = NSClassFromString(@"SOGoAppointmentObject"); @@ -110,8 +147,104 @@ static NSNumber *sharedYes = nil; return nil; } - apt = [[aptClass alloc] initWithName:_key inContainer:self]; - return [apt autorelease]; + return [aptClass objectWithName: _key inContainer: self]; +} + +- (id) lookupActionForCalDAVMethod: (NSString *)_key +{ + SoSelectorInvocation *invocation; + NSString *name; + + name = [NSString stringWithFormat: @"do%@:", + [_key calDavMethodToObjC]]; + + invocation = [[SoSelectorInvocation alloc] + initWithSelectorNamed: name + addContextParameter: YES]; + [invocation autorelease]; + + return invocation; +} + +- (void) appendAppointment: (NSDictionary *) appointment + withBaseURL: (NSString *) baseURL + toREPORTResponse: (WOResponse *) r +{ + SOGoAppointmentObject *realApt; + NSString *uid, *etagLine, *dataLine; + + uid = [appointment objectForKey: @"uid"]; + + realApt = [SOGoAppointmentObject objectWithName: uid + inContainer: self]; + + [r appendContentString: @" \r\n"]; + [r appendContentString: @" "]; + [r appendContentString: baseURL]; + if (![baseURL hasSuffix: @"/"]) + [r appendContentString: @"/"]; + [r appendContentString: uid]; + [r appendContentString: @"\r\n"]; + + [r appendContentString: @" \r\n"]; + [r appendContentString: @" \r\n"]; + etagLine = [NSString stringWithFormat: @" %@\r\n", + [realApt davEntityTag]]; + [r appendContentString: etagLine]; + [r appendContentString: @" \r\n"]; + [r appendContentString: @" HTTP/1.1 200 OK\r\n"]; + [r appendContentString: @" \r\n"]; + + dataLine + = [NSString + stringWithFormat: @" %@\r\n", + [realApt contentAsString]]; + [r appendContentString: dataLine]; + + [r appendContentString: @" \r\n"]; +} + +- (id) doCalendarQuery: (id) context +{ + WOResponse *r; + NSString *baseURL; + NSArray *apts; + NSEnumerator *appointments; + NSDictionary *appointment; + +// FIXME: this is f00ked UP +// FIXME: no, just kidding... actually we should take the date range into +// account otherwise all events will be returned. We should also manage the +// VTODO... and well, have a clean implementation. + + apts + = [self fetchCoreInfosFrom: + [NSCalendarDate dateWithTimeIntervalSince1970: 0] + to: + [NSCalendarDate dateWithTimeIntervalSince1970: 0x7fffffff]]; + + baseURL = [self baseURLInContext: context]; + r = [context response]; + [r setStatus: 207]; + [r setContentEncoding: NSUTF8StringEncoding]; + [r setHeader: @"text/xml; charset=\"utf-8\"" forKey: @"content-type"]; + [r setHeader: @"no-cache" forKey: @"pragma"]; + [r setHeader: @"no-cache" forKey: @"cache-control"]; + [r appendContentString:@"\r\n"]; + [r appendContentString: @"\r\n"]; + appointments = [apts objectEnumerator]; + appointment = [appointments nextObject]; + while (appointment) + { + [self appendAppointment: appointment + withBaseURL: baseURL + toREPORTResponse: r]; + appointment = [appointments nextObject]; + } + [r appendContentString:@"\r\n"]; + + return r; } - (id) lookupName: (NSString *)_key @@ -124,6 +257,9 @@ static NSNumber *sharedYes = nil; if ((obj = [super lookupName:_key inContext:_ctx acquire:NO])) return obj; + if ([_key hasPrefix: @"{urn:ietf:params:xml:ns:caldav}"]) + return [self lookupActionForCalDAVMethod: [_key substringFromIndex: 31]]; + if ([self isValidAppointmentName:_key]) return [self appointmentWithName:_key inContext:_ctx];