public X2chAuthenticateThreadReader()
     : base()
 {
     RokkaResponseState = X2chRokkaResponseState.None;
 }
        /// <summary>
        /// スレッドを開く
        /// </summary>
        /// <param name="th"></param>
        public override bool Open(ThreadHeader header)
        {
            if (header == null)
            {
                throw new ArgumentNullException("header");
            }
            if (IsOpen)
            {
                throw new InvalidOperationException("既にストリームが開かれています");
            }

            headerInfo = header;
            //firstRead = true;
            RokkaResponseState = X2chRokkaResponseState.None;

            if (header.Pastlog)
            {
                return(false);
            }

            X2chAuthenticator authenticator = X2chAuthenticator.GetInstance();

            if (authenticator.HasSession)
            {
                X2chThreadHeader x2chHeader = header as X2chThreadHeader;
                if (x2chHeader != null)
                {
                    HttpWebRequest req = (HttpWebRequest)WebRequest.Create(x2chHeader.AuthenticateUrl);
                    req.Timeout           = 15000;
                    req.UserAgent         = UserAgent;
                    req.AllowAutoRedirect = false;

                    // ** 9/26 削除 **
                    // req.Headers.Add("Accept-Encoding", "gzip");

                    // ** 9/26 追加 **
                    req.AutomaticDecompression = DecompressionMethods.GZip;

                    req.Headers.Add("Pragma", "no-cache");
                    req.Headers.Add("Cache-Control", "no-cache");

                    if (x2chHeader.ETag != String.Empty)
                    {
                        req.Headers.Add("If-None-Match", x2chHeader.ETag);
                    }

                    _res = (HttpWebResponse)req.GetResponse();

                    //baseStream = _res.GetResponseStream();
                    baseStream          = FileUtility.CreateMemoryStream(_res.GetResponseStream());
                    baseStream.Position = 0;
                    length = (int)baseStream.Length;

                    RokkaResponseState = ParseRokkaFirstline(baseStream);

                    if (_res.StatusCode == HttpStatusCode.OK)
                    {
                        /* 9 26削除
                         * using (GZipStream gzipInp = new GZipStream(_res.GetResponseStream(), CompressionMode.Decompress))
                         * baseStream = FileUtility.CreateMemoryStream(gzipInp);
                         */

                        x2chHeader.ETag         = _res.Headers["ETag"];
                        x2chHeader.LastModified = _res.LastModified;

                        index    = header.GotResCount + 1;
                        position = 0;
                        isOpen   = true;
                    }
                    else
                    {
                        OnPastlog(new PastlogEventArgs(header));
                    }
                }
            }
            else
            {
                OnPastlog(new PastlogEventArgs(header));
            }

            // 過去ログなのでdat落ちに設定
            headerInfo.Pastlog = true;

            return(isOpen);
        }
Ejemplo n.º 3
0
        private void OpenInternal()
        {
            CompleteStatus status = CompleteStatus.Success;

            try
            {
                try
                {
                    isWaiting = true;
                    OnLoading(new EventArgs());
                }
                finally
                {
                    isWaiting = false;
                }
                if (canceled)
                {
                    return;
                }

                // 開く処理を行う
                if (modeOpen)
                {
                    Invoke(new MethodInvoker(Opening));
                }

                // キャッシュを読み込み表示
                ReadCache(resCollection);

                if (canceled)
                {
                    return;
                }

                Invoke(new MethodInvoker(WriteBegin));

                if (canceled)
                {
                    return;
                }

                if (modeOpen)
                {
                    Invoke(new WriteResMethodInvoker(Write), new object[] { resCollection });

                    // スクロール位置を復元 (値が0の場合は復元しない)
                    if (modeOpen && headerInfo.Position != 0.0f)
                    {
                        Invoke(new PositionMethodInvoker(SetScrollPosition),
                               new object[] { headerInfo.Position });
                    }
                }

Retry:
                try
                {
                    // サーバーに接続
                    if (OpenReader())
                    {
                        if (canceled)
                        {
                            return;
                        }

                        Reading();

                        // あぼーんを検知した場合
                        if (aboneDetected)
                        {
                        }
                    }
                    else
                    {
                        headerInfo.NewResCount = 0;
                        ThreadIndexer.Write(Cache, headerInfo);
                    }
                }
                finally
                {
                    if (reader != null)
                    {
                        reader.Close();
                    }
                }

                // 再試行が要求された場合、最初から
                if (retried)
                {
                    goto Retry;
                }

                if (canceled)
                {
                    return;
                }


                Invoke(new MethodInvoker(WriteEnd));
            }
            catch (Exception ex)
            {
                status = CompleteStatus.Error;
                //			isOpen = false; #10/15
                TwinDll.Output(ex);
                OnStatusTextChanged(ex.Message);
            }
            finally
            {
                // 中止された場合はETagをリセット
                if (canceled)
                {
                    headerInfo.ETag = String.Empty;
                }

                indicesValues.Clear();

                canceled = false;

                lock (syncObject)
                    thread = null;

                if (status == CompleteStatus.Success)
                {
                    OnStatusTextChanged(
                        String.Format("{0}の読み込みを完了 (新着: {1}件)",
                                      headerInfo.Subject, headerInfo.NewResCount));
                }
                /** 9/26 追加 **/
                else if (reader is X2chAuthenticateThreadReader)
                {
                    X2chRokkaResponseState rokkaState = ((X2chAuthenticateThreadReader)reader).RokkaResponseState;
                    if (rokkaState != X2chRokkaResponseState.Success)
                    {
                        TwinDll.Output("RokkaResponseState: {0}, URL: {1}, ", rokkaState, headerInfo.Url);
                    }
                    OnStatusTextChanged(String.Format("RokkaResponseState: {0}", rokkaState));
                }
                /****/

                IsReading             = false;
                lastCompletedDateTime = DateTime.Now;

                OnComplete(new CompleteEventArgs(status));
            }
        }