From a0ca7a8cb807d504f8aad1352f247d9a0c78d154 Mon Sep 17 00:00:00 2001 From: sta Date: Sat, 31 May 2014 15:46:10 +0900 Subject: [PATCH] Refactored HttpStreamAsyncResult.cs --- websocket-sharp/Net/ChunkedRequestStream.cs | 4 +- websocket-sharp/Net/HttpStreamAsyncResult.cs | 196 ++++++++++--------- websocket-sharp/Net/RequestStream.cs | 4 +- 3 files changed, 110 insertions(+), 94 deletions(-) diff --git a/websocket-sharp/Net/ChunkedRequestStream.cs b/websocket-sharp/Net/ChunkedRequestStream.cs index fe0818ed..7a7a36dd 100644 --- a/websocket-sharp/Net/ChunkedRequestStream.cs +++ b/websocket-sharp/Net/ChunkedRequestStream.cs @@ -135,9 +135,7 @@ namespace WebSocketSharp.Net if (count < 0 || offset > len - count) throw new ArgumentOutOfRangeException ("'offset' + 'count' exceeds the size of buffer."); - var ares = new HttpStreamAsyncResult (); - ares.Callback = callback; - ares.State = state; + var ares = new HttpStreamAsyncResult (callback, state); if (_noMoreData) { ares.Complete (); return ares; diff --git a/websocket-sharp/Net/HttpStreamAsyncResult.cs b/websocket-sharp/Net/HttpStreamAsyncResult.cs index a9f2f094..f84a1648 100644 --- a/websocket-sharp/Net/HttpStreamAsyncResult.cs +++ b/websocket-sharp/Net/HttpStreamAsyncResult.cs @@ -1,113 +1,133 @@ -// -// HttpStreamAsyncResult.cs -// Copied from System.Net.HttpStreamAsyncResult.cs -// -// Authors: -// Gonzalo Paniagua Javier (gonzalo@novell.com) -// -// Copyright (C) 2005 Novell, Inc (http://www.novell.com) -// -// Permission is hereby granted, free of charge, to any person obtaining -// a copy of this software and associated documentation files (the -// "Software"), to deal in the Software without restriction, including -// without limitation the rights to use, copy, modify, merge, publish, -// distribute, sublicense, and/or sell copies of the Software, and to -// permit persons to whom the Software is furnished to do so, subject to -// the following conditions: -// -// The above copyright notice and this permission notice shall be -// included in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -// +#region License +/* + * HttpStreamAsyncResult.cs + * + * This code is derived from System.Net.HttpStreamAsyncResult.cs of Mono + * (http://www.mono-project.com). + * + * The MIT License + * + * Copyright (c) 2005 Novell, Inc. (http://www.novell.com) + * Copyright (c) 2012-2014 sta.blockhead + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +#endregion + +#region Authors +/* + * Authors: + * - Gonzalo Paniagua Javier + */ +#endregion using System; using System.Threading; -namespace WebSocketSharp.Net { +namespace WebSocketSharp.Net +{ + internal class HttpStreamAsyncResult : IAsyncResult + { + #region Private Fields - class HttpStreamAsyncResult : IAsyncResult { + private AsyncCallback _callback; + private bool _completed; + private object _state; + private object _sync; + private ManualResetEvent _waitHandle; - #region Private Fields + #endregion - bool completed; - ManualResetEvent handle; - object locker = new object (); + #region Internal Fields - #endregion + internal byte [] Buffer; + internal int Count; + internal Exception Error; + internal int Offset; + internal int SyncRead; - #region Internal Fields + #endregion - internal AsyncCallback Callback; - internal int Count; - internal byte [] Buffer; - internal Exception Error; - internal int Offset; - internal object State; - internal int SyncRead; + #region Public Constructors - #endregion + public HttpStreamAsyncResult (AsyncCallback callback, object state) + { + _callback = callback; + _state = state; + _sync = new object (); + } - #region Properties + #endregion - public object AsyncState { - get { return State; } - } + #region Public Properties - public WaitHandle AsyncWaitHandle { - get { - lock (locker) { - if (handle == null) - handle = new ManualResetEvent (completed); - } + public object AsyncState { + get { + return _state; + } + } - return handle; - } - } + public WaitHandle AsyncWaitHandle { + get { + lock (_sync) + return _waitHandle ?? (_waitHandle = new ManualResetEvent (_completed)); + } + } - public bool CompletedSynchronously { - get { return (SyncRead == Count); } - } + public bool CompletedSynchronously { + get { + return SyncRead == Count; + } + } - public bool IsCompleted { - get { - lock (locker) { - return completed; - } - } - } + public bool IsCompleted { + get { + lock (_sync) + return _completed; + } + } - #endregion + #endregion - #region Public Methods + #region Public Methods - public void Complete () - { - lock (locker) { - if (completed) - return; + public void Complete () + { + lock (_sync) { + if (_completed) + return; - completed = true; - if (handle != null) - handle.Set (); + _completed = true; + if (_waitHandle != null) + _waitHandle.Set (); - if (Callback != null) - Callback.BeginInvoke (this, null, null); - } - } + if (_callback != null) + _callback.BeginInvoke (this, ar => _callback.EndInvoke (ar), null); + } + } - public void Complete (Exception e) - { - Error = e; - Complete (); - } + public void Complete (Exception exception) + { + Error = exception; + Complete (); + } - #endregion - } + #endregion + } } diff --git a/websocket-sharp/Net/RequestStream.cs b/websocket-sharp/Net/RequestStream.cs index 9a0956b8..a27eab02 100644 --- a/websocket-sharp/Net/RequestStream.cs +++ b/websocket-sharp/Net/RequestStream.cs @@ -173,12 +173,10 @@ namespace WebSocketSharp.Net var nread = fillFromBuffer (buffer, offset, count); if (nread > 0 || nread == -1) { - var ares = new HttpStreamAsyncResult (); + var ares = new HttpStreamAsyncResult (callback, state); ares.Buffer = buffer; ares.Offset = offset; ares.Count = count; - ares.Callback = callback; - ares.State = state; ares.SyncRead = nread; ares.Complete ();