From 7acad8f8f9b671f8fe57b181e852036a5e598be1 Mon Sep 17 00:00:00 2001 From: Wolfgang Sourdeau Date: Tue, 7 Jul 2009 20:56:09 +0000 Subject: [PATCH 1/2] Monotone-Parent: 18a2136e7e775fc22d94d6a7805e474939c22f28 Monotone-Revision: c7fbb37f86d4d228354053447bb000451c74730a Monotone-Author: wsourdeau@inverse.ca Monotone-Date: 2009-07-07T20:56:09 Monotone-Branch: ca.inverse.sogo --- ChangeLog | 8 ++++++++ SoObjects/SOGo/SOGoGCSFolder.m | 27 ++++++++++++++++++++------- 2 files changed, 28 insertions(+), 7 deletions(-) diff --git a/ChangeLog b/ChangeLog index c1048a989..aa430454b 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +2009-07-07 Wolfgang Sourdeau + + * SoObjects/SOGo/SOGoGCSFolder.m (-davSyncCollection:): added the + ability to specify additional filters for elements that must be + returned. + (-additionalWebdavSyncFilters): new method that returns a + parametrable where clause for reset queries. + 2009-07-07 Cyril Robert * UI/WebServerResources/MailerUI.js: Fixed Drag&Drop issue (header was diff --git a/SoObjects/SOGo/SOGoGCSFolder.m b/SoObjects/SOGo/SOGoGCSFolder.m index bc54e036e..0aa9e451d 100644 --- a/SoObjects/SOGo/SOGoGCSFolder.m +++ b/SoObjects/SOGo/SOGoGCSFolder.m @@ -698,7 +698,7 @@ static NSArray *childRecordFields = nil; tmpA = [moduleSettings objectForKey: @"InactiveFolders"]; if (tmpA) - [tmpA removeObject: [self nameInContainer]]; + [tmpA removeObject: nameInContainer]; tmpD = [moduleSettings objectForKey: @"FolderSyncTags"]; if (tmpD) @@ -881,6 +881,11 @@ static NSArray *childRecordFields = nil; ignoreDeleted: ignoreDeleted]; } +- (NSString *) additionalWebdavSyncFilters +{ + return @""; +} + - (NSArray *) _fetchSyncTokenFields: (NSDictionary *) properties matchingSyncToken: (int) syncToken { @@ -893,7 +898,7 @@ static NSArray *childRecordFields = nil; NSArray *records; EOQualifier *qualifier; NSEnumerator *addFields; - NSString *currentField; + NSString *currentField, *filter; fields = [NSMutableArray arrayWithObjects: @"c_name", @"c_component", @"c_creationdate", @"c_lastmodified", nil]; @@ -910,8 +915,8 @@ static NSArray *childRecordFields = nil; withQualifier: qualifier ignoreDeleted: YES]]; qualifier = [EOQualifier qualifierWithQualifierFormat: - @"c_lastmodified > %d and c_deleted == 1", - syncToken]; + @"c_lastmodified > %d and c_deleted == 1", + syncToken]; fields = [NSMutableArray arrayWithObjects: @"c_name", @"c_deleted", nil]; [mRecords addObjectsFromArray: [self _fetchFields: fields withQualifier: qualifier @@ -919,8 +924,15 @@ static NSArray *childRecordFields = nil; records = mRecords; } else - records = [self _fetchFields: fields withQualifier: nil - ignoreDeleted: YES]; + { + filter = [self additionalWebdavSyncFilters]; + if ([filter length]) + qualifier = [EOQualifier qualifierWithQualifierFormat: filter]; + else + qualifier = nil; + records = [self _fetchFields: fields withQualifier: qualifier + ignoreDeleted: YES]; + } return records; } @@ -1115,6 +1127,7 @@ static NSArray *childRecordFields = nil; documentElement = (DOMElement *) [document documentElement]; syncToken = [[documentElement firstElementWithTag: @"sync-token" inNamespace: XMLNS_WEBDAV] textValue]; + propElement = [documentElement firstElementWithTag: @"prop" inNamespace: XMLNS_WEBDAV]; @@ -1333,7 +1346,7 @@ static NSArray *childRecordFields = nil; @" VALUES ('/%@', '%@', '%@')", [folder aclTableName], objectPath, uid, currentRole]; - [channel evaluateExpressionX: SQL]; + [channel evaluateExpressionX: SQL]; } [[channel adaptorContext] commitTransaction]; From 5659a3b1cfcce42eeb62125f197e5e3a0703344f Mon Sep 17 00:00:00 2001 From: Wolfgang Sourdeau Date: Tue, 7 Jul 2009 20:57:00 +0000 Subject: [PATCH 2/2] Monotone-Parent: c7fbb37f86d4d228354053447bb000451c74730a Monotone-Revision: a1fec97888a28b21f11c4743a65a09fe028bf771 Monotone-Author: wsourdeau@inverse.ca Monotone-Date: 2009-07-07T20:57:00 Monotone-Branch: ca.inverse.sogo --- ChangeLog | 4 + .../Appointments/SOGoAppointmentFolder.m | 80 +++++++++++-------- 2 files changed, 51 insertions(+), 33 deletions(-) diff --git a/ChangeLog b/ChangeLog index aa430454b..1f20cbbe5 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,9 @@ 2009-07-07 Wolfgang Sourdeau + * SoObjects/Appointments/SOGoAppointmentFolder.m + (-additionalWebdavSyncFilters): overriden method for returning a + clause that takes the DAV time limit into account. + * SoObjects/SOGo/SOGoGCSFolder.m (-davSyncCollection:): added the ability to specify additional filters for elements that must be returned. diff --git a/SoObjects/Appointments/SOGoAppointmentFolder.m b/SoObjects/Appointments/SOGoAppointmentFolder.m index 7eeb01f1b..a28b29b3b 100644 --- a/SoObjects/Appointments/SOGoAppointmentFolder.m +++ b/SoObjects/Appointments/SOGoAppointmentFolder.m @@ -80,12 +80,14 @@ static NGLogger *logger = nil; static NSNumber *sharedYes = nil; +static int davCalendarStartTimeLimit = 0; + (void) initialize { NGLoggerManager *lm; - static BOOL didInit = NO; - + static BOOL didInit = NO; + NSUserDefaults *ud; + if (!didInit) { didInit = YES; @@ -100,6 +102,10 @@ static NSNumber *sharedYes = nil; logger = [lm loggerForDefaultKey: @"SOGoAppointmentFolderDebugEnabled"]; sharedYes = [[NSNumber numberWithBool: YES] retain]; + + ud = [NSUserDefaults standardUserDefaults]; + davCalendarStartTimeLimit + = [ud integerForKey: @"SOGoDAVCalendarStartTimeLimit"]; } } @@ -1219,28 +1225,17 @@ firstInstanceCalendarDateRange: (NGCalendarDateRange *) fir [r appendString: @"HTTP/1.1 404 Not Found"]; } -- (int) _getStartTimeLimit -{ - NSUserDefaults *ud; - int interval; - - ud = [NSUserDefaults standardUserDefaults]; - interval = [ud integerForKey: @"SOGoDAVCalendarStartTimeLimit"]; - - return interval; -} - - (NSCalendarDate *) _getMaxStartDate { - NSCalendarDate *tmp, *rc = NULL; - int interval; - - interval = [self _getStartTimeLimit]; - if (interval > 0) + NSCalendarDate *tmp, *rc; + + if (davCalendarStartTimeLimit > 0) { tmp = [NSCalendarDate date]; - rc = [tmp addTimeInterval: interval * -86400]; + rc = [tmp addTimeInterval: davCalendarStartTimeLimit * -86400]; } + else + rc = nil; return rc; } @@ -1248,40 +1243,39 @@ firstInstanceCalendarDateRange: (NGCalendarDateRange *) fir - (void) _enforceTimeLimitOnFilter: (NSMutableDictionary *) filter { NSCalendarDate *start, *end, *now; - int limit, interval, intervalStart, intervalEnd; + int interval, intervalStart, intervalEnd; start = [filter objectForKey: @"start"]; end = [filter objectForKey: @"end"]; now = [NSCalendarDate date]; - limit = [self _getStartTimeLimit]; interval = ([end timeIntervalSinceDate: start] / 86400); - if (limit > 0 && interval > limit) + if (davCalendarStartTimeLimit > 0 && interval > davCalendarStartTimeLimit) { if ([now compare: start] == NSOrderedDescending && [now compare: end] == NSOrderedAscending) { intervalStart = [now timeIntervalSinceDate: start] / 86400; intervalEnd = [end timeIntervalSinceDate: now] / 86400; - if (intervalStart > limit / 2) + if (intervalStart > davCalendarStartTimeLimit / 2) { - start = [now addTimeInterval: (limit / 2) * -86400]; + start = [now addTimeInterval: (davCalendarStartTimeLimit / 2) * -86400]; [filter setObject: start forKey: @"start"]; } - if (intervalEnd > limit / 2) + if (intervalEnd > davCalendarStartTimeLimit / 2) { - end = [now addTimeInterval: (limit / 2) * 86400]; + end = [now addTimeInterval: (davCalendarStartTimeLimit / 2) * 86400]; [filter setObject: end forKey: @"end"]; } } else if ([now compare: end] == NSOrderedDescending) { - start = [end addTimeInterval: limit * -86400]; + start = [end addTimeInterval: davCalendarStartTimeLimit * -86400]; [filter setObject: start forKey: @"start"]; } else if ([now compare: start] == NSOrderedAscending) { - end = [start addTimeInterval: limit * 86400]; + end = [start addTimeInterval: davCalendarStartTimeLimit * 86400]; [filter setObject: end forKey: @"end"]; } } @@ -1307,14 +1301,13 @@ firstInstanceCalendarDateRange: (NGCalendarDateRange *) fir - (void) _addDateRangeLimitToFilter: (NSMutableDictionary *) filter { NSCalendarDate *now; - int limit; + NSTimeInterval rangeLimit; now = [NSCalendarDate date]; - limit = [self _getStartTimeLimit]; - - [filter setObject: [now addTimeInterval: (limit / 2) * -86400] + rangeLimit = (davCalendarStartTimeLimit / 2) * -86400; + [filter setObject: [now addTimeInterval: rangeLimit] forKey: @"start"]; - [filter setObject: [now addTimeInterval: (limit / 2) * 86400] + [filter setObject: [now addTimeInterval: rangeLimit * -1] forKey: @"end"]; } @@ -1882,6 +1875,27 @@ firstInstanceCalendarDateRange: (NGCalendarDateRange *) fir return r; } +- (NSString *) additionalWebdavSyncFilters +{ + NSCalendarDate *startDate; + NSString *filter; + int startDateSecs; + + startDate = [self _getMaxStartDate]; + if (startDate) + { + startDateSecs = (int) [startDate timeIntervalSince1970]; + filter = [NSString stringWithFormat: @"c_enddate = NULL" + @" OR (c_enddate >= %d AND c_iscycle = 0)" + @" OR (c_cycleenddate >= %d AND c_iscycle = 1)", + startDateSecs, startDateSecs]; + } + else + filter = @""; + + return filter; +} + - (Class) objectClassForContent: (NSString *) content { iCalCalendar *calendar;