/// <summary>
 /// serialize to json
 /// </summary>
 /// <param name="o"></param>
 /// <returns></returns>
 private static string ToString(PushMessage o)
 {
     JavaScriptSerializer jser = new JavaScriptSerializer();
     string contents = jser.Serialize(o);
     return contents;
 }
 /// <summary>
 /// Enque either a common or WP7 message to be sent to MPNS. Get message components and send it to the device
 /// </summary>
 /// <param name="device">Device to send the message to</param>
 /// <param name="msg">Message to send</param>
 public override void EnqueMessage(DeviceDataModel device, PushMessage msg)
 {
     if (msg.MessageType == (short)PushMessageType.Toast)
     {
         this.EnqueAndroidToastNotification(device, msg.Message["toast"]);
     }
     else if (msg.MessageType == (short)PushMessageType.Raw)
     {
         this.EnqueAndroidRawNotification(device, msg.Message["raw"]);
     }
     else if (msg.MessageType == (short)PushMessageType.Common)
     {
         this.EnqueAndroidCommonNotification(device, msg.Message["title"], int.Parse(msg.Message["count"], CultureInfo.InvariantCulture), msg.Message["sound"]);
     }
     else if (msg.MessageType == (short)PushMessageType.Iphone)
     {
         this.EnqueAndroidCommonNotification(device, msg.Message["title"], int.Parse(msg.Message["count"], CultureInfo.InvariantCulture), msg.Message["sound"]);
     }
     else
     {
         return;
     }
 }
        /// <summary>
        /// Enques and sends the message to a collection of devices
        /// </summary>
        /// <param name="devices">List of devices to send the message to</param>
        /// <param name="msg">The push message to send the message to the devices</param>
        public virtual void EnqueMessage(IEnumerable<DeviceDataModel> devices, PushMessage msg)
        {
            // Check if the message is supported is by the connection class.
            if (!this.HandlesMessageType((PushMessageType)msg.MessageType))
            {
                return;
            }

            if (devices == null)
            {
                return;
            }

            foreach (DeviceDataModel ddm in devices)
            {
                this.EnqueMessage(ddm, msg);
            }
        }
 /// <summary>
 /// Enque either a common or iPhone message type to be sent to APNS. Get message components and enque it for the device
 /// </summary>
 /// <param name="device">Device to send the message to</param>
 /// <param name="msg">Message to send</param>
 public override void EnqueMessage(DeviceDataModel device, PushMessage msg)
 {
     if (msg.MessageType == (short)PushMessageType.Iphone)
     {
         string msgStr = ToString(msg);
         iPhoneMessage iPhoneMsg = FromString(msgStr, typeof(iPhoneMessage)) as iPhoneMessage;
         this.EnqueiOSMessage(device, iPhoneMsg);
     }
     else if (msg.MessageType == (short)PushMessageType.Common)
     {
         string msgStr = ToString(msg);
         iPhoneMessage iPhoneMsg = FromString(msgStr, typeof(iPhoneMessage)) as iPhoneMessage;
         this.EnqueiOSMessage(device, iPhoneMsg);
     }
 }
 /// <summary>
 /// Enque and send the message to the appropriate notification service
 /// </summary>
 /// <param name="device">Device to send the message to</param>
 /// <param name="msg">The push message to send to the device</param>
 public virtual void EnqueMessage(DeviceDataModel device, PushMessage msg)
 {
     return;
 }
 /// <summary>
 /// Enque either a common or WP7 message to be sent to MPNS. Get message components and send it to the device
 /// </summary>
 /// <param name="devices">Devices to send the message to</param>
 /// <param name="msg">Message to send</param>
 public override void EnqueMessage(IEnumerable<DeviceDataModel> devices, PushMessage msg)
 {
     try
     {
         if (msg.MessageType == (short)PushMessageType.Toast)
         {
             this.EnqueWP7ToastNotification(devices, msg.Message["toast"]);
         }
         else if (msg.MessageType == (short)PushMessageType.Raw)
         {
             this.EnqueWP7RawNotification(devices, msg.Message["raw"]);
         }
         else if (msg.MessageType == (short)PushMessageType.Tile || msg.MessageType == (short)PushMessageType.Common)
         {
             this.EnqueWP7TileNotification(devices, msg.Message["title"], int.Parse(msg.Message["count"], CultureInfo.InvariantCulture), msg.Message["url"]);
         }
         else
         {
             return;
         }
     }
     catch (Exception)
     {
         if (this.NotificationFormatError != null)
         {
             this.NotificationFormatError(this, new NotificationEventArgs(new NotificationFormatException(msg)));
         }
     }
 }
 /// <summary>
 /// Enque either a common or WP7 message to be sent to MPNS. Get message components and send it to the device
 /// </summary>
 /// <param name="device">Device to send the message to</param>
 /// <param name="msg">Message to send</param>
 public override void EnqueMessage(DeviceDataModel device, PushMessage msg)
 {
     if (msg.MessageType == (short)PushMessageType.Toast)
     {
         this.EnqueWP7ToastNotification(device, msg.Message["toast"]);
     }
     else if (msg.MessageType == (short)PushMessageType.Raw)
     {
         this.EnqueWP7RawNotification(device, msg.Message["message"]);
     }
     else if (msg.MessageType == (short)PushMessageType.Tile || msg.MessageType == (short)PushMessageType.Common)
     {
         this.EnqueWP7TileNotification(device, msg.Message["title"], int.Parse(msg.Message["count"], CultureInfo.InvariantCulture), msg.Message["url"]);
     }
     else
     {
         return;
     }
 }
 /// <summary>
 /// Initializes a new instance of the NotificationFormatException class.
 /// </summary>
 /// <param name="message">Notification that caused the Exception.</param>
 public NotificationFormatException(PushMessage message)
     : base(string.Format(CultureInfo.InvariantCulture, "Notification payload larger than maximum allowed"))
 {
     this.NotificationMessage = message;
 }
        // Based on the type of message, it is sent to appropriate connection
        private void ProcessMessage(PushMessage pushMsg)
        {
            // Check if APNS and MPNS support a given type
            bool ifAPNSSupportsType = this.apnsSupportedMessages[(PushMessageType)pushMsg.MessageType];
            bool ifMPNSSupportsType = this.mpnsSupportedMessages[(PushMessageType)pushMsg.MessageType];
            bool ifC2DMSupportsType = this.c2dmSupportedMessages[(PushMessageType)pushMsg.MessageType];

            if (ifAPNSSupportsType)
            {
                // If APNS supports it, get the list of devices of the type APNS supports. 
                IEnumerable<DeviceDataModel> ddmList = this.sds.SelectByDeviceTypeAndSubscription(pushMsg.SubscriptionName, this.apnsDevType);
                this.apnsConnection.EnqueMessage(ddmList, pushMsg);
            }

            if (ifMPNSSupportsType)
            {
                // If MPNS supports the message type, get the list of devices of MPNS type and subscribed to a given subscription
                IEnumerable<DeviceDataModel> ddmList = this.sds.SelectByDeviceTypeAndSubscription(pushMsg.SubscriptionName, this.mpnsDevType);
                this.mpnsConnection.EnqueMessage(ddmList, pushMsg);
            }

            if (ifC2DMSupportsType)
            {
                // If APNS supports it, get the list of devices of the type APNS supports. 
                IEnumerable<DeviceDataModel> ddmList = this.sds.SelectByDeviceTypeAndSubscription(pushMsg.SubscriptionName, this.c2dmDevType);
                this.c2dmConnection.EnqueMessage(ddmList, pushMsg);
            }
        }