/// <summary>
        /// スレッドを開く
        /// </summary>
        /// <param name="header"></param>
        public virtual void Open(ThreadHeader header)
        {
            if (header == null)
            {
                throw new ArgumentNullException("header");
            }
            if (IsReading)
            {
                throw new InvalidOperationException("スレッドを読み込み中です");
            }

            Close();

            // 各フラグを設定
            IsOpen    = true;
            IsReading = true;

            modeOpen   = true;
            headerInfo = header;

            // インデックス情報を読み込む
            if (ThreadIndexer.Exists(Cache, header))
            {
                ThreadIndexer.Read(Cache, header);
            }

            string subj = (header.Subject != String.Empty) ? header.Subject : "[スレッド名不明]";

            OnStatusTextChanged(subj + "を開いています");

            ThreadRun();
        }
        private void ReadCache(ResSetCollection buff)
        {
            // 新規に開く場合のみキャッシュを読み込む
            if (modeOpen)
            {
                if (ThreadIndexer.Exists(Cache, headerInfo))
                {
                    ThreadIndexer.Read(Cache, headerInfo);

                    try
                    {
                        storage            = new LocalThreadStorage(Cache, headerInfo, StorageMode.Read);
                        storage.BufferSize = bufferSize;

                        // すべてのレスを読み込み表示
                        while (storage.Read(buff) != 0)
                        {
                            ;
                        }
                    }
                    finally
                    {
                        if (storage != null)
                        {
                            storage.Close();
                            storage = null;
                        }
                    }

                    buff.IsNew = false;
                }
            }
        }
        /// <summary>
        /// インデックス一覧をファイルに保存
        /// </summary>
        public void Save()
        {
            StreamWriter sw = null;

            try {
                sw = new StreamWriter(fileName, false, TwinDll.DefaultEncoding);
                foreach (ThreadHeader header in items)
                {
                    if (ThreadIndexer.Exists(cache, header))
                    {
                        // 相対パスに変換
                        string relative = Shlwapi.GetRelativePath(
                            Application.StartupPath, cache.GetIndexPath(header));

                        sw.WriteLine(relative);
                    }
                }
            }
            finally {
                if (sw != null)
                {
                    sw.Close();
                }
            }
        }
        /// <summary>
        /// リーダーを開く
        /// </summary>
        private bool OpenReader()
        {
            aboneDetected = false;
            retried       = false;

            // 未取得スレッドなら現在の設定を反映させる
            if (!ThreadIndexer.Exists(Cache, headerInfo))
            {
                headerInfo.UseGzip = useGzip;
            }
            // 基本リーダーを作成
            reader = CreateBaseReader(headerInfo.BoardInfo.Bbs);

            // リーダーを開く
            reader.BufferSize = bufferSize;
            reader.Open(headerInfo);

            return(reader.IsOpen);
        }