Neuron®
The Neuron® is the basis for the creation of open and secure federated networks for smart societies.
Loading...
Searching...
No Matches
ServiceRegistrationClient.cs
1using System;
2using System.Collections.Generic;
3using System.Reflection;
4using System.Text;
5using System.Threading.Tasks;
6using System.Xml;
11
13{
18 {
22 public const string NamespaceServiceRegistration = "http://waher.se/Schema/ServiceRegistration.xsd";
23
24 private readonly XmppClient client;
25 private readonly string registryJid;
26
33 {
34 this.client = Client;
35 this.registryJid = ServiceRegistryJID;
36 }
37
41 public XmppClient Client => this.client;
42
46 public string ServiceRegistryJID => this.registryJid;
47
51 public async Task CheckRegistration(params Annotation[] Annotations)
52 {
53 if (this.client.State != XmppState.Connected)
54 return;
55
56 Registration Registration = await Database.FindFirstDeleteRest<Registration>();
57 SortedDictionary<string, bool> AssembliesSorted = new SortedDictionary<string, bool>();
58 Assembly[] LoadedAssemblies = Types.Assemblies;
59 AssemblyName AN;
60
61 foreach (Assembly A in LoadedAssemblies)
62 {
63 try
64 {
65 AN = A.GetName();
66 if (AN.Version.Major == 0 && AN.Version.Minor == 0 && AN.Version.Revision == 0 && AN.Version.Build == 0)
67 continue;
68
69 AssembliesSorted[A.FullName] = true;
70 }
71 catch (Exception)
72 {
73 continue;
74 }
75 }
76
77 string[] Assemblies = new string[AssembliesSorted.Count];
78 AssembliesSorted.Keys.CopyTo(Assemblies, 0);
79
80 string BareJid = this.client.BareJID.ToLower();
81 bool New;
82
83 if (Registration is null)
84 {
86 {
87 Created = DateTime.Now
88 };
89
90 New = true;
91 }
92 else if (Registration.BareJid != BareJid ||
93 !Equals<string>(Registration.Assemblies, Assemblies) ||
94 !Equals<string>(Registration.Features, this.client.GetFeatures()) ||
95 !Equals<Annotation>(Registration.Annotations, Annotations) ||
96 Registration.ClientName != this.client.ClientName ||
97 Registration.ClientVersion != this.client.ClientVersion ||
98 Registration.ClientOS != this.client.ClientOS ||
99 Registration.Language != this.client.Language ||
100 Registration.Host != this.client.Host ||
101 Registration.Domain != this.client.Domain)
102 {
103 Registration.Updated = DateTime.Now;
104 New = false;
105 }
106 else
107 return;
108
109 this.SetValues(Registration, Assemblies, Annotations);
110
111 if (await this.SendRegistration(Registration))
112 {
113 if (New)
115 else
117 }
118 }
119
120 private async Task<bool> SendRegistration(Registration Registration)
121 {
122 TaskCompletionSource<bool> T = new TaskCompletionSource<bool>();
123 StringBuilder Xml = new StringBuilder();
124 XmlWriter w = XmlWriter.Create(Xml, XML.WriterSettings(false, true));
125
126 w.WriteStartElement("register", NamespaceServiceRegistration);
127 w.WriteAttributeString("jid", Registration.BareJid);
128 w.WriteAttributeString("clientName", Registration.ClientName);
129 w.WriteAttributeString("clientVersion", Registration.ClientVersion);
130 w.WriteAttributeString("clientOS", Registration.ClientOS);
131 w.WriteAttributeString("language", Registration.Language);
132 w.WriteAttributeString("host", Registration.Host);
133 w.WriteAttributeString("domain", Registration.Domain);
134 w.WriteAttributeString("created", XML.Encode(Registration.Created));
135 w.WriteAttributeString("updated", XML.Encode(Registration.Updated));
136
137 if (!(Registration.Features is null))
138 {
139 foreach (string Feature in Registration.Features)
140 w.WriteElementString("Feature", Feature);
141 }
142
143 if (!(Registration.Annotations is null))
144 {
145 foreach (Annotation Annotation in Registration.Annotations)
146 {
147 w.WriteStartElement("Annotation");
148 w.WriteAttributeString("tag", Annotation.Tag);
149 w.WriteValue(Annotation.Value);
150 w.WriteEndElement();
151 }
152 }
153
154 if (!(Registration.Assemblies is null))
155 {
156 foreach (string QN in Registration.Assemblies)
157 w.WriteElementString("Assembly", QN);
158 }
159
160 w.WriteEndElement();
161 w.Flush();
162
163 await this.client.SendIqSet(this.registryJid, Xml.ToString(), (Sender, e) =>
164 {
165 T.TrySetResult(e.Ok);
166 return Task.CompletedTask;
167 }, null);
168
169 return await T.Task;
170 }
171
172 private void SetValues(Registration Registration, string[] Assemblies, Annotation[] Annotations)
173 {
174 Registration.Assemblies = Assemblies;
175 Registration.BareJid = this.client.BareJID;
176 Registration.Features = this.client.GetFeatures();
177 Registration.Annotations = Annotations;
178 Registration.ClientName = this.client.ClientName;
179 Registration.ClientVersion = this.client.ClientVersion;
180 Registration.ClientOS = this.client.ClientOS;
181 Registration.Language = this.client.Language;
182 Registration.Host = this.client.Host;
183 Registration.Domain = this.client.Domain;
184 }
185
193 public static bool Equals<T>(T[] Array1, T[] Array2)
194 {
195 if ((Array1 is null) ^ (Array2 is null))
196 return false;
197
198 if (Array1 is null)
199 return true;
200
201 int i, c = Array1.Length;
202
203 if (Array2.Length != c)
204 return false;
205
206 for (i = 0; i < c; i++)
207 {
208 if (!Array1[i].Equals(Array2[i]))
209 return false;
210 }
211
212 return true;
213 }
214
219 public static async Task<DateTime?> GetRegistrationTime()
220 {
221 Registration Registration = await Database.FindFirstDeleteRest<Registration>();
222 return Registration?.Created;
223 }
224
225 }
226}
Helps with common XML-related tasks.
Definition: XML.cs:19
static string Encode(string s)
Encodes a string for use in XML.
Definition: XML.cs:27
static XmlWriterSettings WriterSettings(bool Indent, bool OmitXmlDeclaration)
Gets an XML writer settings object.
Definition: XML.cs:1177
Manages an XMPP client connection. Implements XMPP, as defined in https://tools.ietf....
Definition: XmppClient.cs:59
Static interface for database persistence. In order to work, a database provider has to be assigned t...
Definition: Database.cs:19
static async Task Update(object Object)
Updates an object in the database.
Definition: Database.cs:626
static async Task Insert(object Object)
Inserts an object into the default collection of the database.
Definition: Database.cs:95
Static class that dynamically manages types and interfaces available in the runtime environment.
Definition: Types.cs:14
static Assembly[] Assemblies
Assemblies in the inventory.
Definition: Types.cs:884
string[] Assemblies
Registered assemblies
Definition: Registration.cs:59
string ClientName
Registered Client Name
Definition: Registration.cs:79
string ClientVersion
Registered Client Version
Definition: Registration.cs:89
DateTime Created
When registration object was created
Annotation[] Annotations
Registered annotations
DateTime Updated
When registration object was last updated
string Language
Registered Client Language
async Task CheckRegistration(params Annotation[] Annotations)
Checks if the software needs to be registered.
const string NamespaceServiceRegistration
http://waher.se/Schema/ServiceRegistration.xsd
static async Task< DateTime?> GetRegistrationTime()
Gets the original registration time.
ServiceRegistrationClient(XmppClient Client, string ServiceRegistryJID)
XMPP-based Service Registration Client.
static bool Equals< T >(T[] Array1, T[] Array2)
Compares two arrays
XmppState
State of XMPP connection.
Definition: XmppState.cs:7