protected override void SendNotification(Common.Notification notification) { try { sendNotification(notification); } catch (Exception ex) { this.Events.RaiseChannelException(ex, PlatformType.Windows, notification); } }
protected override void SendNotification(Common.Notification notification) { var bbn = notification as BlackberryNotification; if (bbn != null) { push(bbn); } }
protected override void SendNotification(Common.Notification notification) { lock (sentLock) { var appleNotification = notification as AppleNotification; bool isOkToSend = true; byte[] notificationData = new byte[] {}; try { notificationData = appleNotification.ToBytes(); } catch (NotificationFailureException nfex) { //Bad notification format already isOkToSend = false; Interlocked.Decrement(ref trackedNotificationCount); this.Events.RaiseNotificationSendFailure(notification, nfex); } if (isOkToSend) { lock (connectLock) Connect(); try { lock (streamWriteLock) { lock (sentLock) { networkStream.Write(notificationData, 0, notificationData.Length); sentNotifications.Add(new SentNotification(appleNotification)); } } } catch (Exception) { //If this failed, we probably had a networking error, so let's requeue the notification this.QueueNotification(notification, true, true); } } } }
void sendNotification(Common.Notification notification) { //See if we need an access token if (string.IsNullOrEmpty(AccessToken)) { RenewAccessToken(); } var winNotification = notification as WindowsNotification; //https://cloud.notify.windows.com/?token=..... //Authorization: Bearer {AccessToken} // var wnsType = string.Empty; switch (winNotification.Type) { case WindowsNotificationType.Tile: wnsType = "wns/tile"; break; case WindowsNotificationType.Badge: wnsType = "wns/badge"; break; case WindowsNotificationType.Toast: wnsType = "wns/toast"; break; default: wnsType = "wns/raw"; break; } var request = (HttpWebRequest)HttpWebRequest.Create(winNotification.ChannelUri); // "https://notify.windows.com"); request.Method = "POST"; request.Headers.Add("X-WNS-Type", wnsType); request.Headers.Add("Authorization", string.Format("Bearer {0}", this.AccessToken)); request.ContentType = "text/xml"; if (winNotification.Type == WindowsNotificationType.Raw) { request.ContentType = "application/octet-stream"; } if (winNotification.Type == WindowsNotificationType.Tile) { var winTileNot = winNotification as WindowsTileNotification; if (winTileNot != null && winTileNot.CachePolicy.HasValue) { request.Headers.Add("X-WNS-Cache-Policy", winTileNot.CachePolicy == WindowsNotificationCachePolicyType.Cache ? "cache" : "no-cache"); } } else if (winNotification.Type == WindowsNotificationType.Badge) { if (winNotification is WindowsBadgeNumericNotification) { var winTileBadge = winNotification as WindowsBadgeNumericNotification; if (winTileBadge != null && winTileBadge.CachePolicy.HasValue) { request.Headers.Add("X-WNS-Cache-Policy", winTileBadge.CachePolicy == WindowsNotificationCachePolicyType.Cache ? "cache" : "no-cache"); } } else if (winNotification is WindowsBadgeGlyphNotification) { var winTileBadge = winNotification as WindowsBadgeGlyphNotification; if (winTileBadge != null && winTileBadge.CachePolicy.HasValue) { request.Headers.Add("X-WNS-Cache-Policy", winTileBadge.CachePolicy == WindowsNotificationCachePolicyType.Cache ? "cache" : "no-cache"); } } } if (winNotification.RequestForStatus.HasValue) { request.Headers.Add("X-WNS-RequestForStatus", winNotification.RequestForStatus.Value.ToString().ToLower()); } if (winNotification.Type == WindowsNotificationType.Tile) { var winTileNot = winNotification as WindowsTileNotification; if (winTileNot != null && !string.IsNullOrEmpty(winTileNot.NotificationTag)) { request.Headers.Add("X-WNS-Tag", winTileNot.NotificationTag); // TILE only } } if (winNotification.TimeToLive.HasValue) { request.Headers.Add("X-WNS-TTL", winNotification.TimeToLive.Value.ToString()); //Time to live in seconds } //Microsoft recommends we disable expect-100 to improve latency request.ServicePoint.Expect100Continue = false; var payload = winNotification.PayloadToString(); var data = Encoding.Default.GetBytes(payload); request.ContentLength = data.Length; using (var rs = request.GetRequestStream()) rs.Write(data, 0, data.Length); try { request.BeginGetResponse(new AsyncCallback(getResponseCallback), new object[] { request, winNotification }); } catch (WebException wex) { //Handle different httpstatuses var status = ParseStatus(wex.Response as HttpWebResponse, winNotification); HandleStatus(status); } }
static void Events_OnDeviceSubscriptionExpired(Common.PlatformType platform, string deviceInfo, Common.Notification notification) { Console.WriteLine("Device Subscription Expired: " + platform.ToString() + " -> " + deviceInfo); }
static void Events_OnChannelException(Exception exception, Common.PlatformType platformType, Common.Notification notification) { Console.WriteLine("Channel Exception: " + platformType.ToString() + " -> " + exception.ToString()); }
static void Events_OnNotificationSendFailure(Common.Notification notification, Exception notificationFailureException) { Console.WriteLine("Failure: " + notification.Platform.ToString() + " -> " + notificationFailureException.Message + " -> " + notification.ToString()); }
static void Events_OnNotificationSent(Common.Notification notification) { Console.WriteLine("Sent: " + notification.Platform.ToString() + " -> " + notification.ToString()); }
static void Events_OnDeviceSubscriptionIdChanged(Common.PlatformType platform, string oldDeviceInfo, string newDeviceInfo, Common.Notification notification) { //Currently this event will only ever happen for Android GCM Console.WriteLine("Device Registration Changed: Old-> " + oldDeviceInfo + " New-> " + newDeviceInfo); }
static void Events_OnChannelException(Exception exception, Common.Notification notification) { Console.WriteLine("Channel Exception: " + exception.ToString()); }