Mini Kabibi Habibi

Current Path : C:/Users/Public/Documents/DXTREME 13.1 Demos/DXSK8/DXSK8.Service/
Upload File :
Current File : C:/Users/Public/Documents/DXTREME 13.1 Demos/DXSK8/DXSK8.Service/PushNotifications.cs

using System;
using System.Collections.Generic;
using System.Configuration;
using System.IO;
using System.Linq;
using System.Net;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Json;
using System.Text;
using System.Web;

namespace DXSK8.Service {
    [DataContract]
    public class OAuthToken {
        [DataMember(Name = "access_token")]
        public string AccessToken { get; set; }
        [DataMember(Name = "token_type")]
        public string TokenType { get; set; }
    }

    public class PushNotifications {
        private OAuthToken accessToken = null;
        public void Notify(string url, string content) {
            PostToWns(url, content);
        }
        private OAuthToken GetOAuthTokenFromJson(string jsonString) {
            using(var ms = new MemoryStream(Encoding.Unicode.GetBytes(jsonString))) {
                var ser = new DataContractJsonSerializer(typeof(OAuthToken));
                var oAuthToken = (OAuthToken)ser.ReadObject(ms);
                return oAuthToken;
            }
        }
        protected OAuthToken GetAccessToken(string secret, string sid) {
            string urlEncodedSecret = HttpUtility.UrlEncode(secret);
            string urlEncodedSid = HttpUtility.UrlEncode(sid);

            string body = String.Format("grant_type=client_credentials&client_id={0}&client_secret={1}&scope=notify.windows.com", urlEncodedSid, urlEncodedSecret);

            string response;
            using(var client = new WebClient()) {
                client.Headers.Add("Content-Type", "application/x-www-form-urlencoded");
                response = client.UploadString("https://login.live.com/accesstoken.srf", body);
            }
            return GetOAuthTokenFromJson(response);
        }
        public string PostToWns(string uri, string xml, string type = "wns/toast") {
            var secret = ConfigurationManager.AppSettings["WinStoreSecret"];
            var sid = ConfigurationManager.AppSettings["WinStoreAppId"];

            try {
                if(accessToken == null) {
                    accessToken = GetAccessToken(secret, sid);
                }

                byte[] contentInBytes = Encoding.UTF8.GetBytes(xml);


                // TODO: find more elegant solution for escaping the token
                var uriStart = "https://db3.notify.windows.com/?token=";
                var parts = uri.Split('=');
                uri = uriStart + HttpUtility.UrlEncode(uri.Substring(uriStart.Length));

                HttpWebRequest request = HttpWebRequest.Create(uri) as HttpWebRequest;
                request.Method = "POST";

                request.Headers.Add("X-WNS-Type", type);
                request.Headers.Add("Authorization", String.Format("Bearer {0}", accessToken.AccessToken));

                using(Stream requestStream = request.GetRequestStream()) {
                    requestStream.Write(contentInBytes, 0, contentInBytes.Length);
                }

                using(HttpWebResponse webResponse = (HttpWebResponse)request.GetResponse()) {
                    return webResponse.StatusCode.ToString();
                }
            }
            catch(WebException webException) {
                string exceptionDetails = webException.Response.Headers["WWW-Authenticate"];
                if(exceptionDetails != null && exceptionDetails.Contains("Token expired")) {
                    accessToken = null;
                    // Implement a maximum retry policy
                    return PostToWns(uri, xml, type);
                }
                else {
                    return "EXCEPTION: " + webException.Message;
                }
            }
            catch(Exception ex) {
                return "EXCEPTION: " + ex.Message;
            }
        }
    }
}