示例#1
0
        public static GcmNotification ForSingleRegistrationId(GcmNotification msg, string registrationId)
        {
            var result = new GcmNotification();

            result.Tag = msg.Tag;
            result.RegistrationIds.Add(registrationId);
            result.CollapseKey    = msg.CollapseKey;
            result.JsonData       = msg.JsonData;
            result.DelayWhileIdle = msg.DelayWhileIdle;
            return(result);
        }
示例#2
0
        public static GcmNotification ForSingleResult(GcmMessageTransportResponse response, int resultIndex)
        {
            var result = new GcmNotification();

            result.Tag = response.Message.Tag;
            result.RegistrationIds.Add(response.Message.RegistrationIds[resultIndex]);
            result.CollapseKey    = response.Message.CollapseKey;
            result.JsonData       = response.Message.JsonData;
            result.DelayWhileIdle = response.Message.DelayWhileIdle;
            return(result);
        }
示例#3
0
        void requestStreamCallback(IAsyncResult result)
        {
            var asyncParam = result.AsyncState as GcmAsyncParameters;

            try
            {
                if (asyncParam != null)
                {
                    var wrStream = asyncParam.WebRequest.EndGetRequestStream(result);

                    using (var webReqStream = new StreamWriter(wrStream))
                    {
                        var data = asyncParam.Message.GetJson();
                        webReqStream.Write(data);
                        webReqStream.Close();
                    }

                    try
                    {
                        asyncParam.WebRequest.BeginGetResponse(new AsyncCallback(responseCallback), asyncParam);
                    }
                    catch (WebException wex)
                    {
                        asyncParam.WebResponse = wex.Response as HttpWebResponse;
                        processResponseError(asyncParam);
                    }
                }
            }
            catch (Exception ex)
            {
                //Raise individual failures for each registration id for the notification
                foreach (var r in asyncParam.Message.RegistrationIds)
                {
                    asyncParam.Callback(this, new SendNotificationResult(GcmNotification.ForSingleRegistrationId(asyncParam.Message, r), false, ex));
                }

                Interlocked.Decrement(ref waitCounter);
            }
        }
 public static GcmNotification WithDryRun(this GcmNotification n)
 {
     n.DryRun = true;
     return(n);
 }
 public static GcmNotification WithTag(this GcmNotification n, object tag)
 {
     n.Tag = tag;
     return(n);
 }
 public static GcmNotification ForDeviceRegistrationId(this GcmNotification n, string deviceRegistrationId)
 {
     n.RegistrationIds.Add(deviceRegistrationId);
     return(n);
 }
 public static GcmNotification WithTimeToLive(this GcmNotification n, int ttlSeconds)
 {
     n.TimeToLive = ttlSeconds;
     return(n);
 }
 public static GcmNotification WithDelayWhileIdle(this GcmNotification n, bool delayWhileIdle = false)
 {
     n.DelayWhileIdle = delayWhileIdle;
     return(n);
 }
 public static GcmNotification WithCollapseKey(this GcmNotification n, string collapseKey)
 {
     n.CollapseKey = collapseKey;
     return(n);
 }
 public static GcmNotification ForDeviceRegistrationId(this GcmNotification n, IEnumerable <string> deviceRegistrationIds)
 {
     n.RegistrationIds.AddRange(deviceRegistrationIds);
     return(n);
 }
示例#11
0
        void processResponseOk(GcmAsyncParameters asyncParam)
        {
            var result = new GcmMessageTransportResponse()
            {
                ResponseCode = GcmMessageTransportResponseCode.Ok,
                Message      = asyncParam.Message
            };

            //Get the response body
            var json = new JObject();

            var str = string.Empty;

            try { str = (new StreamReader(asyncParam.WebResponse.GetResponseStream())).ReadToEnd(); }
            catch { }

            try { json = JObject.Parse(str); }
            catch { }

            result.NumberOfCanonicalIds = json.Value <long>("canonical_ids");
            result.NumberOfFailures     = json.Value <long>("failure");
            result.NumberOfSuccesses    = json.Value <long>("success");

            var jsonResults = json["results"] as JArray;

            if (jsonResults == null)
            {
                jsonResults = new JArray();
            }

            foreach (var r in jsonResults)
            {
                var msgResult = new GcmMessageResult();

                msgResult.MessageId = r.Value <string>("message_id");
                msgResult.CanonicalRegistrationId = r.Value <string>("registration_id");
                msgResult.ResponseStatus          = GcmMessageTransportResponseStatus.Ok;

                if (!string.IsNullOrEmpty(msgResult.CanonicalRegistrationId))
                {
                    msgResult.ResponseStatus = GcmMessageTransportResponseStatus.CanonicalRegistrationId;
                }
                else if (r["error"] != null)
                {
                    var err = r.Value <string>("error") ?? "";

                    switch (err.ToLowerInvariant().Trim())
                    {
                    case "ok":
                        msgResult.ResponseStatus = GcmMessageTransportResponseStatus.Ok;
                        break;

                    case "missingregistration":
                        msgResult.ResponseStatus = GcmMessageTransportResponseStatus.MissingRegistrationId;
                        break;

                    case "unavailable":
                        msgResult.ResponseStatus = GcmMessageTransportResponseStatus.Unavailable;
                        break;

                    case "notregistered":
                        msgResult.ResponseStatus = GcmMessageTransportResponseStatus.NotRegistered;
                        break;

                    case "invalidregistration":
                        msgResult.ResponseStatus = GcmMessageTransportResponseStatus.InvalidRegistration;
                        break;

                    case "mismatchsenderid":
                        msgResult.ResponseStatus = GcmMessageTransportResponseStatus.MismatchSenderId;
                        break;

                    case "messagetoobig":
                        msgResult.ResponseStatus = GcmMessageTransportResponseStatus.MessageTooBig;
                        break;

                    case "invaliddatakey":
                        msgResult.ResponseStatus = GcmMessageTransportResponseStatus.InvalidDataKey;
                        break;

                    case "invalidttl":
                        msgResult.ResponseStatus = GcmMessageTransportResponseStatus.InvalidTtl;
                        break;

                    case "internalservererror":
                        msgResult.ResponseStatus = GcmMessageTransportResponseStatus.InternalServerError;
                        break;

                    default:
                        msgResult.ResponseStatus = GcmMessageTransportResponseStatus.Error;
                        break;
                    }
                }

                result.Results.Add(msgResult);
            }

            asyncParam.WebResponse.Close();

            int index = 0;

            var response = result;

            //Loop through every result in the response
            // We will raise events for each individual result so that the consumer of the library
            // can deal with individual registrationid's for the notification
            foreach (var r in response.Results)
            {
                var singleResultNotification = GcmNotification.ForSingleResult(response, index);

                if (r.ResponseStatus == GcmMessageTransportResponseStatus.Ok)
                {
                    //It worked! Raise success
                    asyncParam.Callback(this, new SendNotificationResult(singleResultNotification));
                }
                else if (r.ResponseStatus == GcmMessageTransportResponseStatus.CanonicalRegistrationId)
                {
                    //Swap Registrations Id's
                    var newRegistrationId = r.CanonicalRegistrationId;
                    var oldRegistrationId = string.Empty;

                    if (singleResultNotification.RegistrationIds != null && singleResultNotification.RegistrationIds.Count > 0)
                    {
                        oldRegistrationId = singleResultNotification.RegistrationIds[0];
                    }

                    asyncParam.Callback(this, new SendNotificationResult(singleResultNotification, false, new DeviceSubscriptonExpiredException())
                    {
                        OldSubscriptionId = oldRegistrationId, NewSubscriptionId = newRegistrationId, IsSubscriptionExpired = true
                    });
                }
                else if (r.ResponseStatus == GcmMessageTransportResponseStatus.Unavailable)
                {
                    asyncParam.Callback(this, new SendNotificationResult(singleResultNotification, true, new Exception("Unavailable Response Status")));
                }
                else if (r.ResponseStatus == GcmMessageTransportResponseStatus.NotRegistered)
                {
                    var oldRegistrationId = string.Empty;

                    if (singleResultNotification.RegistrationIds != null && singleResultNotification.RegistrationIds.Count > 0)
                    {
                        oldRegistrationId = singleResultNotification.RegistrationIds[0];
                    }

                    //Raise failure and device expired
                    asyncParam.Callback(this, new SendNotificationResult(singleResultNotification, false, new DeviceSubscriptonExpiredException())
                    {
                        OldSubscriptionId = oldRegistrationId, IsSubscriptionExpired = true, SubscriptionExpiryUtc = DateTime.UtcNow
                    });
                }
                else
                {
                    //Raise failure, for unknown reason
                    asyncParam.Callback(this, new SendNotificationResult(singleResultNotification, false, new GcmMessageTransportException(r.ResponseStatus.ToString(), response)));
                }

                index++;
            }

            Interlocked.Decrement(ref waitCounter);
        }