/// <summary> /// デシリアライズ時に呼ばれるコンストラクタ /// </summary> /// <param name="info"></param> /// <param name="context"></param> public BoardInfo(SerializationInfo info, StreamingContext context) { this.bbs = (BbsType)info.GetValue("Bbs", typeof(BbsType)); this.name = HtmlTextUtility.RemoveTag(info.GetString("Name")); this.path = info.GetString("Path"); this.server = info.GetString("Server"); }
/// <summary> /// ThreadParserクラスのインスタンスを初期化 /// </summary> /// <param name="enc"></param> public ThreadParser(BbsType bbs, Encoding enc) : base(bbs, enc) { // // TODO: コンストラクタ ロジックをここに追加してください。 // }
/// <summary> /// ThreadListParserクラスのインスタンスを初期化 /// </summary> protected ThreadListParser(BbsType bbs, Encoding encoding) : base(bbs, encoding) { // // TODO: コンストラクタ ロジックをここに追加してください。 // }
/// <summary></summary> /// <param name="bbs"></param> /// <returns></returns> private static BbsClassTypes CreateInternal(BbsType bbs) { if (typeTable.Contains(bbs)) { return((BbsClassTypes)typeTable[bbs]); } throw new NotSupportedException(bbs.ToString()); }
/// <summary> /// 掲示板の型とエンコーディングを指定して、 /// MachiThreadParserクラスのインスタンスを初期化 /// </summary> public MachiThreadParser(BbsType bbs, Encoding enc) : base(bbs, enc) { // // TODO: コンストラクタ ロジックをここに追加してください。 // subject = String.Empty; totalCount = 1; }
/// <summary> /// BoardInfoクラスのインスタンスを初期化 /// </summary> /// <param name="server">サーバーアドレス</param> /// <param name="path">板へのパス</param> /// <param name="name">板名</param> public BoardInfo(string server, string path, string name) : this() { this.server = server; this.path = path; this.name = HtmlTextUtility.RemoveTag(name); this.bbs = Parse(server); }
/// <summary> /// PartialDataParserクラスのインスタンスを初期化 /// </summary> /// <param name="bbs">解析する掲示板の種類</param> /// <param name="enc">テキストのエンコーディング</param> /// <param name="type">初期化するクラスの型</param> protected PartialDataParser(BbsType bbs, Encoding enc) { encoding = enc; bbsType = bbs; memory = new MemoryStream(); remainderLength = 0; capacity = 4096; }
// /// <summary> // /// <>を検索するための検索クラスを初期化 // /// </summary> // protected static readonly Regex splitRegex = new Regex("<>", RegexOptions.Compiled); /// <summary> /// 掲示板の型とエンコーディングを指定して、 /// X2chThreadParserクラスのインスタンスを初期化 /// </summary> /// <param name="enc"></param> public X2chThreadParser(BbsType bbs, Encoding enc) : base(bbs, enc) { // // TODO: コンストラクタ ロジックをここに追加してください。 // elements = new string[5]; resCount = 0; }
/// <summary> /// BoardInfoクラスのインスタンスを初期化 /// </summary> public BoardInfo() { // // TODO: コンストラクタ ロジックをここに追加してください。 // server = String.Empty; path = String.Empty; name = String.Empty; bbs = BbsType.X2ch; tag = null; }
/// <summary> /// bbsに対応する各クラスを登録 /// </summary> /// <param name="bbs">登録する掲示板</param> /// <param name="headerType">bbsのに対応しているヘッダクラスを指定</param> /// <param name="readerType">bbsのスレッド読み込みに対応しているリーダーを指定</param> /// <param name="listReaderType">bbsのスレッド一覧読み込みに対応しているリーダーを指定</param> /// <param name="postType">bbsの投稿に対応しているクラスを指定</param> public static void Regist(BbsType bbs, Type headerType, Type readerType, Type listReaderType, Type postType) { BbsClassTypes obj = new BbsClassTypes(); obj.PostBase = postType; obj.ThreadHeader = headerType; obj.ThreadReader = readerType; obj.ThreadListReader = listReaderType; typeTable[bbs] = obj; }
/// <summary> /// ThreadControlクラスのインスタンスを初期化 /// </summary> /// <param name="cache"></param> protected ThreadControl(Cache cache) : base(cache) { // // TODO: コンストラクタ ロジックをここに追加してください。 // resCollection = new ResSetCollection(); indicesValues = new SortedValueCollection <int>(); bbsType = BbsType.None; bufferSize = 4096; useGzip = false; isPackageReception = false; }
/// <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> /// newbbsに対応したリーダーを作成 /// (既に作成済みであれば何もしない) /// </summary> /// <param name="newbbs"></param> private ThreadReader CreateBaseReader(BbsType newbbs) { if (newbbs != bbsType) { bbsType = newbbs; reader = TypeCreator.CreateThreadReader(newbbs); if (reader is X2chKakoThreadReader) { X2chKakoThreadReader kako = (X2chKakoThreadReader)reader; kako.RetryServers = new BoardInfo[] { retryServer }; } reader.ABone += new EventHandler(OnABoneInternal); reader.Pastlog += new EventHandler <PastlogEventArgs>(OnPastlogInternal); } return(reader); }
/// <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); }
/// <summary> /// bbsに対応した投稿クラスを作成 /// </summary> /// <param name="bbs"></param> /// <returns></returns> public static PostBase CreatePost(BbsType bbs) { BbsClassTypes obj = CreateInternal(bbs); return((PostBase)Activator.CreateInstance(obj.PostBase)); }
/// <summary> /// bbsに対応したスレッド一覧リーダーを作成 /// </summary> /// <param name="bbs"></param> /// <returns></returns> public static ThreadListReader CreateThreadListReader(BbsType bbs) { BbsClassTypes obj = CreateInternal(bbs); return((ThreadListReader)Activator.CreateInstance(obj.ThreadListReader)); }
/// <summary> /// インデックスを読み込む /// </summary> /// <param name="filePath">インデックスファイルへのファイルパス</param> /// <returns>読み込みに成功すればThreadHeaderのインスタンス、失敗すればnull</returns> public static ThreadHeader Read(string filePath) { if (filePath == null) { throw new ArgumentNullException("filePath"); } ThreadHeader result = null; lock (typeof(ThreadIndexer)) { // インデックスファイルへのパス if (File.Exists(filePath)) { try { CSPrivateProfile profile = new CSPrivateProfile(); profile.Read(filePath); // 重要なセクションがなければエラー if (!profile.Sections.ContainsSection("Board") || !profile.Sections.ContainsSection("Thread")) { return(null); } BbsType bbs = (BbsType)Enum.Parse(typeof(BbsType), profile.GetString("Board", "BBS", "X2ch")); // 板情報 result = TypeCreator.CreateThreadHeader(bbs); result.BoardInfo.Server = profile.GetString("Board", "Server", "Error"); result.BoardInfo.Path = profile.GetString("Board", "Path", "Error"); result.BoardInfo.Name = profile.GetString("Board", "Name", "Error"); result.BoardInfo.Bbs = bbs; // スレッド情報 result.ETag = profile.GetString("Thread", "ETag", String.Empty); result.LastWritten = profile.GetDateTime("Thread", "LastWritten"); result.LastModified = profile.GetDateTime("Thread", "LastModified"); result.Subject = profile.GetString("Thread", "Subject", "Error"); result.ResCount = profile.GetInt("Thread", "ResCount", 0); result.GotResCount = profile.GetInt("Thread", "GotResCount", 0); result.GotByteCount = profile.GetInt("Thread", "GotByteCount", 0); result.NewResCount = profile.GetInt("Thread", "NewResCount", 0); result.Key = profile.GetString("Thread", "Key", "Error"); // そのほかの情報 result.Position = profile.GetFloat("Option", "Position", 0); result.Pastlog = profile.GetBool("Option", "Pastlog", false); result.UseGzip = profile.GetBool("Option", "UseGzip", false); result.Shiori = profile.GetInt("Option", "Shiori", 0); result.RefCount = profile.GetInt("Option", "RefCount", 0); result.Sirusi.FromArrayString(profile.GetString("Option", "Sirusi", "")); } catch (Exception ex) { TwinDll.Output(ex); } } } return(result); }
/// <summary> /// 掲示板の型とエンコーディングを指定して、 /// MachiThreadListParserクラスのインスタンスを初期化 /// </summary> public MachiThreadListParser(BbsType bbs, Encoding enc) : base(bbs, enc) { }
/// <summary> /// 常に現行スレを見るようにする /// </summary> private BbsType EnsureCurrentBbs(BbsType bbs) { return(bbs.Equals(BbsType.X2chAuthenticate) ? BbsType.X2ch : bbs); }
/// <summary> /// 巡回開始 /// </summary> public override void Patrol() { try { ThreadReaderRelay reader = null; BbsType bbs = BbsType.None; foreach (ThreadHeader header in Items) { if (header.Pastlog || header.IsLimitOverThread) { continue; } ResSetCollection temp = new ResSetCollection(); BoardInfo board = header.BoardInfo; // リーダーを作成 if (bbs != board.Bbs) { reader = null; reader = new ThreadReaderRelay(Cache, TypeCreator.CreateThreadReader(board.Bbs)); bbs = board.Bbs; } // 取得前の新着を保存 int newResCount = header.NewResCount; try { OnStatusTextChanged(header.Subject + " の巡回中..."); ClientBase.Connect.WaitOne(); PatrolEventArgs e = new PatrolEventArgs(header); OnPatroling(e); if (!e.Cancel) { // 新着のみを読み取る reader.ReadCache = false; if (reader.Open(header)) { while (reader.Read(temp) != 0) { ; } } } } catch {} finally { if (reader != null) { reader.Close(); } ClientBase.Connect.Set(); } if (header.NewResCount > 0) { // 前回の新着を足して、インデックスを保存 header.NewResCount += newResCount; OnUpdated(new PatrolEventArgs(header)); } } } finally { OnStatusTextChanged("巡回を完了しました"); } }