Ejemplo n.º 1
0
        internal async Task <BuddyResult <T> > HandleServiceResult <T>(BuddyCallResult <T> serviceResult, bool allowThrow = false)
        {
            var result = new BuddyResult <T> ();

            result.RequestID = serviceResult.RequestID;
            if (serviceResult.Error != null)
            {
                BuddyServiceException buddyException = null;
                switch (serviceResult.StatusCode)
                {
                case 0:
                    buddyException = new BuddyNoInternetException(serviceResult.Error);
                    break;

                case 401:
                case 403:
                    buddyException = new BuddyUnauthorizedException(serviceResult.Error, serviceResult.Message, serviceResult.ErrorNumber);
                    break;

                default:
                    buddyException = new BuddySDK.BuddyServiceException(serviceResult.Error, serviceResult.Message, serviceResult.ErrorNumber);
                    break;
                }
                TaskCompletionSource <bool> uiPromise = new TaskCompletionSource <bool> ();
                PlatformAccess.Current.InvokeOnUiThread(async() => {
                    var r = false;
                    if (await OnServiceException(this, buddyException))
                    {
                        r = true;
                    }
                    uiPromise.TrySetResult(r);
                });
                if (await uiPromise.Task && allowThrow)
                {
                    throw buddyException;
                }
                buddyException.StatusCode = serviceResult.StatusCode;
                result.Error = buddyException;
            }
            else
            {
                result.Value = serviceResult.Result;
            }
            return(result);
        }
Ejemplo n.º 2
0
        public void CallMethodAsync <T>(string methodName, HttpRequestType requestType, IDictionary <string, object> parameters, Action <BuddyCallResult <T> > callback)
        {
            DateTime start = DateTime.Now;

            Action <Exception, BuddyCallResult <T> > handleException = (ex, bcr) =>
            {
                WebException    webEx    = ex as WebException;
                HttpWebResponse response = null;
                var             err      = BuddyError.UnknownServiceError;

                bcr.Message = ex.ToString();
                if (webEx != null)
                {
                    err = BuddyError.InternetConnectionError;

                    if (webEx.Response != null)
                    {
                        response    = (HttpWebResponse)webEx.Response;
                        bcr.Message = response.StatusDescription;
                    }
                    else
                    {
                        bcr.Message = webEx.Status.ToString();
                    }
                }

                bcr.Error = err;
                LogResponse(methodName, bcr.Message, DateTime.Now.Subtract(start), response);

                callback(bcr);
            };


            GetResponse(methodName, parameters, requestType, (ex, response) =>
            {
                var bcr = new BuddyCallResult <T>();
                var isResponseRequest = typeof(T).Equals(typeof(HttpWebResponse));

                if (isResponseRequest)
                {
                    bcr.Result = (T)(object)response;
                }

                if (ex != null)
                {
                    handleException(ex, bcr);

                    return;
                }
                else if (response != null)
                {
                    if (!isResponseRequest)
                    {
                        string body = null;
                        try
                        {
                            using (var responseStream = response.GetResponseStream())
                            {
                                body = new StreamReader(responseStream).ReadToEnd();
                            }
                        }
                        catch (Exception rex)
                        {
                            handleException(rex, bcr);
                            return;
                        }


                        LogResponse(methodName, body, DateTime.Now.Subtract(start), response);

                        var err = GetBuddyError(body);

                        if (err != BuddyError.None)
                        {
                            bcr.Error = err;
                            callback(bcr);
                            return;
                        }


                        if (typeof(T).Equals(typeof(string)))
                        {
                            bcr.Result = (T)Convert.ChangeType(body, typeof(T), CultureInfo.InvariantCulture);
                        }
                        else
                        {
                            var serializer = Newtonsoft.Json.JsonSerializer.Create(null);


                            //json parse
                            try
                            {
                                var envelope = serializer.Deserialize <JsonEnvelope <T> >(new JsonTextReader(new StringReader(body)));
                                bcr.Result   = envelope.data;
                            }
                            catch
                            {
                                bcr.Error   = BuddyError.UnknownServiceError;
                                bcr.Message = body;
                            }
                        }
                    }
                    try
                    {
                        callback(bcr);
                    }
                    catch (Exception ex3)
                    {
                        handleException(ex3, bcr);
                    }
                }
            });
        }