/// <summary> /// Synchronously send this message to the destination uri. /// </summary> /// <param name="payload">The message payload bytes.</param> /// <param name="uri">The message destination uri.</param> /// <param name="payload">Initialized Web request instance.</param> /// <returns>The result instance with relevant information for this send operation.</returns> private MessageSendResult SendSynchronously(byte[] payload, Uri uri, HttpWebRequest request) { try { // Get the request stream. using (var requestStream = request.GetRequestStream()) { // Start to write the payload to the stream. requestStream.Write(payload, 0, payload.Length); // Switch to receiving the response from MPNS. using (var response = (HttpWebResponse)request.GetResponse()) { var result = new MessageSendResult(this, uri, response); if (response.StatusCode != HttpStatusCode.OK) { throw new InvalidOperationException(string.Format(Resources.ServerErrorStatusCode, response.StatusCode)); } return(result); } } } catch (WebException ex) { var result = new MessageSendResult(this, uri, ex); throw new MessageSendException(result, ex); } catch (Exception ex) { var result = new MessageSendResult(this, uri, ex); throw new MessageSendException(result, ex); } }
public PushNotificationsLogMsg(NotificationType notificationType, MessageSendResult messageSendResult) { this.Timestamp = messageSendResult.Timestamp; this.MessageId = messageSendResult.AssociatedMessage.Id.ToString(); this.ChannelUri = messageSendResult.ChannelUri.ToString(); this.NotificationType = notificationType; this.StatusCode = messageSendResult.StatusCode; this.NotificationStatus = messageSendResult.NotificationStatus.ToString(); this.DeviceConnectionStatus = messageSendResult.DeviceConnectionStatus.ToString(); this.SubscriptionStatus = messageSendResult.DeviceConnectionStatus.ToString(); }
/// <summary> /// Initialize a new instance of this type. /// </summary> public MessageStatus(string pattern, MessageSendResult result) { Pattern = pattern; Timestamp = result.Timestamp; MessageType = MessageTypes[result.AssociatedMessage.GetType()]; MessageId = result.AssociatedMessage.Id; ChannelUri = result.ChannelUri; StatusCode = result.StatusCode; NotificationStatus = result.NotificationStatus; DeviceConnectionStatus = result.DeviceConnectionStatus; SubscriptionStatus = result.SubscriptionStatus; }
/// <summary> /// Asynchronously send this message to the destination uri using the HttpWebRequest context. /// </summary> /// <param name="payload">The message payload bytes.</param> /// <param name="uri">The message destination uri.</param> /// <param name="payload">Initialized Web request instance.</param> /// <param name="sent">Message sent callback.</param> /// <param name="error">Message send error callback.</param> /// <returns>The result instance with relevant information for this send operation.</returns> private void SendAsynchronously(byte[] payload, Uri uri, HttpWebRequest request, Action <MessageSendResult> sent, Action <MessageSendResult> error) { try { // Get the request stream asynchronously. request.BeginGetRequestStream(requestAsyncResult => { try { using (var requestStream = request.EndGetRequestStream(requestAsyncResult)) { // Start writing the payload to the stream. requestStream.Write(payload, 0, payload.Length); } // Switch to receiving the response from MPNS asynchronously. request.BeginGetResponse(responseAsyncResult => { try { using (var response = (HttpWebResponse)request.EndGetResponse(responseAsyncResult)) { var result = new MessageSendResult(this, uri, response); if (response.StatusCode == HttpStatusCode.OK) { sent(result); } else { error(result); } } } catch (Exception ex3) { error(new MessageSendResult(this, uri, ex3)); } }, null); } catch (Exception ex2) { error(new MessageSendResult(this, uri, ex2)); } }, null); } catch (Exception ex1) { error(new MessageSendResult(this, uri, ex1)); } }
private void OnMessageSent(NotificationType type, MessageSendResult result) { PushNotificationsLogMsg msg = new PushNotificationsLogMsg(type, result); Dispatcher.BeginInvoke((Action)(() => { trace.Add(msg); })); }
private void OnRawSent(string userName, MessageSendResult result) { // In case that the device is disconnected, no need to send a tile message. if (result.DeviceConnectionStatus == DeviceConnectionStatus.TempDisconnected) { return; } // Checking these three flags we can know what's the state of both the device and apllication. bool isApplicationRunning = result.SubscriptionStatus == SubscriptionStatus.Active && result.NotificationStatus == NotificationStatus.Received && result.DeviceConnectionStatus == DeviceConnectionStatus.Connected; // In case that the application is not running, send a tile update with counter increase. if (!isApplicationRunning) { var tileMsg = new TilePushNotificationMessage(MessageSendPriority.High) { Count = IncreaseCounter(userName), BackgroundImageUri = BackgroundImageUri, Title = Title }; tileMsg.SendAsync(result.ChannelUri, Log, Log); } }
/// <summary> /// Logs push message result. /// </summary> protected void Log(MessageSendResult result) { ResultLogger.Log(DisplayName, result); }
void IMessageSendResultLogger.Log(string patternName, MessageSendResult result) { Dispatcher.BeginInvoke(() => Status.Add(new MessageStatus(patternName, result))); }
/// <summary> /// Initializes a new instance of this type. /// </summary> /// <param name="result">The send operation result.</param> /// <param name="innerException">An inner exception causes this error.</param> internal MessageSendException(MessageSendResult result, Exception innerException) : base(Resources.FailedToSendMessage, innerException) { Result = result; }
private bool CheckIfPinned(MessageSendResult result) { // We known if the application is pinned by checking the following send result flags: return result.DeviceConnectionStatus == DeviceConnectionStatus.Connected && result.SubscriptionStatus == SubscriptionStatus.Active && result.NotificationStatus == NotificationStatus.Received; }
/// <summary> /// Once tile update sent, check if handled by the phone. /// In case that the application is not pinned, ask to pin. /// </summary> private void OnMessageSent(string userName, MessageSendResult result) { if (!CheckIfPinned(result)) { AskUserToPin(result.ChannelUri); } }
/// <summary> /// Initializes a new instance of this type. /// </summary> /// <param name="result">The send operation result.</param> /// <param name="innerException">An inner exception causes this error.</param> internal MessageSendException(MessageSendResult result, Exception innerException) : base(Resources.FailedToSendMessage, innerException) { Result = result; }