/// <summary>
        /// 次スレチェックスレッド
        /// </summary>
        protected virtual void Checking()
        {
            ThreadListReader    listReader = null;
            List <ThreadHeader> tempItems  = new List <ThreadHeader>();
            BoardInfo           board      = header.BoardInfo;

            try
            {
                matchItems.Clear();
                listReader = TypeCreator.CreateThreadListReader(board.Bbs);

                if (listReader.Open(board))
                {
                    while (listReader.Read(tempItems) != 0)
                    {
                        ;
                    }
                    matchItems = Check(header, tempItems);
                }
                OnSuccess(this, new ThreadHeaderEventArgs(matchItems));
            }
            catch (Exception ex)
            {
                TwinDll.Output(ex);
            }
            finally
            {
                if (listReader != null)
                {
                    listReader.Close();
                }
            }
        }
        /// <summary>
        /// 巡回を開始 (更新チェックのみ)
        /// </summary>
        public override void Patrol()
        {
            // 更新対象の板をすべてコレクションに詰める
            Hashtable boardList = new Hashtable();

            foreach (ThreadHeader item1 in Items)
            {
                BoardInfo board = item1.BoardInfo;
                OnPatroling(new PatrolEventArgs(item1));

                // スレッド一覧を受信
                if (!boardList.Contains(board.Url))
                {
                    OnStatusTextChanged(board.Url + "subject.txt を取得中...");

                    List <ThreadHeader> headers    = new List <ThreadHeader>();
                    ThreadListReader    listReader = TypeCreator.CreateThreadListReader(board.Bbs);

                    listReader.ServerChange +=
                        new EventHandler <ServerChangeEventArgs>(delegate(object sender, ServerChangeEventArgs e)
                    {
                        item1.BoardInfo.Server = board.Server = e.NewBoard.Server;
                    });

                    try {
                        if (listReader.Open(board))
                        {
                            while (listReader.Read(headers) != 0)
                            {
                                ;
                            }
                        }
                    }
                    catch {}
                    finally {
                        if (listReader != null)
                        {
                            listReader.Close();
                        }
                    }

                    boardList[board.Url] = headers;
                }

                // レス数が増えていれば更新されている、存在しなければdat落ち
                List <ThreadHeader> targetList = (List <ThreadHeader>)boardList[board.Url];
                int index = targetList.IndexOf(item1);

                if (index == -1 && targetList.Count > 0)
                {
                    item1.Pastlog = true;
                    OnUpdated(new PatrolEventArgs(item1));
                }
                else if (index >= 0 && item1.GotResCount < targetList[index].ResCount)
                {
                    item1.ResCount = targetList[index].ResCount;
                    OnUpdated(new PatrolEventArgs(item1));
                }
            }
        }
示例#3
0
        /// <summary>
        /// 生きているスレとdat落ちしているスレを分離
        /// </summary>
        /// <param name="oldBoard">ログが存在する板</param>
        /// <param name="newBoard">生きているスレの移転先</param>
        /// <param name="leaveItems">dat落ちしているスレが格納される</param>
        /// <param name="liveItems">生きているスレが格納される</param>
        private void Separate(BoardInfo oldBoard, BoardInfo newBoard,
                              out List <ThreadHeader> leaveItems, out List <ThreadHeader> liveItems)
        {
            leaveItems = new List <ThreadHeader>();
            liveItems  = new List <ThreadHeader>();

            if (cache.Exists(oldBoard))
            {
                List <ThreadHeader> oldItems   = GotThreadListIndexer.Read(cache, oldBoard);
                List <ThreadHeader> newItems   = new List <ThreadHeader>();
                ThreadListReader    listReader = null;

                if (oldItems.Count > 0)
                {
                    try {
                        listReader = TypeCreator.CreateThreadListReader(newBoard.Bbs);
                        listReader.Open(newBoard);

                        while (listReader.Read(newItems) != 0)
                        {
                            ;
                        }

                        // 移転先のスレ一覧に存在するログのみ移転 (dat落ちしているスレは移転しない)
                        foreach (ThreadHeader header in oldItems)
                        {
                            Predicate <ThreadHeader> p = new Predicate <ThreadHeader>(delegate(ThreadHeader h)
                            {
                                return(h.Key == header.Key);
                            });

                            if (newItems.Exists(p))
                            {
                                // 生きているスレの板情報を移転先板に書き換える
                                if (ThreadIndexer.Read(cache, header) != null)
                                {
                                    ThreadIndexer.Delete(cache, header);

                                    liveItems.Add(header);
                                    header.BoardInfo = newBoard;

                                    ThreadIndexer.Write(cache, header);
                                }
                            }
                            else
                            {
                                leaveItems.Add(header);
                            }
                        }
                    }
                    finally {
                        if (listReader != null)
                        {
                            listReader.Close();
                        }
                    }
                }
            }
        }
        /// <summary>
        /// ThreadListControlクラスのインスタンスを初期化。
        /// </summary>
        /// <param name="cache"></param>
        protected ThreadListControl(Cache cache) : base(cache)
        {
            headerList = new List <ThreadHeader>();

            // オフライン用のリーダーを作成
            offlineReader = new OfflineThreadListReader(cache);

            oldItems = new ThreadHeader[0];

            bbsType    = BbsType.None;
            bufferSize = 4096;

            isOpen = false;
            online = true;
        }
        /// <summary>
        /// スレッド一覧を閉じます。
        /// </summary>
        public virtual void Close()
        {
            if (IsOpen)
            {
                Stop();

                OnClosed(new EventArgs());
                OnStatusTextChanged(String.Empty);
            }

            boardInfo = null;
            headerList.Clear();

            isOpen     = false;
            baseReader = null;

            oldItems = null;
            oldItems = new ThreadHeader[0];
        }
        /// <summary>
        /// 指定した板に対応するリーダーを作成し、開きます。
        /// </summary>
        /// <param name="board"></param>
        /// <returns></returns>
        private bool OpenReader(BoardInfo board)
        {
            if (board.Bbs != bbsType && online)
            {
                bbsType       = board.Bbs;
                networkReader = TypeCreator.CreateThreadListReader(bbsType);
                networkReader.ServerChange += new EventHandler <ServerChangeEventArgs>(OnServerChange);
            }

            baseReader = online ?
                         new ThreadListReaderRelay(Cache, networkReader) : offlineReader;

            baseReader.BufferSize   = bufferSize;
            baseReader.AutoRedirect = true;
            baseReader.Open(board);

            if (online)
            {
                oldItems = ((ThreadListReaderRelay)baseReader).CacheItems.ToArray();
            }

            return(baseReader.IsOpen);
        }