public static void Run()
        {
            // Create and initialize credentials
            var credentials = new NetworkCredential("username", "12345");

            // Create instance of ExchangeClient class by giving credentials
            IEWSClient client = EWSClient.GetEWSClient("https://outlook.office365.com/ews/exchange.asmx", "testUser", "pwd", "domain");

            // Get all tasks info collection from exchange
            ExchangeMessageInfoCollection tasks = client.ListMessages(client.MailboxInfo.TasksUri);

            // Parse all the tasks info in the list
            foreach (ExchangeMessageInfo info in tasks)
            {
                // Fetch task from exchange using current task info
                ExchangeTask task = client.FetchTask(info.UniqueUri);

                // Update the task status to NotStarted
                task.Status = ExchangeTaskStatus.NotStarted;

                // Set the task due date
                task.DueDate = new DateTime(2013, 2, 26);

                // Set task priority
                task.Priority = MailPriority.Low;

                // Update task on exchange
                client.UpdateTask(task);
            }

            Console.WriteLine(Environment.NewLine + "Task updated on Exchange Server successfully.");
        }
        private static void AppendRecurrenceTag(ExchangeTask task, StringBuilder xmlBuilder)
        {
            if (!task.IsRecurring)
            {
                return;
            }

            xmlBuilder.Append("<tasks:Recurrence>");

            // Type
            xmlBuilder.AppendFormat("<tasks:Type>{0}</tasks:Type>", GetRecurrencePatternInteger(task.RecurrenceType));

            // Start
            xmlBuilder.AppendFormat("<tasks:Start>{0}</tasks:Start>", task.Start.HasValue ? GetFullDateString(task.Start.Value) : GetFullDateString(task.Created));

            //// Dead occur
            //builder.AppendFormat("<tasks:DeadOccur>{0}</tasks:DeadOccur>", task.Completed.HasValue ? 1 : 0);
            xmlBuilder.AppendFormat("<tasks:DeadOccur>{0}</tasks:DeadOccur>", 0);

            // Regenerate
            int regenerate = 0;

            if (task.RecurrenceType == ExchangeRecurrencePattern.DailyRegeneration ||
                task.RecurrenceType == ExchangeRecurrencePattern.WeeklyRegeneration ||
                task.RecurrenceType == ExchangeRecurrencePattern.MonthlyRegeneration ||
                task.RecurrenceType == ExchangeRecurrencePattern.YearlyRegeneration)
            {
                regenerate = 1;
            }
            xmlBuilder.AppendFormat("<tasks:Regenerate>{0}</tasks:Regenerate>", regenerate);

            // Interval
            xmlBuilder.AppendFormat("<tasks:Interval>{0}</tasks:Interval>", task.Interval == 0 ? 1 : task.Interval);

            // DayOfWeek
            if (task.RecurrenceType == ExchangeRecurrencePattern.Weekly || task.RecurrenceType == ExchangeRecurrencePattern.MonthlyRelative)
            {
                xmlBuilder.AppendFormat("<tasks:DayOfWeek>{0}</tasks:DayOfWeek>", (int)task.DaysOfWeek);
            }

            // DayOfMonth
            if (task.RecurrenceType == ExchangeRecurrencePattern.Monthly || task.RecurrenceType == ExchangeRecurrencePattern.Yearly)
            {
                xmlBuilder.AppendFormat("<tasks:DayOfMonth>{0}</tasks:DayOfMonth>", task.DayOfMonth == 0 ? 1 : task.DayOfMonth);
            }

            // WeekOfMonth
            if (task.RecurrenceType == ExchangeRecurrencePattern.MonthlyRelative)
            {
                xmlBuilder.AppendFormat("<tasks:WeekOfMonth>{0}</tasks:WeekOfMonth>", (int)task.DayOfWeekIndex + 1);
            }

            // MonthOfYear
            if (task.RecurrenceType == ExchangeRecurrencePattern.Yearly)
            {
                xmlBuilder.AppendFormat("<tasks:MonthOfYear>{0}</tasks:MonthOfYear>", task.Month == 0 ? 1 : task.Month);
            }

            xmlBuilder.Append("</tasks:Recurrence>");
        }
Exemple #3
0
        public static ITask ToTask(this ExchangeTask exchangeTask, IWorkbook workbook)
        {
            var task = workbook.CreateTask();

            task.Added = DateTime.Now;
            task.UpdateFromExchange(exchangeTask);

            return(task);
        }
        public static void Run()
        {
            // ExStart:FilterTasksFromServer
            // Set mailboxURI, Username, password, domain information
            string            mailboxUri  = "https://ex2010/ews/exchange.asmx";
            string            username    = "******";
            string            password    = "******";
            string            domain      = "ex2010.local";
            NetworkCredential credentials = new NetworkCredential(username, password, domain);
            IEWSClient        client      = EWSClient.GetEWSClient(mailboxUri, credentials);

            ExchangeQueryBuilder          queryBuilder   = null;
            MailQuery                     query          = null;
            ExchangeTask                  fetchedTask    = null;
            ExchangeMessageInfoCollection messageInfoCol = null;

            client.TimezoneId = "Central Europe Standard Time";
            Array values = Enum.GetValues(typeof(ExchangeTaskStatus));

            //Now retrieve the tasks with specific statuses
            foreach (ExchangeTaskStatus status in values)
            {
                queryBuilder = new ExchangeQueryBuilder();
                queryBuilder.TaskStatus.Equals(status);
                query          = queryBuilder.GetQuery();
                messageInfoCol = client.ListMessages(client.MailboxInfo.TasksUri, query);
                fetchedTask    = client.FetchTask(messageInfoCol[0].UniqueUri);
            }

            //retrieve all other than specified
            foreach (ExchangeTaskStatus status in values)
            {
                queryBuilder = new ExchangeQueryBuilder();
                queryBuilder.TaskStatus.NotEquals(status);
                query          = queryBuilder.GetQuery();
                messageInfoCol = client.ListMessages(client.MailboxInfo.TasksUri, query);
            }

            //specifying multiple criterion
            ExchangeTaskStatus[] selectedStatuses = new ExchangeTaskStatus[]
            {
                ExchangeTaskStatus.Completed,
                ExchangeTaskStatus.InProgress
            };
            queryBuilder = new ExchangeQueryBuilder();
            queryBuilder.TaskStatus.In(selectedStatuses);
            query          = queryBuilder.GetQuery();
            messageInfoCol = client.ListMessages(client.MailboxInfo.TasksUri, query);

            queryBuilder = new ExchangeQueryBuilder();
            queryBuilder.TaskStatus.NotIn(selectedStatuses);
            query          = queryBuilder.GetQuery();
            messageInfoCol = client.ListMessages(client.MailboxInfo.TasksUri, query);
            //ExEnd:FilterTasksFromServer
        }
        public static void Run()
        {
            // The path to the File directory.
            string dataDir = RunExamples.GetDataDir_Exchange();
            string dstEmail = dataDir + "Message.msg";

            ExchangeTask task = new ExchangeTask();
            task.Subject = "TASK-ID - " + Guid.NewGuid();
            task.Status = ExchangeTaskStatus.InProgress;
            task.StartDate = DateTime.Now;
            task.DueDate = task.StartDate.AddDays(3);
            task.Save(dstEmail);

            Console.WriteLine(Environment.NewLine + "Task saved on disk successfully at " + dstEmail);
        }
Exemple #6
0
        public static void Run()
        {
            // ExStart:ProcessExchangeTasksUsingIEWSClient
            // Create instance of EWSClient class by giving credentials
            IEWSClient client = EWSClient.GetEWSClient("https://outlook.office365.com/ews/exchange.asmx", "testUser", "pwd", "domain");

            // Create Exchange task object
            ExchangeTask task = new ExchangeTask();

            // Set task subject and status to In progress
            task.Subject = "New-Test";
            task.Status  = ExchangeTaskStatus.InProgress;
            client.CreateTask(client.MailboxInfo.TasksUri, task);
            // ExEnd:ProcessExchangeTasksUsingIEWSClient
        }
        public static void Run()
        {
            // ExStart:ProcessExchangeTasksUsingIEWSClient
            // Create instance of EWSClient class by giving credentials
            IEWSClient client = EWSClient.GetEWSClient("https://outlook.office365.com/ews/exchange.asmx", "testUser", "pwd", "domain");

            // Create Exchange task object
            ExchangeTask task = new ExchangeTask();

            // Set task subject and status to In progress
            task.Subject = "New-Test";
            task.Status = ExchangeTaskStatus.InProgress;
            client.CreateTask(client.MailboxInfo.TasksUri, task);
            // ExEnd:ProcessExchangeTasksUsingIEWSClient
        }
Exemple #8
0
        public static void Run()
        {
            // The path to the documents directory.
            string dataDir  = RunExamples.GetDataDir_Exchange();
            string dstEmail = dataDir + "Message.msg";

            ExchangeTask task = new ExchangeTask();

            task.Subject   = "TASK-ID - " + Guid.NewGuid();
            task.Status    = ExchangeTaskStatus.InProgress;
            task.StartDate = DateTime.Now;
            task.DueDate   = task.StartDate.AddDays(3);
            task.Save(dstEmail);

            Console.WriteLine(Environment.NewLine + "Task saved on disk successfully at " + dstEmail);
        }
Exemple #9
0
        public static ExchangeTask BuildExchangeTask(this EwsTask ewsTask)
        {
            var id = string.Format("{0}{1}{2}", ewsTask.Id, ChangeKeySeparator, ewsTask.ChangeKey);

            if (ewsTask.Type == EwsItemType.Item)
            {
                id = ItemPrefix + id;
            }

            var exchangeTask = new ExchangeTask
            {
                Id         = id,
                Subject    = ewsTask.Subject,
                Start      = ewsTask.StartDate,
                Due        = ewsTask.DueDate,
                Completed  = ewsTask.CompleteDate,
                Importance = (ExchangeTaskImportance)(int)ewsTask.Importance,
            };

            if (ewsTask.ReminderIsSet && ewsTask.ReminderDate.HasValue && ewsTask.ReminderDate.Value != DateTime.MinValue)
            {
                exchangeTask.Alarm = ewsTask.ReminderDate;
            }

            if (!string.IsNullOrWhiteSpace(ewsTask.Body))
            {
                exchangeTask.Note = ewsTask.Body;
            }

            if (ewsTask.Categories != null && ewsTask.Categories.Length > 0)
            {
                exchangeTask.Category = ewsTask.Categories[0];
            }

            if (ewsTask.Recurrence != null && ewsTask.Recurrence.RecurrenceType != ExchangeRecurrencePattern.None)
            {
                exchangeTask.IsRecurring    = true;
                exchangeTask.DayOfMonth     = ewsTask.Recurrence.DayOfMonth;
                exchangeTask.DayOfWeekIndex = ewsTask.Recurrence.DayOfWeekIndex;
                exchangeTask.DaysOfWeek     = ewsTask.Recurrence.DaysOfWeek;
                exchangeTask.Interval       = ewsTask.Recurrence.Interval;
                exchangeTask.Month          = ewsTask.Recurrence.Month;
                exchangeTask.RecurrenceType = ewsTask.Recurrence.RecurrenceType;
            }

            return(exchangeTask);
        }
        public static void Run()
        {
            // Create instance of EWSClient class by giving credentials
            IEWSClient client = EWSClient.GetEWSClient("https://outlook.office365.com/ews/exchange.asmx", "testUser", "pwd", "domain");

            // Create Exchange task object
            ExchangeTask task = new ExchangeTask();

            // Set task subject
            task.Subject = "New-Test";

            // Set task status to In progress
            task.Status = ExchangeTaskStatus.InProgress;

            // Create task on exchange
            client.CreateTask(client.MailboxInfo.TasksUri, task);

            Console.WriteLine(Environment.NewLine + "Task created on Exchange Server successfully.");
        }
Exemple #11
0
        private ExchangeChangeSet GetChangeSet(ExchangeTask added = null, ExchangeTask modified = null, IEnumerable <string> deleted = null)
        {
            var changeset = new ExchangeChangeSet();

            if (added != null)
            {
                changeset.AddedTasks.Add(added);
            }

            if (modified != null)
            {
                changeset.ModifiedTasks.Add(modified);
            }

            if (deleted != null)
            {
                deleted.ForEach(d => changeset.DeletedTasks.Add(new ServerDeletedAsset(d)));
            }

            return(changeset);
        }
Exemple #12
0
        private IFolder GetFolderForExchangeTask(ExchangeTask exchangeTask)
        {
            IFolder folder = null;

            if (!string.IsNullOrEmpty(exchangeTask.Category))
            {
                // check a folder match the name
                folder = this.Workbook.Folders.FirstOrDefault(f => f.Name.Equals(exchangeTask.Category, StringComparison.OrdinalIgnoreCase));
                if (folder == null)
                {
                    // no folder found and the task in exchange has a category
                    // create a folder with the name of the category
                    folder = this.CreateFolder(exchangeTask.Category);
                }
            }
            else
            {
                // the task has no folder, use the default one
                folder = this.GetDefaultFolder();
            }

            return(folder);
        }
Exemple #13
0
        public static void Run()
        {
            // ExStart:DeleteTaskOnExchange
            // Create instance of ExchangeClient class by giving credentials
            IEWSClient client = EWSClient.GetEWSClient("https://outlook.office365.com/ews/exchange.asmx", "testUser", "pwd", "domain");

            // Get all tasks info collection from exchange
            ExchangeMessageInfoCollection tasks = client.ListMessages(client.MailboxInfo.TasksUri);

            // Parse all the tasks info in the list
            foreach (ExchangeMessageInfo info in tasks)
            {
                // Fetch task from exchange using current task info
                ExchangeTask task = client.FetchTask(info.UniqueUri);

                // Check if the current task fulfills the search criteria
                if (task.Subject.Equals("test"))
                {
                    //Delete task from exchange
                    client.DeleteItem(task.UniqueUri, DeletionOptions.DeletePermanently);
                }
            }
            // ExEnd:DeleteTaskOnExchange
        }
        private static void CreateTaskXml(ExchangeTask task, StringBuilder builder, bool isAdd)
        {
            // Server Id (in case of update)
            if (isAdd)
            {
                builder.AppendFormat("<ClientId>{0}</ClientId>", task.LocalId);
            }
            else
            {
                builder.AppendFormat("<ServerId>{0}</ServerId>", task.Id);
            }

            builder.Append("<ApplicationData>");

            // Subject
            builder.AppendFormat("<tasks:Subject>{0}</tasks:Subject>", task.Subject.ToEscapedXml());

            // Notes
            builder.Append("<airsyncbase:Body>");
            builder.Append("<airsyncbase:Type>1</airsyncbase:Type>");
            builder.AppendFormat("<airsyncbase:Data>{0}</airsyncbase:Data>", !string.IsNullOrEmpty(task.Note) ? task.Note.ToEscapedXml() : " ");
            builder.Append("</airsyncbase:Body>");

            // Category
            if (!string.IsNullOrEmpty(task.Category))
            {
                builder.Append("<tasks:Categories>");
                builder.AppendFormat("<tasks:Category>{0}</tasks:Category>", task.Category.ToEscapedXml());
                builder.Append("</tasks:Categories>");
            }
            // Complete
            builder.AppendFormat("<tasks:Complete>{0}</tasks:Complete>", task.Completed.HasValue ? "1" : "0");

            // Completed
            if (task.Completed.HasValue)
            {
                builder.AppendFormat("<tasks:DateCompleted>{0}</tasks:DateCompleted>", GetFullDateString(task.Completed.Value.ToUniversalTime()));
            }

            // Due Date
            if (task.Due.HasValue)
            {
                builder.AppendFormat("<tasks:DueDate>{0}</tasks:DueDate>", GetFullDateString(task.Due.Value));
                builder.AppendFormat("<tasks:UtcDueDate>{0}</tasks:UtcDueDate>", GetFullDateString(task.Due.Value.ToUniversalTime()));
            }

            // Priority
            builder.AppendFormat("<tasks:Importance>{0}</tasks:Importance>", (int)task.Importance);

            if (task.Start.HasValue)
            {
                // Start Date
                builder.AppendFormat("<tasks:StartDate>{0}</tasks:StartDate>", GetFullDateString(task.Start.Value));
                builder.AppendFormat("<tasks:UtcStartDate>{0}</tasks:UtcStartDate>", GetFullDateString(task.Start.Value.ToUniversalTime()));
            }

            // Recurrence
            AppendRecurrenceTag(task, builder);

            // Sensitivity
            builder.Append("<tasks:Sensitivity>0</tasks:Sensitivity>");

            // Reminder
            if (task.Alarm.HasValue)
            {
                builder.Append("<tasks:ReminderSet>1</tasks:ReminderSet>");
                builder.AppendFormat("<tasks:ReminderTime>{0}</tasks:ReminderTime>", GetFullDateString(task.Alarm.Value.ToUniversalTime()));
            }

            builder.Append("</ApplicationData>");
        }
Exemple #15
0
        public static ExchangeTask GetExchangeTask(XElement task)
        {
            try
            {
                ExchangeTask result = new ExchangeTask();
                XElement     data   = task.Element("ApplicationData");

                // Manage common fields
                result.Id = task.Element("ServerId").Value;

                if (data.Element("Subject") != null)
                {
                    result.Subject = data.Element("Subject").Value;
                }
                else
                {
                    result.Subject = "-";
                }

                result.Note = data.Elements("Body").Any() && data.Element("Body").Elements("Data").Any()
                    ? data.Element("Body").Element("Data").Value : null;
                if (!string.IsNullOrEmpty(result.Note) && result.Note.StartsWith(ReportedNoteCrumbles))
                {
                    result.Note = result.Note.Substring(ReportedNoteCrumbles.Length);
                    result.Note = result.Note.TrimEnd('\n');
                }
                if (string.IsNullOrWhiteSpace(result.Note))
                {
                    result.Note = null;
                }

                result.Due = data.Element("DueDate") != null?GetDate(data.Element("DueDate").Value) : null;

                result.Start = data.Element("StartDate") != null?GetDate(data.Element("StartDate").Value) : null;

                var categories = data.Element("Categories");
                if (categories != null)
                {
                    var category = categories.Elements("Category");
                    if (category != null && category.Any())
                    {
                        result.Category = category.First().Value;
                    }
                }

                if (data.Element("Complete") != null && data.Element("Complete").Value == "1")
                {
                    var applicationData = task.Element("ApplicationData");
                    if (applicationData != null)
                    {
                        var dateCompleted = applicationData.Element("DateCompleted");
                        if (dateCompleted != null && dateCompleted.Value != null)
                        {
                            result.Completed = GetDate(dateCompleted.Value);
                        }
                    }

                    // ActiveSync specification specify that is "Complete" is set to 1, a DateCompleted must be included:
                    // "The DateCompleted element MUST be included in the response if the Complete element (section 2.2.2.7) value is 1."
                    // but for some reason, that's not the case when syncing with AkrutoSync and Memotoo, and in that case we fallback
                    // to "now" for the completion date
                    if (result.Completed == null)
                    {
                        result.Completed = DateTime.Now;
                    }
                }
                result.Importance = data.Element("Importance") != null ? (ExchangeTaskImportance)int.Parse(data.Element("Importance").Value) : ExchangeTaskImportance.Normal;

                result.IsRecurring = data.Element("Recurrence") != null;
                XElement recurrence = data.Element("Recurrence");
                if (result.IsRecurring)
                {
                    // Get the DeadOccur property to know if it is a "real" recurring task or only an instance
                    if (recurrence.Element("DeadOccur") != null)
                    {
                        int deadOccur = int.Parse(recurrence.Element("DeadOccur").Value);
                        if (deadOccur > 0)
                        {
                            result.IsRecurring = false;
                        }
                    }
                    else
                    {
                        // No "DeadOccur" element, we assume (from the documentation) that value is equal to 0
                        result.IsRecurring = false;
                    }
                }

                XElement reminderSet = data.Element("ReminderSet");
                if (reminderSet != null && reminderSet.Value == "1")
                {
                    XElement reminderTime = data.Element("ReminderTime");
                    if (reminderTime != null && !string.IsNullOrWhiteSpace(reminderTime.Value))
                    {
                        result.Alarm = GetDate(reminderTime.Value);
                        if (result.Alarm.HasValue)
                        {
                            result.Alarm = result.Alarm.Value.ToLocalTime();
                        }
                    }
                }

                if (result.IsRecurring)
                {
                    int regenerate = 0;
                    if (recurrence.Element("Regenerate") != null && !string.IsNullOrEmpty(recurrence.Element("Regenerate").Value) && int.TryParse(recurrence.Element("Regenerate").Value, out regenerate))
                    {
                        result.UseFixedDate = regenerate != 1;
                    }

                    result.RecurrenceType = result.IsRecurring ? GetRecurrencePattern(int.Parse(recurrence.Element("Type").Value), result.UseFixedDate) : ExchangeRecurrencePattern.None;

                    // Manage recurring fields
                    result.Interval = int.Parse(recurrence.Element("Interval").Value);

                    // DayOfWeek element
                    result.DaysOfWeek = ExchangeDayOfWeek.None;
                    if (result.RecurrenceType == ExchangeRecurrencePattern.Weekly || result.RecurrenceType == ExchangeRecurrencePattern.MonthlyRelative)
                    {
                        int days = 0;
                        if (recurrence.Element("DayOfWeek") != null)
                        {
                            days = int.Parse(recurrence.Element("DayOfWeek").Value);
                        }
                        result.DaysOfWeek = (ExchangeDayOfWeek)days;
                        if (HasMultipleDays(result.DaysOfWeek) && result.RecurrenceType == ExchangeRecurrencePattern.Weekly)
                        {
                            result.Interval = 0; // Set interval to 0 to avoid the Weekly standard pattern
                        }
                    }

                    // DayOfMonth element
                    result.DayOfMonth = 0;
                    if (result.RecurrenceType == ExchangeRecurrencePattern.Monthly || result.RecurrenceType == ExchangeRecurrencePattern.Yearly)
                    {
                        result.DayOfMonth = int.Parse(recurrence.Element("DayOfMonth").Value);
                    }

                    // WeekOfMonth element
                    if (result.RecurrenceType == ExchangeRecurrencePattern.MonthlyRelative)
                    {
                        // TODO : manage 'Yearly in the nth month' pattern
                        result.DayOfWeekIndex = GetDayOfTheWeekIndex(int.Parse(recurrence.Element("WeekOfMonth").Value));
                    }

                    // MonthOfYear element
                    if (result.RecurrenceType == ExchangeRecurrencePattern.Yearly)
                    {
                        // TODO : manage 'Yearly in the nth month' pattern
                        result.Month = int.Parse(recurrence.Element("MonthOfYear").Value);
                    }

                    LogService.Log("SyncCommandResult", $"Task {result.Subject} read completed");
                }

                return(result);
            }
            catch (Exception ex)
            {
                using (var sw = new StringWriter())
                {
                    using (var xw = XmlWriter.Create(sw))
                    {
                        task.WriteTo(xw);
                    }

                    string content = sw.ToString().Replace("\r\n", string.Empty);
                    string message = $"Error when parsing task XML {ex}: {content}";

                    LogService.Log("SyncCommandResult", message);

                    TryTrackEvent("Parsing", message);

                    throw new CommandException("unable to read task content");
                }
            }
        }
Exemple #16
0
 protected virtual bool HaveSameId(ITask task, ExchangeTask exchangeTask)
 {
     return(task.SyncId == exchangeTask.Id);
 }
Exemple #17
0
        public static EwsTask BuildEwsTask(this ExchangeTask exchangeTask)
        {
            var ewsTask = new EwsTask
            {
                Subject      = exchangeTask.Subject,
                Categories   = new[] { exchangeTask.Category },
                StartDate    = exchangeTask.Start,
                CompleteDate = exchangeTask.Completed,
                Importance   = (EwsImportance)(int)exchangeTask.Importance
            };

            if (exchangeTask.Due.HasValue)
            {
                ewsTask.DueDate = exchangeTask.Due.Value.Date;
            }

            if (exchangeTask.Alarm.HasValue)
            {
                ewsTask.ReminderDate  = exchangeTask.Alarm;
                ewsTask.ReminderIsSet = true;
            }

            if (!string.IsNullOrWhiteSpace(exchangeTask.Note))
            {
                ewsTask.Body     = exchangeTask.Note;
                ewsTask.BodyType = exchangeTask.Note.HasHtml() ? EwsBodyType.HTML : EwsBodyType.Text;
            }

            if (!exchangeTask.Properties.HasValue)
            {
                throw new NotSupportedException("Task has no properties set");
            }

            if (exchangeTask.IsRecurring && exchangeTask.Due.HasValue)
            {
                var recurrence = new EwsRecurrence
                {
                    RecurrenceType = exchangeTask.RecurrenceType,
                    Interval       = exchangeTask.Interval,
                    DayOfMonth     = exchangeTask.DayOfMonth,
                    DayOfWeekIndex = exchangeTask.DayOfWeekIndex,
                    DaysOfWeek     = exchangeTask.DaysOfWeek,
                    Month          = exchangeTask.Month,
                };

                if (!exchangeTask.Start.HasValue)
                {
                    recurrence.StartDate = exchangeTask.Due.Value;
                }
                else
                {
                    recurrence.StartDate = exchangeTask.Start.Value;
                }

                ewsTask.Recurrence = recurrence;
            }

            if (exchangeTask.Properties.Value.HasFlag(ExchangeTaskProperties.Title))
            {
                ewsTask.Changes |= EwsFields.Subject;
            }
            if (exchangeTask.Properties.Value.HasFlag(ExchangeTaskProperties.Folder))
            {
                ewsTask.Changes |= EwsFields.Categories;
            }
            if (exchangeTask.Properties.Value.HasFlag(ExchangeTaskProperties.Due))
            {
                ewsTask.Changes |= EwsFields.DueDate;
            }
            if (exchangeTask.Properties.Value.HasFlag(ExchangeTaskProperties.Start))
            {
                ewsTask.Changes |= EwsFields.StartDate;
            }
            if (exchangeTask.Properties.Value.HasFlag(ExchangeTaskProperties.Completed))
            {
                ewsTask.Changes |= EwsFields.CompleteDate;
            }
            if (exchangeTask.Properties.Value.HasFlag(ExchangeTaskProperties.Priority))
            {
                ewsTask.Changes |= EwsFields.Importance;
            }
            if (exchangeTask.Properties.Value.HasFlag(ExchangeTaskProperties.RepeatFrom))
            {
                ewsTask.Changes |= EwsFields.Recurrence;
            }
            if (exchangeTask.Properties.Value.HasFlag(ExchangeTaskProperties.Alarm))
            {
                ewsTask.Changes |= EwsFields.Reminder;
            }
            if (exchangeTask.Properties.Value.HasFlag(ExchangeTaskProperties.Note))
            {
                ewsTask.Changes |= EwsFields.Body;
            }

            if (!string.IsNullOrWhiteSpace(exchangeTask.Id))
            {
                string id = exchangeTask.Id;
                if (exchangeTask.Id.StartsWith(ItemPrefix))
                {
                    id           = id.Replace(ItemPrefix, string.Empty);
                    ewsTask.Type = EwsItemType.Item;
                }

                var identifier = GetEwsItemIdentifier(id);
                ewsTask.Id        = identifier.Id;
                ewsTask.ChangeKey = identifier.ChangeKey;
            }

            return(ewsTask);
        }
Exemple #18
0
 protected override bool HaveSameId(ITask task, ExchangeTask exchangeTask)
 {
     return(task.SyncId != null && exchangeTask.Id != null && task.SyncId.GetEwsItemIdentifier().Id == exchangeTask.Id.GetEwsItemIdentifier().Id);
 }
Exemple #19
0
        public static ExchangeTask ToExchangeTask(this ITask task, bool setCategory, TaskProperties properties)
        {
            var exchangeTask = new ExchangeTask
            {
                Subject    = task.Title,
                Importance = task.Priority.GetImportance(),
                Completed  = task.Completed,
                Due        = task.Due,
                Start      = task.Start,
                LocalId    = task.Id,
                Id         = task.SyncId,
                Note       = task.Note,
                Created    = task.Added,
                Alarm      = task.Alarm,
                Properties = (ExchangeTaskProperties?)properties
            };

            // flag must be set to false when the folder that owns the task is the default
            // folder we create for task without category in Exchange
            if (setCategory)
            {
                exchangeTask.Category = task.Folder.Name;
            }

            if (task.Progress.HasValue)
            {
                exchangeTask.ProgressPercent = task.Progress.Value;
            }

            if (task.IsPeriodic && task.Due.HasValue)
            {
                exchangeTask.IsRecurring  = true;
                exchangeTask.UseFixedDate = task.UseFixedDate;

                if (task.CustomFrequency is DailyFrequency)
                {
                    var frequency = (DailyFrequency)task.CustomFrequency;

                    exchangeTask.RecurrenceType = ExchangeRecurrencePattern.Daily;
                    exchangeTask.Interval       = 1;
                }
                else if (task.CustomFrequency is DaysOfWeekFrequency)
                {
                    var frequency = (DaysOfWeekFrequency)task.CustomFrequency;

                    exchangeTask.RecurrenceType = ExchangeRecurrencePattern.Weekly;
                    exchangeTask.Interval       = 1;

                    if (frequency.IsMonday)
                    {
                        exchangeTask.DaysOfWeek |= ExchangeDayOfWeek.Monday;
                    }
                    if (frequency.IsTuesday)
                    {
                        exchangeTask.DaysOfWeek |= ExchangeDayOfWeek.Tuesday;
                    }
                    if (frequency.IsWednesday)
                    {
                        exchangeTask.DaysOfWeek |= ExchangeDayOfWeek.Wednesday;
                    }
                    if (frequency.IsThursday)
                    {
                        exchangeTask.DaysOfWeek |= ExchangeDayOfWeek.Thursday;
                    }
                    if (frequency.IsFriday)
                    {
                        exchangeTask.DaysOfWeek |= ExchangeDayOfWeek.Friday;
                    }
                    if (frequency.IsSaturday)
                    {
                        exchangeTask.DaysOfWeek |= ExchangeDayOfWeek.Saturday;
                    }
                    if (frequency.IsSunday)
                    {
                        exchangeTask.DaysOfWeek |= ExchangeDayOfWeek.Sunday;
                    }
                }
                else if (task.CustomFrequency is EveryXPeriodFrequency)
                {
                    var frequency = (EveryXPeriodFrequency)task.CustomFrequency;
                    exchangeTask.Interval = frequency.Rate;

                    switch (frequency.Scale)
                    {
                    case CustomFrequencyScale.Day:
                        if (exchangeTask.UseFixedDate)
                        {
                            exchangeTask.RecurrenceType = ExchangeRecurrencePattern.Daily;
                        }
                        else
                        {
                            exchangeTask.RecurrenceType = ExchangeRecurrencePattern.DailyRegeneration;
                        }
                        break;

                    case CustomFrequencyScale.Week:
                        if (exchangeTask.UseFixedDate)
                        {
                            exchangeTask.DaysOfWeek     = task.Due.Value.DayOfWeek.ToExchangeDayOfWeek();
                            exchangeTask.RecurrenceType = ExchangeRecurrencePattern.Weekly;
                        }
                        else
                        {
                            exchangeTask.RecurrenceType = ExchangeRecurrencePattern.WeeklyRegeneration;
                        }
                        break;

                    case CustomFrequencyScale.Month:
                        if (exchangeTask.UseFixedDate)
                        {
                            exchangeTask.RecurrenceType = ExchangeRecurrencePattern.Monthly;
                            exchangeTask.DayOfMonth     = task.Due.Value.Day;
                        }
                        else
                        {
                            exchangeTask.RecurrenceType = ExchangeRecurrencePattern.MonthlyRegeneration;
                        }
                        break;

                    case CustomFrequencyScale.Year:
                        if (exchangeTask.UseFixedDate)
                        {
                            exchangeTask.RecurrenceType = ExchangeRecurrencePattern.Yearly;
                            exchangeTask.DayOfMonth     = task.Due.Value.Day;
                            exchangeTask.Month          = task.Due.Value.Month;
                        }
                        else
                        {
                            exchangeTask.RecurrenceType = ExchangeRecurrencePattern.YearlyRegeneration;
                        }
                        break;
                    }
                }
                else if (task.CustomFrequency is WeeklyFrequency)
                {
                    var frequency = (WeeklyFrequency)task.CustomFrequency;

                    exchangeTask.IsRecurring = true;
                    if (!task.Start.HasValue)
                    {
                        exchangeTask.DaysOfWeek = task.Due.Value.DayOfWeek.ToExchangeDayOfWeek();
                    }
                    else
                    {
                        exchangeTask.DaysOfWeek = task.Start.Value.DayOfWeek.ToExchangeDayOfWeek();
                    }
                    exchangeTask.RecurrenceType = ExchangeRecurrencePattern.Weekly;
                    exchangeTask.Interval       = 1;
                }
                else if (task.CustomFrequency is MonthlyFrequency && task.Due.HasValue)
                {
                    var frequency = (MonthlyFrequency)task.CustomFrequency;

                    exchangeTask.IsRecurring    = true;
                    exchangeTask.RecurrenceType = ExchangeRecurrencePattern.Monthly;
                    exchangeTask.Interval       = 1;
                    exchangeTask.DayOfMonth     = task.Due.Value.Date.Day;
                }
                else if (task.CustomFrequency is OnXDayFrequency)
                {
                    var frequency = (OnXDayFrequency)task.CustomFrequency;

                    exchangeTask.RecurrenceType = ExchangeRecurrencePattern.MonthlyRelative;
                    exchangeTask.Interval       = 1;
                    exchangeTask.DaysOfWeek     = frequency.DayOfWeek.ToExchangeDayOfWeek();
                    exchangeTask.DayOfWeekIndex = frequency.RankingPosition.ToExchangeDayIndex();
                }
                else if (task.CustomFrequency is YearlyFrequency && task.Due.HasValue)
                {
                    var frequency = (YearlyFrequency)task.CustomFrequency;

                    exchangeTask.IsRecurring    = true;
                    exchangeTask.RecurrenceType = ExchangeRecurrencePattern.Yearly;
                    exchangeTask.Interval       = 1;
                    exchangeTask.DayOfMonth     = task.Due.Value.Date.Day;
                    exchangeTask.Month          = task.Due.Value.Date.Month;
                }
            }

            return(exchangeTask);
        }
Exemple #20
0
        public static void UpdateFromExchange(this ITask task, ExchangeTask exchangeTask)
        {
            task.Title     = exchangeTask.Subject;
            task.Priority  = exchangeTask.Importance.GetPriority();
            task.Completed = exchangeTask.Completed;
            task.Due       = exchangeTask.Due;
            task.Start     = exchangeTask.Start;

            task.SyncId = exchangeTask.Id;
            task.Note   = exchangeTask.Note;
            task.Alarm  = exchangeTask.Alarm;

            // set the progress in the task if the value is exchange is more than 0 (ie, the user has set a value - 0 being the default value for all tasks)
            // or if the task has a value which is different from the value in exchange
            if (exchangeTask.ProgressPercent > 0 || (task.Progress.HasValue && task.Progress.Value != exchangeTask.ProgressPercent))
            {
                // Progress is between 0.0 and 1.0
                task.Progress = exchangeTask.ProgressPercent / 100;
            }

            task.Modified = DateTime.Now;
            // Remove recurring if task is completed
            if (!exchangeTask.IsRecurring || exchangeTask.Completed.HasValue)
            {
                task.FrequencyType = FrequencyType.Once;
            }
            else
            {
                task.UseFixedDate = true;

                switch (exchangeTask.RecurrenceType)
                {
                case ExchangeRecurrencePattern.None:

                    break;

                case ExchangeRecurrencePattern.Daily:
                case ExchangeRecurrencePattern.DailyRegeneration:

                    if (exchangeTask.Interval == 1)
                    {
                        task.CustomFrequency = FrequencyFactory.GetCustomFrequency(FrequencyType.Daily);
                    }
                    else
                    {
                        var frequency = FrequencyFactory.GetCustomFrequency <EveryXPeriodFrequency>(FrequencyType.EveryXPeriod);
                        frequency.Scale = CustomFrequencyScale.Day;
                        frequency.Rate  = exchangeTask.Interval;

                        task.CustomFrequency = frequency;
                    }

                    task.UseFixedDate = exchangeTask.RecurrenceType == ExchangeRecurrencePattern.Daily;

                    break;

                case ExchangeRecurrencePattern.Weekly:
                case ExchangeRecurrencePattern.WeeklyRegeneration:

                    if (exchangeTask.Interval < 2)
                    {
                        int daysCount = 0;
                        var frequency = FrequencyFactory.GetCustomFrequency <DaysOfWeekFrequency>(FrequencyType.DaysOfWeek);

                        if ((exchangeTask.DaysOfWeek & ExchangeDayOfWeek.Monday) == ExchangeDayOfWeek.Monday)
                        {
                            daysCount++;
                            frequency.IsMonday = true;
                        }
                        if ((exchangeTask.DaysOfWeek & ExchangeDayOfWeek.Tuesday) == ExchangeDayOfWeek.Tuesday)
                        {
                            daysCount++;
                            frequency.IsTuesday = true;
                        }
                        if ((exchangeTask.DaysOfWeek & ExchangeDayOfWeek.Wednesday) == ExchangeDayOfWeek.Wednesday)
                        {
                            daysCount++;
                            frequency.IsWednesday = true;
                        }
                        if ((exchangeTask.DaysOfWeek & ExchangeDayOfWeek.Thursday) == ExchangeDayOfWeek.Thursday)
                        {
                            daysCount++;
                            frequency.IsThursday = true;
                        }
                        if ((exchangeTask.DaysOfWeek & ExchangeDayOfWeek.Friday) == ExchangeDayOfWeek.Friday)
                        {
                            daysCount++;
                            frequency.IsFriday = true;
                        }
                        if ((exchangeTask.DaysOfWeek & ExchangeDayOfWeek.Saturday) == ExchangeDayOfWeek.Saturday)
                        {
                            daysCount++;
                            frequency.IsSaturday = true;
                        }
                        if ((exchangeTask.DaysOfWeek & ExchangeDayOfWeek.Sunday) == ExchangeDayOfWeek.Sunday)
                        {
                            daysCount++;
                            frequency.IsSunday = true;
                        }

                        // if the weekly frequency repeat on a single day that match the due date or the start date
                        // use the WeeklyFrequency instead of DaysOfWeek
                        bool matchDaysOfWeek = (!exchangeTask.Start.HasValue && exchangeTask.Due.HasValue && exchangeTask.DaysOfWeek.ToDayOfWeek() == exchangeTask.Due.Value.DayOfWeek) ||
                                               (exchangeTask.Start.HasValue && exchangeTask.DaysOfWeek.ToDayOfWeek() == exchangeTask.Start.Value.DayOfWeek);
                        if (daysCount == 0 || (daysCount == 1 && matchDaysOfWeek))
                        {
                            task.CustomFrequency = FrequencyFactory.GetCustomFrequency(FrequencyType.Weekly);
                        }
                        else if (daysCount > 0)
                        {
                            task.CustomFrequency = frequency;
                        }
                        else
                        {
                            TrackingManagerHelper.Trace("Exchange update task weekly frequency without days");
                        }
                    }
                    else
                    {
                        var frequency = FrequencyFactory.GetCustomFrequency <EveryXPeriodFrequency>(FrequencyType.EveryXPeriod);
                        frequency.Scale = CustomFrequencyScale.Week;
                        frequency.Rate  = exchangeTask.Interval;

                        task.CustomFrequency = frequency;
                    }

                    task.UseFixedDate = exchangeTask.RecurrenceType == ExchangeRecurrencePattern.Weekly;

                    break;

                case ExchangeRecurrencePattern.Monthly:
                case ExchangeRecurrencePattern.MonthlyRegeneration:

                    if (exchangeTask.Interval < 2)
                    {
                        task.CustomFrequency = FrequencyFactory.GetCustomFrequency(FrequencyType.Monthly);
                    }
                    else
                    {
                        var frequency = FrequencyFactory.GetCustomFrequency <EveryXPeriodFrequency>(FrequencyType.EveryXPeriod);
                        frequency.Scale = CustomFrequencyScale.Month;
                        frequency.Rate  = exchangeTask.Interval;

                        task.CustomFrequency = frequency;
                    }

                    task.UseFixedDate = exchangeTask.RecurrenceType == ExchangeRecurrencePattern.Monthly;

                    break;

                case ExchangeRecurrencePattern.MonthlyRelative:
                {
                    if (exchangeTask.Interval == 1)
                    {
                        var frequency = FrequencyFactory.GetCustomFrequency <OnXDayFrequency>(FrequencyType.OnXDayOfEachMonth);
                        frequency.RankingPosition = exchangeTask.DayOfWeekIndex.ToRankingPosition();
                        frequency.DayOfWeek       = exchangeTask.DaysOfWeek.ToDayOfWeek();

                        task.CustomFrequency = frequency;
                    }
                    else if (exchangeTask.Interval > 1)
                    {
                        if (exchangeTask.Due.HasValue && exchangeTask.Due.Value.DayOfWeek == exchangeTask.DaysOfWeek.ToDayOfWeek())
                        {
                            // repeat every N month, day of the week match due date => use EveryXPeriod
                            var frequency = FrequencyFactory.GetCustomFrequency <EveryXPeriodFrequency>(FrequencyType.EveryXPeriod);
                            frequency.Rate  = exchangeTask.Interval;
                            frequency.Scale = CustomFrequencyScale.Month;

                            task.CustomFrequency = frequency;
                        }
                    }
                }

                break;

                case ExchangeRecurrencePattern.Yearly:
                case ExchangeRecurrencePattern.YearlyRegeneration:

                    if (exchangeTask.Interval < 2)
                    {
                        task.CustomFrequency = FrequencyFactory.GetCustomFrequency(FrequencyType.Yearly);
                    }
                    else
                    {
                        var frequency = FrequencyFactory.GetCustomFrequency <EveryXPeriodFrequency>(FrequencyType.EveryXPeriod);
                        frequency.Scale = CustomFrequencyScale.Year;
                        frequency.Rate  = exchangeTask.Interval;

                        task.CustomFrequency = frequency;
                    }
                    task.UseFixedDate = exchangeTask.RecurrenceType == ExchangeRecurrencePattern.Yearly;

                    break;

                default:
                    TrackingManagerHelper.Trace("ExchangeHelper - Unknown recurrence type: " + exchangeTask.RecurrenceType);
                    break;
                }
            }
        }