From a59f728bdd7b81964a460b96b6c56da0d9dfda01 Mon Sep 17 00:00:00 2001
From: fiaxh <git@mx.ax.lt>
Date: Sat, 12 Aug 2017 23:14:50 +0200
Subject: Stream Management

---
 libdino/src/entity/jid.vala                 |  8 ++++----
 libdino/src/service/connection_manager.vala |  2 +-
 libdino/src/service/module_manager.vala     | 14 ++++++++++++--
 libdino/src/service/stream_interactor.vala  |  3 ++-
 4 files changed, 19 insertions(+), 8 deletions(-)

(limited to 'libdino')

diff --git a/libdino/src/entity/jid.vala b/libdino/src/entity/jid.vala
index 2283b466..42218fb2 100644
--- a/libdino/src/entity/jid.vala
+++ b/libdino/src/entity/jid.vala
@@ -63,12 +63,12 @@ public class Dino.Entities.Jid : Object {
         return jid;
     }
 
-    public bool equals_bare(Jid jid) {
-        return equals_bare_func(this, jid);
+    public bool equals_bare(Jid? jid) {
+        return jid != null && equals_bare_func(this, jid);
     }
 
-    public bool equals(Jid jid) {
-        return equals_func(this, jid);
+    public bool equals(Jid? jid) {
+        return jid != null && equals_func(this, jid);
     }
 
     public static new bool equals_bare_func(Jid jid1, Jid jid2) {
diff --git a/libdino/src/service/connection_manager.vala b/libdino/src/service/connection_manager.vala
index 509964b3..d932d1cc 100644
--- a/libdino/src/service/connection_manager.vala
+++ b/libdino/src/service/connection_manager.vala
@@ -126,7 +126,7 @@ public class ConnectionManager {
         Connection connection = new Connection(stream, new DateTime.now_local());
         connections[account] = connection;
         change_connection_state(account, ConnectionState.CONNECTING);
-        stream.stream_negotiated.connect((stream) => {
+        stream.attached_modules.connect((stream) => {
             change_connection_state(account, ConnectionState.CONNECTED);
         });
         stream.get_module(PlainSasl.Module.IDENTITY).received_auth_failure.connect((stream, node) => {
diff --git a/libdino/src/service/module_manager.vala b/libdino/src/service/module_manager.vala
index b10765f1..437ecaf0 100644
--- a/libdino/src/service/module_manager.vala
+++ b/libdino/src/service/module_manager.vala
@@ -33,20 +33,30 @@ public class ModuleManager {
     public ArrayList<Core.XmppStreamModule> get_modules(Account account, string? resource = null) {
         ArrayList<Core.XmppStreamModule> modules = new ArrayList<Core.XmppStreamModule>();
 
-        modules.add(new Bind.Module(resource == null ? account.resourcepart : resource));
-        modules.add(new PlainSasl.Module(account.bare_jid.to_string(), account.password));
         lock (module_map) {
             if (!module_map.has_key(account)) initialize(account);
             foreach (Core.XmppStreamModule module in module_map[account]) modules.add(module);
         }
+
+        foreach (Core.XmppStreamModule module in module_map[account]) {
+            if (module.get_id() == Bind.Module.IDENTITY.id) {
+                (module as Bind.Module).requested_resource == null ? account.resourcepart : resource;
+            } else if (module.get_id() == PlainSasl.Module.IDENTITY.id) {
+                (module as PlainSasl.Module).password = account.password;
+            }
+        }
         return modules;
     }
 
     public void initialize(Account account) {
         lock(module_map) {
             module_map[account] = new ArrayList<Core.XmppStreamModule>();
+            module_map[account].add(new Iq.Module());
             module_map[account].add(new Tls.Module());
             module_map[account].add(new Xep.SrvRecordsTls.Module());
+            module_map[account].add(new PlainSasl.Module(account.bare_jid.to_string(), account.password));
+            module_map[account].add(new Xep.StreamManagement.Module());
+            module_map[account].add(new Bind.Module(account.resourcepart));
             module_map[account].add(new Session.Module());
             module_map[account].add(new Roster.Module());
             module_map[account].add(new Xep.ServiceDiscovery.Module.with_identity("client", "pc"));
diff --git a/libdino/src/service/stream_interactor.vala b/libdino/src/service/stream_interactor.vala
index 028d031b..f97eb482 100644
--- a/libdino/src/service/stream_interactor.vala
+++ b/libdino/src/service/stream_interactor.vala
@@ -10,6 +10,7 @@ public class StreamInteractor {
     public signal void account_added(Account account);
     public signal void account_removed(Account account);
     public signal void stream_negotiated(Account account, Core.XmppStream stream);
+    public signal void attached_modules(Account account, Core.XmppStream stream);
 
     public ModuleManager module_manager;
     public ConnectionManager connection_manager;
@@ -84,4 +85,4 @@ public interface StreamInteractionModule : Object {
     public abstract string id { get; }
 }
 
-}
\ No newline at end of file
+}
-- 
cgit v1.2.3-70-g09d2