Exemple #1
0
 /// <summary>
 /// Select method to simplify searching.
 /// </summary>
 /// <param name="deviceId">The device id of the device being searched.</param>
 /// <param name="type">The type of the device being searched.</param>
 /// <returns>Returns the DeviceDataModel if found otherwise returns null.</returns>
 public DeviceDataModel SelectByDeviceIdAndType(string deviceId, string type)
 {
     try
     {
         DeviceDataModel device = this.serviceContext.DeviceTable.Where(s => s.DeviceId == deviceId && s.DeviceType == type).FirstOrDefault();
         return(device);
     }
     catch (DataServiceQueryException)
     {
         return(null);
     }
     catch (Exception)
     {
         throw;
     }
 }
Exemple #2
0
        /// <summary>
        /// Delete the device record.
        /// </summary>
        /// Deletes subscription records before deleting device details.
        /// <param name="ddm">The device to be delete.</param>
        public void DeleteDeviceSubscriptions(DeviceDataModel ddm)
        {
            IEnumerable <SubscriptionDataModel> sdmList = this.serviceContext.SubscriptionsTable.Where(s => (s.DeviceId == ddm.DeviceId));

            foreach (SubscriptionDataModel sdm in sdmList)
            {
                this.serviceContext.DeleteObject(sdm);
            }

            IEnumerable <DeviceDataModel> ddmList = this.serviceContext.DeviceTable.Where(d => d.DeviceId == ddm.DeviceId);

            foreach (DeviceDataModel tddm in ddmList)
            {
                this.serviceContext.DeleteObject(tddm);
            }

            this.serviceContext.SaveChanges();
        }
 /// <summary>
 /// Adds the device or updates it. For WP7, the URI will be updated frequently. 
 /// deviceID is maintained as the index into the d/b
 /// </summary>
 /// <param name="devTypeName">The type of the device being added or updated.</param>
 /// <param name="deviceId">The device id of the device being added or updated.</param>
 /// <param name="deviceUri">The device uri. Used only for WP7 and empty string for others.</param>
 /// <returns>Returns success or an error.</returns>
 public PushMessageError AddOrUpdateDevice(string devTypeName, string deviceId, string deviceUri)
 {
     DeviceDataModel ddm = this.dds.SelectByDeviceIdAndType(deviceId, devTypeName);
     if (ddm == null)
     {
         // No such device, create it
         ddm = new DeviceDataModel(devTypeName, deviceId);
         ddm.Address = deviceUri;
         this.dds.Insert(ddm);
         return PushMessageError.Success;
     }
     else
     {
         // For WP7, we will update the URI with the new value
         ddm.Address = deviceUri;
         this.dds.Update(ddm);
         return PushMessageError.Success;
     }
 }
Exemple #4
0
        /// <summary>
        /// Select device by DeviceID.
        /// </summary>
        /// <param name="deviceId">The device id being searched.</param>
        /// <returns>Returns the DeviceDataModel if found otherwise returns null.</returns>
        public DeviceDataModel SelectByDeviceId(string deviceId)
        {
            try
            {
                DeviceDataModel device = this.serviceContext.DeviceTable.Where(s => s.DeviceId == deviceId).First();
                return(device);
            }
            catch (DataServiceQueryException)
            {
                return(null);
            }
            catch (ArgumentNullException)
            {
                return(null);
            }

            //catch (Exception)
            //{
            //    return null;
            //}
        }
 /// <summary>
 ///  enques all types of WP7 message to each device URI in the subscription.       
 /// </summary>
 /// <param name="subscription"></param>
 /// <param name="messageBytes"></param>
 /// <param name="type"></param>
 private void EnqueAndroidNotification(DeviceDataModel ddm, byte[] msgBytes)
 {
     try
     {
         // get the all devices that have signed up for the subscription
         // send the message to each device addrress or URI
         this.SendAndroidMessage(msgBytes);
     }
     catch (ObjectDisposedException e)
     {
         if (this.NotificationFailed != null)
         {
             this.NotificationFailed(this, new NotificationEventArgs(e));
         }
     }
     catch (System.IO.IOException e)
     {
         if (this.NotificationFailed != null)
         {
             this.NotificationFailed(this, new NotificationEventArgs(e));
         }
     }
 }
 /// <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>
        /// Enque message for a particular device. For iPhone, we have to pack each message separately as the device ID is put in the message
        /// </summary>
        /// <param name="device"></param>
        /// <param name="msg"></param>
        private void EnqueiOSMessage(DeviceDataModel device, iPhoneMessage msg)
        {
            byte[] apnsNotificationBytes;
            int numberOfRetries = 0;
            if (device.DeviceType == "iOS")
            {
                if (!CheckDeviceId(device.DeviceId))
                {
                    return;
                }

                // compose the message
                apnsNotificationBytes = this.ComposeAPNSMessage(device.DeviceId, msg as iPhoneMessage);
                while (numberOfRetries < this.SendRetries)
                {
                    try
                    {
                        // and send the notification
                        this.SendiPhoneDeviceNotification(apnsNotificationBytes);
                        return;
                    }
                    catch (DeviceIdFormatException e)
                    {
                        // device ID was wrong. Send an error to listener
                        if (this.DeviceIdFormatError != null)
                        {
                            this.DeviceIdFormatError(this, new NotificationEventArgs(e));
                        }
                    }
                    catch (NotificationFormatException e)
                    {
                        // notification format was wrong. send error to listner
                        if (this.NotificationFormatError != null)
                        {
                            this.NotificationFormatError(this, new NotificationEventArgs(e));
                        }
                    }
                    catch (ObjectDisposedException e)
                    {
                        if (this.NotificationFailed != null)
                        {
                            this.NotificationFailed(this, new NotificationEventArgs(e));
                        }

                        this.DisconnectTCPClient();
                    }
                    catch (System.IO.IOException e)
                    {
                        if (this.NotificationFailed != null)
                        {
                            this.NotificationFailed(this, new NotificationEventArgs(e));
                        }

                        this.DisconnectTCPClient();
                    }

                    numberOfRetries++;
                }
            }
        }
 /// <summary>
 /// Remove a device from the table
 /// </summary>
 /// <param name="item">The DeviceDataModel item to be deleted.</param>
 public void Delete(DeviceDataModel item)
 {
     this.serviceContext.DeleteObject(item);
     this.serviceContext.SaveChanges();
 }
Exemple #9
0
 /// <summary>
 /// Update a device. For WP7 device, URI will get updated often.
 /// </summary>
 /// <param name="updatedItem">The item to be updated.</param>
 public void Update(DeviceDataModel updatedItem)
 {
     // We only need to update WP7 devices.
     this.serviceContext.UpdateObject(updatedItem);
     this.serviceContext.SaveChanges();
 }
Exemple #10
0
 /// <summary>
 /// Add a device to the table
 /// </summary>
 /// <param name="newItem">The DeviceDataModel item to be added.</param>
 public void Insert(DeviceDataModel newItem)
 {
     this.serviceContext.AddObject(MessageServiceContext.DeviceTableName, newItem);
     this.serviceContext.SaveChanges();
 }
 /// <summary>
 /// Enques all types of WP7 message to each device URI in the subscription.       
 /// </summary>
 /// <param name="ddm">Device to send message to.</param>
 /// <param name="messageBytes">Message bytes of the message to send.</param>
 /// <param name="type">Type of message to send.</param>
 private void EnqueWP7Notification(DeviceDataModel ddm, byte[] messageBytes, WP7NotificationType type)
 {
     // Get the all devices that have signed up for the subscription
     // Send the message to each device addrress or URI
     if (Uri.IsWellFormedUriString(ddm.Address, UriKind.Absolute))
     {
         this.SendWP7Message(new Uri(ddm.Address), messageBytes, type);
     }
     else
     {
         if (this.DeviceIdFormatError != null)
         {
             this.DeviceIdFormatError(this, new NotificationEventArgs(new DeviceIdFormatException(ddm.Address)));
         }
     }
 }
 /// <summary>
 /// Formats a toast message and enques it for sending it out a device. 
 /// </summary>
 /// <param name="ddm">The device to send the message to.</param>
 /// <param name="message">The message to send.</param>
 private void EnqueWP7ToastNotification(DeviceDataModel ddm, string message)
 {
     Trace.WriteLine(string.Format(CultureInfo.InvariantCulture, "WCF Worker role: Enque Toast for deviceID : {0}", ddm.DeviceId));
     byte[] messageBytes = PackageToastNotification(message);
     this.EnqueWP7Notification(ddm, messageBytes, WP7NotificationType.Toast);
 }
 /// <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>
 /// Update a device. For WP7 device, URI will get updated often. 
 /// </summary>
 /// <param name="updatedItem">The item to be updated.</param>
 public void Update(DeviceDataModel updatedItem)
 {
     // We only need to update WP7 devices.
     this.serviceContext.UpdateObject(updatedItem);
     this.serviceContext.SaveChanges();
 }
 /// <summary>
 /// formats a raw message and enques it for sending it out to all devices in the subscription. 
 /// </summary>
 /// <param name="subscription"></param>
 /// <param name="message"></param>
 private void EnqueAndroidRawNotification(DeviceDataModel ddm, string message)
 {
     Trace.WriteLine(string.Format(CultureInfo.InvariantCulture, "WCF Worker role: Enque Raw for deviceID : {0}", ddm.DeviceId));
     byte[] formattedMsgBytes = PackageRawNotification(ddm.DeviceId, message);
     this.EnqueAndroidNotification(ddm, formattedMsgBytes);
 }
 /// <summary>
 /// formats a file message and enques it for sending it out to all devices in the subscription. 
 /// </summary>
 /// <param name="subscription"></param>
 /// <param name="title"></param>
 /// <param name="count"></param>
 /// <param name="image"></param>
 private void EnqueAndroidCommonNotification(DeviceDataModel ddm, string title, int count, string sound)
 {
     Trace.WriteLine(string.Format(CultureInfo.InvariantCulture, "WCF Worker role: Enque Raw for deviceID : {0}", ddm.DeviceId));
     byte[] formattedMsgBytes = this.PackageCommonNotification(ddm.DeviceId, title, count, sound);
     this.EnqueAndroidNotification(ddm, formattedMsgBytes);
 }
 /// <summary>
 /// Formats a raw message and enques it for sending it out to all devices in the subscription. 
 /// </summary>
 /// <param name="ddm">Device to send a raw message.</param>
 /// <param name="message">Message to send.</param>
 private void EnqueWP7RawNotification(DeviceDataModel ddm, string message)
 {
     byte[] messageBytes = Encoding.UTF8.GetBytes(message);
     this.EnqueWP7Notification(ddm, messageBytes, WP7NotificationType.Raw);
 }
Exemple #18
0
 /// <summary>
 /// Remove a device from the table
 /// </summary>
 /// <param name="item">The DeviceDataModel item to be deleted.</param>
 public void Delete(DeviceDataModel item)
 {
     this.serviceContext.DeleteObject(item);
     this.serviceContext.SaveChanges();
 }
 /// <summary>
 /// Formats a file message and enques it for sending it out to  dtheevices in the subscription. 
 /// </summary>
 /// <param name="ddm">Devices to send the message to.</param>
 /// <param name="title">Title of the push notification.</param>
 /// <param name="count">Count to be shown on the tile.</param>
 /// <param name="image">Image to show on the tile.</param>
 private void EnqueWP7TileNotification(DeviceDataModel ddm, string title, int count, string image)
 {
     byte[] messageBytes = PackageTileNotification(title, count, image);
     this.EnqueWP7Notification(ddm, messageBytes, WP7NotificationType.Tile);
 }
 /// <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 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>
        /// Delete the device record.
        /// </summary>
        /// Deletes subscription records before deleting device details.
        /// <param name="ddm">The device to be delete.</param>
        public void DeleteDeviceSubscriptions(DeviceDataModel ddm)
        {
            IEnumerable<SubscriptionDataModel> sdmList = this.serviceContext.SubscriptionsTable.Where(s => (s.DeviceId == ddm.DeviceId));
            foreach (SubscriptionDataModel sdm in sdmList)
            {
                this.serviceContext.DeleteObject(sdm);
            }

            IEnumerable<DeviceDataModel> ddmList = this.serviceContext.DeviceTable.Where(d => d.DeviceId == ddm.DeviceId);
            foreach (DeviceDataModel tddm in ddmList)
            {
                this.serviceContext.DeleteObject(tddm);
            }

            this.serviceContext.SaveChanges();
        }
 /// <summary>
 /// Add a device to the table
 /// </summary>
 /// <param name="newItem">The DeviceDataModel item to be added.</param>
 public void Insert(DeviceDataModel newItem)
 {
     this.serviceContext.AddObject(MessageServiceContext.DeviceTableName, newItem);
     this.serviceContext.SaveChanges();
 }