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