/// <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)); } } }
/// <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); }