/// <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)); }
/// <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); } }
/// <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); }
public abstract NewsArticle GetNonCachedArticle(int articleNumber, string groupName, NewsArticle.Content content);
public abstract NewsArticle GetNonCachedArticle(string originalMessageID, NewsArticle.Content content);
public abstract NewsArticle[] GetArticleList(int startNumber, int endNumber, string groupName, NewsArticle.Content content);
/// <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)); }
/// <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); }