[gnome-contacts] Remember "no" reponse to link suggestion



commit aab7274ecb45680b1553105dcc9f21be946c9389
Author: Alexander Larsson <alexl redhat com>
Date:   Tue Jan 24 15:13:21 2012 +0100

    Remember "no" reponse to link suggestion

 src/contacts-contact-pane.vala |    2 +-
 src/contacts-contact.vala      |    3 ++
 src/contacts-store.vala        |   70 ++++++++++++++++++++++++++++++++++++++++
 3 files changed, 74 insertions(+), 1 deletions(-)
---
diff --git a/src/contacts-contact-pane.vala b/src/contacts-contact-pane.vala
index d0724c1..8f51a88 100644
--- a/src/contacts-contact-pane.vala
+++ b/src/contacts-contact-pane.vala
@@ -1746,7 +1746,7 @@ public class Contacts.ContactPane : ScrolledWindow {
       });
 
     no.clicked.connect ( () => {
-	/* TODO: Set up anti-linking relationship (and any where we force unlink) */
+	contacts_store.add_no_suggest_link (contact, c);
 	/* TODO: Add undo */
 	row.destroy ();
       });
diff --git a/src/contacts-contact.vala b/src/contacts-contact.vala
index 334ca08..92d355b 100644
--- a/src/contacts-contact.vala
+++ b/src/contacts-contact.vala
@@ -1148,6 +1148,9 @@ public class Contacts.Contact : GLib.Object  {
     if (this.non_linkable () || other.non_linkable ())
       return false;
 
+    if (!App.app.contacts_store.may_suggest_link (this, other))
+      return false;
+
     /* Only connect main contacts with non-mainable contacts, and vice versa. */
     if ((this.is_main && !other.has_mainable_persona()) ||
 	(!this.has_mainable_persona () && other.is_main)) {
diff --git a/src/contacts-store.vala b/src/contacts-store.vala
index 6dcb313..45b8d83 100644
--- a/src/contacts-store.vala
+++ b/src/contacts-store.vala
@@ -33,6 +33,8 @@ public class Contacts.Store : GLib.Object {
 
   public Gee.HashMap<string, Account> calling_accounts;
 
+  public Gee.HashMultiMap<string, string> dont_suggest_link;
+
   public bool can_call {
     get {
       return this.calling_accounts.size > 0 ? true : false;
@@ -62,9 +64,77 @@ public class Contacts.Store : GLib.Object {
     return c.get_data<bool> ("contacts-master-at-join");
   }
 
+  private void read_dont_suggest_db () {
+    dont_suggest_link.clear ();
+    try {
+      var path = Path.build_filename (Environment.get_user_config_dir (), "gnome-contacts", "dont_suggest.db");
+      string contents;
+      if (FileUtils.get_contents (path, out contents)) {
+	var rows = contents.split ("\n");
+	foreach (var r in rows) {
+	  var ids = r.split (" ");
+	  if (ids.length == 2) {
+	    dont_suggest_link.set (ids[0], ids[1]);
+	  }
+	}
+      }
+    } catch (GLib.Error e) {
+      if (!(e is FileError.NOENT))
+	warning ("error loading no suggestion db: %s\n", e.message);
+    }
+  }
+
+  private void write_dont_suggest_db () {
+    try {
+      var dir = Path.build_filename (Environment.get_user_config_dir (), "gnome-contacts");
+      DirUtils.create_with_parents (dir, 0700);
+      var path = Path.build_filename (dir, "dont_suggest.db");
+
+      var s = new StringBuilder ();
+      foreach (var key in dont_suggest_link.get_keys ()) {
+	foreach (var value in dont_suggest_link.get (key)) {
+	  s.append_printf ("%s %s\n", key, value);
+	}
+      }
+      FileUtils.set_contents (path, s.str, s.len);
+    } catch (GLib.Error e) {
+      warning ("error writing no suggestion db: %s\n", e.message);
+    }
+  }
+
+  public bool may_suggest_link (Contact a, Contact b) {
+    foreach (var a_persona in a.individual.personas) {
+      foreach (var no_link_uid in dont_suggest_link.get (a_persona.uid)) {
+	foreach (var b_persona in b.individual.personas) {
+	  if (b_persona.uid == no_link_uid)
+	    return false;
+	}
+      }
+    }
+    foreach (var b_persona in b.individual.personas) {
+      foreach (var no_link_uid in dont_suggest_link.get (b_persona.uid)) {
+	foreach (var a_persona in a.individual.personas) {
+	  if (a_persona.uid == no_link_uid)
+	    return false;
+	}
+      }
+    }
+    return true;
+  }
+
+  public void add_no_suggest_link (Contact a, Contact b) {
+    var persona1 = a.get_personas_for_display ().to_array ()[0];
+    var persona2 = b.get_personas_for_display ().to_array ()[0];
+    dont_suggest_link.set (persona1.uid, persona2.uid);
+    write_dont_suggest_db ();
+  }
+
   public Store () {
     contacts = new Gee.ArrayList<Contact>();
 
+    dont_suggest_link = new Gee.HashMultiMap<string, string> ();
+    read_dont_suggest_db ();
+
     backend_store = BackendStore.dup ();
     aggregator = new IndividualAggregator ();
     aggregator.notify["is-quiescent"].connect ( (obj, pspec) => {



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]