]> err.no Git - scalable-opengroupware.org/blobdiff - UI/MainUI/SOGoUserHomePage.m
git-svn-id: http://svn.opengroupware.org/SOGo/inverse/trunk@1101 d1b88da0-ebda-0310...
[scalable-opengroupware.org] / UI / MainUI / SOGoUserHomePage.m
index 4cd16e76e34185fe1b0c84d85c5c545d823114fd..3b54ade19a60315619c039f9093ff7fd89985dfe 100644 (file)
  * Boston, MA 02111-1307, USA.
  */
 
+#import <Foundation/NSArray.h>
+#import <Foundation/NSCalendarDate.h>
+#import <Foundation/NSDictionary.h>
+#import <Foundation/NSValue.h>
 #import <NGObjWeb/WORequest.h>
+#import <NGObjWeb/WOResponse.h>
+#import <NGExtensions/NSCalendarDate+misc.h>
+
+#import <Appointments/SOGoFreeBusyObject.h>
+#import <SOGo/SOGoUser.h>
+#import <SOGo/NSCalendarDate+SOGo.h>
 #import <SOGoUI/UIxComponent.h>
 
 @interface SOGoUserHomePage : UIxComponent
   return [self redirectToLocation: url];
 }
 
+- (void) _fillFreeBusyItems: (NSMutableArray *) items
+                withRecords: (NSEnumerator *) records
+              fromStartDate: (NSCalendarDate *) startDate
+                  toEndDate: (NSCalendarDate *) endDate
+{
+  NSDictionary *record;
+  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;
+  int count, intervals;
+
+  interval = [endDate timeIntervalSinceDate: startDate] + 60;
+  intervals = interval / 900; /* slices of 15 minutes */
+  freeBusyItems = [NSMutableArray arrayWithCapacity: intervals];
+  for (count = 1; count < intervals; 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, *additionalDays;
+  NSTimeZone *uTZ;
+  SOGoUser *user;
+
+  co = [self clientObject];
+  user = [context activeUser];
+  uTZ = [user timeZone];
+
+  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];
+
+  additionalDays = [self queryParameterForKey: @"additional"];
+  if ([additionalDays length] > 0)
+    endDate = [endDate dateByAddingYears: 0 months: 0
+                       days: [additionalDays intValue]
+                       hours: 0 minutes: 0 seconds: 0];
+
+  return [self _freeBusyAsTextFromStartDate: startDate toEndDate: endDate
+               forFreeBusy: co];
+}
+
+- (id <WOActionResults>) 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