Exemplo n.º 1
0
        public async Task <(EmailBackedKeyValueStore, LockResult)> LockStoreForWriting(IMailFolder parentFolder, string uniqueStoreName, Action <MimeMessage>?initializationCallback = null)
        {
            logger.Debug("Trying to retrieve remote KV store...");
            var(msg, lockResult) = await GetOrCreateStorageMessageInFolderAsync(parentFolder, uniqueStoreName, "__", false, initializationCallback);

            var kvStore = new EmailBackedKeyValueStore(logger, msg, uniqueStoreName);

            return(kvStore, lockResult);
        }
Exemplo n.º 2
0
        private async Task <(MimeMessageWithUniqueId, LockResult)> GetOrCreateStorageMessageInFolderAsync(IMailFolder folder, string uniqueStoreName, string lockFolderName, bool unlockResource, Action <MimeMessage>?initializationCallback = null)
        {
            var messageIdHeaderValue = uniqueStoreName.EnsureContentIdFormat();

            logger.Debug("Searching storage message in folder {FolderPath} with Message-Id header value {MessageIdHeaderValue}", folder.FullName, messageIdHeaderValue);
            var lockResult = await remoteLock.AcquireLockRetry(folder, lockFolderName);

            if (!lockResult.IsSuccess)
            {
                throw new CannotLockException($"Cannot get lock for resource '{lockFolderName}'");
            }

            try
            {
                var searchResult = await folder.FindIdByMessageIdHeader(messageIdHeaderValue, false, false);

                var         uniqueId      = searchResult.Item1;
                MimeMessage?resultMessage = null;
                if (uniqueId.IsValid)
                {
                    var message = await folder.GetMessageOrDefaultAsync(uniqueId);

                    logger.Debug("Found storage message in folder {FolderPath} for Message-Id header value {MessageIdHeaderValue} with ID {ID}", folder.FullName, messageIdHeaderValue, message.Item2);
                    resultMessage = message.Item1;
                }

                if (resultMessage == null)
                {
                    Action <MimeMessage> initializationCallbackPlusSubjectInit = (message) =>
                    {
                        message.Subject = EmailBackedKeyValueStore.GetSubjectFromUniqueStoreName(uniqueStoreName);
                        initializationCallback?.Invoke(message);
                    };
                    (resultMessage, uniqueId) = await CreateEmptyStorageMessageAsync(folder, messageIdHeaderValue, initializationCallback);
                }
                return(new MimeMessageWithUniqueId()
                {
                    Message = resultMessage, UniqueId = uniqueId
                }, lockResult);
            }
            finally
            {
                if (unlockResource)
                {
                    var unlockResult = await remoteLock.ReleaseLock(folder, lockFolderName, lockResult.ResultingLockCookie);

                    if (!unlockResult)
                    {
                        logger.Warning("Could not unlock the following lock: {@LockResult}", lockResult);
                    }
                }
            }
        }
Exemplo n.º 3
0
 public MimeMessageWrapper(ILogger logger, MimeMessage mimeMessage)
 {
     this.mimeMessage = mimeMessage;
     kvStore          = new EmailBackedKeyValueStore(logger, mimeMessage);
     try
     {
         originalMessage = kvStore.GetOrDefault <Message>("heu-originalMessage").AsObject;
     }
     catch (Exception e)
     {
         logger.Debug(e, "Cannot get original message from mime message");
     };
 }