Esempio n. 1
0
 public NewMessageEventArgs(MessageEntry newMessage)
 {
     NewMessage = newMessage;
 }
Esempio n. 2
0
        public IObservable <MimeMessage> Get(MessageEntry messageEntry)
        {
            _logger.Verbose("Loading Message Entry {@MessageEntry}", messageEntry);

            return(Observable.Create <MimeMessage>(
                       o =>
            {
                // in case of multiple subscriptions...
                var observer = Observer.Synchronize(o);

                var disposable = new CancellationDisposable();

                try
                {
                    var message = MimeMessageCache.GetOrSet(
                        messageEntry.File,
                        () =>
                    {
                        _logger.Verbose(
                            "Getting Message Data from Cached Message Repository",
                            messageEntry);
                        var messageData = _messageRepository.GetMessage(messageEntry);
                        MimeMessage mimeMessage;

                        // wrap in a memorystream...
                        using (var ms = new MemoryStream(messageData))
                        {
                            _logger.Verbose(
                                "MimeMessage Load for {@MessageEntry}",
                                messageEntry);

                            mimeMessage = MimeMessage.Load(
                                ParserOptions.Default,
                                ms,
                                disposable.Token);
                        }

                        return mimeMessage;
                    },
                        m =>
                    {
                        var policy = new CacheItemPolicy
                        {
                            SlidingExpiration = TimeSpan.FromSeconds(300)
                        };

                        MimeMessageCache.Add(messageEntry.File, m, policy);
                    });

                    observer.OnNext(message);
                    observer.OnCompleted();
                }
                catch (OperationCanceledException)
                {
                    // no need to respond...
                }
                catch (Exception ex)
                {
                    _logger.Error(ex, "Exception Loading {@MessageEntry}", messageEntry);
                    observer.OnError(ex);
                }

                return disposable;
            }).SubscribeOn(TaskPoolScheduler.Default));
        }