aboutsummaryrefslogblamecommitdiff
path: root/libdino/src/service/module_manager.vala
blob: ab268876c554b1bdd93a6ffc44453fab60c42214 (plain) (tree)
1
2
3
4
5
6
7
8
9






                            
                                                                                                                                     
 
                                                                  
                                                                                                             


                                                                        












                                                                                       
                                                                                                   











                                                                                                     

                       












                                                                                                          
                                                                                                    






                                                                              


     
using Gee;

using Dino.Entities;
using Xmpp;

namespace Dino {

public class ModuleManager {
    private HashMap<Account, ArrayList<Core.XmppStreamModule>> module_map = new HashMap<Account, ArrayList<Core.XmppStreamModule>>();

    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>();
        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 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.Pubsub.Module());
            module_map[account].add(new Xep.EntityCapabilities.Module(entity_capabilities_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]);
        }
    }
}

}