2using System.Collections.Generic;
4using System.Threading.Tasks;
58 List<KeyValuePair<string, string>> Headers =
new List<KeyValuePair<string, string>>();
59 List<EmbeddedObjectReference> Attachments =
null;
60 List<EmbeddedObjectReference> Inline =
null;
62 foreach (XmlNode N
in e.
Content.ChildNodes)
64 if (N is XmlElement E)
69 foreach (XmlNode N2
in E.ChildNodes)
75 string Value = N2.InnerText;
77 Headers.Add(
new KeyValuePair<string, string>(Key, Value));
93 EmbeddedObjectReference Ref =
new EmbeddedObjectReference(ContentType2, Description, FileName, Name,
94 ContentId, EmbeddedObjectId, Size);
96 if (E.LocalName ==
"inline")
99 Inline =
new List<EmbeddedObjectReference>();
105 if (Attachments is
null)
106 Attachments =
new List<EmbeddedObjectReference>();
108 Attachments.Add(Ref);
115 string PlainText = e.
Body;
117 string Markdown =
null;
119 foreach (XmlNode N
in e.
Message.ChildNodes)
121 if (N is XmlElement E)
126 if (E.NamespaceURI ==
"urn:xmpp:content")
131 PlainText = E.InnerText;
138 case "text/markdown":
139 Markdown = E.InnerText;
146 if (E.NamespaceURI ==
"http://jabber.org/protocol/xhtml-im")
148 foreach (XmlNode N2
in E.ChildNodes)
150 if (N2 is XmlElement E2 && E2.LocalName ==
"body")
154 int i = Html.IndexOf(
'>');
155 Html = Html.Substring(i + 1);
157 i = Html.LastIndexOf(
'<');
158 Html = Html.Substring(0, i);
169 Date, FromMail, FromHeader, Sender2, Size, MailObjectId, Headers.ToArray(), Attachments?.ToArray(),
170 Inline?.ToArray(), PlainText, Html, Markdown));
184 public Task
Get(
string ObjectId, EventHandlerAsync<MessageObjectEventArgs> Callback,
object State)
186 return this.
Get(ObjectId,
string.Empty, Callback, State);
196 public Task
Get(
string ObjectId,
string ContentType, EventHandlerAsync<MessageObjectEventArgs> Callback,
object State)
198 StringBuilder Xml =
new StringBuilder();
200 Xml.Append(
"<get xmlns='");
202 Xml.Append(
"' cid='");
205 if (!
string.IsNullOrEmpty(ContentType))
207 Xml.Append(
"' type='");
216 string ResponseContentType =
null;
219 if (e.
Ok && !((E = e.FirstElement) is
null) && E.LocalName ==
"content" && E.NamespaceURI ==
NamespaceMail)
223 ResponseContentType = XML.Attribute(E,
"type");
224 Data = Convert.FromBase64String(E.InnerText);
242 public Task<MessageObject>
GetAsync(
string ObjectId)
244 return this.GetAsync(ObjectId,
string.Empty);
252 public async Task<MessageObject>
GetAsync(
string ObjectId,
string ContentType)
254 TaskCompletionSource<MessageObject> Result =
new TaskCompletionSource<MessageObject>();
256 await this.Get(ObjectId, ContentType, (Sender, e) =>
259 Result.TrySetResult(
new MessageObject(e.Data, e.ContentType));
261 Result.TrySetException(e.
StanzaError ??
new Exception(
"Unable to get message object."));
263 return Task.CompletedTask;
267 return await Result.Task;
276 public Task
Delete(
string ObjectId, EventHandlerAsync<IqResultEventArgs> Callback,
object State)
278 return this.client.SendIqSet(this.client.Domain,
"<delete xmlns='" + NamespaceMail +
"' cid='" +
XML.
Encode(ObjectId) +
"'/>",
288 TaskCompletionSource<bool> Result =
new TaskCompletionSource<bool>();
290 await this.Delete(ObjectId, (Sender, e) =>
293 Result.TrySetResult(
true);
295 Result.TrySetException(e.
StanzaError ??
new Exception(
"Unable to delete message object."));
297 return Task.CompletedTask;
316 string Name,
string FileName,
string Description, StringBuilder Xml)
318 Xml.Append(
"<content xmlns='");
319 Xml.Append(NamespaceMail);
320 Xml.Append(
"' cid='");
322 Xml.Append(
"' type='");
327 Xml.Append(
"' disposition='");
328 Xml.Append(
XML.
Encode(Disposition.ToString()));
331 if (!
string.IsNullOrEmpty(Name))
333 Xml.Append(
"' name='");
337 if (!
string.IsNullOrEmpty(FileName))
339 Xml.Append(
"' fileName='");
343 if (!
string.IsNullOrEmpty(Description))
345 Xml.Append(
"' description='");
350 Xml.Append(Convert.ToBase64String(ContentData));
351 Xml.Append(
"</content>");
353 return Task.CompletedTask;
Plain text encoder/decoder.
const string DefaultContentType
text/plain
Helps with common XML-related tasks.
static string Attribute(XmlElement E, string Name)
Gets the value of an XML attribute.
static string Encode(string s)
Encodes a string for use in XML.
Event arguments for message events.
XmlElement Message
The message stanza.
string Body
Human readable body.
bool Ok
If the response is an OK result response (true), or an error response (false).
XmlElement Content
Content of the message. For messages that are processed by registered message handlers,...
XmppException StanzaError
Any stanza error returned.
Client providing support for server mail-extension.
Task AppendContent(string ContentId, string ContentType, byte[] ContentData, ContentDisposition Disposition, string Name, string FileName, string Description, StringBuilder Xml)
Appends embedded content to a message XML output.
EventHandlerAsync< MailEventArgs > MailReceived
This event is raised when a mail message has been received.
Task Delete(string ObjectId, EventHandlerAsync< IqResultEventArgs > Callback, object State)
Deletes a message object from the broker.
Task Get(string ObjectId, string ContentType, EventHandlerAsync< MessageObjectEventArgs > Callback, object State)
Gets a message object from the broker.
Task< MessageObject > GetAsync(string ObjectId)
Gets a message object from the broker.
Task Get(string ObjectId, EventHandlerAsync< MessageObjectEventArgs > Callback, object State)
Gets a message object from the broker.
override void Dispose()
Disposes of the extension.
async Task< MessageObject > GetAsync(string ObjectId, string ContentType)
Gets a message object from the broker.
async Task DeleteAsync(string ObjectId)
Deletes a message object from the broker.
const string NamespaceMail
http://jabber.org/protocol/pubsub
override string[] Extensions
Implemented extensions.
MailClient(XmppClient Client)
Client providing support for server mail-extension.
Message object event arguments.
Contains the binary representation of a message object.
Manages an XMPP client connection. Implements XMPP, as defined in https://tools.ietf....
bool UnregisterMessageHandler(string LocalName, string Namespace, EventHandlerAsync< MessageEventArgs > Handler, bool RemoveNamespaceAsClientFeature)
Unregisters a Message handler.
void RegisterMessageHandler(string LocalName, string Namespace, EventHandlerAsync< MessageEventArgs > Handler, bool PublishNamespaceAsClientFeature)
Registers a Message handler.
string Domain
Current Domain.
Task< uint > SendIqGet(string To, string Xml, EventHandlerAsync< IqResultEventArgs > Callback, object State)
Sends an IQ Get request.
Base class for XMPP Extensions.
XmppClient client
XMPP Client used by the extension.
Task Exception(Exception Exception)
Called to inform the viewer of an exception state.
XmppClient Client
XMPP Client.
ContentDisposition
Content disposition