protected override ThreadHeader[] ParseData(string dataText) { List <ThreadHeader> list = new List <ThreadHeader>(100); try { MatchCollection matches = Pattern.Matches(dataText); foreach (Match m in matches) { ThreadHeader header = TypeCreator.CreateThreadHeader(bbsType); header.Key = Path.GetFileNameWithoutExtension(m.Groups["key"].Value); header.Subject = m.Groups["subj"].Value; int resCnt; if (Int32.TryParse(m.Groups["res"].Value, out resCnt)) { header.ResCount = resCnt; } list.Add(header); } } catch {} return(list.ToArray()); }
/// <summary> /// ローカルに存在するすべてのスレッド情報を検索 /// </summary> /// <param name="headers"></param> /// <returns></returns> public override int Read(List <ThreadHeader> headers, out int cntParsed) { if (!isOpen) { throw new InvalidOperationException("開かれていません"); } if (headers == null) { throw new ArgumentNullException("headers"); } int max = Math.Min(position + 16, length); int temp = position; while (position < max) { ThreadHeader head = TypeCreator.CreateThreadHeader(boardinfo.Bbs); head.BoardInfo = boardinfo; head.Key = Path.GetFileNameWithoutExtension(indexFiles[position]); ThreadIndexer.Read(cache, head); headers.Add(head); position++; } cntParsed = (position - temp); return(cntParsed); }
/// <summary> /// 単独のdatファイル開き、を既得キャッシュとして保存 /// </summary> /// <param name="cache"></param> /// <param name="target">単独のdatと関連づける板</param> /// <param name="filePath">datファイルのファイルパス</param> /// <param name="datNumber">dat番号</param> /// <param name="gzip">datファイルがgzip圧縮されていればtrue、そうでなければfalseを指定する</param> /// <returns>キャッシュされたスレッドのヘッダ情報を返す</returns> public static ThreadHeader OpenDat(Cache cache, BoardInfo target, string filePath, string datNumber, bool gzip) { // ヘッダー情報を作成 ThreadHeader header = TypeCreator.CreateThreadHeader(target.Bbs); header.BoardInfo = target; header.Key = datNumber; header.UseGzip = gzip; header.Subject = String.Empty; ResSetCollection resItems = new ResSetCollection(); using (Stream stream = StreamCreator.CreateReader(filePath, gzip)) { X2chThreadParser parser = new X2chThreadParser(); byte[] buffer = new byte[4096]; bool first = true; int offset = 0, read, parsed; do { // バッファに読み込む read = stream.Read(buffer, 0, buffer.Length); offset += read; // 解析しResSet構造体の配列を作成 ResSet[] array = parser.Parse(buffer, read, out parsed); resItems.AddRange(array); // スレタイを取得しておく if (first && array.Length > 0) { header.Subject = array[0].Tag as String; first = false; } } while (read != 0); // 既得バイト数とレス数を設定 header.GotByteCount = offset; header.GotResCount = resItems.Count; } // datファイルの最終更新日を取得 header.LastModified = File.GetLastWriteTime(filePath); // 読み込んだレスをキャッシュとして保存 using (LocalThreadStorage storage = new LocalThreadStorage(cache, header, StorageMode.Write)) { storage.Write(resItems); } // インデックス情報を生成 ThreadIndexer.Write(cache, header); return(header); }
/// <summary> /// 指定した板に存在する草稿を取得 /// </summary> /// <param name="filePath"></param> public Draft[] Load(BoardInfo board) { if (board == null) { throw new ArgumentNullException("board"); } XmlDocument doc = new XmlDocument(); ArrayList arrayList = new ArrayList(); string filePath = cache.GetFolderPath(board); filePath = Path.Combine(filePath, DraftFileName); try { doc.Load(filePath); // 草稿要素をすべて取得 XmlNodeList nodeList = doc.SelectNodes("draft/thread"); foreach (XmlNode node in nodeList) { ThreadHeader header = TypeCreator.CreateThreadHeader(board.Bbs); header.BoardInfo = board; header.Key = node.Attributes.GetNamedItem("key").Value; if (ThreadIndexer.Read(cache, header) != null) { string name = node.SelectSingleNode("from").InnerText; string email = node.SelectSingleNode("email").InnerText; string body = node.SelectSingleNode("message").InnerText; // 草稿情報を作成 PostRes res = new PostRes(name, email, body); Draft draft = new Draft(header, res); arrayList.Add(draft); } } } catch (FileNotFoundException) {} return((Draft[])arrayList.ToArray(typeof(Draft))); }
protected override ThreadHeader[] ParseData(string dataText) { List <ThreadHeader> list = new List <ThreadHeader>(100); const string token = ".cgi,"; int begin = 0, index; try { // 123456.cgi,スレッド名(123) while (begin < dataText.Length && (index = newline.Search(dataText, begin)) != -1) { string data = dataText.Substring(begin, index - begin); int idxDot = data.IndexOf(token); int idxSep1 = data.LastIndexOf('('); int idxSep2 = data.LastIndexOf(')'); int idxSubj = idxDot + token.Length; if (idxDot >= 0 && idxSep1 >= 0 && idxSep2 >= 0) { ThreadHeader header = TypeCreator.CreateThreadHeader(bbsType); header.Key = data.Substring(0, idxDot); header.Subject = data.Substring(idxSubj, idxSep1 - idxSubj); int resCnt; if (Int32.TryParse(data.Substring(idxSep1 + 1, idxSep2 - (idxSep1 + 1)), out resCnt)) { header.ResCount = resCnt; } list.Add(header); } begin = (index + newline.Pattern.Length); } } catch (Exception ex) { TwinDll.Output(ex); } return(list.ToArray()); }
public void Read(string filePath, out ThreadHeader header, out ResSetCollection resCollection) { XmlDocument doc = new XmlDocument(); doc.Load(filePath); header = TypeCreator.CreateThreadHeader(BbsType.X2ch); resCollection = new ResSetCollection(); // ルート要素を取得 XmlNode root = doc.DocumentElement; // <thread>要素の処理 XmlNode thread = root.SelectSingleNode("thread"); if (thread == null) { throw new ConvertException("<thread>要素が存在しません"); } XmlNode serv = thread.Attributes.GetNamedItem("server"); if (serv == null) { throw new ConvertException("server属性が存在しません"); } XmlNode board = thread.Attributes.GetNamedItem("board"); if (board == null) { throw new ConvertException("board属性が存在しません"); } XmlNode key = thread.Attributes.GetNamedItem("key"); if (key == null) { throw new ConvertException("key属性が存在しません"); } // スレッドタイトルを取得 XmlNode title = thread.SelectSingleNode("title"); if (title == null) { throw new ConvertException("<title>要素が存在しません"); } // <info>要素の処理 XmlNode info = thread.SelectSingleNode("info"); if (info == null) { throw new ConvertException("<info>要素が存在しません"); } XmlNode lastmod = info.Attributes.GetNamedItem("last-modified"); if (lastmod == null) { throw new ConvertException("last-modified属性が存在しません"); } XmlNode size = info.Attributes.GetNamedItem("size"); if (size == null) { throw new ConvertException("size属性が存在しません"); } // スレッドの情報を設定 header.Key = key.Value; header.BoardInfo.Server = serv.Value; header.BoardInfo.Path = board.Value; header.Subject = title.InnerText; header.LastModified = DateTime.Parse(lastmod.Value); int gotByteCount; if (Int32.TryParse(size.Value, out gotByteCount)) { header.GotByteCount = gotByteCount; } // <res-set>要素の処理 XmlNode children = thread.SelectSingleNode("res-set"); if (children == null) { throw new ConvertException("<res-set>要素が存在しません"); } resCollection = GetResCollection(doc, children); header.GotResCount = resCollection.Count; }