(feat) initial support for EAS recurring tasks
parent
5e27437b25
commit
90fcd572c3
|
@ -35,6 +35,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
#import <Foundation/NSString.h>
|
#import <Foundation/NSString.h>
|
||||||
|
|
||||||
#import <NGCards/iCalEvent.h>
|
#import <NGCards/iCalEvent.h>
|
||||||
|
#import <NGCards/iCalToDo.h>
|
||||||
#import <NGCards/iCalByDayMask.h>
|
#import <NGCards/iCalByDayMask.h>
|
||||||
|
|
||||||
#import <NGCards/iCalDateTime.h>
|
#import <NGCards/iCalDateTime.h>
|
||||||
|
@ -59,11 +60,17 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
- (NSString *) activeSyncRepresentationInContext: (WOContext *) context
|
- (NSString *) activeSyncRepresentationInContext: (WOContext *) context
|
||||||
{
|
{
|
||||||
NSMutableString *s;
|
NSMutableString *s;
|
||||||
|
NSString *t;
|
||||||
int type;
|
int type;
|
||||||
|
|
||||||
s = [NSMutableString string];
|
s = [NSMutableString string];
|
||||||
|
|
||||||
[s appendString: @"<Recurrence xmlns=\"Calendar:\">"];
|
if ([[self parent] isKindOfClass: [iCalToDo class]])
|
||||||
|
t = @"Tasks";
|
||||||
|
else
|
||||||
|
t = @"Calendar";
|
||||||
|
|
||||||
|
[s appendFormat: @"<Recurrence xmlns=\"%@:\">", t];
|
||||||
|
|
||||||
// 0 -> daily, 1 -> weekly, 2 -> montly, 5 -> yearly
|
// 0 -> daily, 1 -> weekly, 2 -> montly, 5 -> yearly
|
||||||
type = 0;
|
type = 0;
|
||||||
|
@ -75,11 +82,11 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
// 1 -> sunday, 2 -> monday, 4 -> tuesday, 8 -> wednesday, 16 -> thursday, 32 -> friday, 64 -> saturday, 127 -> last day of month (montly or yearl recurrences only)
|
// 1 -> sunday, 2 -> monday, 4 -> tuesday, 8 -> wednesday, 16 -> thursday, 32 -> friday, 64 -> saturday, 127 -> last day of month (montly or yearl recurrences only)
|
||||||
if ([[self byDayMask] isWeekDays])
|
if ([[self byDayMask] isWeekDays])
|
||||||
{
|
{
|
||||||
[s appendFormat: @"<Recurrence_DayOfWeek xmlns=\"Calendar:\">%d</Recurrence_DayOfWeek>", (2|4|8|16|32)];
|
[s appendFormat: @"<Recurrence_DayOfWeek xmlns=\"%@:\">%d</Recurrence_DayOfWeek>", t, (2|4|8|16|32)];
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
[s appendFormat: @"<Recurrence_Interval xmlns=\"Calendar:\">%d</Recurrence_Interval>", [self repeatInterval]];
|
[s appendFormat: @"<Recurrence_Interval xmlns=\"%@:\">%d</Recurrence_Interval>", t, [self repeatInterval]];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if ([self frequency] == iCalRecurrenceFrequenceWeekly)
|
else if ([self frequency] == iCalRecurrenceFrequenceWeekly)
|
||||||
|
@ -107,8 +114,8 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
v = (1 << [[self _adjustedStartDate] dayOfWeek]);
|
v = (1 << [[self _adjustedStartDate] dayOfWeek]);
|
||||||
}
|
}
|
||||||
|
|
||||||
[s appendFormat: @"<Recurrence_DayOfWeek xmlns=\"Calendar:\">%d</Recurrence_DayOfWeek>", v];
|
[s appendFormat: @"<Recurrence_DayOfWeek xmlns=\"%@:\">%d</Recurrence_DayOfWeek>", t, v];
|
||||||
[s appendFormat: @"<Recurrence_Interval xmlns=\"Calendar:\">%d</Recurrence_Interval>", [self repeatInterval]];
|
[s appendFormat: @"<Recurrence_Interval xmlns=\"%@:\">%d</Recurrence_Interval>", t, [self repeatInterval]];
|
||||||
}
|
}
|
||||||
else if ([self frequency] == iCalRecurrenceFrequenceMonthly)
|
else if ([self frequency] == iCalRecurrenceFrequenceMonthly)
|
||||||
{
|
{
|
||||||
|
@ -125,8 +132,8 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
if (firstOccurrence < 0)
|
if (firstOccurrence < 0)
|
||||||
firstOccurrence = 5;
|
firstOccurrence = 5;
|
||||||
|
|
||||||
[s appendFormat: @"<Recurrence_DayOfWeek xmlns=\"Calendar:\">%d</Recurrence_DayOfWeek>", (1 << [dm firstDay])];
|
[s appendFormat: @"<Recurrence_DayOfWeek xmlns=\"%@:\">%d</Recurrence_DayOfWeek>", t, (1 << [dm firstDay])];
|
||||||
[s appendFormat: @"<Recurrence_WeekOfMonth xmlns=\"Calendar:\">%d</Recurrence_WeekOfMonth>", firstOccurrence];
|
[s appendFormat: @"<Recurrence_WeekOfMonth xmlns=\"%@:\">%d</Recurrence_WeekOfMonth>", t, firstOccurrence];
|
||||||
}
|
}
|
||||||
else if ([[self byMonthDay] count])
|
else if ([[self byMonthDay] count])
|
||||||
{
|
{
|
||||||
|
@ -140,8 +147,8 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
iCalByDayMask *dm;
|
iCalByDayMask *dm;
|
||||||
|
|
||||||
dm = [self byDayMask];
|
dm = [self byDayMask];
|
||||||
[s appendFormat: @"<Recurrence_DayOfWeek xmlns=\"Calendar:\">%d</Recurrence_DayOfWeek>", (1 << [dm firstDay])];
|
[s appendFormat: @"<Recurrence_DayOfWeek xmlns=\"%@:\">%d</Recurrence_DayOfWeek>", t, (1 << [dm firstDay])];
|
||||||
[s appendFormat: @"<Recurrence_WeekOfMonth xmlns=\"Calendar:\">%d</Recurrence_WeekOfMonth>", 5];
|
[s appendFormat: @"<Recurrence_WeekOfMonth xmlns=\"%@:\">%d</Recurrence_WeekOfMonth>", t, 5];
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -153,7 +160,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
{
|
{
|
||||||
// Simple reccurrence rule of type "Monthly"
|
// Simple reccurrence rule of type "Monthly"
|
||||||
type = 2;
|
type = 2;
|
||||||
[s appendFormat: @"<Recurrence_DayOfMonth xmlns=\"Calendar:\">%d</Recurrence_DayOfMonth>", [[self _adjustedStartDate] dayOfMonth]];
|
[s appendFormat: @"<Recurrence_DayOfMonth xmlns=\"%@:\">%d</Recurrence_DayOfMonth>", t, [[self _adjustedStartDate] dayOfMonth]];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if ([self frequency] == iCalRecurrenceFrequenceYearly)
|
else if ([self frequency] == iCalRecurrenceFrequenceYearly)
|
||||||
|
@ -172,38 +179,39 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
if (firstOccurrence < 0)
|
if (firstOccurrence < 0)
|
||||||
firstOccurrence = 5;
|
firstOccurrence = 5;
|
||||||
|
|
||||||
[s appendFormat: @"<Recurrence_DayOfWeek xmlns=\"Calendar:\">%d</Recurrence_DayOfWeek>", (1 << [dm firstDay])];
|
[s appendFormat: @"<Recurrence_DayOfWeek xmlns=\"%@:\">%d</Recurrence_DayOfWeek>", t, (1 << [dm firstDay])];
|
||||||
[s appendFormat: @"<Recurrence_WeekOfMonth xmlns=\"Calendar:\">%d</Recurrence_WeekOfMonth>", firstOccurrence];
|
[s appendFormat: @"<Recurrence_WeekOfMonth xmlns=\"%@:\">%d</Recurrence_WeekOfMonth>", t, firstOccurrence];
|
||||||
[s appendFormat: @"<Recurrence_MonthOfYear xmlns=\"Calendar:\">%@</Recurrence_MonthOfYear>",
|
[s appendFormat: @"<Recurrence_MonthOfYear xmlns=\"%@:\">%@</Recurrence_MonthOfYear>", t,
|
||||||
[self flattenedValuesForKey: @"bymonth"]];
|
[self flattenedValuesForKey: @"bymonth"]];
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
type = 5; // Yearly
|
type = 5; // Yearly
|
||||||
|
|
||||||
[s appendFormat: @"<Recurrence_DayOfMonth xmlns=\"Calendar:\">%@</Recurrence_DayOfMonth>",
|
[s appendFormat: @"<Recurrence_DayOfMonth xmlns=\"%@:\">%@</Recurrence_DayOfMonth>", t,
|
||||||
[self flattenedValuesForKey: @"bymonthday"]];
|
[self flattenedValuesForKey: @"bymonthday"]];
|
||||||
|
|
||||||
[s appendFormat: @"<Recurrence_MonthOfYear xmlns=\"Calendar:\">%@</Recurrence_MonthOfYear>",
|
[s appendFormat: @"<Recurrence_MonthOfYear xmlns=\"%@:\">%@</Recurrence_MonthOfYear>", t,
|
||||||
[self flattenedValuesForKey: @"bymonth"]];
|
[self flattenedValuesForKey: @"bymonth"]];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
type = 5;
|
type = 5;
|
||||||
[s appendFormat: @"<Recurrence_DayOfMonth xmlns=\"Calendar:\">%d</Recurrence_DayOfMonth>", [[self _adjustedStartDate] dayOfMonth]];
|
[s appendFormat: @"<Recurrence_DayOfMonth xmlns=\"%@:\">%d</Recurrence_DayOfMonth>", t, [[self _adjustedStartDate] dayOfMonth]];
|
||||||
[s appendFormat: @"<Recurrence_MonthOfYear xmlns=\"Calendar:\">%d</Recurrence_MonthOfYear>", [[self _adjustedStartDate] monthOfYear]];
|
[s appendFormat: @"<Recurrence_MonthOfYear xmlns=\"%@:\">%d</Recurrence_MonthOfYear>", t, [[self _adjustedStartDate] monthOfYear]];
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
[s appendFormat: @"<Recurrence_Type xmlns=\"Calendar:\">%d</Recurrence_Type>", type];
|
[s appendFormat: @"<Recurrence_Type xmlns=\"%@:\">%d</Recurrence_Type>", t, type];
|
||||||
|
|
||||||
|
if ([[self parent] isKindOfClass: [iCalToDo class]])
|
||||||
|
[s appendFormat: @"<Recurrence_Start xmlns=\"%@:\">%@</Recurrence_Start>", t, [[[self parent] startDate] activeSyncRepresentationInContext: context]];
|
||||||
|
|
||||||
// Occurrences / Until
|
// Occurrences / Until
|
||||||
//[s appendFormat: @"<Recurrence_Occurrences xmlns=\"Calendar:\">%d</Recurrence_Occurrences>", 5];
|
|
||||||
if ([self repeatCount])
|
if ([self repeatCount])
|
||||||
{
|
{
|
||||||
[s appendFormat: @"<Recurrence_Occurrences xmlns=\"Calendar:\">%@</Recurrence_Occurrences>",
|
[s appendFormat: @"<Recurrence_Occurrences xmlns=\"%@:\">%@</Recurrence_Occurrences>", t,
|
||||||
[self flattenedValuesForKey: @"count"]];
|
[self flattenedValuesForKey: @"count"]];
|
||||||
}
|
}
|
||||||
else if ([self untilDate])
|
else if ([self untilDate])
|
||||||
|
@ -214,11 +222,10 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
//ud = [[context activeUser] userDefaults];
|
//ud = [[context activeUser] userDefaults];
|
||||||
//[date setTimeZone: [ud timeZone]];
|
//[date setTimeZone: [ud timeZone]];
|
||||||
|
|
||||||
[s appendFormat: @"<Recurrence_Until xmlns=\"Calendar:\">%@</Recurrence_Until>",
|
[s appendFormat: @"<Recurrence_Until xmlns=\"%@:\">%@</Recurrence_Until>", t,
|
||||||
[date activeSyncRepresentationWithoutSeparatorsInContext: context]];
|
[date activeSyncRepresentationWithoutSeparatorsInContext: context]];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
[s appendString: @"</Recurrence>"];
|
[s appendString: @"</Recurrence>"];
|
||||||
|
|
||||||
return s;
|
return s;
|
||||||
|
|
|
@ -45,7 +45,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
#include "NSDate+ActiveSync.h"
|
#include "NSDate+ActiveSync.h"
|
||||||
#include "NSString+ActiveSync.h"
|
#include "NSString+ActiveSync.h"
|
||||||
|
#include "iCalRecurrenceRule+ActiveSync.h"
|
||||||
|
|
||||||
@implementation iCalToDo (ActiveSync)
|
@implementation iCalToDo (ActiveSync)
|
||||||
|
|
||||||
|
@ -81,6 +81,10 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
[s appendFormat: @"<UTCDueDate xmlns=\"Tasks:\">%@</UTCDueDate>", [o activeSyncRepresentationInContext: context]];
|
[s appendFormat: @"<UTCDueDate xmlns=\"Tasks:\">%@</UTCDueDate>", [o activeSyncRepresentationInContext: context]];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Recurrence rules
|
||||||
|
if ([self isRecurrent])
|
||||||
|
[s appendString: [[[self recurrenceRules] lastObject] activeSyncRepresentationInContext: context]];
|
||||||
|
|
||||||
// Importance
|
// Importance
|
||||||
o = [self priority];
|
o = [self priority];
|
||||||
if ([o isEqualToString: @"9"])
|
if ([o isEqualToString: @"9"])
|
||||||
|
@ -247,6 +251,29 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Recurrence
|
||||||
|
if ((o = [theValues objectForKey: @"Recurrence"]) && !([[o objectForKey: @"Recurrence_DeadOccur"] intValue]))
|
||||||
|
{
|
||||||
|
iCalRecurrenceRule *rule;
|
||||||
|
|
||||||
|
rule = [[iCalRecurrenceRule alloc] init];
|
||||||
|
[self setRecurrenceRules: [NSArray arrayWithObject: rule]];
|
||||||
|
RELEASE(rule);
|
||||||
|
|
||||||
|
[rule takeActiveSyncValues: o inContext: context];
|
||||||
|
|
||||||
|
if (!([theValues objectForKey: @"StartDate"]))
|
||||||
|
{
|
||||||
|
iCalDateTime *start;
|
||||||
|
|
||||||
|
start = (iCalDateTime *) [self uniqueChildWithTag: @"dtstart"];
|
||||||
|
|
||||||
|
[start setTimeZone: tz];
|
||||||
|
[start setDate: [[o objectForKey: @"Recurrence_Start"] calendarDate]];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|
Loading…
Reference in New Issue