コード例 #1
0
        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());
        }
コード例 #2
0
        /// <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);
        }
コード例 #3
0
        /// <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);
        }
コード例 #4
0
ファイル: DraftBox.cs プロジェクト: yas-mnkornym/AnizanHelper
        /// <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)));
        }
コード例 #5
0
        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());
        }
コード例 #6
0
        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;
        }