2017-11-11 20:29:13 +00:00
|
|
|
using Gee;
|
|
|
|
|
2017-03-02 14:37:32 +00:00
|
|
|
namespace Xmpp {
|
2017-04-18 15:53:25 +00:00
|
|
|
public string get_bare_jid(string jid) {
|
2017-03-02 14:37:32 +00:00
|
|
|
return jid.split("/")[0];
|
|
|
|
}
|
|
|
|
|
2017-03-11 00:25:45 +00:00
|
|
|
public bool is_bare_jid(string jid) {
|
2017-03-02 14:37:32 +00:00
|
|
|
return !jid.contains("/");
|
|
|
|
}
|
|
|
|
|
2017-03-11 00:25:45 +00:00
|
|
|
public string? get_resource_part(string jid) {
|
2017-03-02 14:37:32 +00:00
|
|
|
return jid.split("/")[1];
|
|
|
|
}
|
2017-03-10 15:02:32 +00:00
|
|
|
|
|
|
|
public string random_uuid() {
|
2017-03-12 21:23:25 +00:00
|
|
|
uint32 b1 = Random.next_int();
|
|
|
|
uint16 b2 = (uint16)Random.next_int();
|
|
|
|
uint16 b3 = (uint16)(Random.next_int() | 0x4000u) & ~0xb000u;
|
|
|
|
uint16 b4 = (uint16)(Random.next_int() | 0x8000u) & ~0x4000u;
|
|
|
|
uint16 b5_1 = (uint16)Random.next_int();
|
|
|
|
uint32 b5_2 = Random.next_int();
|
|
|
|
return "%08x-%04x-%04x-%04x-%04x%08x".printf(b1, b2, b3, b4, b5_1, b5_2);
|
2017-03-10 15:02:32 +00:00
|
|
|
}
|
2017-11-11 20:29:13 +00:00
|
|
|
|
|
|
|
public abstract class StanzaListener<T> : Object {
|
|
|
|
public abstract string action_group { get; }
|
|
|
|
public abstract string[] after_actions { get; }
|
|
|
|
public abstract async void run(Core.XmppStream stream, T stanza);
|
|
|
|
}
|
|
|
|
|
|
|
|
public class StanzaListenerHolder<T> : Object {
|
2017-11-21 22:27:27 +00:00
|
|
|
private ArrayList<StanzaListener<T>> listeners = new ArrayList<StanzaListener<T>>();
|
2017-11-11 20:29:13 +00:00
|
|
|
|
|
|
|
public new void connect(StanzaListener<T> listener) {
|
|
|
|
listeners.add(listener);
|
|
|
|
resort_list();
|
|
|
|
}
|
|
|
|
|
2017-11-21 22:27:27 +00:00
|
|
|
public new void disconnect(StanzaListener<T> listener) {
|
|
|
|
listeners.remove(listener);
|
|
|
|
resort_list();
|
|
|
|
}
|
|
|
|
|
2017-11-11 20:29:13 +00:00
|
|
|
public async void run(Core.XmppStream stream, T stanza) {
|
|
|
|
foreach (StanzaListener<T> l in listeners) {
|
|
|
|
yield l.run(stream, stanza);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
private bool set_contains_action(Gee.List<StanzaListener<T>> s, string[] actions) {
|
|
|
|
foreach(StanzaListener<T> l in s) {
|
|
|
|
if (l.action_group in actions) {
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
private void resort_list() {
|
2017-11-21 22:27:27 +00:00
|
|
|
ArrayList<StanzaListener<T>> new_list = new ArrayList<StanzaListener<T>>();
|
2017-11-22 19:06:50 +00:00
|
|
|
ArrayList<StanzaListener<T>> remaining = new ArrayList<StanzaListener<T>>();
|
|
|
|
remaining.add_all(listeners);
|
|
|
|
while (remaining.size > 0) {
|
2017-11-11 20:29:13 +00:00
|
|
|
bool changed = false;
|
2017-11-22 19:06:50 +00:00
|
|
|
Gee.Iterator<StanzaListener<T>> iter = remaining.iterator();
|
|
|
|
while (iter.has_next()) {
|
|
|
|
if (!iter.valid) {
|
|
|
|
iter.next();
|
|
|
|
}
|
|
|
|
StanzaListener<T> l = iter.get();
|
2017-11-11 20:29:13 +00:00
|
|
|
if (!set_contains_action(remaining, l.after_actions)) {
|
|
|
|
new_list.add(l);
|
2017-11-22 19:06:50 +00:00
|
|
|
iter.remove();
|
2017-11-11 20:29:13 +00:00
|
|
|
changed = true;
|
|
|
|
}
|
|
|
|
}
|
2017-11-22 19:06:50 +00:00
|
|
|
if (!changed) error("Can't sort listeners");
|
2017-11-11 20:29:13 +00:00
|
|
|
}
|
|
|
|
listeners = new_list;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-06-16 12:29:02 +00:00
|
|
|
}
|