diff --git a/plugins/windows-notification/src/windows_notifications_plugin.vala b/plugins/windows-notification/src/windows_notifications_plugin.vala index 72344199..f6d536dc 100644 --- a/plugins/windows-notification/src/windows_notifications_plugin.vala +++ b/plugins/windows-notification/src/windows_notifications_plugin.vala @@ -1,7 +1,7 @@ -using Gee; using Dino.Entities; using Dino.Plugins.WindowsNotification.Vapi; using winrt.Windows.UI.Notifications; +using Xmpp; namespace Dino.Plugins.WindowsNotification { public class Plugin : RootInterface, Object { @@ -10,6 +10,69 @@ public class Plugin : RootInterface, Object { private ToastNotifier notifier; private ToastNotification notification; // Notifications remove their actions when they get out of scope + private delegate void NodeFunction(StanzaNode node); + + private StanzaNode Build(string xml) { + var reader = new Xmpp.StanzaReader.for_string(xml); + + StanzaNode root_node = null; + var loop = new MainLoop(); + reader.read_node + .begin((obj, res) => { + root_node = reader.read_node.end(res); + loop.quit(); + }); + loop.run(); + + ExecuteOnAllSubNodes(root_node, (node) => { + node.ns_uri = ""; + foreach (var attr in node.attributes){ + attr.ns_uri = ""; + } + }); + + return root_node; + } + + private Gee.ArrayList FindRecursive(StanzaNode node, string tag_name, Gee.List? attributes) { + var ret = new Gee.ArrayList(); + FindRecursiveInternal(node, tag_name, attributes, ret); + return ret; + } + + private void FindRecursiveInternal(StanzaNode root_node, string tag_name, Gee.List? attributes, Gee.List list) { + if (root_node.name == tag_name) { + if (attributes != null) { + foreach (var attr in attributes) { + var node_attr = root_node.get_attribute_raw(attr.name, attr.ns_uri); + if (node_attr != null && node_attr.equals(attr)) { + list.add(root_node); + break; + } + } + } + else { + list.add(root_node); + } + } + foreach (var node in root_node.get_all_subnodes()) { + FindRecursiveInternal(node, tag_name, attributes, list); + } + } + + private string ToXml(StanzaNode node) { + var namespace_state = new NamespaceState(); + namespace_state.set_current(""); + return node.to_xml(namespace_state); + } + + private void ExecuteOnAllSubNodes(StanzaNode root_node, NodeFunction func) { + func(root_node); + foreach (var node in root_node.get_all_subnodes()) { + ExecuteOnAllSubNodes(node, func); + } + } + public void registered(Dino.Application app) { if (!winrt.InitApartment()) { @@ -27,79 +90,33 @@ public class Plugin : RootInterface, Object { } { - var text = " - - - - Adam Wilson tagged you in a photo - On top of McClellan Butte - with Andrew Bares - - - - - - - - "; - - text = " - - - Surface Launch Party - Studio S / Ballroom - 4:00 PM, 10/26/2015 - - - - - - - - - - - - "; - - this.notifier = new ToastNotifier(AUMID); - this.notification = new ToastNotification(text); - var token = notification.Activated((c, d) => { - var i = 2; - stdout.printf("Yay! Activated 1!\n"); - }); - notification.RemoveActivated(token); - - token = notification.Activated((c, d) => { - var i = 2; - stdout.printf("Yay! Activated 2!\n"); - }); - - var token2 = notification.Failed(() => { - stdout.printf("Failed! :/\n"); - }); - notification.RemoveFailed(token2); - - var give_me_reason = ToastDismissalReason.TimedOut; - var give_me_template = ToastTemplateType.ToastText01; + var give_me_template = ToastTemplateType.ToastText02; var template = ToastNotificationManager.GetTemplateContent(give_me_template); + var node = Build(template); + { + var attributes = new Gee.ArrayList(); + attributes.add(new StanzaAttribute.build("", "id", "1")); + attributes.add(new StanzaAttribute.build("", "id", "2")); - var token3 = notification.Dismissed((reason) => { - stdout.printf("Dismissed! :(\n"); - var r = reason; - var m = 2; + var nodes = FindRecursive(node, "text", attributes); + foreach (var node_ in nodes) { + var attr = node_.get_attribute_raw("id", ""); + if (attr != null) { + if (attr.val == "1") { + node_.put_node(new StanzaNode.text("Header!")); + } else if (attr.val == "2") { + node_.put_node(new StanzaNode.text("Text!")); + } + } + } + } + + this.notifier = new ToastNotifier(AUMID); + this.notification = new ToastNotification(ToXml(node)); + var token = notification.Activated((c, d) => { + stdout.printf("\nYay! Activated!\n"); + stdout.flush(); }); - notification.RemoveDismissed(token3); notifier.Show(notification); }