+2007-08-07 Wolfgang Sourdeau <wsourdeau@inverse.ca>
+
+ * SoObjects/Appointments/SOGoCalendarComponent.m
+ ([SOGoCalendarComponent
+ -sendEMailUsingTemplateNamed:_pageNameforOldObject:_oldObjectandNewObject:_newObjecttoAttendees:_attendees]):
+ set the mail date to the current date string returned by our
+ rfc822DateString extension method.
+
+ * UI/Contacts/UIxContactFoldersView.m ([UIxContactFoldersView
+ -_gcsFoldersFromFolder:): ignore the personal folders who are
+ returned but don't really exist.
+
2007-08-02 Francis Lachapelle <flachapelle@inverse.ca>
* UI/Contacts/UIxContactFoldersView.m ([UIxContactFoldersView _responseForResults:]):
+2007-08-07 Wolfgang Sourdeau <wsourdeau@inverse.ca>
+
+ * iCalRecurrenceRule.m ([iCalRecurrenceRule
+ -valueForFrequency:value]): returns NSNotFound whenever the
+ frequency text has a length of 0.
+ ([iCalRecurrenceRule -byDayMask]): return an empty mask whenever
+ the "byday" value has a length of 0.
+
+2007-02-12 Helge Hess <helge.hess@opengroupware.org>
+
+ * iCalMonthlyRecurrenceCalculator.m: fixed byday calculation for days
+ which overflow the number of days in a month. Should fix OGo bug
+ #1829. (v4.7.79)
+
2007-07-10 Wolfgang Sourdeau <wsourdeau@inverse.ca>
* iCalToDo.m ([iCalToDo -setDue:newDueDate]): use setDateTime:
/*
- Copyright (C) 2004-2005 SKYRIX Software AG
+ Copyright (C) 2004-2007 SKYRIX Software AG
+ Copyright (C) 2007 Helge Hess
This file is part of SOPE.
unsigned monthIdxInRange, numberOfMonthsInRange, interval;
int diff;
NGMonthSet byMonthList = { // TODO: fill from rrule, this is the default
+ /* enable all months of the year */
YES, YES, YES, YES, YES, YES,
YES, YES, YES, YES, YES, YES
};
- NSArray *byMonthDay = nil; // array of ints (-31..-1 and 1..31)
+ NSArray *byMonthDay; // array of ints (-31..-1 and 1..31)
NGMonthDaySet byMonthDaySet;
eventStartDate = [self->firstRange startDate];
eventDayOfMonth = [eventStartDate dayOfMonth];
- timeZone = [eventStartDate timeZone];
- rStart = [_r startDate];
- rEnd = [_r endDate];
- interval = [self->rrule repeatInterval];
- until = [self lastInstanceStartDate]; // TODO: maybe replace
- byMonthDay = [self->rrule byMonthDay];
+ timeZone = [eventStartDate timeZone];
+ rStart = [_r startDate];
+ rEnd = [_r endDate];
+ interval = [self->rrule repeatInterval];
+ until = [self lastInstanceStartDate]; // TODO: maybe replace
+ byMonthDay = [self->rrule byMonthDay];
/* check whether the range to be processed is beyond the 'until' date */
/* precalculate month days (same for all instances) */
- if (byMonthDay != nil)
+ if (byMonthDay != nil) {
+#if HEAVY_DEBUG
+ NSLog(@"byMonthDay: %@", byMonthDay);
+#endif
NGMonthDaySet_fillWithByMonthDay(&byMonthDaySet, byMonthDay);
+ }
// TODO: I think the 'diff' is to skip recurrence which are before the
- check whether the month is in the BYMONTH list
*/
+ /*
+ Note: the function below adds exactly a month, eg:
+ 2007-01-30 + 1month => 2007-02-*28*!!
+ */
cursor = [eventStartDate dateByAddingYears:0
months:(diff + monthIdxInRange)
days:0];
// TODO: add processing of byhour/byminute/bysecond etc
+ /*
+ Next step is to create NSCalendarDate instances from our 'monthDays'
+ set. We walk over each day of the 'monthDays' set. If its flag isn't
+ set, we continue.
+ If its set, we add the date to the instance.
+
+ The 'cursor' is the *startdate* of the event (not necessarily a
+ component of the sequence!) plus the currently processed month.
+ Eg:
+ startdate: 2007-01-30
+ cursor[1]: 2007-01-30
+ cursor[2]: 2007-02-28 <== Note: we have February!
+ */
+
for (dom = 1, doCont = YES; dom <= numDaysInMonth && doCont; dom++) {
NSCalendarDate *start;
if (!monthDays[dom])
continue;
-
- if (eventDayOfMonth == dom)
+
+ // TODO: what is this good for?
+ /*
+ Here we need to correct the date. Remember that the startdate given in
+ the event is not necessarily a date of the sequence!
+
+ The 'numDaysInMonth' localvar contains the number of days in the
+ current month (eg 31 for Januar, 28 for most February's, etc)
+
+ Eg: MONTHLY;BYDAY=-1WE (last wednesday, every month)
+
+ cursor: 2007-01-30 (eventDayOfMonth = 30)
+ =>start: 2007-01-31 (dom = 31)
+ cursor: 2007-02-28 (eventDayOfMonth = 30)
+ =>start: 2007-02-28 (dom = 28)
+
+ Note: in case the cursor already had an event-day overflow, that is the
+ 'eventDayOfMonth' is bigger than the 'numDaysInMonth', the cursor
+ will already be corrected!
+ Eg:
+ start was: 2007-01-30
+ cursor will be: 2007-02-28
+ */
+ if (eventDayOfMonth == dom) {
start = cursor;
+ }
else {
- start = [cursor dateByAddingYears:0 months:0
- days:(dom - eventDayOfMonth)];
+ int maxDay =
+ eventDayOfMonth > numDaysInMonth ? numDaysInMonth : eventDayOfMonth;
+
+ start = [cursor dateByAddingYears:0 months:0 days:(dom - maxDay)];
}
-
+
+ /*
+ Setup for 2007-02-28, MONTHLY;BYDAY=-1WE.
+ dom: 28
+ eventDayOfMonth: 31
+ cursor: 2007-02-28
+ start: 2007-02-25 <== WRONG
+ */
+
+#if HEAVY_DEBUG
+ NSLog(@"DOM %i EDOM %i NUMDAYS %i START: %@ CURSOR: %@",
+ dom, eventDayOfMonth, numDaysInMonth,
+ start, cursor);
+#endif
doCont = [self _addInstanceWithStartDate:start
limitDate:until
limitRange:_r
NSString *frequency;
iCalRecurrenceFrequency freq;
- frequency = [value uppercaseString];
- if ([frequency isEqualToString:@"WEEKLY"])
- freq = iCalRecurrenceFrequenceWeekly;
- else if ([frequency isEqualToString:@"MONTHLY"])
- freq = iCalRecurrenceFrequenceMonthly;
- else if ([frequency isEqualToString:@"DAILY"])
- freq = iCalRecurrenceFrequenceDaily;
- else if ([frequency isEqualToString:@"YEARLY"])
- freq = iCalRecurrenceFrequenceYearly;
- else if ([frequency isEqualToString:@"HOURLY"])
- freq = iCalRecurrenceFrequenceHourly;
- else if ([frequency isEqualToString:@"MINUTELY"])
- freq = iCalRecurrenceFrequenceMinutely;
- else if ([frequency isEqualToString:@"SECONDLY"])
- freq = iCalRecurrenceFrequenceSecondly;
+ if ([value length] > 0)
+ {
+ frequency = [value uppercaseString];
+ if ([frequency isEqualToString:@"WEEKLY"])
+ freq = iCalRecurrenceFrequenceWeekly;
+ else if ([frequency isEqualToString:@"MONTHLY"])
+ freq = iCalRecurrenceFrequenceMonthly;
+ else if ([frequency isEqualToString:@"DAILY"])
+ freq = iCalRecurrenceFrequenceDaily;
+ else if ([frequency isEqualToString:@"YEARLY"])
+ freq = iCalRecurrenceFrequenceYearly;
+ else if ([frequency isEqualToString:@"HOURLY"])
+ freq = iCalRecurrenceFrequenceHourly;
+ else if ([frequency isEqualToString:@"MINUTELY"])
+ freq = iCalRecurrenceFrequenceMinutely;
+ else if ([frequency isEqualToString:@"SECONDLY"])
+ freq = iCalRecurrenceFrequenceSecondly;
+ else
+ freq = NSNotFound;
+ }
else
freq = NSNotFound;
{
NSArray *days;
unsigned int mask, count, max;
- NSString *day;
+ NSString *day, *value;
mask = 0;
- days = [[self namedValue: @"byday"] componentsSeparatedByString: @","];
- max = [days count];
- for (count = 0; count < max; count++)
+ value = [self namedValue: @"byday"];
+ if ([value length] > 0)
{
- day = [days objectAtIndex: count];
- day = [day substringFromIndex: [day length] - 2];
- mask |= [self weekDayFromICalRepresentation: day];
+ days = [value componentsSeparatedByString: @","];
+ max = [days count];
+ for (count = 0; count < max; count++)
+ {
+ day = [days objectAtIndex: count];
+ day = [day substringFromIndex: [day length] - 2];
+ mask |= [self weekDayFromICalRepresentation: day];
+ }
}
return mask;
#import <NGMail/NGSendMail.h>
#import <SoObjects/SOGo/LDAPUserManager.h>
+#import <SoObjects/SOGo/NSCalendarDate+SOGo.h>
#import <SoObjects/SOGo/SOGoPermissions.h>
#import <SoObjects/SOGo/SOGoUser.h>
#import <SoObjects/Appointments/SOGoAppointmentFolder.h>
iCalPerson *attendee;
NSString *recipient;
SOGoAptMailNotification *p;
- NSString *subject, *text, *header;
+ NSString *mailDate, *subject, *text, *header;
NGMutableHashMap *headerMap;
NGMimeMessage *msg;
NGMimeBodyPart *bodyPart;
[headerMap setObject: @"multipart/mixed" forKey: @"content-type"];
[headerMap setObject: sender forKey: @"From"];
[headerMap setObject: recipient forKey: @"To"];
- [headerMap setObject: [NSCalendarDate date] forKey: @"date"];
+ mailDate = [[NSCalendarDate date] rfc822DateString];
+ [headerMap setObject: mailDate forKey: @"date"];
[headerMap setObject: subject forKey: @"Subject"];
msg = [NGMimeMessage messageWithHeader: headerMap];
if ([currentContactFolder
isKindOfClass: [SOGoContactGCSFolder class]])
{
- folderName = [NSString stringWithFormat: @"/Contacts/%@",
- [currentContactFolder nameInContainer]];
- currentDictionary = [NSMutableDictionary new];
- [currentDictionary autorelease];
displayName = [[currentContactFolder ocsFolder] folderName];
- [currentDictionary setObject: displayName forKey: @"displayName"];
- [currentDictionary setObject: folderName forKey: @"name"];
- [currentDictionary setObject: @"contact" forKey: @"type"];
- [gcsFolders addObject: currentDictionary];
+ if (displayName)
+ {
+ folderName = [NSString stringWithFormat: @"/Contacts/%@",
+ [currentContactFolder nameInContainer]];
+ currentDictionary
+ = [NSMutableDictionary dictionaryWithCapacity: 3];
+ [currentDictionary setObject: displayName forKey: @"displayName"];
+ [currentDictionary setObject: folderName forKey: @"name"];
+ [currentDictionary setObject: @"contact" forKey: @"type"];
+ [gcsFolders addObject: currentDictionary];
+ }
}
currentContactFolder = [contactSubfolders nextObject];
}
}
offset = nodes.length - 1;
}
- else
- window.alert("nope:" + window.opener.userFolderType);
+// else
+// window.alert("nope:" + window.opener.userFolderType);
return offset;
}