diff --git a/ChangeLog b/ChangeLog index 4a03c67c9..6aa0bdbd4 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,12 @@ 2006-10-25 Wolfgang Sourdeau + * UI/MainUI/SOGoUserHomePage.m ([SOGoUserHomePage + -readFreeBusyAction]): new method that returns an array of numbers + corresponding to the state in the freebusy of each "quarter of an + hour" between the "sday" and "eday" date parameters passed in the + url. This permits to handle the display of the freebusy with Ajax + mechanisms. + * UI/Contacts/UIxContactFoldersView.m ([UIxContactFoldersView -contactSearchAction]): new action that returns the uid and the username + email of the user whose name contain the value of the diff --git a/UI/MainUI/SOGoUserHomePage.m b/UI/MainUI/SOGoUserHomePage.m index 596f820fd..e229d9729 100644 --- a/UI/MainUI/SOGoUserHomePage.m +++ b/UI/MainUI/SOGoUserHomePage.m @@ -19,6 +19,11 @@ 02111-1307, USA. */ +#import +#import +#import +#import + #import #import @@ -233,4 +238,110 @@ static NSArray *internetAccessStates = nil; return [NSException exceptionWithHTTPStatus:200 /* OK */]; } +- (void) _fillFreeBusyItems: (NSMutableArray *) items + withRecords: (NSEnumerator *) records + fromStartDate: (NSCalendarDate *) startDate + toEndDate: (NSCalendarDate *) endDate +{ + NSDictionary *record; + unsigned int count, startInterval, endInterval, value; + NSNumber *status; + NSCalendarDate *currentDate; + + record = [records nextObject]; + while (record) + { + status = [record objectForKey: @"status"]; + + value = [[record objectForKey: @"startdate"] intValue]; + currentDate = [NSCalendarDate dateWithTimeIntervalSince1970: value]; + if ([currentDate earlierDate: startDate] == currentDate) + startInterval = 0; + else + startInterval + = ([currentDate timeIntervalSinceDate: startDate] / 900); + + value = [[record objectForKey: @"enddate"] intValue]; + currentDate = [NSCalendarDate dateWithTimeIntervalSince1970: value]; + if ([currentDate earlierDate: endDate] == endDate) + endInterval = [items count] - 1; + else + endInterval = ([currentDate timeIntervalSinceDate: startDate] / 900); + + for (count = startInterval; count < endInterval; count++) + [items replaceObjectAtIndex: count withObject: status]; + + record = [records nextObject]; + } +} + +- (NSString *) _freeBusyAsTextFromStartDate: (NSCalendarDate *) startDate + toEndDate: (NSCalendarDate *) endDate + forFreeBusy: (SOGoFreeBusyObject *) fb +{ + NSEnumerator *records; + NSMutableArray *freeBusyItems; + NSTimeInterval interval; + unsigned int count, intervals; + + interval = [endDate timeIntervalSinceDate: startDate] + 60; + intervals = interval / 900; /* slices of 15 minutes */ + freeBusyItems = [NSMutableArray arrayWithCapacity: intervals]; + for (count = 0; count < intervals - 1; count++) + [freeBusyItems addObject: @"0"]; + + records = [[fb fetchFreebusyInfosFrom: startDate to: endDate] objectEnumerator]; + [self _fillFreeBusyItems: freeBusyItems withRecords: records + fromStartDate: startDate toEndDate: endDate]; + + return [freeBusyItems componentsJoinedByString: @","]; +} + +- (NSString *) _freeBusyAsText +{ + SOGoFreeBusyObject *co; + NSCalendarDate *startDate, *endDate; + NSString *queryDay; + NSTimeZone *uTZ; + + co = [self clientObject]; + uTZ = [co userTimeZone]; + + queryDay = [self queryParameterForKey: @"sday"]; + if ([queryDay length]) + startDate = [NSCalendarDate dateFromShortDateString: queryDay + andShortTimeString: @"0000" + inTimeZone: uTZ]; + else + { + startDate = [NSCalendarDate calendarDate]; + [startDate setTimeZone: uTZ]; + startDate = [startDate hour: 0 minute: 0]; + } + + queryDay = [self queryParameterForKey: @"eday"]; + if ([queryDay length]) + endDate = [NSCalendarDate dateFromShortDateString: queryDay + andShortTimeString: @"2359" + inTimeZone: uTZ]; + else + endDate = [startDate hour: 23 minute: 59]; + + return [self _freeBusyAsTextFromStartDate: startDate toEndDate: endDate + forFreeBusy: co]; +} + +- (id ) readFreeBusyAction +{ + WOResponse *response; + + response = [context response]; + [response setStatus: 200]; + [response setHeader: @"text/plain; charset=iso-8859-1" + forKey: @"Content-Type"]; + [response appendContentString: [self _freeBusyAsText]]; + + return response; +} + @end /* SOGoUserHomePage */ diff --git a/UI/MainUI/product.plist b/UI/MainUI/product.plist index 19da3a97b..9f2869c32 100644 --- a/UI/MainUI/product.plist +++ b/UI/MainUI/product.plist @@ -77,6 +77,16 @@ }; }; }; + SOGoFreeBusyObject = { + superclass = "SOGoObject"; + methods = { + ajaxRead = { + protectedBy = "View"; + pageName = "SOGoUserHomePage"; + actionName = "readFreeBusy"; + }; + }; + }; SOGoCustomGroupFolder = { superclass = "SOGoGroupFolder"; methods = {