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