Esempio n. 1
0
 /// <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");
 }
Esempio n. 2
0
 /// <summary>
 /// ThreadParserクラスのインスタンスを初期化
 /// </summary>
 /// <param name="enc"></param>
 public ThreadParser(BbsType bbs, Encoding enc)
     : base(bbs, enc)
 {
     //
     // TODO: コンストラクタ ロジックをここに追加してください。
     //
 }
Esempio n. 3
0
 /// <summary>
 /// ThreadListParserクラスのインスタンスを初期化
 /// </summary>
 protected ThreadListParser(BbsType bbs, Encoding encoding)
     : base(bbs, encoding)
 {
     //
     // TODO: コンストラクタ ロジックをここに追加してください。
     //
 }
Esempio n. 4
0
 /// <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());
 }
Esempio n. 5
0
 /// <summary>
 /// 掲示板の型とエンコーディングを指定して、
 /// MachiThreadParserクラスのインスタンスを初期化
 /// </summary>
 public MachiThreadParser(BbsType bbs, Encoding enc) : base(bbs, enc)
 {
     //
     // TODO: コンストラクタ ロジックをここに追加してください。
     //
     subject    = String.Empty;
     totalCount = 1;
 }
Esempio n. 6
0
 /// <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);
 }
Esempio n. 7
0
        /// <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;
        }
Esempio n. 9
0
 /// <summary>
 /// BoardInfoクラスのインスタンスを初期化
 /// </summary>
 public BoardInfo()
 {
     //
     // TODO: コンストラクタ ロジックをここに追加してください。
     //
     server = String.Empty;
     path   = String.Empty;
     name   = String.Empty;
     bbs    = BbsType.X2ch;
     tag    = null;
 }
Esempio n. 10
0
        /// <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;
        }
Esempio n. 11
0
 /// <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;
        }
Esempio n. 13
0
        /// <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);
        }
Esempio n. 15
0
        /// <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));
        }
Esempio n. 16
0
        /// <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));
        }
Esempio n. 17
0
        /// <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);
 }
Esempio n. 20
0
        /// <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("巡回を完了しました");
            }
        }