/// <summary>
 /// Get article by message ID by it's number in specified group.
 /// </summary>
 /// <param name="articleNumber">Message number.</param>
 /// <param name="groupName">Group name.</param>
 /// <param name="content">Necessary content of message.</param>
 /// <returns>Article.</returns>
 public override NewsArticle GetNonCachedArticle(int articleNumber, string groupName,
                                                 NewsArticle.Content content)
 {
     return(ToNNTPArticle(
                UpdateReferences(
                    GetArticle(articleNumber, groupName)), groupName, content));
 }
Example #2
0
        /// <summary>
        /// Get article considering cache with additional cache managing parameter (caching salt).
        /// </summary>
        /// <param name="articleNumber"></param>
        /// <param name="groupName"></param>
        /// <param name="content"></param>
        /// <param name="cacheSalt"></param>
        /// <returns></returns>
        public virtual NewsArticle GetArticle(int articleNumber, string groupName,
                                              NewsArticle.Content content, string cacheSalt)
        {
            NewsArticle article;

            if (settings.Cache != CacheType.None)
            {
                // check message in cache
                article = cache[groupName + articleNumber + cacheSalt] as NewsArticle;
                if ((article == null) || !CheckContentSuitable(content, article.Contents))
                // There is no suitable message in cache.
                {
                    article = GetNonCachedArticle(articleNumber, groupName, content);

                    // Put the message in the cache.
                    PutInCache(article, cacheSalt);
                }
            }
            else
            {
                // Don't use cache.
                article = GetNonCachedArticle(articleNumber, groupName, content);
            }

            return(article);
        }
 /// <summary>
 /// Get article without lookup in cache by message id.
 /// </summary>
 /// <param name="messageID">Message ID.</param>
 /// <param name="content">Necessary content of message.</param>
 /// <returns>Article.</returns>
 public override NewsArticle GetNonCachedArticle(string messageID, NewsArticle.Content content)
 {
     try
     {
         var _messageID = int.Parse(messageIdNumber.Match(messageID).Groups["messageIdNumber"].Value);
         var message    = GetArticle(_messageID);
         return(ToNNTPArticle(UpdateReferences(message), message.Group, content));
     }
     catch (FormatException)
     {
         throw new DataProviderException(DataProviderErrors.NoSuchArticle);
     }
 }
Example #4
0
        /// <summary>
        /// Check if current content of article is suitable for need content.
        /// </summary>
        /// <param name="need">Necessary content of the message.</param>
        /// <param name="current">Current content if the message.</param>
        /// <returns></returns>
        protected static bool CheckContentSuitable(NewsArticle.Content need, NewsArticle.Content current)
        {
            var suit = false;

            switch (need)
            {
            case NewsArticle.Content.None:
                switch (current)
                {
                case NewsArticle.Content.None:
                case NewsArticle.Content.Header:
                case NewsArticle.Content.HeaderAndBody:
                    suit = true;
                    break;
                }
                break;

            case NewsArticle.Content.Header:
                switch (current)
                {
                case NewsArticle.Content.Header:
                case NewsArticle.Content.HeaderAndBody:
                    suit = true;
                    break;
                }
                break;

            case NewsArticle.Content.Body:
                switch (current)
                {
                case NewsArticle.Content.Body:
                case NewsArticle.Content.HeaderAndBody:
                    suit = true;
                    break;
                }
                break;

            case NewsArticle.Content.HeaderAndBody:
                if (current == NewsArticle.Content.HeaderAndBody)
                {
                    suit = true;
                }
                break;
            }

            return(suit);
        }
Example #5
0
 public abstract NewsArticle GetNonCachedArticle(int articleNumber, string groupName,
                                                 NewsArticle.Content content);
Example #6
0
 public abstract NewsArticle GetNonCachedArticle(string originalMessageID,
                                                 NewsArticle.Content content);
Example #7
0
 public abstract NewsArticle[] GetArticleList(int startNumber, int endNumber, string groupName,
                                              NewsArticle.Content content);
Example #8
0
 /// <summary>
 /// Get article considering cache.
 /// </summary>
 /// <param name="articleNumber"></param>
 /// <param name="groupName"></param>
 /// <param name="content"></param>
 /// <returns></returns>
 public virtual NewsArticle GetArticle(int articleNumber, string groupName,
                                       NewsArticle.Content content)
 {
     return(GetArticle(articleNumber, groupName, content, null));
 }
Example #9
0
 /// <summary>
 /// Get article considering cache.
 /// </summary>
 /// <param name="originalMessageID">Message-ID</param>
 /// <param name="content">Necessary content of message.</param>
 /// <returns>Message.</returns>
 public virtual NewsArticle GetArticle(string originalMessageID, NewsArticle.Content content)
 {
     return(GetArticle(originalMessageID, content, null));
 }
 /// <summary>
 /// Get cached article considering messag format
 /// </summary>
 /// <param name="originalMessageID"></param>
 /// <param name="content"></param>
 /// <returns></returns>
 public override NewsArticle GetArticle(string originalMessageID, NewsArticle.Content content)
 {
     return(base.GetArticle(originalMessageID, content, style.ToString()));
 }
 /// <summary>
 /// Get cached article considering messag format
 /// </summary>
 /// <param name="articleNumber"></param>
 /// <param name="groupName"></param>
 /// <param name="content"></param>
 /// <returns></returns>
 public override NewsArticle GetArticle(int articleNumber, string groupName, NewsArticle.Content content)
 {
     return(GetArticle(articleNumber, groupName, content, style.ToString()));
 }
        /// <summary>
        /// Get list of articles by group name, start and end number of messages in it.
        /// Retrieve only specified content of messages.
        /// </summary>
        /// <param name="groupName">Group name.</param>
        /// <param name="startNumber">Start message number.</param>
        /// <param name="endNumber">End message number.</param>
        /// <param name="content">Necessary content of articles.</param>
        /// <returns>List of articles.</returns>
        public override NewsArticle[] GetArticleList(int startNumber, int endNumber, string groupName, NewsArticle.Content content)
        {
            var articles     = GetArticleList(groupName, startNumber, endNumber);
            var newsArticles = new NewsArticle[articles.Length];

            for (var i = 0; i < articles.Length; i++)
            {
                newsArticles[i] =
                    ToNNTPArticle(UpdateReferences(articles[i]), groupName, content);
            }

            return(newsArticles);
        }
        /// <summary>
        /// Convert rsdn's message to MIME message
        /// Also see rfc 2046, 2112, 2183, 2392, 2557
        /// </summary>
        /// <param name="message"></param>
        /// <param name="newsgroup"></param>
        /// <param name="content"></param>
        /// <returns></returns>
        protected NewsArticle ToNNTPArticle(IArticle message, string newsgroup,
                                            NewsArticle.Content content)
        {
            var newsMessage =
                new NewsArticle(string.Format("<{0}{1}>", message.ID, message.Postfix),
                                new[] { newsgroup }, new[] { message.Number }, content)
            {
                HeaderEncoding = encoding
            };

            if ((content == NewsArticle.Content.Header) ||
                (content == NewsArticle.Content.HeaderAndBody))
            {
                newsMessage["Path"] = Session.FullHostname + "!not-for-mail";
                newsMessage.From    = string.Format("\"{0}\" <{1}@users.rsdn.ru>",
                                                    string.IsNullOrEmpty(message.Author) ? "Аноним " + message.UserType : message.Author,
                                                    message.AuthorID);

                newsMessage.Date    = message.Date;
                newsMessage.Subject = message.Subject;
                if (message.AuthorID != 0)
                {
                    newsMessage["X-UserID"] = message.AuthorID.ToString();
                }
                newsMessage["X-MessageID"] = message.ID.ToString();

                if (!string.IsNullOrEmpty(message.Tags))
                {
                    newsMessage["Keywords"] = message.Tags;
                }

                // build refences
                var   referencesString = new StringBuilder();
                int[] references;
                lock (referenceCache)
                {
                    references = referenceCache.GetReferences(message.ID);
                }
                // get message's parents from the start and from the end with limitation of depth
                for (var i = references.Length - 1;
                     (i >= references.Length - referencesDeep) && (i > 0); i--)
                {
                    referencesString.AppendFormat("<{0}{1}> ", references[i], message.Postfix);
                }
                for (var i = Math.Min(references.Length - referencesDeep - 1, referencesDeep); i > 0; i--)
                {
                    referencesString.AppendFormat("<{0}{1}> ", references[i], message.Postfix);
                }
                if (referencesString.Length > 0)
                {
                    // remove last space
                    referencesString.Length--;
                    newsMessage["References"] = referencesString.ToString();
                }
                if (references.Length > 1)
                {
                    newsMessage["In-Reply-To"] = string.Format("<{0}{1}>", references[1], message.Postfix);
                }
            }

            if ((content == NewsArticle.Content.Body) ||
                (content == NewsArticle.Content.HeaderAndBody))
            {
                switch (style)
                {
                case FormattingStyle.PlainText:
                    var plainMessage = new StringBuilder(PrepareText(message.Message));
                    newsMessage.Entities.Add(plainMessage.ToString());
                    newsMessage.TransferEncoding = ContentTransferEncoding.Base64;
                    newsMessage.ContentType      = string.Format("text/plain; charset=\"{0}\"", encoding.WebName);
                    break;

                case FormattingStyle.Html:
                case FormattingStyle.HtmlInlineImages:
                    var plainTextBody = new Message(false);
                    plainTextBody.Entities.Add(PrepareText(message.Message));
                    plainTextBody.TransferEncoding = ContentTransferEncoding.Base64;
                    plainTextBody.ContentType      = string.Format("text/plain; charset=\"{0}\"", encoding.WebName);

                    var htmlTextBody = new Message(false);
                    var userInfo     = GetUserInfo(Format.ToInt(message.AuthorID));

                    if (imageProcessor != null)
                    {
                        imageProcessor.ClearProcessedImages();
                    }

                    var htmlMessage = template.GetInstanceOf("HtmlEmailTemplate");
                    htmlMessage.SetAttribute("message", new TemplateArticle(message));
                    htmlMessage.SetAttribute("text",
                                             formatter.Format(message.Message, message.Smile));
                    htmlMessage.SetAttribute("homepage",
                                             formatter.Format(message.HomePage, message.Smile));
                    htmlMessage.SetAttribute("origin",
                                             formatter.Format(userInfo == null ? null : userInfo.Origin, true));
                    htmlMessage.SetAttribute("encoding", encoding);
                    htmlMessage.SetAttribute("subject", Format.ReplaceTags(message.Subject));
                    htmlMessage.SetAttribute("server", serverSchemeAndName);
                    htmlMessage.SetAttribute("replyMarker", htmlReplyMarker);

                    htmlTextBody.Entities.Add(htmlMessage.ToString());
                    htmlTextBody.TransferEncoding = ContentTransferEncoding.Base64;
                    htmlTextBody.ContentType      = string.Format("text/html; charset=\"{0}\"", encoding.WebName);

                    if (imageProcessor != null && imageProcessor.ProcessedImagesCount > 0)
                    {
                        newsMessage.ContentType = "multipart/related; type=\"multipart/alternative\"";

                        var combineMessage = new Message(false)
                        {
                            ContentType = "multipart/alternative"
                        };
                        combineMessage.Entities.Add(plainTextBody);
                        combineMessage.Entities.Add(htmlTextBody);
                        newsMessage.Entities.Add(combineMessage);

                        foreach (var img in imageProcessor.GetProcessedImages())
                        {
                            newsMessage.Entities.Add(img);
                        }

                        imageProcessor.ClearProcessedImages();
                    }
                    else
                    {
                        newsMessage.ContentType = "multipart/alternative";
                        newsMessage.Entities.Add(plainTextBody);
                        newsMessage.Entities.Add(htmlTextBody);
                    }
                    break;
                }
            }

            return(newsMessage);
        }