PageRenderTime 50ms CodeModel.GetById 22ms RepoModel.GetById 0ms app.codeStats 0ms

/WP7.1/Templates/VB/WPCloud.Mem/WindowsPhoneCloud.Phone/Push/SamplePushUserRegistrationClient.vb

#
Visual Basic | 141 lines | 107 code | 19 blank | 15 comment | 0 complexity | abbb0641d9dcf8c9ef3cc94d865ff071 MD5 | raw file
  1. ' ----------------------------------------------------------------------------------
  2. ' Microsoft Developer & Platform Evangelism
  3. '
  4. ' Copyright (c) Microsoft Corporation. All rights reserved.
  5. '
  6. ' THIS CODE AND INFORMATION ARE PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND,
  7. ' EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES
  8. ' OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR PURPOSE.
  9. ' ----------------------------------------------------------------------------------
  10. ' The example companies, organizations, products, domain names,
  11. ' e-mail addresses, logos, people, places, and events depicted
  12. ' herein are fictitious. No association with any real company,
  13. ' organization, product, domain name, email address, logo, person,
  14. ' places, or events is intended or should be inferred.
  15. ' ----------------------------------------------------------------------------------
  16. Imports Microsoft.Samples.WindowsPhoneCloud.StorageClient
  17. Imports Microsoft.Samples.WindowsPhoneCloud.StorageClient.Credentials
  18. Imports Microsoft.Samples.WindowsPhoneCloud.Phone.Models
  19. Imports System.Text
  20. Imports System.Runtime.Serialization
  21. Imports System.Net.Browser
  22. Imports System.IO
  23. Imports System.Globalization
  24. Namespace Push
  25. Public Class SamplePushUserRegistrationClient
  26. Implements ISamplePushUserRegistrationClient
  27. Private Const RegisterNotificationOperation As String = "/register"
  28. Private Const UnregisterNotificationOperation As String = "/unregister"
  29. Private Const GetUpdatesNotificationOperation As String = "/updates"
  30. Private ReadOnly serviceEndpoint As Uri
  31. Private ReadOnly storageCredentials As IStorageCredentials
  32. Private ReadOnly applicationId As String
  33. Public Sub New(ByVal serviceEndpoint As Uri, ByVal storageCredentials As IStorageCredentials, ByVal applicationId As String)
  34. Me.serviceEndpoint = serviceEndpoint
  35. Me.storageCredentials = storageCredentials
  36. Me.applicationId = applicationId
  37. End Sub
  38. Public Sub Connect(ByVal callback As Action(Of SamplePushUserRegistrationResponse(Of String))) Implements ISamplePushUserRegistrationClient.Connect
  39. Dim registerOperationUriBuilder = New UriBuilder(Me.serviceEndpoint)
  40. registerOperationUriBuilder.Path &= RegisterNotificationOperation
  41. PushContext.Current.Connect(Sub(c) ExecutePostServiceOperation(Of String)(registerOperationUriBuilder.Uri, Me.storageCredentials, c.ChannelUri, Me.applicationId, callback))
  42. End Sub
  43. Public Sub Disconnect(ByVal callback As Action(Of SamplePushUserRegistrationResponse(Of String))) Implements ISamplePushUserRegistrationClient.Disconnect
  44. If PushContext.Current.NotificationChannel IsNot Nothing Then
  45. Dim channelUri = PushContext.Current.NotificationChannel.ChannelUri
  46. Dim unregisterOperationUriBuilder = New UriBuilder(Me.serviceEndpoint)
  47. unregisterOperationUriBuilder.Path &= UnregisterNotificationOperation
  48. ExecutePostServiceOperation(Of String)(unregisterOperationUriBuilder.Uri, Me.storageCredentials, channelUri, Me.applicationId, callback)
  49. Else
  50. callback(New SamplePushUserRegistrationResponse(Of String)(String.Empty, Nothing))
  51. End If
  52. PushContext.Current.Disconnect()
  53. End Sub
  54. Public Sub GetUpdates(ByVal callback As Action(Of SamplePushUserRegistrationResponse(Of String()))) Implements ISamplePushUserRegistrationClient.GetUpdates
  55. If PushContext.Current.NotificationChannel IsNot Nothing Then
  56. Dim channelUri = PushContext.Current.NotificationChannel.ChannelUri
  57. Dim getUpdatesOperationUriBuilder = New UriBuilder(Me.serviceEndpoint)
  58. getUpdatesOperationUriBuilder.Path &= GetUpdatesNotificationOperation
  59. ExecuteGetServiceOperation(Of String())(getUpdatesOperationUriBuilder.Uri, Me.storageCredentials, channelUri, Me.applicationId, callback)
  60. End If
  61. End Sub
  62. Private Shared Sub ExecuteGetServiceOperation(Of T)(ByVal serviceOperationUri As Uri, ByVal storageCredentials As IStorageCredentials, ByVal channelUri As Uri, ByVal applicationId As String, ByVal callback As Action(Of SamplePushUserRegistrationResponse(Of T)))
  63. Dim deviceId As String = App.GetDeviceId()
  64. Dim getOperationUri = New Uri(String.Format(CultureInfo.InvariantCulture, "{0}?applicationId={1}&deviceId={2}", serviceOperationUri, applicationId, deviceId))
  65. Dim request = WebRequestCreator.ClientHttp.Create(getOperationUri)
  66. request.Method = "GET"
  67. Try
  68. storageCredentials.SignRequest(request, -1)
  69. request.BeginGetResponse(
  70. Sub(ar)
  71. Dim result As T = Nothing
  72. Try
  73. Dim response = request.EndGetResponse(ar)
  74. Dim serializer = New DataContractSerializer(GetType(T))
  75. result = CType(serializer.ReadObject(response.GetResponseStream()), T)
  76. callback(New SamplePushUserRegistrationResponse(Of T)(result, Nothing))
  77. Catch exception As Exception
  78. callback(New SamplePushUserRegistrationResponse(Of T)(Nothing, If(StorageClientExceptionParser.ParseStringWebException(TryCast(exception, WebException)), exception)))
  79. End Try
  80. End Sub, Nothing)
  81. Catch exception As Exception
  82. callback(New SamplePushUserRegistrationResponse(Of T)(Nothing, exception))
  83. End Try
  84. End Sub
  85. Private Shared Sub ExecutePostServiceOperation(Of T)(ByVal serviceOperationUri As Uri, ByVal storageCredentials As IStorageCredentials, ByVal channelUri As Uri, ByVal applicationId As String, ByVal callback As Action(Of SamplePushUserRegistrationResponse(Of T)))
  86. Dim request = WebRequestCreator.ClientHttp.Create(serviceOperationUri)
  87. request.Method = "POST"
  88. request.ContentType = "text/xml"
  89. Dim postData = String.Empty
  90. Using stream = New MemoryStream()
  91. Dim serializer = New DataContractSerializer(GetType(PushUserServiceRequest))
  92. Dim deviceId As String = App.GetDeviceId()
  93. Dim newPushUserRegistration = New PushUserServiceRequest With {.ApplicationId = applicationId, .DeviceId = deviceId, .ChannelUri = channelUri}
  94. serializer.WriteObject(stream, newPushUserRegistration)
  95. Dim contextAsByteArray() As Byte = stream.ToArray()
  96. postData = Encoding.UTF8.GetString(contextAsByteArray, 0, contextAsByteArray.Length)
  97. End Using
  98. Try
  99. storageCredentials.SignRequest(request, postData.Length)
  100. request.BeginGetRequestStream(Sub(ar)
  101. Dim postStream = request.EndGetRequestStream(ar)
  102. Dim byteArray = Encoding.UTF8.GetBytes(postData)
  103. postStream.Write(byteArray, 0, postData.Length)
  104. postStream.Close()
  105. request.BeginGetResponse(Sub(asyncResult)
  106. Dim result As T = Nothing
  107. Try
  108. Dim response = request.EndGetResponse(asyncResult)
  109. Dim serializer = New DataContractSerializer(GetType(T))
  110. result = CType(serializer.ReadObject(response.GetResponseStream()), T)
  111. callback(New SamplePushUserRegistrationResponse(Of T)(result, Nothing))
  112. Catch exception As Exception
  113. callback(New SamplePushUserRegistrationResponse(Of T)(Nothing, If(StorageClientExceptionParser.ParseStringWebException(TryCast(exception, WebException)), exception)))
  114. End Try
  115. End Sub, Nothing)
  116. End Sub, request)
  117. Catch exception As Exception
  118. callback(New SamplePushUserRegistrationResponse(Of T)(Nothing, exception))
  119. End Try
  120. End Sub
  121. End Class
  122. End Namespace