From d8e102a160f316369c99d3dc2df7d7d54f5bc955 Mon Sep 17 00:00:00 2001
From: Marvin W <git@larma.de>
Date: Fri, 10 Mar 2017 21:45:56 +0100
Subject: Use typed identity in module manager

---
 libdino/src/service/avatar_manager.vala            |   4 +-
 .../service/counterpart_interaction_manager.vala   |   6 +-
 libdino/src/service/message_manager.vala           |   2 +-
 libdino/src/service/module_manager.vala            | 128 +++++++++------------
 libdino/src/service/muc_manager.vala               |   4 +-
 libdino/src/service/pgp_manager.vala               |   3 +-
 libdino/src/service/presence_manager.vala          |   6 +-
 libdino/src/service/roster_manager.vala            |   6 +-
 libdino/src/service/stream_interactor.vala         |   2 +-
 9 files changed, 74 insertions(+), 87 deletions(-)

(limited to 'libdino')

diff --git a/libdino/src/service/avatar_manager.vala b/libdino/src/service/avatar_manager.vala
index de44c419..0a141449 100644
--- a/libdino/src/service/avatar_manager.vala
+++ b/libdino/src/service/avatar_manager.vala
@@ -89,10 +89,10 @@ public class AvatarManager : StreamInteractionModule, Object {
     }
 
     private void on_account_added(Account account) {
-        stream_interactor.module_manager.user_avatars_modules[account].received_avatar.connect((stream, jid, id) =>
+        stream_interactor.module_manager.get_module(account, Xep.UserAvatars.Module.IDENTITY).received_avatar.connect((stream, jid, id) =>
             on_user_avatar_received(account, new Jid(jid), id)
         );
-        stream_interactor.module_manager.vcard_modules[account].received_avatar.connect((stream, jid, id) =>
+        stream_interactor.module_manager.get_module(account, Xep.VCard.Module.IDENTITY).received_avatar.connect((stream, jid, id) =>
             on_vcard_avatar_received(account, new Jid(jid), id)
         );
 
diff --git a/libdino/src/service/counterpart_interaction_manager.vala b/libdino/src/service/counterpart_interaction_manager.vala
index 8ea8ba15..221fc4d4 100644
--- a/libdino/src/service/counterpart_interaction_manager.vala
+++ b/libdino/src/service/counterpart_interaction_manager.vala
@@ -44,13 +44,13 @@ public class CounterpartInteractionManager : StreamInteractionModule, Object {
     }
 
     private void on_account_added(Account account) {
-        stream_interactor.module_manager.chat_markers_modules[account].marker_received.connect( (stream, jid, marker, id) => {
+        stream_interactor.module_manager.get_module(account, Xep.ChatMarkers.Module.IDENTITY).marker_received.connect( (stream, jid, marker, id) => {
             on_chat_marker_received(account, new Jid(jid), marker, id);
         });
-        stream_interactor.module_manager.message_delivery_receipts_modules[account].receipt_received.connect((stream, jid, id) => {
+        stream_interactor.module_manager.get_module(account, Xep.MessageDeliveryReceipts.Module.IDENTITY).receipt_received.connect((stream, jid, id) => {
             on_receipt_received(account, new Jid(jid), id);
         });
-        stream_interactor.module_manager.chat_state_notifications_modules[account].chat_state_received.connect((stream, jid, state) => {
+        stream_interactor.module_manager.get_module(account, Xep.ChatStateNotifications.Module.IDENTITY).chat_state_received.connect((stream, jid, state) => {
             on_chat_state_received(account, new Jid(jid), state);
         });
     }
diff --git a/libdino/src/service/message_manager.vala b/libdino/src/service/message_manager.vala
index ec7a35c8..76a05f9e 100644
--- a/libdino/src/service/message_manager.vala
+++ b/libdino/src/service/message_manager.vala
@@ -75,7 +75,7 @@ public class MessageManager : StreamInteractionModule, Object {
     }
 
     private void on_account_added(Account account) {
-        stream_interactor.module_manager.message_modules[account].received_message.connect( (stream, message) => {
+        stream_interactor.module_manager.get_module(account, Xmpp.Message.Module.IDENTITY).received_message.connect( (stream, message) => {
             on_message_received(account, message);
         });
         stream_interactor.stream_negotiated.connect(send_unsent_messages);
diff --git a/libdino/src/service/module_manager.vala b/libdino/src/service/module_manager.vala
index 5ef93da8..c21e189e 100644
--- a/libdino/src/service/module_manager.vala
+++ b/libdino/src/service/module_manager.vala
@@ -6,90 +6,76 @@ using Xmpp;
 namespace Dino {
 
 public class ModuleManager {
-
-    public HashMap<Account, Tls.Module> tls_modules = new HashMap<Account, Tls.Module>();
-    public HashMap<Account, PlainSasl.Module> plain_sasl_modules = new HashMap<Account, PlainSasl.Module>();
-    public HashMap<Account, Bind.Module> bind_modules = new HashMap<Account, Bind.Module>();
-    public HashMap<Account, Roster.Module> roster_modules = new HashMap<Account, Roster.Module>();
-    public HashMap<Account, Xep.ServiceDiscovery.Module> service_discovery_modules = new HashMap<Account, Xep.ServiceDiscovery.Module>();
-    public HashMap<Account, Xep.PrivateXmlStorage.Module> private_xmp_storage_modules = new HashMap<Account, Xep.PrivateXmlStorage.Module>();
-    public HashMap<Account, Xep.Bookmarks.Module> bookmarks_module = new HashMap<Account, Xep.Bookmarks.Module>();
-    public HashMap<Account, Presence.Module> presence_modules = new HashMap<Account, Presence.Module>();
-    public HashMap<Account, Xmpp.Message.Module> message_modules = new HashMap<Account, Xmpp.Message.Module>();
-    public HashMap<Account, Xep.MessageCarbons.Module> message_carbons_modules = new HashMap<Account, Xep.MessageCarbons.Module>();
-    public HashMap<Account, Xep.Muc.Module> muc_modules = new HashMap<Account, Xep.Muc.Module>();
-    public HashMap<Account, Xep.Pgp.Module> pgp_modules = new HashMap<Account, Xep.Pgp.Module>();
-    public HashMap<Account, Xep.Pubsub.Module> pubsub_modules = new HashMap<Account, Xep.Pubsub.Module>();
-    public HashMap<Account, Xep.EntityCapabilities.Module> entity_capabilities_modules = new HashMap<Account, Xep.EntityCapabilities.Module>();
-    public HashMap<Account, Xep.UserAvatars.Module> user_avatars_modules = new HashMap<Account, Xep.UserAvatars.Module>();
-    public HashMap<Account, Xep.VCard.Module> vcard_modules = new HashMap<Account, Xep.VCard.Module>();
-    public HashMap<Account, Xep.MessageDeliveryReceipts.Module> message_delivery_receipts_modules = new HashMap<Account, Xep.MessageDeliveryReceipts.Module>();
-    public HashMap<Account, Xep.ChatStateNotifications.Module> chat_state_notifications_modules = new HashMap<Account, Xep.ChatStateNotifications.Module>();
-    public HashMap<Account, Xep.ChatMarkers.Module> chat_markers_modules = new HashMap<Account, Xep.ChatMarkers.Module>();
-    public HashMap<Account, Xep.Ping.Module> ping_modules = new HashMap<Account, Xep.Ping.Module>();
-    public HashMap<Account, Xep.DelayedDelivery.Module> delayed_delivery_module = new HashMap<Account, Xep.DelayedDelivery.Module>();
-    public HashMap<Account, StreamError.Module> stream_error_modules = new HashMap<Account, StreamError.Module>();
+    private HashMap<Account, ArrayList<Core.XmppStreamModule>> module_map = new HashMap<Account, ArrayList<Core.XmppStreamModule>>();
 
     private AvatarStorage avatar_storage = new AvatarStorage("./");
     private EntityCapabilitiesStorage entity_capabilities_storage;
 
+    public signal void initialize_account_modules(Account account, ArrayList<Core.XmppStreamModule> modules);
+
     public ModuleManager(Database db) {
         entity_capabilities_storage = new EntityCapabilitiesStorage(db);
     }
 
+    public T? get_module<T>(Account account, Core.ModuleIdentity<T> identity) {
+        if (identity == null) return null;
+        lock (module_map) {
+            if (!module_map.has_key(account)) {
+                initialize(account);
+            }
+            var res = module_map[account].filter((module) => identity.matches(module));
+            if (res != null && res.next()) {
+                return identity.cast(res.get());
+            }
+        }
+        return null;
+    }
+
     public ArrayList<Core.XmppStreamModule> get_modules(Account account, string? resource = null) {
         ArrayList<Core.XmppStreamModule> modules = new ArrayList<Core.XmppStreamModule>();
-
-        if (!tls_modules.has_key(account)) add_account(account);
-
-        modules.add(tls_modules[account]);
-        modules.add(plain_sasl_modules[account]);
-        modules.add(new Bind.Module(resource == null ? account.resourcepart : resource));
-        modules.add(roster_modules[account]);
-        modules.add(service_discovery_modules[account]);
-        modules.add(private_xmp_storage_modules[account]);
-        modules.add(bookmarks_module[account]);
-        modules.add(presence_modules[account]);
-        modules.add(message_modules[account]);
-        modules.add(message_carbons_modules[account]);
-        modules.add(muc_modules[account]);
-        modules.add(pgp_modules[account]);
-        modules.add(pubsub_modules[account]);
-        modules.add(entity_capabilities_modules[account]);
-        modules.add(user_avatars_modules[account]);
-        modules.add(vcard_modules[account]);
-        modules.add(message_delivery_receipts_modules[account]);
-        modules.add(chat_state_notifications_modules[account]);
-        modules.add(chat_markers_modules[account]);
-        modules.add(ping_modules[account]);
-        modules.add(delayed_delivery_module[account]);
-        modules.add(stream_error_modules[account]);
+        lock (module_map) {
+            if (!module_map.has_key(account)) {
+                initialize(account);
+            }
+            foreach (Core.XmppStreamModule module in module_map[account]) {
+                if (Bind.Module.IDENTITY.matches(module)) {
+                    // TODO: argh?!
+                    modules.add(new Bind.Module(resource == null ? account.resourcepart : resource));
+                } else {
+                    modules.add(module);
+                }
+            }
+        }
         return modules;
     }
 
-    public void add_account(Account account) {
-        tls_modules[account] = new Tls.Module();
-        plain_sasl_modules[account] = new PlainSasl.Module(account.bare_jid.to_string(), account.password);
-        bind_modules[account] = new Bind.Module(account.resourcepart);
-        roster_modules[account] = new Roster.Module();
-        service_discovery_modules[account] = new Xep.ServiceDiscovery.Module.with_identity("client", "pc");
-        private_xmp_storage_modules[account] = new Xep.PrivateXmlStorage.Module();
-        bookmarks_module[account] = new Xep.Bookmarks.Module();
-        presence_modules[account] = new Presence.Module();
-        message_modules[account] = new Xmpp.Message.Module();
-        message_carbons_modules[account] = new Xep.MessageCarbons.Module();
-        muc_modules[account] = new Xep.Muc.Module();
-        pgp_modules[account] = new Xep.Pgp.Module();
-        pubsub_modules[account] = new Xep.Pubsub.Module();
-        entity_capabilities_modules[account] = new Xep.EntityCapabilities.Module(entity_capabilities_storage);
-        user_avatars_modules[account] = new Xep.UserAvatars.Module(avatar_storage);
-        vcard_modules[account] = new Xep.VCard.Module(avatar_storage);
-        message_delivery_receipts_modules[account] = new Xep.MessageDeliveryReceipts.Module();
-        chat_state_notifications_modules[account] = new Xep.ChatStateNotifications.Module();
-        chat_markers_modules[account] = new Xep.ChatMarkers.Module();
-        ping_modules[account] = new Xep.Ping.Module();
-        delayed_delivery_module[account] = new Xep.DelayedDelivery.Module();
-        stream_error_modules[account] = new StreamError.Module();
+    public void initialize(Account account) {
+        lock(module_map) {
+            module_map[account] = new ArrayList<Core.XmppStreamModule>();
+            module_map[account].add(new Tls.Module());
+            module_map[account].add(new PlainSasl.Module(account.bare_jid.to_string(), account.password));
+            module_map[account].add(new Bind.Module(account.resourcepart));
+            module_map[account].add(new Roster.Module());
+            module_map[account].add(new Xep.ServiceDiscovery.Module.with_identity("client", "pc"));
+            module_map[account].add(new Xep.PrivateXmlStorage.Module());
+            module_map[account].add(new Xep.Bookmarks.Module());
+            module_map[account].add(new Presence.Module());
+            module_map[account].add(new Xmpp.Message.Module());
+            module_map[account].add(new Xep.MessageCarbons.Module());
+            module_map[account].add(new Xep.Muc.Module());
+            module_map[account].add(new Xep.Pgp.Module());
+            module_map[account].add(new Xep.Pubsub.Module());
+            module_map[account].add(new Xep.EntityCapabilities.Module(entity_capabilities_storage));
+            module_map[account].add(new Xep.UserAvatars.Module(avatar_storage));
+            module_map[account].add(new Xep.VCard.Module(avatar_storage));
+            module_map[account].add(new Xep.MessageDeliveryReceipts.Module());
+            module_map[account].add(new Xep.ChatStateNotifications.Module());
+            module_map[account].add(new Xep.ChatMarkers.Module());
+            module_map[account].add(new Xep.Ping.Module());
+            module_map[account].add(new Xep.DelayedDelivery.Module());
+            module_map[account].add(new StreamError.Module());
+            initialize_account_modules(account, module_map[account]);
+        }
     }
 }
 
diff --git a/libdino/src/service/muc_manager.vala b/libdino/src/service/muc_manager.vala
index be23d391..74467077 100644
--- a/libdino/src/service/muc_manager.vala
+++ b/libdino/src/service/muc_manager.vala
@@ -144,10 +144,10 @@ public class MucManager : StreamInteractionModule, Object {
     }
 
     private void on_account_added(Account account) {
-        stream_interactor.module_manager.muc_modules[account].subject_set.connect( (stream, subject, jid) => {
+        stream_interactor.module_manager.get_module(account, Xep.Muc.Module.IDENTITY).subject_set.connect( (stream, subject, jid) => {
             on_subject_set(account, new Jid(jid), subject);
         });
-        stream_interactor.module_manager.bookmarks_module[account].conferences_updated.connect( (stream, conferences) => {
+        stream_interactor.module_manager.get_module(account, Xep.Bookmarks.Module.IDENTITY).conferences_updated.connect( (stream, conferences) => {
             bookmarks_updated(account, conferences);
         });
     }
diff --git a/libdino/src/service/pgp_manager.vala b/libdino/src/service/pgp_manager.vala
index 6f3b63d7..c8bf2180 100644
--- a/libdino/src/service/pgp_manager.vala
+++ b/libdino/src/service/pgp_manager.vala
@@ -1,5 +1,6 @@
 using Gee;
 
+using Xmpp;
 using Dino.Entities;
 
 namespace Dino {
@@ -37,7 +38,7 @@ namespace Dino {
         }
 
         private void on_account_added(Account account) {
-            stream_interactor.module_manager.pgp_modules[account].received_jid_key_id.connect((stream, jid, key_id) => {
+            stream_interactor.module_manager.get_module(account, Xep.Pgp.Module.IDENTITY).received_jid_key_id.connect((stream, jid, key_id) => {
                 on_jid_key_received(account, new Jid(jid), key_id);
             });
         }
diff --git a/libdino/src/service/presence_manager.vala b/libdino/src/service/presence_manager.vala
index b89c6570..be1e00fc 100644
--- a/libdino/src/service/presence_manager.vala
+++ b/libdino/src/service/presence_manager.vala
@@ -79,13 +79,13 @@ public class PresenceManager : StreamInteractionModule, Object {
     }
 
     private void on_account_added(Account account) {
-        stream_interactor.module_manager.presence_modules[account].received_available_show.connect((stream, jid, show) =>
+        stream_interactor.module_manager.get_module(account, Presence.Module.IDENTITY).received_available_show.connect((stream, jid, show) =>
             on_received_available_show(account, new Jid(jid), show)
         );
-        stream_interactor.module_manager.presence_modules[account].received_unavailable.connect((stream, jid) =>
+        stream_interactor.module_manager.get_module(account, Presence.Module.IDENTITY).received_unavailable.connect((stream, jid) =>
             on_received_unavailable(account, new Jid(jid))
         );
-        stream_interactor.module_manager.presence_modules[account].received_subscription_request.connect((stream, jid) =>
+        stream_interactor.module_manager.get_module(account, Presence.Module.IDENTITY).received_subscription_request.connect((stream, jid) =>
             received_subscription_request(new Jid(jid), account)
         );
     }
diff --git a/libdino/src/service/roster_manager.vala b/libdino/src/service/roster_manager.vala
index 106405e2..6f6f402a 100644
--- a/libdino/src/service/roster_manager.vala
+++ b/libdino/src/service/roster_manager.vala
@@ -58,13 +58,13 @@ namespace Dino {
         }
 
         private void on_account_added(Account account) {
-            stream_interactor.module_manager.roster_modules[account].received_roster.connect( (stream, roster) => {
+            stream_interactor.module_manager.get_module(account, Roster.Module.IDENTITY).received_roster.connect( (stream, roster) => {
                 on_roster_received(account, roster);
             });
-            stream_interactor.module_manager.roster_modules[account].item_removed.connect( (stream, roster_item) => {
+            stream_interactor.module_manager.get_module(account, Roster.Module.IDENTITY).item_removed.connect( (stream, roster_item) => {
                 removed_roster_item(account, new Jid(roster_item.jid), roster_item);
             });
-            stream_interactor.module_manager.roster_modules[account].item_updated.connect( (stream, roster_item) => {
+            stream_interactor.module_manager.get_module(account, Roster.Module.IDENTITY).item_updated.connect( (stream, roster_item) => {
                 on_roster_item_updated(account, roster_item);
             });
         }
diff --git a/libdino/src/service/stream_interactor.vala b/libdino/src/service/stream_interactor.vala
index f3859e3b..5965cdd3 100644
--- a/libdino/src/service/stream_interactor.vala
+++ b/libdino/src/service/stream_interactor.vala
@@ -22,7 +22,7 @@ public class StreamInteractor {
     }
 
     public void connect(Account account) {
-        module_manager.add_account(account);
+        module_manager.initialize(account);
         account_added(account);
         connection_manager.connect(account);
     }
-- 
cgit v1.2.3-70-g09d2