From 14e10c038c74c90345107d2ca2f910836dc8e5ac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Burak=20Kaan=20K=C3=B6se?= Date: Sat, 30 Nov 2024 12:47:24 +0100 Subject: [PATCH] Single synchronizer for calendar and mail. --- .../AccountManagementViewModel.cs | 11 ++-- Wino.Calendar.ViewModels/AppShellViewModel.cs | 9 ++- .../CalendarPageViewModel.cs | 17 +++-- Wino.Calendar/App.xaml | 3 + Wino.Calendar/App.xaml.cs | 1 + Wino.Calendar/Controls/CalendarItemControl.cs | 2 +- Wino.Calendar/Controls/WinoCalendarPanel.cs | 6 +- .../Services/CalendarAuthenticatorConfig.cs | 30 +++++++++ .../Styles/CalendarItemControlResources.xaml | 2 +- Wino.Calendar/Wino.Calendar.csproj | 1 + .../Entities/Calendar/CalendarItem.cs | 7 +- Wino.Core.Domain/Interfaces/ICalendarItem.cs | 6 +- .../Models/Calendar/CalendarItem.cs | 6 +- .../Synchronization/SynchronizationResult.cs | 19 +++++- Wino.Core.UWP/CoreGeneric.xaml | 4 +- .../Synchronizers/BaseCalendarSynchronizer.cs | 12 ---- .../Calendar/OutlookCalendarSynchronizer.cs | 22 ------- .../{Mail => }/GmailSynchronizer.cs | 4 +- .../{Mail => }/ImapSynchronizer.cs | 2 +- .../{Mail => }/OutlookSynchronizer.cs | 5 +- ...ailSynchronizer.cs => WinoSynchronizer.cs} | 18 ++++-- Wino.Core/Wino.Core.csproj | 1 + Wino.Server/App.xaml.cs | 4 +- Wino.Server/Wino.Server.csproj | 1 + Wino.sln | 64 +++++++++++++++++++ 25 files changed, 179 insertions(+), 78 deletions(-) create mode 100644 Wino.Calendar/Services/CalendarAuthenticatorConfig.cs delete mode 100644 Wino.Core/Synchronizers/BaseCalendarSynchronizer.cs delete mode 100644 Wino.Core/Synchronizers/Calendar/OutlookCalendarSynchronizer.cs rename Wino.Core/Synchronizers/{Mail => }/GmailSynchronizer.cs (99%) rename Wino.Core/Synchronizers/{Mail => }/ImapSynchronizer.cs (99%) rename Wino.Core/Synchronizers/{Mail => }/OutlookSynchronizer.cs (99%) rename Wino.Core/Synchronizers/{BaseMailSynchronizer.cs => WinoSynchronizer.cs} (97%) diff --git a/Wino.Calendar.ViewModels/AccountManagementViewModel.cs b/Wino.Calendar.ViewModels/AccountManagementViewModel.cs index 7fdd50b9..b3a6b0e1 100644 --- a/Wino.Calendar.ViewModels/AccountManagementViewModel.cs +++ b/Wino.Calendar.ViewModels/AccountManagementViewModel.cs @@ -7,6 +7,7 @@ using Wino.Core.Domain.Entities.Shared; using Wino.Core.Domain.Enums; using Wino.Core.Domain.Exceptions; using Wino.Core.Domain.Interfaces; +using Wino.Core.Domain.Models.Authentication; using Wino.Core.Domain.Models.Navigation; using Wino.Core.Domain.Models.Synchronization; using Wino.Core.ViewModels; @@ -96,7 +97,7 @@ namespace Wino.Calendar.ViewModels }; var tokenInformationResponse = await WinoServerConnectionManager - .GetResponseAsync(new AuthorizationRequested(accountCreationDialogResult.ProviderType, + .GetResponseAsync(new AuthorizationRequested(accountCreationDialogResult.ProviderType, createdAccount, createdAccount.ProviderType == MailProviderType.Gmail), accountCreationCancellationTokenSource.Token); @@ -106,11 +107,11 @@ namespace Wino.Calendar.ViewModels tokenInformationResponse.ThrowIfFailed(); - var tokenInformation = tokenInformationResponse.Data; - createdAccount.Address = tokenInformation.Address; - tokenInformation.AccountId = createdAccount.Id; + //var tokenInformation = tokenInformationResponse.Data; + //createdAccount.Address = tokenInformation.Address; + //tokenInformation.AccountId = createdAccount.Id; - await AccountService.CreateAccountAsync(createdAccount, tokenInformation, null); + await AccountService.CreateAccountAsync(createdAccount, null); // Sync profile information if supported. if (createdAccount.IsProfileInfoSyncSupported) diff --git a/Wino.Calendar.ViewModels/AppShellViewModel.cs b/Wino.Calendar.ViewModels/AppShellViewModel.cs index 83ac3e0a..1c7eb4ab 100644 --- a/Wino.Calendar.ViewModels/AppShellViewModel.cs +++ b/Wino.Calendar.ViewModels/AppShellViewModel.cs @@ -114,6 +114,7 @@ namespace Wino.Calendar.ViewModels /// private DateTime GetDisplayTypeSwitchDate() { + var settings = PreferencesService.GetCurrentCalendarSettings(); switch (StatePersistenceService.CalendarDisplayType) { case CalendarDisplayType.Day: @@ -121,10 +122,12 @@ namespace Wino.Calendar.ViewModels return HighlightedDateRange.StartDate; case CalendarDisplayType.Week: - // TODO: From settings - if (HighlightedDateRange.IsInRange(DateTime.Now)) return DateTime.Now.Date.GetWeekStartDateForDate(DayOfWeek.Monday); + if (HighlightedDateRange == null || HighlightedDateRange.IsInRange(DateTime.Now)) + { + return DateTime.Now.Date.GetWeekStartDateForDate(settings.FirstDayOfWeek); + } - return HighlightedDateRange.StartDate.GetWeekStartDateForDate(DayOfWeek.Monday); + return HighlightedDateRange.StartDate.GetWeekStartDateForDate(settings.FirstDayOfWeek); case CalendarDisplayType.WorkWeek: break; case CalendarDisplayType.Month: diff --git a/Wino.Calendar.ViewModels/CalendarPageViewModel.cs b/Wino.Calendar.ViewModels/CalendarPageViewModel.cs index e391b957..75078191 100644 --- a/Wino.Calendar.ViewModels/CalendarPageViewModel.cs +++ b/Wino.Calendar.ViewModels/CalendarPageViewModel.cs @@ -7,7 +7,6 @@ using System.Threading.Tasks; using CommunityToolkit.Diagnostics; using CommunityToolkit.Mvvm.ComponentModel; using CommunityToolkit.Mvvm.Messaging; -using Wino.Calendar.Models.CalendarTypeStrategies; using Wino.Core.Domain.Enums; using Wino.Core.Domain.Interfaces; using Wino.Core.Domain.Models.Calendar; @@ -380,40 +379,40 @@ namespace Wino.Calendar.ViewModels var beforeAllDay = new CalendarItem(calendarItem.StartTime.Date.AddHours(0), calendarItem.StartTime.Date.AddMinutes(30)) { - Name = "kj" + Title = "kj" }; var allday = new CalendarItem(calendarItem.StartTime.Date.AddHours(1), calendarItem.StartTime.Date.AddHours(10).AddMinutes(59)) { - Name = "All day" + Title = "All day" }; var test = new CalendarItem(calendarItem.StartTime.Date.AddHours(4), calendarItem.StartTime.Date.AddHours(4).AddMinutes(30)) { - Name = "test" + Title = "test" }; var hour = new CalendarItem(calendarItem.StartTime.Date.AddHours(7), calendarItem.StartTime.Date.AddHours(8)) { - Name = "1 h" + Title = "1 h" }; var hourandhalf = new CalendarItem(calendarItem.StartTime.Date.AddHours(7), calendarItem.StartTime.Date.AddHours(8).AddMinutes(30)) { - Name = "1.5 h" + Title = "1.5 h" }; var halfhour1 = new CalendarItem(calendarItem.StartTime.Date.AddHours(7), calendarItem.StartTime.Date.AddHours(7).AddMinutes(30)) { - Name = "30 min" + Title = "30 min" }; var halfhour2 = new CalendarItem(calendarItem.StartTime.Date.AddHours(7).AddMinutes(30), calendarItem.StartTime.Date.AddHours(8)) { - Name = "30 min" + Title = "30 min" }; var halfhour3 = new CalendarItem(calendarItem.StartTime.Date.AddHours(8), calendarItem.StartTime.Date.AddHours(8).AddMinutes(30)) { - Name = "30 min" + Title = "30 min" }; foreach (var day in eventDays) diff --git a/Wino.Calendar/App.xaml b/Wino.Calendar/App.xaml index 7d679b49..086cf7d0 100644 --- a/Wino.Calendar/App.xaml +++ b/Wino.Calendar/App.xaml @@ -27,6 +27,9 @@ + + + diff --git a/Wino.Calendar/App.xaml.cs b/Wino.Calendar/App.xaml.cs index ee381c2b..418c0846 100644 --- a/Wino.Calendar/App.xaml.cs +++ b/Wino.Calendar/App.xaml.cs @@ -64,6 +64,7 @@ namespace Wino.Calendar services.AddSingleton(); services.AddTransient(); services.AddTransient(); + services.AddSingleton(); } private void RegisterViewModels(IServiceCollection services) diff --git a/Wino.Calendar/Controls/CalendarItemControl.cs b/Wino.Calendar/Controls/CalendarItemControl.cs index 23a66563..e244da1e 100644 --- a/Wino.Calendar/Controls/CalendarItemControl.cs +++ b/Wino.Calendar/Controls/CalendarItemControl.cs @@ -36,7 +36,7 @@ namespace Wino.Calendar.Controls public override string ToString() { - return Item?.Name ?? "NA"; + return Item?.Title ?? "NA"; } } } diff --git a/Wino.Calendar/Controls/WinoCalendarPanel.cs b/Wino.Calendar/Controls/WinoCalendarPanel.cs index 9e19ae62..78144342 100644 --- a/Wino.Calendar/Controls/WinoCalendarPanel.cs +++ b/Wino.Calendar/Controls/WinoCalendarPanel.cs @@ -75,7 +75,7 @@ namespace Wino.Calendar.Controls // No need to handle actions. Each action requires a full measurement update. private void EventCollectionChanged(object sender, NotifyCollectionChangedEventArgs e) => ResetMeasurements(); - private double GetChildTopMargin(DateTime childStart, double availableHeight) + private double GetChildTopMargin(DateTimeOffset childStart, double availableHeight) { double totalMinutes = 1440; double minutesFromStart = (childStart - DayModel.RepresentingDate).TotalMinutes; @@ -90,7 +90,7 @@ namespace Wino.Calendar.Controls private double GetChildLeftMargin(CalendarItemMeasurement calendarItemMeasurement, double availableWidth) => availableWidth * calendarItemMeasurement.Left; - private double GetChildHeight(DateTime childStart, DateTime childEnd) + private double GetChildHeight(DateTimeOffset childStart, DateTimeOffset childEnd) { double totalMinutes = 1440; double availableHeight = DayModel.CalendarRenderOptions.CalendarSettings.HourHeight * 24; @@ -146,7 +146,7 @@ namespace Wino.Calendar.Controls child.Measure(new Size(childWidth, childHeight)); - var arrangementRect = new Rect(childLeft + EventItemMargin.Left, childTop + EventItemMargin.Top, childWidth - extraRightMargin, childHeight); + var arrangementRect = new Rect(childLeft + EventItemMargin.Left, childTop + EventItemMargin.Top, Math.Max(childWidth - extraRightMargin, 1), childHeight); child.Arrange(arrangementRect); } diff --git a/Wino.Calendar/Services/CalendarAuthenticatorConfig.cs b/Wino.Calendar/Services/CalendarAuthenticatorConfig.cs new file mode 100644 index 00000000..42e9da4b --- /dev/null +++ b/Wino.Calendar/Services/CalendarAuthenticatorConfig.cs @@ -0,0 +1,30 @@ +using Wino.Core.Domain.Interfaces; + +namespace Wino.Calendar.Services +{ + public class CalendarAuthenticatorConfig : IAuthenticatorConfig + { + public string OutlookAuthenticatorClientId => "b19c2035-d740-49ff-b297-de6ec561b208"; + + public string[] OutlookScope => new string[] + { + "Calendars.Read", + "Calendars.Read.Shared", + "offline_access", + "Calendars.ReadBasic", + "Calendars.ReadWrite", + "Calendars.ReadWrite.Shared", + "User.Read" + }; + + public string GmailAuthenticatorClientId => "973025879644-s7b4ur9p3rlgop6a22u7iuptdc0brnrn.apps.googleusercontent.com"; + + public string[] GmailScope => new string[] + { + "https://mail.google.com/", + "https://www.googleapis.com/auth/calendar", + "https://www.googleapis.com/auth/calendar.events", + "https://www.googleapis.com/auth/calendar.settings.readonly" + }; + } +} diff --git a/Wino.Calendar/Styles/CalendarItemControlResources.xaml b/Wino.Calendar/Styles/CalendarItemControlResources.xaml index eaa70e09..fbe5c2ae 100644 --- a/Wino.Calendar/Styles/CalendarItemControlResources.xaml +++ b/Wino.Calendar/Styles/CalendarItemControlResources.xaml @@ -18,7 +18,7 @@ + Text="{x:Bind Item.Title, Mode=OneWay}" /> diff --git a/Wino.Calendar/Wino.Calendar.csproj b/Wino.Calendar/Wino.Calendar.csproj index 2b82548a..165faa7f 100644 --- a/Wino.Calendar/Wino.Calendar.csproj +++ b/Wino.Calendar/Wino.Calendar.csproj @@ -152,6 +152,7 @@ + diff --git a/Wino.Core.Domain/Entities/Calendar/CalendarItem.cs b/Wino.Core.Domain/Entities/Calendar/CalendarItem.cs index 87be1f29..d4c49b4f 100644 --- a/Wino.Core.Domain/Entities/Calendar/CalendarItem.cs +++ b/Wino.Core.Domain/Entities/Calendar/CalendarItem.cs @@ -1,10 +1,12 @@ using System; +using Itenso.TimePeriod; using SQLite; using Wino.Core.Domain.Enums; +using Wino.Core.Domain.Interfaces; namespace Wino.Core.Domain.Entities.Calendar { - public class CalendarItem + public class CalendarItem : ICalendarItem { [PrimaryKey] public Guid Id { get; set; } @@ -20,5 +22,8 @@ namespace Wino.Core.Domain.Entities.Calendar public DateTimeOffset CreatedAt { get; set; } public DateTimeOffset UpdatedAt { get; set; } public Guid CalendarId { get; set; } + + [Ignore] + public TimeRange Period => new TimeRange(StartTime.Date, EndTime.Date); } } diff --git a/Wino.Core.Domain/Interfaces/ICalendarItem.cs b/Wino.Core.Domain/Interfaces/ICalendarItem.cs index 9cef0baf..8c36d74d 100644 --- a/Wino.Core.Domain/Interfaces/ICalendarItem.cs +++ b/Wino.Core.Domain/Interfaces/ICalendarItem.cs @@ -5,10 +5,10 @@ namespace Wino.Core.Domain.Interfaces { public interface ICalendarItem { - string Name { get; } + string Title { get; } Guid Id { get; } - DateTime StartTime { get; } - DateTime EndTime { get; } + DateTimeOffset StartTime { get; } + DateTimeOffset EndTime { get; } TimeRange Period { get; } } } diff --git a/Wino.Core.Domain/Models/Calendar/CalendarItem.cs b/Wino.Core.Domain/Models/Calendar/CalendarItem.cs index c4b7f39b..437f4c47 100644 --- a/Wino.Core.Domain/Models/Calendar/CalendarItem.cs +++ b/Wino.Core.Domain/Models/Calendar/CalendarItem.cs @@ -6,7 +6,7 @@ namespace Wino.Core.Domain.Models.Calendar { public class CalendarItem : ICalendarItem { - public string Name { get; set; } + public string Title { get; set; } public CalendarItem(DateTime startTime, DateTime endTime) { StartTime = startTime; @@ -14,8 +14,8 @@ namespace Wino.Core.Domain.Models.Calendar Period = new TimeRange(startTime, endTime); } - public DateTime StartTime { get; } - public DateTime EndTime { get; } + public DateTimeOffset StartTime { get; } + public DateTimeOffset EndTime { get; } public Guid Id { get; } = Guid.NewGuid(); diff --git a/Wino.Core.Domain/Models/Synchronization/SynchronizationResult.cs b/Wino.Core.Domain/Models/Synchronization/SynchronizationResult.cs index 0e98844a..7145dacb 100644 --- a/Wino.Core.Domain/Models/Synchronization/SynchronizationResult.cs +++ b/Wino.Core.Domain/Models/Synchronization/SynchronizationResult.cs @@ -1,6 +1,7 @@ using System.Collections.Generic; using System.Text.Json.Serialization; using Wino.Core.Domain.Enums; +using Wino.Core.Domain.Interfaces; using Wino.Core.Domain.Models.Accounts; using Wino.Core.Domain.Models.MailItem; @@ -18,16 +19,32 @@ namespace Wino.Core.Domain.Models.Synchronization [JsonIgnore] public IEnumerable DownloadedMessages { get; set; } = []; + /// + /// Gets the new downloaded events from synchronization. + /// Server will create notifications for these events. + /// It's ignored in serialization. Client should not react to this. + /// + [JsonIgnore] + public IEnumerable DownloadedEvents { get; set; } = []; + public ProfileInformation ProfileInformation { get; set; } public SynchronizationCompletedState CompletedState { get; set; } public static SynchronizationResult Empty => new() { CompletedState = SynchronizationCompletedState.Success }; - public static SynchronizationResult Completed(IEnumerable downloadedMessages, ProfileInformation profileInformation = null) + // Mail synchronization + public static SynchronizationResult Completed(IEnumerable downloadedMessages) => new() { DownloadedMessages = downloadedMessages, + CompletedState = SynchronizationCompletedState.Success + }; + + // Profile synchronization + public static SynchronizationResult Completed(ProfileInformation profileInformation) + => new() + { ProfileInformation = profileInformation, CompletedState = SynchronizationCompletedState.Success }; diff --git a/Wino.Core.UWP/CoreGeneric.xaml b/Wino.Core.UWP/CoreGeneric.xaml index 30bb098e..64a86083 100644 --- a/Wino.Core.UWP/CoreGeneric.xaml +++ b/Wino.Core.UWP/CoreGeneric.xaml @@ -31,8 +31,8 @@ 0 - 19 - 19 + 24,24,24,24 diff --git a/Wino.Core/Synchronizers/BaseCalendarSynchronizer.cs b/Wino.Core/Synchronizers/BaseCalendarSynchronizer.cs deleted file mode 100644 index 0483667a..00000000 --- a/Wino.Core/Synchronizers/BaseCalendarSynchronizer.cs +++ /dev/null @@ -1,12 +0,0 @@ -using Wino.Core.Domain.Entities.Shared; -using Wino.Core.Domain.Interfaces; - -namespace Wino.Core.Synchronizers -{ - public abstract class BaseCalendarSynchronizer : BaseSynchronizer, IBaseCalendarSynchronizer - { - protected BaseCalendarSynchronizer(MailAccount account) : base(account) - { - } - } -} diff --git a/Wino.Core/Synchronizers/Calendar/OutlookCalendarSynchronizer.cs b/Wino.Core/Synchronizers/Calendar/OutlookCalendarSynchronizer.cs deleted file mode 100644 index 81879269..00000000 --- a/Wino.Core/Synchronizers/Calendar/OutlookCalendarSynchronizer.cs +++ /dev/null @@ -1,22 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Threading; -using System.Threading.Tasks; -using Microsoft.Kiota.Abstractions; -using Wino.Core.Domain.Entities.Shared; -using Wino.Core.Domain.Interfaces; - -namespace Wino.Core.Synchronizers.Calendar -{ - public class OutlookCalendarSynchronizer : BaseSynchronizer - { - public OutlookCalendarSynchronizer(MailAccount account) : base(account) - { - } - - public override Task ExecuteNativeRequestsAsync(List> batchedRequests, CancellationToken cancellationToken = default) - { - throw new NotImplementedException(); - } - } -} diff --git a/Wino.Core/Synchronizers/Mail/GmailSynchronizer.cs b/Wino.Core/Synchronizers/GmailSynchronizer.cs similarity index 99% rename from Wino.Core/Synchronizers/Mail/GmailSynchronizer.cs rename to Wino.Core/Synchronizers/GmailSynchronizer.cs index c2b79aa7..f4a1301b 100644 --- a/Wino.Core/Synchronizers/Mail/GmailSynchronizer.cs +++ b/Wino.Core/Synchronizers/GmailSynchronizer.cs @@ -5,6 +5,7 @@ using System.Net.Http; using System.Threading; using System.Threading.Tasks; using CommunityToolkit.Mvvm.Messaging; +using Google.Apis.Calendar.v3.Data; using Google.Apis.Gmail.v1; using Google.Apis.Gmail.v1.Data; using Google.Apis.Http; @@ -34,7 +35,7 @@ using Wino.Messaging.UI; namespace Wino.Core.Synchronizers.Mail { - public class GmailSynchronizer : BaseMailSynchronizer, IHttpClientFactory + public class GmailSynchronizer : WinoSynchronizer, IHttpClientFactory { public override uint BatchModificationSize => 1000; public override uint InitialMessageDownloadCountPerFolder => 1200; @@ -67,6 +68,7 @@ namespace Wino.Core.Synchronizers.Mail _gmailService = new GmailService(initializer); _peopleService = new PeopleServiceService(initializer); + _authenticator = authenticator; _gmailChangeProcessor = gmailChangeProcessor; } diff --git a/Wino.Core/Synchronizers/Mail/ImapSynchronizer.cs b/Wino.Core/Synchronizers/ImapSynchronizer.cs similarity index 99% rename from Wino.Core/Synchronizers/Mail/ImapSynchronizer.cs rename to Wino.Core/Synchronizers/ImapSynchronizer.cs index 3a807d35..1ec9dd89 100644 --- a/Wino.Core/Synchronizers/Mail/ImapSynchronizer.cs +++ b/Wino.Core/Synchronizers/ImapSynchronizer.cs @@ -30,7 +30,7 @@ using Wino.Messaging.UI; namespace Wino.Core.Synchronizers.Mail { - public class ImapSynchronizer : BaseMailSynchronizer + public class ImapSynchronizer : WinoSynchronizer { private CancellationTokenSource idleDoneToken; private CancellationTokenSource cancelInboxListeningToken = new CancellationTokenSource(); diff --git a/Wino.Core/Synchronizers/Mail/OutlookSynchronizer.cs b/Wino.Core/Synchronizers/OutlookSynchronizer.cs similarity index 99% rename from Wino.Core/Synchronizers/Mail/OutlookSynchronizer.cs rename to Wino.Core/Synchronizers/OutlookSynchronizer.cs index 6d1e08f9..a15721b5 100644 --- a/Wino.Core/Synchronizers/Mail/OutlookSynchronizer.cs +++ b/Wino.Core/Synchronizers/OutlookSynchronizer.cs @@ -38,7 +38,7 @@ using Wino.Core.Requests.Mail; namespace Wino.Core.Synchronizers.Mail { - public class OutlookSynchronizer : BaseMailSynchronizer + public class OutlookSynchronizer : WinoSynchronizer { public override uint BatchModificationSize => 20; public override uint InitialMessageDownloadCountPerFolder => 250; @@ -572,8 +572,6 @@ namespace Wino.Core.Synchronizers.Mail #region Mail Integration - - public override bool DelaySendOperationSynchronization() => true; public override List> Move(BatchMoveRequest request) @@ -925,7 +923,6 @@ namespace Wino.Core.Synchronizers.Mail } } - private async Task DownloadMimeMessageAsync(string messageId, CancellationToken cancellationToken = default) { var mimeContentStream = await _graphClient.Me.Messages[messageId].Content.GetAsync(null, cancellationToken).ConfigureAwait(false); diff --git a/Wino.Core/Synchronizers/BaseMailSynchronizer.cs b/Wino.Core/Synchronizers/WinoSynchronizer.cs similarity index 97% rename from Wino.Core/Synchronizers/BaseMailSynchronizer.cs rename to Wino.Core/Synchronizers/WinoSynchronizer.cs index f68b1cd1..f39dea22 100644 --- a/Wino.Core/Synchronizers/BaseMailSynchronizer.cs +++ b/Wino.Core/Synchronizers/WinoSynchronizer.cs @@ -23,11 +23,11 @@ using Wino.Messaging.UI; namespace Wino.Core.Synchronizers { - public abstract class BaseMailSynchronizer : BaseSynchronizer, IBaseMailSynchronizer + public abstract class WinoSynchronizer : BaseSynchronizer, IBaseMailSynchronizer { - protected ILogger Logger = Log.ForContext>(); + protected ILogger Logger = Log.ForContext>(); - protected BaseMailSynchronizer(MailAccount account) : base(account) + protected WinoSynchronizer(MailAccount account) : base(account) { } @@ -186,7 +186,7 @@ namespace Wino.Core.Synchronizers return SynchronizationResult.Failed; } - return SynchronizationResult.Completed(null, newProfileInformation); + return SynchronizationResult.Completed(newProfileInformation); } // Alias sync. @@ -300,6 +300,8 @@ namespace Wino.Core.Synchronizers return options; } + #region Mail/Folder Operations + public virtual bool DelaySendOperationSynchronization() => false; public virtual List> Move(BatchMoveRequest request) => throw new NotSupportedException(string.Format(Translator.Exception_UnsupportedSynchronizerOperation, this.GetType())); public virtual List> ChangeFlag(BatchChangeFlagRequest request) => throw new NotSupportedException(string.Format(Translator.Exception_UnsupportedSynchronizerOperation, this.GetType())); @@ -314,6 +316,14 @@ namespace Wino.Core.Synchronizers public virtual List> EmptyFolder(EmptyFolderRequest request) => throw new NotSupportedException(string.Format(Translator.Exception_UnsupportedSynchronizerOperation, this.GetType())); public virtual List> MarkFolderAsRead(MarkFolderAsReadRequest request) => throw new NotSupportedException(string.Format(Translator.Exception_UnsupportedSynchronizerOperation, this.GetType())); + #endregion + + #region Calendar Operations + + + #endregion + + /// /// Downloads a single missing message from synchronizer and saves it to given FileId from IMailItem. /// diff --git a/Wino.Core/Wino.Core.csproj b/Wino.Core/Wino.Core.csproj index 19b1a7ae..56060661 100644 --- a/Wino.Core/Wino.Core.csproj +++ b/Wino.Core/Wino.Core.csproj @@ -16,6 +16,7 @@ + diff --git a/Wino.Server/App.xaml.cs b/Wino.Server/App.xaml.cs index 5768fece..954273af 100644 --- a/Wino.Server/App.xaml.cs +++ b/Wino.Server/App.xaml.cs @@ -9,6 +9,7 @@ using System.Windows; using H.NotifyIcon; using Microsoft.Extensions.DependencyInjection; using Windows.Storage; +using Wino.Calendar.Services; using Wino.Core; using Wino.Core.Domain; using Wino.Core.Domain.Enums; @@ -92,10 +93,9 @@ namespace Wino.Server } else { - // TODO: Calendar config will be added here. + services.AddSingleton(); } - return services.BuildServiceProvider(); } diff --git a/Wino.Server/Wino.Server.csproj b/Wino.Server/Wino.Server.csproj index 971e6885..e1a7c79d 100644 --- a/Wino.Server/Wino.Server.csproj +++ b/Wino.Server/Wino.Server.csproj @@ -19,6 +19,7 @@ + diff --git a/Wino.sln b/Wino.sln index 28c61a9b..19e2eeb3 100644 --- a/Wino.sln +++ b/Wino.sln @@ -34,6 +34,10 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Wino.Calendar.ViewModels", EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Wino.Authentication", "Wino.Authentication\Wino.Authentication.csproj", "{A4DBA01A-F315-49E0-8428-BB99D32B20F9}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Wino.Calendar", "Wino.Calendar\Wino.Calendar.csproj", "{600F4979-DB7E-409D-B7DA-B60BE4C55C35}" +EndProject +Project("{C7167F0D-BC9F-4E6E-AFE1-012C56B48DB5}") = "Wino.Calendar.Packaging", "Wino.Calendar.Packaging\Wino.Calendar.Packaging.wapproj", "{7485B18C-F5AB-4ABE-BA7F-05B6623C67C8}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -328,6 +332,66 @@ Global {A4DBA01A-F315-49E0-8428-BB99D32B20F9}.Release|x64.Build.0 = Release|Any CPU {A4DBA01A-F315-49E0-8428-BB99D32B20F9}.Release|x86.ActiveCfg = Release|Any CPU {A4DBA01A-F315-49E0-8428-BB99D32B20F9}.Release|x86.Build.0 = Release|Any CPU + {600F4979-DB7E-409D-B7DA-B60BE4C55C35}.Debug|Any CPU.ActiveCfg = Debug|x64 + {600F4979-DB7E-409D-B7DA-B60BE4C55C35}.Debug|Any CPU.Build.0 = Debug|x64 + {600F4979-DB7E-409D-B7DA-B60BE4C55C35}.Debug|Any CPU.Deploy.0 = Debug|x64 + {600F4979-DB7E-409D-B7DA-B60BE4C55C35}.Debug|ARM.ActiveCfg = Debug|ARM + {600F4979-DB7E-409D-B7DA-B60BE4C55C35}.Debug|ARM.Build.0 = Debug|ARM + {600F4979-DB7E-409D-B7DA-B60BE4C55C35}.Debug|ARM.Deploy.0 = Debug|ARM + {600F4979-DB7E-409D-B7DA-B60BE4C55C35}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {600F4979-DB7E-409D-B7DA-B60BE4C55C35}.Debug|ARM64.Build.0 = Debug|ARM64 + {600F4979-DB7E-409D-B7DA-B60BE4C55C35}.Debug|ARM64.Deploy.0 = Debug|ARM64 + {600F4979-DB7E-409D-B7DA-B60BE4C55C35}.Debug|x64.ActiveCfg = Debug|x64 + {600F4979-DB7E-409D-B7DA-B60BE4C55C35}.Debug|x64.Build.0 = Debug|x64 + {600F4979-DB7E-409D-B7DA-B60BE4C55C35}.Debug|x64.Deploy.0 = Debug|x64 + {600F4979-DB7E-409D-B7DA-B60BE4C55C35}.Debug|x86.ActiveCfg = Debug|x86 + {600F4979-DB7E-409D-B7DA-B60BE4C55C35}.Debug|x86.Build.0 = Debug|x86 + {600F4979-DB7E-409D-B7DA-B60BE4C55C35}.Debug|x86.Deploy.0 = Debug|x86 + {600F4979-DB7E-409D-B7DA-B60BE4C55C35}.Release|Any CPU.ActiveCfg = Release|x64 + {600F4979-DB7E-409D-B7DA-B60BE4C55C35}.Release|Any CPU.Build.0 = Release|x64 + {600F4979-DB7E-409D-B7DA-B60BE4C55C35}.Release|Any CPU.Deploy.0 = Release|x64 + {600F4979-DB7E-409D-B7DA-B60BE4C55C35}.Release|ARM.ActiveCfg = Release|ARM + {600F4979-DB7E-409D-B7DA-B60BE4C55C35}.Release|ARM.Build.0 = Release|ARM + {600F4979-DB7E-409D-B7DA-B60BE4C55C35}.Release|ARM.Deploy.0 = Release|ARM + {600F4979-DB7E-409D-B7DA-B60BE4C55C35}.Release|ARM64.ActiveCfg = Release|ARM64 + {600F4979-DB7E-409D-B7DA-B60BE4C55C35}.Release|ARM64.Build.0 = Release|ARM64 + {600F4979-DB7E-409D-B7DA-B60BE4C55C35}.Release|ARM64.Deploy.0 = Release|ARM64 + {600F4979-DB7E-409D-B7DA-B60BE4C55C35}.Release|x64.ActiveCfg = Release|x64 + {600F4979-DB7E-409D-B7DA-B60BE4C55C35}.Release|x64.Build.0 = Release|x64 + {600F4979-DB7E-409D-B7DA-B60BE4C55C35}.Release|x64.Deploy.0 = Release|x64 + {600F4979-DB7E-409D-B7DA-B60BE4C55C35}.Release|x86.ActiveCfg = Release|x86 + {600F4979-DB7E-409D-B7DA-B60BE4C55C35}.Release|x86.Build.0 = Release|x86 + {600F4979-DB7E-409D-B7DA-B60BE4C55C35}.Release|x86.Deploy.0 = Release|x86 + {7485B18C-F5AB-4ABE-BA7F-05B6623C67C8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {7485B18C-F5AB-4ABE-BA7F-05B6623C67C8}.Debug|Any CPU.Build.0 = Debug|Any CPU + {7485B18C-F5AB-4ABE-BA7F-05B6623C67C8}.Debug|Any CPU.Deploy.0 = Debug|Any CPU + {7485B18C-F5AB-4ABE-BA7F-05B6623C67C8}.Debug|ARM.ActiveCfg = Debug|ARM + {7485B18C-F5AB-4ABE-BA7F-05B6623C67C8}.Debug|ARM.Build.0 = Debug|ARM + {7485B18C-F5AB-4ABE-BA7F-05B6623C67C8}.Debug|ARM.Deploy.0 = Debug|ARM + {7485B18C-F5AB-4ABE-BA7F-05B6623C67C8}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {7485B18C-F5AB-4ABE-BA7F-05B6623C67C8}.Debug|ARM64.Build.0 = Debug|ARM64 + {7485B18C-F5AB-4ABE-BA7F-05B6623C67C8}.Debug|ARM64.Deploy.0 = Debug|ARM64 + {7485B18C-F5AB-4ABE-BA7F-05B6623C67C8}.Debug|x64.ActiveCfg = Debug|x64 + {7485B18C-F5AB-4ABE-BA7F-05B6623C67C8}.Debug|x64.Build.0 = Debug|x64 + {7485B18C-F5AB-4ABE-BA7F-05B6623C67C8}.Debug|x64.Deploy.0 = Debug|x64 + {7485B18C-F5AB-4ABE-BA7F-05B6623C67C8}.Debug|x86.ActiveCfg = Debug|x86 + {7485B18C-F5AB-4ABE-BA7F-05B6623C67C8}.Debug|x86.Build.0 = Debug|x86 + {7485B18C-F5AB-4ABE-BA7F-05B6623C67C8}.Debug|x86.Deploy.0 = Debug|x86 + {7485B18C-F5AB-4ABE-BA7F-05B6623C67C8}.Release|Any CPU.ActiveCfg = Release|Any CPU + {7485B18C-F5AB-4ABE-BA7F-05B6623C67C8}.Release|Any CPU.Build.0 = Release|Any CPU + {7485B18C-F5AB-4ABE-BA7F-05B6623C67C8}.Release|Any CPU.Deploy.0 = Release|Any CPU + {7485B18C-F5AB-4ABE-BA7F-05B6623C67C8}.Release|ARM.ActiveCfg = Release|ARM + {7485B18C-F5AB-4ABE-BA7F-05B6623C67C8}.Release|ARM.Build.0 = Release|ARM + {7485B18C-F5AB-4ABE-BA7F-05B6623C67C8}.Release|ARM.Deploy.0 = Release|ARM + {7485B18C-F5AB-4ABE-BA7F-05B6623C67C8}.Release|ARM64.ActiveCfg = Release|ARM64 + {7485B18C-F5AB-4ABE-BA7F-05B6623C67C8}.Release|ARM64.Build.0 = Release|ARM64 + {7485B18C-F5AB-4ABE-BA7F-05B6623C67C8}.Release|ARM64.Deploy.0 = Release|ARM64 + {7485B18C-F5AB-4ABE-BA7F-05B6623C67C8}.Release|x64.ActiveCfg = Release|x64 + {7485B18C-F5AB-4ABE-BA7F-05B6623C67C8}.Release|x64.Build.0 = Release|x64 + {7485B18C-F5AB-4ABE-BA7F-05B6623C67C8}.Release|x64.Deploy.0 = Release|x64 + {7485B18C-F5AB-4ABE-BA7F-05B6623C67C8}.Release|x86.ActiveCfg = Release|x86 + {7485B18C-F5AB-4ABE-BA7F-05B6623C67C8}.Release|x86.Build.0 = Release|x86 + {7485B18C-F5AB-4ABE-BA7F-05B6623C67C8}.Release|x86.Deploy.0 = Release|x86 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE