private void ThreadWorker()
        {
            Thread.CurrentThread.Name = "ConcurrentRequestWebService-" + GetHashCode();

            var pendingRequests = new Queue<PrivateRequestData>();
            var pendingResponses = new Queue<IAsyncResult>();

            while (IsRunning)
            {
                lock (ApiLockSync)
                {
                    if (_queuedRequest.Count == 0 && _pendingProcessing.Count == 0 && pendingRequests.Count == 0 && pendingResponses.Count == 0)
                    {
                        Monitor.Wait(ApiLockSync);

                        if (!IsRunning)
                            break;
                    }

                    while (_queuedRequest.Count > 0)
                    {
                        pendingRequests.Enqueue(_queuedRequest.Dequeue());
                    }

                    while (_pendingProcessing.Count > 0)
                    {
                        pendingResponses.Enqueue(_pendingProcessing.Dequeue());
                    }
                }


                var pendingCompletion = new Queue<PendingCompletion>();

                for (var i = 0; (i < pendingRequests.Count) && (i < MaximumConcurrentRequests); i++)
                {
                    var currentData = pendingRequests.Dequeue();

                    if (!Utils.HasInternetConnectivity)
                    {
                        var result = new WebServiceEventArgs(WebApiServerStatus.NoConnection, new NotSupportedException("No internet connection"), String.Empty, currentData.UserState);
                        Responser(currentData, result);
                    }
                    else
                    {
                        if (currentData.RequestType == RequestType.Get)
                            CreateGetRequestWithState(currentData, ProcessorCallback);
                        else if (currentData.RequestType == RequestType.Post)
                            CreatePostRequestWithState(currentData, ProcessorCallbackPost);
                    }

                    Thread.Sleep(1);
                }

                for (var i = 0; (i < pendingResponses.Count) && (i < MaximumConcurrentRequests); i++)
                {
                    var pendingResponse = pendingResponses.Dequeue();

                    var pending = ProcessCompletion(pendingResponse);
                    pendingCompletion.Enqueue(pending);

                    Thread.Sleep(1);

                }

                for (var i = 0; i < pendingCompletion.Count; i++)
                {
                    var almostDone = pendingCompletion.Dequeue();

                    PrivateCompletionProcessor(almostDone);

                    Thread.Sleep(1);
                }
            }
        }
Example #2
0
		private void OnOperationCompleted(Guid guid, WebServiceEventArgs args)
		{
			var result = new ApiResult(args.UserState, args.Exception, args.ResponseStatus, args.ResponseString);
			ApiCallCompleted(guid, result);
		}
        private void PrivateCompletionProcessor(PendingCompletion completion)
        {
            if (completion.Error != null)
            {
                WebServiceEventArgs response;

                if (completion.Error is WebException)
                {
                    response = GenerateFromException(completion.Error as WebException, HasInternetConnectivity, completion.RequestData.UserState);
                }
                else
                {
                    response = new WebServiceEventArgs(WebApiServerStatus.Error, completion.Error, String.Empty, completion.RequestData.UserState);
                }

                Responser(completion.RequestData, response);
            }
            else // Read data from stream and continue
            {
                WebServiceEventArgs finalResponse;

                using (var stream = completion.Result)
                {
                    using (var streamReader = new StreamReader(stream))
                    {
                        while (!streamReader.EndOfStream)
                        {
                            StringBuilder.Append(streamReader.ReadLine());
                        }

                        var stringResult = StringBuilder.ToString();
                        finalResponse = new WebServiceEventArgs(WebApiServerStatus.Success, null, stringResult, completion.RequestData.UserState);
                    }
                }

                completion.Response.Close();
                StringBuilder.Flush();

                Responser(completion.RequestData, finalResponse);
            }
        }
Example #4
0
		protected override void Responser(PrivateRequestData requestData, WebServiceEventArgs completer)
		{
			var myRequestData = (DoubleQueueRequestData)requestData;

			switch (myRequestData.CurrentWorker)
			{
				case CurrentlyUsedWorker.Primary:
					_primaryWorker.SignalOperationDone();
					break;
				case CurrentlyUsedWorker.Secondary:
					_secondaryWorker.SignalOperationDone();
					break;
				default:
					throw new ArgumentOutOfRangeException();
			}

			base.Responser(myRequestData, completer);
		}
Example #5
0
		private void StartPostRequestStreamCallback(IAsyncResult ar)
		{
			var userState = (PrivateWebUserState)ar.AsyncState;

			Stream writableStream = null;

			try
			{
				writableStream = userState.Request.EndGetRequestStream(ar);
				using (var memoryStream = new MemoryStream())
				{
					var writableString = userState.Data.Parameters;
					if (userState.Request.ContentType == PostContentType)
					{
						writableString = writableString.TrimStart('?');
					}

					// write tu buffer and reset position
					var getBytes = Encoding.UTF8.GetBytes(writableString);
					memoryStream.Write(getBytes, 0, getBytes.Length);
					memoryStream.Position = 0;

					// read from buffer stream
					var buffer = new byte[getBytes.Length];
					memoryStream.Read(buffer, 0, buffer.Length);

					// write to stream
					writableStream.Write(buffer, 0, buffer.Length);
				}
			}
			catch (Exception e)
			{
				WebServiceEventArgs result;

				if (e is WebException)
					result = GenerateFromException(e as WebException, HasInternetConnectivity, userState.Data.UserState);
				else
					result = new WebServiceEventArgs(WebApiServerStatus.InvalidStream, e, String.Empty, userState.Data.UserState);

				Responser(userState.Data, result);
				return;
			}
			finally
			{
				if (writableStream != null)
				{
					writableStream.Close();
					writableStream.Dispose();

					// If all done good, get the response from the server
					userState.Request.BeginGetResponse(GetResponseProcessorCallback, userState);
				}
			}

		}
Example #6
0
		private void GetResponseProcessorCallback(IAsyncResult ar)
		{
			var webState = (PrivateWebUserState)ar.AsyncState;

			HttpWebResponse response = null;
			var result = WebServiceEventArgs.CreateDefault(webState.Data.UserState);

			try
			{
				response = (HttpWebResponse)webState.Request.EndGetResponse(ar);
				using (var returnStream = response.GetResponseStream())
				using (var reader = new StreamReader(returnStream))
				{
					var builder = new StringBuilder();

					while (!reader.EndOfStream)
						builder.Append(reader.ReadLine());

					var resultString = builder.ToString();
					result = new WebServiceEventArgs(WebApiServerStatus.Success, null, resultString, webState.Data.UserState);
				}
			}
			catch (Exception e)
			{
				if (e is WebException)
					result = GenerateFromException(e as WebException, HasInternetConnectivity, webState.Data.UserState);
				else
					result = new WebServiceEventArgs(WebApiServerStatus.InvalidStream, e, String.Empty, webState.Data.UserState);

			}
			finally
			{
				if (response != null)
					response.Close();

				Responser(webState.Data, result);
			}
		}
Example #7
0
		protected static WebServiceEventArgs GenerateFromException(WebException e, bool hasInternet, object userState)
		{
			WebServiceEventArgs result;
			var webEx = e;

			Debug.WriteLine("WebException status {0}", webEx.Status);

			switch (e.Status)
			{
				case WebExceptionStatus.RequestCanceled:
					Debug.WriteLine("Cancelled!");
					result = new WebServiceEventArgs(WebApiServerStatus.Cancelled, e, String.Empty, userState);
					break;
				case WebExceptionStatus.ConnectFailure:
					Debug.WriteLine("Invalid Web Address");
					result = new WebServiceEventArgs(WebApiServerStatus.Error, e, String.Empty, userState);
					break;
				default:
					Debug.WriteLine("Some crappy error");
					result = !hasInternet ?
						new WebServiceEventArgs(WebApiServerStatus.NoConnection, e, String.Empty, userState) :
						new WebServiceEventArgs(WebApiServerStatus.Unknown, e, String.Empty, userState);
					break;
			}

			if (e.Message.Contains("NotFound") && hasInternet)
			{
				result = new WebServiceEventArgs(WebApiServerStatus.InvalidUrl, e, String.Empty, userState);
			}

			return result;
		}
Example #8
0
		/// <summary>
		/// Call the response callback from WebServiceEventArgs
		/// </summary>
		/// <param name="requestData"></param>
		/// <param name="completer"></param>
		protected virtual void Responser(PrivateRequestData requestData, WebServiceEventArgs completer)
		{
			if (completer == null)
				throw new ArgumentNullException("completer", "Response must not be null.");

			if (completer.ResponseStatus == WebApiServerStatus.Unknown)
				Utils.ErrorLogInstance.AddError("Responser", "Default WebServiceEventArgs found. Invalid Web state");

			lock (_requestLockObject)
			{
				// remove from running requests
				RunningRequests.Remove(requestData.ApiGuidToken);
			}

			if (requestData.IsHandled) return;

			// Finally call the callback on the father thread
			if (requestData.ReturnOnUi)
				Deployment.Current.Dispatcher.BeginInvoke(() => requestData.Result(requestData.ApiGuidToken, completer));
			else
				requestData.Result(requestData.ApiGuidToken, completer);

			requestData.Dispose();
		}