public ArrayList GetArticleList(int low, int high) { if (this.connectedServer == null) { throw new NntpException("No connecting newsserver."); } if (this.connectedGroup == null) { throw new NntpException("No connecting newsgroup."); } Response res = MakeRequest("XOVER " + low + "-" + high); if (res.Code != 224) { throw new NntpException(res.Code, res.Request); } ArrayList list = new ArrayList(); Article article = null; string[] values = null; int i; string response = null; while ((response = sr.ReadLine()) != null && response != ".") { try { article = new Article(); article.Header = new ArticleHeader(); values = response.Split('\t'); article.ArticleId = int.Parse(values[0]); article.Header.Subject = NntpUtil.Base64HeaderDecode(values[1]); article.Header.From = NntpUtil.Base64HeaderDecode(values[2]); i = values[3].IndexOf(','); article.Header.Date = DateTime.Parse(values[3].Substring(i + 1, values[3].Length - 7 - i)); article.MessageId = values[4]; if (values[5].Trim().Length == 0) { article.Header.ReferenceIds = new string[0]; } else { article.Header.ReferenceIds = values[5].Split(' '); } if (values.Length < 8 || values[7] == null || values[7].Trim() == "") { article.Header.LineCount = 0; } else { article.Header.LineCount = int.Parse(values[7]); } article.Body = null; } catch (Exception e) { throw new Exception(response, e); } list.Add(article); } return(list); }
private ArticleHeader GetHeader(string messageId, out MIMEPart part) { string response = null; ArticleHeader header = new ArticleHeader(); string name = null; string value = null; header.ReferenceIds = new string[0]; string[] values = null; string[] values2 = null; Match m = null; part = null; int i = -1; while ((response = sr.ReadLine()) != null && response != "") { m = Regex.Match(response, @"^\s+(\S+)$"); if (m.Success) { value = m.Groups[1].ToString(); } else { i = response.IndexOf(':'); if (i == -1) { continue; } name = response.Substring(0, i).ToUpper(); value = response.Substring(i + 1); } switch (name) { case "REFERENCES": values = value.Split(' '); values2 = header.ReferenceIds; header.ReferenceIds = new string[values.Length + values2.Length]; values.CopyTo(header.ReferenceIds, 0); values2.CopyTo(header.ReferenceIds, values.Length); break; case "SUBJECT": header.Subject += NntpUtil.Base64HeaderDecode(value); break; case "DATE": i = value.IndexOf(','); header.Date = DateTime.Parse(value.Substring(i + 1, value.Length - 7 - i)); break; case "FROM": header.From += NntpUtil.Base64HeaderDecode(value); break; case "NNTP-POSTING-HOST": header.PostingHost += value; break; case "LINES": header.LineCount = int.Parse(value); break; case "MIME-VERSION": part = new MIMEPart(); part.ContentType = "TEXT/PLAIN"; part.Charset = "US-ASCII"; part.ContentTransferEncoding = "7BIT"; part.Filename = null; part.Boundary = null; break; case "CONTENT-TYPE": if (part != null) { m = Regex.Match(response, @"CONTENT-TYPE: ""?([^""\s;]+)", RegexOptions.IgnoreCase); if (m.Success) { part.ContentType = m.Groups[1].ToString(); } m = Regex.Match(response, @"BOUNDARY=""?([^""\s;]+)", RegexOptions.IgnoreCase); if (m.Success) { part.Boundary = m.Groups[1].ToString(); part.EmbeddedPartList = new ArrayList(); } m = Regex.Match(response, @"CHARSET=""?([^""\s;]+)", RegexOptions.IgnoreCase); if (m.Success) { part.Charset = m.Groups[1].ToString(); } m = Regex.Match(response, @"NAME=""?([^""\s;]+)", RegexOptions.IgnoreCase); if (m.Success) { part.Filename = m.Groups[1].ToString(); } } break; case "CONTENT-TRANSFER-ENCODING": if (part != null) { m = Regex.Match(response, @"CONTENT-TRANSFER-ENCODING: ""?([^""\s;]+)", RegexOptions.IgnoreCase); if (m.Success) { part.ContentTransferEncoding = m.Groups[1].ToString(); } } break; } } return(header); }