diff --git a/Wino.Core/Services/SynchronizerFactory.cs b/Wino.Core/Services/SynchronizerFactory.cs index 4aa509a6..96bebacc 100644 --- a/Wino.Core/Services/SynchronizerFactory.cs +++ b/Wino.Core/Services/SynchronizerFactory.cs @@ -13,6 +13,7 @@ namespace Wino.Core.Services private bool isInitialized = false; private readonly IAccountService _accountService; + private readonly IApplicationConfiguration _applicationConfiguration; private readonly IOutlookChangeProcessor _outlookChangeProcessor; private readonly IGmailChangeProcessor _gmailChangeProcessor; private readonly IImapChangeProcessor _imapChangeProcessor; @@ -26,7 +27,8 @@ namespace Wino.Core.Services IImapChangeProcessor imapChangeProcessor, IOutlookAuthenticator outlookAuthenticator, IGmailAuthenticator gmailAuthenticator, - IAccountService accountService) + IAccountService accountService, + IApplicationConfiguration applicationConfiguration) { _outlookChangeProcessor = outlookChangeProcessor; _gmailChangeProcessor = gmailChangeProcessor; @@ -34,6 +36,7 @@ namespace Wino.Core.Services _outlookAuthenticator = outlookAuthenticator; _gmailAuthenticator = gmailAuthenticator; _accountService = accountService; + _applicationConfiguration = applicationConfiguration; } public async Task GetAccountSynchronizerAsync(Guid accountId) @@ -67,7 +70,7 @@ namespace Wino.Core.Services case Domain.Enums.MailProviderType.Gmail: return new GmailSynchronizer(mailAccount, _gmailAuthenticator, _gmailChangeProcessor); case Domain.Enums.MailProviderType.IMAP4: - return new ImapSynchronizer(mailAccount, _imapChangeProcessor); + return new ImapSynchronizer(mailAccount, _imapChangeProcessor, _applicationConfiguration); default: break; } diff --git a/Wino.Core/Synchronizers/ImapSynchronizer.cs b/Wino.Core/Synchronizers/ImapSynchronizer.cs index 99c1e100..d8c15851 100644 --- a/Wino.Core/Synchronizers/ImapSynchronizer.cs +++ b/Wino.Core/Synchronizers/ImapSynchronizer.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.IO; using System.Linq; using System.Threading; using System.Threading.Tasks; @@ -36,6 +37,7 @@ namespace Wino.Core.Synchronizers private readonly ILogger _logger = Log.ForContext(); private readonly ImapClientPool _clientPool; private readonly IImapChangeProcessor _imapChangeProcessor; + private readonly IApplicationConfiguration _applicationConfiguration; // Minimum summary items to Fetch for mail synchronization from IMAP. private readonly MessageSummaryItems mailSynchronizationFlags = @@ -63,14 +65,30 @@ namespace Wino.Core.Synchronizers public override uint BatchModificationSize => 1000; public override uint InitialMessageDownloadCountPerFolder => 250; - public ImapSynchronizer(MailAccount account, IImapChangeProcessor imapChangeProcessor) : base(account) + public ImapSynchronizer(MailAccount account, + IImapChangeProcessor imapChangeProcessor, + IApplicationConfiguration applicationConfiguration) : base(account) { - _clientPool = new ImapClientPool(Account.ServerInformation); + // Create client pool with account protocol log. _imapChangeProcessor = imapChangeProcessor; + _applicationConfiguration = applicationConfiguration; + _clientPool = new ImapClientPool(Account.ServerInformation, CreateAccountProtocolLogFileStream()); idleDoneToken = new CancellationTokenSource(); } + private Stream CreateAccountProtocolLogFileStream() + { + if (Account == null) throw new ArgumentNullException(nameof(Account)); + + var logFile = Path.Combine(_applicationConfiguration.ApplicationDataFolderPath, $"Protocol_{Account.Address}.log"); + + // Each session should start a new log. + if (File.Exists(logFile)) File.Delete(logFile); + + return new FileStream(logFile, FileMode.CreateNew); + } + // TODO // private async void NoOpTimerTriggered(object state) => await AwaitInboxIdleAsync(); @@ -265,7 +283,6 @@ namespace Wino.Core.Synchronizers { return CreateTaskBundle(async (ImapClient client) => { - var remoteDraftFolder = await client.GetFolderAsync(request.DraftPreperationRequest.CreatedLocalDraftCopy.AssignedFolder.RemoteFolderId).ConfigureAwait(false); await remoteDraftFolder.OpenAsync(FolderAccess.ReadWrite).ConfigureAwait(false);