private void MapRecurrance1To2(TaskItem source, ITodo target, iCalTimeZone localIcalTimeZone) { if (source.IsRecurring) { using (var sourceRecurrencePatternWrapper = GenericComObjectWrapper.Create(source.GetRecurrencePattern())) { var sourceRecurrencePattern = sourceRecurrencePatternWrapper.Inner; IRecurrencePattern targetRecurrencePattern = new RecurrencePattern(); if (!sourceRecurrencePattern.NoEndDate) { targetRecurrencePattern.Count = sourceRecurrencePattern.Occurrences; //Until must not be set if count is set, since outlook always sets Occurrences //but sogo wants it as utc end time of the last event not only the enddate at 0000 //targetRecurrencePattern.Until = sourceRecurrencePattern.PatternEndDate.Add(sourceRecurrencePattern.EndTime.TimeOfDay).ToUniversalTime(); } targetRecurrencePattern.Interval = (sourceRecurrencePattern.RecurrenceType == OlRecurrenceType.olRecursYearly || sourceRecurrencePattern.RecurrenceType == OlRecurrenceType.olRecursYearNth) ? sourceRecurrencePattern.Interval / 12 : sourceRecurrencePattern.Interval; switch (sourceRecurrencePattern.RecurrenceType) { case OlRecurrenceType.olRecursDaily: targetRecurrencePattern.Frequency = FrequencyType.Daily; break; case OlRecurrenceType.olRecursWeekly: targetRecurrencePattern.Frequency = FrequencyType.Weekly; CommonEntityMapper.MapDayOfWeek1To2(sourceRecurrencePattern.DayOfWeekMask, targetRecurrencePattern.ByDay); break; case OlRecurrenceType.olRecursMonthly: targetRecurrencePattern.Frequency = FrequencyType.Monthly; targetRecurrencePattern.ByMonthDay.Add(sourceRecurrencePattern.DayOfMonth); break; case OlRecurrenceType.olRecursMonthNth: targetRecurrencePattern.Frequency = FrequencyType.Monthly; if (sourceRecurrencePattern.Instance == 5) { targetRecurrencePattern.BySetPosition.Add(-1); CommonEntityMapper.MapDayOfWeek1To2(sourceRecurrencePattern.DayOfWeekMask, targetRecurrencePattern.ByDay); } else if (sourceRecurrencePattern.Instance > 0) { targetRecurrencePattern.BySetPosition.Add(sourceRecurrencePattern.Instance); CommonEntityMapper.MapDayOfWeek1To2(sourceRecurrencePattern.DayOfWeekMask, targetRecurrencePattern.ByDay); } else { CommonEntityMapper.MapDayOfWeek1To2(sourceRecurrencePattern.DayOfWeekMask, targetRecurrencePattern.ByDay); } break; case OlRecurrenceType.olRecursYearly: targetRecurrencePattern.Frequency = FrequencyType.Yearly; targetRecurrencePattern.ByMonthDay.Add(sourceRecurrencePattern.DayOfMonth); targetRecurrencePattern.ByMonth.Add(sourceRecurrencePattern.MonthOfYear); break; case OlRecurrenceType.olRecursYearNth: targetRecurrencePattern.Frequency = FrequencyType.Yearly; if (sourceRecurrencePattern.Instance == 5) { targetRecurrencePattern.BySetPosition.Add(-1); CommonEntityMapper.MapDayOfWeek1To2(sourceRecurrencePattern.DayOfWeekMask, targetRecurrencePattern.ByDay); } else if (sourceRecurrencePattern.Instance > 0) { targetRecurrencePattern.BySetPosition.Add(sourceRecurrencePattern.Instance); CommonEntityMapper.MapDayOfWeek1To2(sourceRecurrencePattern.DayOfWeekMask, targetRecurrencePattern.ByDay); } else { CommonEntityMapper.MapDayOfWeek1To2(sourceRecurrencePattern.DayOfWeekMask, targetRecurrencePattern.ByDay); } targetRecurrencePattern.ByMonth.Add(sourceRecurrencePattern.MonthOfYear); break; } target.RecurrenceRules.Add(targetRecurrencePattern); } } }
private void MapRecurrance1To2(TaskItem source, ITodo target, iCalTimeZone localIcalTimeZone) { if (source.IsRecurring) { using (var sourceRecurrencePatternWrapper = GenericComObjectWrapper.Create(source.GetRecurrencePattern())) { var sourceRecurrencePattern = sourceRecurrencePatternWrapper.Inner; // Recurring task must have a DTSTART according to the RFC but Outlook may have no task start date set, use PatternStartDate in this case if (source.StartDate == OutlookUtility.OUTLOOK_DATE_NONE) { target.Start = new iCalDateTime(sourceRecurrencePattern.PatternStartDate.Year, sourceRecurrencePattern.PatternStartDate.Month, sourceRecurrencePattern.PatternStartDate.Day, true); if (!_configuration.MapStartAndDueAsFloating) { target.Start.SetTimeZone(localIcalTimeZone); } } IRecurrencePattern targetRecurrencePattern = new RecurrencePattern(); // Don't set Count if pattern has NoEndDate or invalid Occurences for some reason. if (!sourceRecurrencePattern.NoEndDate && sourceRecurrencePattern.Occurrences > 0) { targetRecurrencePattern.Count = sourceRecurrencePattern.Occurrences; //Until must not be set if count is set, since outlook always sets Occurrences //but sogo wants it as utc end time of the last event not only the enddate at 0000 //targetRecurrencePattern.Until = sourceRecurrencePattern.PatternEndDate.Add(sourceRecurrencePattern.EndTime.TimeOfDay).ToUniversalTime(); } targetRecurrencePattern.Interval = (sourceRecurrencePattern.RecurrenceType == OlRecurrenceType.olRecursYearly || sourceRecurrencePattern.RecurrenceType == OlRecurrenceType.olRecursYearNth) ? sourceRecurrencePattern.Interval / 12 : sourceRecurrencePattern.Interval; switch (sourceRecurrencePattern.RecurrenceType) { case OlRecurrenceType.olRecursDaily: targetRecurrencePattern.Frequency = FrequencyType.Daily; break; case OlRecurrenceType.olRecursWeekly: targetRecurrencePattern.Frequency = FrequencyType.Weekly; CommonEntityMapper.MapDayOfWeek1To2(sourceRecurrencePattern.DayOfWeekMask, targetRecurrencePattern.ByDay); break; case OlRecurrenceType.olRecursMonthly: targetRecurrencePattern.Frequency = FrequencyType.Monthly; targetRecurrencePattern.ByMonthDay.Add(sourceRecurrencePattern.DayOfMonth); break; case OlRecurrenceType.olRecursMonthNth: targetRecurrencePattern.Frequency = FrequencyType.Monthly; if (sourceRecurrencePattern.Instance == 5) { targetRecurrencePattern.BySetPosition.Add(-1); CommonEntityMapper.MapDayOfWeek1To2(sourceRecurrencePattern.DayOfWeekMask, targetRecurrencePattern.ByDay); } else if (sourceRecurrencePattern.Instance > 0) { targetRecurrencePattern.BySetPosition.Add(sourceRecurrencePattern.Instance); CommonEntityMapper.MapDayOfWeek1To2(sourceRecurrencePattern.DayOfWeekMask, targetRecurrencePattern.ByDay); } else { CommonEntityMapper.MapDayOfWeek1To2(sourceRecurrencePattern.DayOfWeekMask, targetRecurrencePattern.ByDay); } break; case OlRecurrenceType.olRecursYearly: targetRecurrencePattern.Frequency = FrequencyType.Yearly; targetRecurrencePattern.ByMonthDay.Add(sourceRecurrencePattern.DayOfMonth); targetRecurrencePattern.ByMonth.Add(sourceRecurrencePattern.MonthOfYear); break; case OlRecurrenceType.olRecursYearNth: targetRecurrencePattern.Frequency = FrequencyType.Yearly; if (sourceRecurrencePattern.Instance == 5) { targetRecurrencePattern.BySetPosition.Add(-1); CommonEntityMapper.MapDayOfWeek1To2(sourceRecurrencePattern.DayOfWeekMask, targetRecurrencePattern.ByDay); } else if (sourceRecurrencePattern.Instance > 0) { targetRecurrencePattern.BySetPosition.Add(sourceRecurrencePattern.Instance); CommonEntityMapper.MapDayOfWeek1To2(sourceRecurrencePattern.DayOfWeekMask, targetRecurrencePattern.ByDay); } else { CommonEntityMapper.MapDayOfWeek1To2(sourceRecurrencePattern.DayOfWeekMask, targetRecurrencePattern.ByDay); } targetRecurrencePattern.ByMonth.Add(sourceRecurrencePattern.MonthOfYear); break; } target.RecurrenceRules.Add(targetRecurrencePattern); } } }