From 12cd56612dd6edd056e2cd8aae59ea3ae8f05d1e Mon Sep 17 00:00:00 2001 From: fiaxh Date: Sun, 29 Mar 2020 20:23:47 +0200 Subject: Store entity identity info, use it in conversation list tooltips --- .../src/service/entity_capabilities_storage.vala | 52 ++++++++++++++++++++-- 1 file changed, 49 insertions(+), 3 deletions(-) (limited to 'libdino/src/service/entity_capabilities_storage.vala') diff --git a/libdino/src/service/entity_capabilities_storage.vala b/libdino/src/service/entity_capabilities_storage.vala index 94d9d88e..d9f66913 100644 --- a/libdino/src/service/entity_capabilities_storage.vala +++ b/libdino/src/service/entity_capabilities_storage.vala @@ -1,23 +1,69 @@ using Gee; - +using Qlite; using Xmpp; +using Xmpp.Xep.ServiceDiscovery; namespace Dino { public class EntityCapabilitiesStorage : Xep.EntityCapabilities.Storage, Object { private Database db; + private HashMap> features_cache = new HashMap>(); + private HashMap identity_cache = new HashMap(); public EntityCapabilitiesStorage(Database db) { this.db = db; } public void store_features(string entity, Gee.List features) { - db.add_entity_features(entity, features); + foreach (string feature in features) { + db.entity_feature.insert() + .value(db.entity_feature.entity, entity) + .value(db.entity_feature.feature, feature) + .perform(); + } + } + + public void store_identities(string entity, Gee.List identities) { + foreach (Identity identity in identities) { + if (identity.category == Identity.CATEGORY_CLIENT) { + db.entity_identity.insert() + .value(db.entity_identity.entity, entity) + .value(db.entity_identity.category, identity.category) + .value(db.entity_identity.type, identity.type_) + .value(db.entity_identity.name, identity.name) + .perform(); + return; + } + } } public Gee.List get_features(string entity) { - return db.get_entity_features(entity); + Gee.List? features = features_cache[entity]; + if (features != null) { + return features; + } + + features = new ArrayList(); + foreach (Row row in db.entity_feature.select({db.entity_feature.feature}).with(db.entity_feature.entity, "=", entity)) { + features.add(row[db.entity_feature.feature]); + } + features_cache[entity] = features; + return features; + } + + public Identity? get_identities(string entity) { + Identity? identity = identity_cache[entity]; + if (identity != null) { + return identity; + } + + RowOption row = db.entity_identity.select().with(db.entity_identity.entity, "=", entity).single().row(); + if (row.is_present()) { + identity = new Identity(row[db.entity_identity.category], row[db.entity_identity.type], row[db.entity_identity.name]); + } + identity_cache[entity] = identity; + return identity; } } } -- cgit v1.2.3-54-g00ecf