Neuron®
The Neuron® is the basis for the creation of open and secure federated networks for smart societies.
Loading...
Searching...
No Matches
XmppS2SOverParentEndpoint.cs
1using System;
2using System.Text;
3using System.Threading.Tasks;
6
8{
14 {
15 private readonly XmppClient client;
16
27 {
28 this.client = Client;
29 }
30
34 public override string Type => "XMPP";
35
36 private static string GetForwardedContent(string Content, XmppAddress From)
37 {
38 StringBuilder sb = new StringBuilder();
39
40 if (!string.IsNullOrEmpty(Content))
41 sb.Append(Content);
42
43 sb.Append("<addresses xmlns='http://jabber.org/protocol/address'>");
44 sb.Append("<address type='ofrom' jid='");
45 sb.Append(XML.Encode(From.Address));
46 sb.Append("'/></addresses>");
47
48 return sb.ToString();
49 }
50
51 private static MessageType GetMessageType(string Type)
52 {
53 return Type.ToLower() switch
54 {
55 "chat" => MessageType.Chat,
56 "error" => MessageType.Error,
57 "groupchat" => MessageType.GroupChat,
58 "headline" => MessageType.Headline,
59 _ => MessageType.Normal,
60 };
61 }
62
74 public override Task<bool> IQ(string Type, string Id, XmppAddress To, XmppAddress From, string Language, Stanza Stanza, ISender Sender)
75 {
76 return this.IQ(Type, Id, To, From, Language, Stanza.Content, Sender);
77 }
78
90 public override async Task<bool> IQ(string Type, string Id, XmppAddress To, XmppAddress From, string Language, string ContentXml, ISender Sender)
91 {
92 string ForwardedContent = GetForwardedContent(ContentXml, From);
93
94 await this.client.SendIq(string.Empty, To.Address, ForwardedContent, Type, async (sender, e) =>
95 {
96 string Content = e.Response?.InnerXml.ToString() ?? string.Empty;
97
98 if (e.Ok)
99 await Sender.IqResult(Id, From, To, Content);
100 else
101 await Sender.IqError(Id, From, To, Content);
102
103 }, null);
104
105 return true;
106 }
107
119 public override Task<bool> Message(string Type, string Id, XmppAddress To, XmppAddress From, string Language, Stanza Stanza, ISender Sender)
120 {
121 return this.Message(Type, Id, To, From, Language, Stanza.Content, Sender);
122 }
123
135 public override async Task<bool> Message(string Type, string Id, XmppAddress To, XmppAddress From, string Language, string ContentXml, ISender Sender)
136 {
137 string ForwardedContent = GetForwardedContent(ContentXml, From);
138
139 await this.client.SendMessage(QoSLevel.Unacknowledged, GetMessageType(Type), Id,
140 To.Address, ForwardedContent, string.Empty, string.Empty, Language,
141 string.Empty, string.Empty, null, null);
142 return true;
143 }
144
156 public override Task<bool> Presence(string Type, string Id, XmppAddress To, XmppAddress From, string Language, Stanza Stanza, ISender Sender)
157 {
158 string ForwardedContent = GetForwardedContent(Stanza.Content, From);
159
160 return this.Presence(Type, Id, To, From, Language, ForwardedContent, Sender);
161 }
162
174 public override async Task<bool> Presence(string Type, string Id, XmppAddress To, XmppAddress From, string Language, string ContentXml, ISender Sender)
175 {
176 string ForwardedContent = GetForwardedContent(ContentXml, From);
177
178 await this.client.SendDirectedPresence(Type, To.Address, ForwardedContent);
179 return true;
180 }
181
190 public override async Task<bool> IqError(string Id, XmppAddress To, XmppAddress From, string ErrorXml)
191 {
192 string ForwardedContent = GetForwardedContent(ErrorXml, From);
193
194 await this.client.SendIqError(Id, To.Address, ForwardedContent);
195 return true;
196 }
197
206 public override async Task<string> IqError(string Id, XmppAddress To, XmppAddress From, Exception ex)
207 {
208 string ForwardedContent = GetForwardedContent(this.client.ExceptionToXmppXml(ex), From);
209
210 await this.client.SendIqError(Id, To.Address, ForwardedContent);
211 return string.Empty;
212 }
213
222 public override async Task<bool> IqResult(string Id, XmppAddress To, XmppAddress From, string ResultXml)
223 {
224 string ForwardedContent = GetForwardedContent(ResultXml, From);
225
226 await this.client.SendIqResult(Id, To.Address, ForwardedContent);
227 return true;
228 }
229
240 public override async Task<bool> Presence(string Type, string Id, XmppAddress To, XmppAddress From, string Language, string ContentXml)
241 {
242 string ForwardedContent = GetForwardedContent(ContentXml, From);
243
244 await this.client.SendDirectedPresence(Type, To.Address, ForwardedContent);
245 return true;
246 }
247
256 public override async Task<bool> PresenceError(string Id, XmppAddress To, XmppAddress From, string ErrorXml)
257 {
258 string ForwardedContent = GetForwardedContent(ErrorXml, From);
259
260 await this.client.SendDirectedPresence("error", To.Address, ForwardedContent);
261 return true;
262 }
263
272 public override async Task<bool> PresenceError(string Id, XmppAddress To, XmppAddress From, Exception ex)
273 {
274 string ForwardedContent = GetForwardedContent(this.client.ExceptionToXmppXml(ex), From);
275
276 await this.client.SendDirectedPresence("error", To.Address, ForwardedContent);
277 return true;
278 }
279
290 public override async Task<bool> Message(string Type, string Id, XmppAddress To, XmppAddress From, string Language, string ContentXml)
291 {
292 string ForwardedContent = GetForwardedContent(ContentXml, From);
293
294 await this.client.SendMessage(QoSLevel.Unacknowledged, GetMessageType(Type), Id,
295 To.Address, ForwardedContent, string.Empty, string.Empty, Language,
296 string.Empty, string.Empty, null, null);
297
298 return true;
299 }
300
309 public override async Task<bool> MessageError(string Id, XmppAddress To, XmppAddress From, Exception ex)
310 {
311 string ForwardedContent = GetForwardedContent(this.client.ExceptionToXmppXml(ex), From);
312
313 await this.client.SendMessage(QoSLevel.Unacknowledged, MessageType.Error, Id,
314 To.Address, ForwardedContent, string.Empty, string.Empty, string.Empty,
315 string.Empty, string.Empty, null, null);
316
317 return true;
318 }
319 }
320}
Helps with common XML-related tasks.
Definition: XML.cs:21
static string Encode(string s)
Encodes a string for use in XML.
Definition: XML.cs:29
Abstract base class for server connections.
CaseInsensitiveString LocalDomain
Local domain name.
CaseInsensitiveString RemoteDomain
Connection to domain.
Contains information about a stanza.
Definition: Stanza.cs:9
string Content
Literal XML content.
Definition: Stanza.cs:53
Contains information about one XMPP address.
Definition: XmppAddress.cs:9
CaseInsensitiveString Address
XMPP Address
Definition: XmppAddress.cs:37
Manages an XMPP server-to-server connection tunneled over an XMPP client connection to a parent broke...
override async Task< string > IqError(string Id, XmppAddress To, XmppAddress From, Exception ex)
Sends an IQ error stanza.
override async Task< bool > Presence(string Type, string Id, XmppAddress To, XmppAddress From, string Language, string ContentXml, ISender Sender)
Sends a presence stanza.
override async Task< bool > Message(string Type, string Id, XmppAddress To, XmppAddress From, string Language, string ContentXml)
Sends a message stanza.
override async Task< bool > IQ(string Type, string Id, XmppAddress To, XmppAddress From, string Language, string ContentXml, ISender Sender)
Sends an IQ stanza.
override async Task< bool > IqResult(string Id, XmppAddress To, XmppAddress From, string ResultXml)
Sends an IQ result stanza.
override async Task< bool > Presence(string Type, string Id, XmppAddress To, XmppAddress From, string Language, string ContentXml)
Sends a presence stanza.
override async Task< bool > Message(string Type, string Id, XmppAddress To, XmppAddress From, string Language, string ContentXml, ISender Sender)
Sends a message stanza.
override async Task< bool > MessageError(string Id, XmppAddress To, XmppAddress From, Exception ex)
Sends a message error stanza.
override async Task< bool > IqError(string Id, XmppAddress To, XmppAddress From, string ErrorXml)
Sends an IQ error stanza.
XmppS2SOverParentEndpoint(XmppClient Client, CaseInsensitiveString LocalDomain, CaseInsensitiveString RemoteDomain)
Manages an XMPP server-to-server connection tunneled over an XMPP client connection to a parent broke...
override Task< bool > IQ(string Type, string Id, XmppAddress To, XmppAddress From, string Language, Stanza Stanza, ISender Sender)
Sends an IQ stanza.
override Task< bool > Presence(string Type, string Id, XmppAddress To, XmppAddress From, string Language, Stanza Stanza, ISender Sender)
Sends a presence stanza.
override Task< bool > Message(string Type, string Id, XmppAddress To, XmppAddress From, string Language, Stanza Stanza, ISender Sender)
Sends a message stanza.
override async Task< bool > PresenceError(string Id, XmppAddress To, XmppAddress From, string ErrorXml)
Sends a presence error stanza.
override async Task< bool > PresenceError(string Id, XmppAddress To, XmppAddress From, Exception ex)
Sends a presence error stanza.
Manages an XMPP client connection. Implements XMPP, as defined in https://tools.ietf....
Definition: XmppClient.cs:58
Represents a case-insensitive string.
static readonly CaseInsensitiveString Empty
Empty case-insensitive string
Interface for senders of stanzas.
Definition: ISender.cs:10
Task< string > IqError(string Id, XmppAddress To, XmppAddress From, Exception ex)
Sends an IQ Error stanza.
Task< bool > IqResult(string Id, XmppAddress To, XmppAddress From, string ResultXml)
Sends an IQ Result stanza.
Definition: ImplTypes.g.cs:58
QoSLevel
Quality of Service Level for asynchronous messages. Support for QoS Levels must be supported by the r...
Definition: QoSLevel.cs:8
MessageType
Type of message received.
Definition: MessageType.cs:7