| RemObjects.SDK.ApplePushProvider/APSConnect.pas |
| 45 | 45 | constructor APSConnect(aCertificateName: String); |
| 46 | 46 | begin |
| 47 | 47 | fCertificate := FindCertificate(aCertificateName); |
| 48 | | CreateStream; |
| 48 | //CreateStream; |
| 49 | 49 | end; |
| 50 | 50 | |
| 51 | 51 | constructor APSConnect(aCertificate: X509Certificate); |
| 52 | 52 | begin |
| 53 | 53 | fCertificate := aCertificate; |
| 54 | | CreateStream; |
| 54 | //CreateStream; |
| 55 | 55 | end; |
| 56 | 56 | |
| 57 | 57 | method APSConnect.CreateStream; |
| ... | ... | |
| 114 | 114 | w.Write([Byte(data.Length and $ff00 div $100), Byte(data.Length and $ff)]); |
| 115 | 115 | w.Write(data); |
| 116 | 116 | w.Flush; |
| 117 | | //todo: handle connetion loss & reconnecting |
| 118 | | |
| 119 | | fSslStream.Write(m.ToArray); |
| 120 | | fSslStream.Flush; |
| 117 | |
| 118 | //todo: this is temp; we need to cache the connection but also proeprly recover from loss |
| 119 | CreateStream; |
| 120 | try |
| 121 | fSslStream.Write(m.ToArray); |
| 122 | fSslStream.Flush; |
| 123 | finally |
| 124 | fSslStream.Dispose(); |
| 125 | fTcpClient.Close(); |
| 126 | fSslStream := nil; |
| 127 | fTcpClient := nil; |
| 128 | end; |
| 121 | 129 | //Debug: StreamHelpers.SaveStreamToFile(m, 'w:\test.data'); |
| 122 | 130 | end; |
| 123 | 131 | end; |
| RemObjects.SDK.ApplePushProvider/ApplePushProviderService_Impl.pas |
| 52 | 52 | var lStringToken := PushDeviceManager.BinaryToString(deviceToken); |
| 53 | 53 | if PushDeviceManager.Devices.ContainsKey(lStringToken) then begin |
| 54 | 54 | var p := PushDeviceManager.Devices[lStringToken]; |
| 55 | | if additionalInfo <> p.ClientInfo then begin |
| 56 | | p.ClientInfo := additionalInfo; |
| 57 | | PushDeviceManager.Flush; |
| 58 | | end; |
| 55 | p.ClientInfo := additionalInfo; |
| 56 | p.LastSeen := DateTime.Now; |
| 57 | PushDeviceManager.Flush; |
| 59 | 58 | end |
| 60 | 59 | else begin |
| 61 | 60 | var p := new PushDeviceInfo(Token := deviceToken, |
| 62 | | UserReference := iif(HasSession, Session['UserID'].ToString, nil), |
| 61 | UserReference := iif(HasSession, Session['UserID']:ToString, nil), |
| 63 | 62 | ClientInfo := additionalInfo, |
| 64 | | ServerInfo := nil); |
| 63 | ServerInfo := nil, |
| 64 | LastSeen := DateTime.Now); |
| 65 | 65 | PushDeviceManager.Devices.Add(lStringToken, p); |
| 66 | 66 | PushDeviceManager.Flush; |
| 67 | 67 | end; |
| RemObjects.SDK.ApplePushProvider/RemObjects.SDK.ApplePushProvider.oxygene |
| 87 | 87 | <ItemGroup> |
| 88 | 88 | <Compile Include="ApplePushProviderService_Impl.pas"> |
| 89 | 89 | <SubType>Component</SubType> |
| 90 | | <DesignableClassName>RemObjects.SDK.PushProvider.ApplePushProviderService</DesignableClassName> |
| 90 | <DesignableClassName>RemObjects.SDK.ApplePushProvider.ApplePushProviderService</DesignableClassName> |
| 91 | 91 | <DisableDesigner>True</DisableDesigner> |
| 92 | 92 | </Compile> |
| 93 | 93 | <Compile Include="APSConnect.pas"> |
| ... | ... | |
| 104 | 104 | <Compile Include="PushDeviceManager.pas"> |
| 105 | 105 | </Compile> |
| 106 | 106 | <Compile Include="PushProvider_Intf.pas"> |
| 107 | | <SubType>Code</SubType> |
| 108 | 107 | </Compile> |
| 109 | 108 | <Compile Include="PushProvider_Invk.pas"> |
| 110 | | <SubType>Code</SubType> |
| 111 | 109 | </Compile> |
| 112 | 110 | </ItemGroup> |
| 113 | 111 | <ItemGroup> |
| RemObjects.SDK.ApplePushProvider/PushDeviceManager.pas |
| 21 | 21 | property UserReference: String; |
| 22 | 22 | property ClientInfo: String; |
| 23 | 23 | property ServerInfo: String; |
| 24 | property LastSeen: DateTime; |
| 24 | 25 | end; |
| 25 | 26 | |
| 26 | 27 | PushDeviceManager = public static class |
| ... | ... | |
| 35 | 36 | method Save; |
| 36 | 37 | constructor; |
| 37 | 38 | assembly |
| 38 | | method Flush; |
| 39 | 39 | public |
| 40 | 40 | property Devices: Dictionary<String, PushDeviceInfo> read fDevices; |
| 41 | 41 | property APSConnect: APSConnect read fAPSConnect; |
| ... | ... | |
| 56 | 56 | method StringToBinary(aString: String): Binary; |
| 57 | 57 | method BinaryToString(aBinary: Binary): String; |
| 58 | 58 | |
| 59 | method Flush; |
| 59 | 60 | end; |
| 60 | 61 | |
| 61 | 62 | implementation |
| ... | ... | |
| 118 | 119 | lDeviceNode.Add(new XAttribute('Token', k)); |
| 119 | 120 | lDeviceNode.Add(new XElement('User',lInfo.UserReference)); |
| 120 | 121 | lDeviceNode.Add(new XElement('ClientInfo',lInfo.ClientInfo)); |
| 121 | | lDeviceNode.Add(new XElement('ServerInfo',lInfo.UserReference)); |
| 122 | lDeviceNode.Add(new XElement('ServerInfo',lInfo.ServerInfo)); |
| 123 | lDeviceNode.Add(new XElement('Date',lInfo.LastSeen.ToString('yyyy-MM-dd HH:mm:ss'))); |
| 124 | |
| 122 | 125 | |
| 123 | 126 | lRoot.Add(lDeviceNode); |
| 124 | 127 | end; |
| ... | ... | |
| 136 | 139 | for each matching lDeviceNode: XElement in x.Root.Elements do begin |
| 137 | 140 | var lToken := lDeviceNode.Attribute('Token').value; |
| 138 | 141 | |
| 142 | var lDate := DateTime.Now; |
| 143 | DateTime.TryParse(lDeviceNode.Element('Date'):Value, CultureInfo.InvariantCulture, DateTimeStyles.None, out lDate); |
| 144 | |
| 139 | 145 | var p := new PushDeviceInfo(Token := StringToBinary(lToken), |
| 140 | 146 | UserReference := lDeviceNode.Element('User').Value, |
| 141 | 147 | ClientInfo := lDeviceNode.Element('ClientInfo').Value, |
| 142 | | ServerInfo := lDeviceNode.Element('ServerInfo').Value); |
| 148 | ServerInfo := lDeviceNode.Element('ServerInfo').Value, |
| 149 | LastSeen := lDate |
| 150 | ); |
| 143 | 151 | fDevices.Add(lToken, p); |
| 144 | 152 | //if assigned(fAPSConnect) then fAPSConnect.PushMessageNotification(lToken.ToArray, 'Welcome back. Server has been Started.'); |
| 145 | 153 | end; |