[folks] Bug 645549 — Add a way to get the individual from a persona



commit 629aa199668b32ff33452d9d22985e21193c6e4f
Author: Philip Withnall <philip tecnocode co uk>
Date:   Sun Jul 3 20:38:29 2011 +0100

    Bug 645549 â Add a way to get the individual from a persona
    
    Add a Persona.individual property which is updated by
    Individual._connect_to_persona() and ._disconnect_from_persona() as
    appropriate, so should remain in lock-step with the Individual whose persona
    set the Persona instance is currently in.
    
    Closes: bgo#645549

 NEWS                  |    2 ++
 folks/individual.vala |    9 +++++++--
 folks/persona.vala    |   29 +++++++++++++++++++++++++++++
 3 files changed, 38 insertions(+), 2 deletions(-)
---
diff --git a/NEWS b/NEWS
index e2853fb..fc737c8 100644
--- a/NEWS
+++ b/NEWS
@@ -18,6 +18,7 @@ Bugs fixed:
 * Bug 654509 â Folks master not building
 * Bug 652048 â Make nickname writable
 * Bug 652425 â Failure codes for removing personas needed in PersonaStoreError
+* Bug 645549 â Add a way to get the individual from a persona
 
 API changes:
 * Swf.Persona retains and exposes its libsocialweb Contact
@@ -27,6 +28,7 @@ API changes:
 * Add PersonaStoreError.PERMISSION_DENIED and PersonaStoreError.REMOVE_FAILED
 * Change the error domain of PersonaStore.remove_persona() from GLib.Error to
   Folks.PersonaStoreError
+* Add a Persona.individual property
 
 Overview of changes from libfolks 0.5.1 to libfolks 0.5.2
 =========================================================
diff --git a/folks/individual.vala b/folks/individual.vala
index 79630e3..8cdb9dd 100644
--- a/folks/individual.vala
+++ b/folks/individual.vala
@@ -1101,6 +1101,8 @@ public class Folks.Individual : Object,
 
   private void _connect_to_persona (Persona persona)
     {
+      persona.individual = this;
+
       persona.notify["alias"].connect (this._notify_alias_cb);
       persona.notify["avatar"].connect (this._notify_avatar_cb);
       persona.notify["presence-message"].connect (this._notify_presence_cb);
@@ -1208,7 +1210,8 @@ public class Folks.Individual : Object,
         }
     }
 
-  private void _disconnect_from_persona (Persona persona)
+  private void _disconnect_from_persona (Persona persona,
+      Individual? replacement_individual)
     {
       persona.notify["alias"].disconnect (this._notify_alias_cb);
       persona.notify["avatar"].disconnect (this._notify_avatar_cb);
@@ -1244,6 +1247,8 @@ public class Folks.Individual : Object,
           ((GroupDetails) persona).group_changed.disconnect (
               this._persona_group_changed_cb);
         }
+
+      persona.individual = replacement_individual;
     }
 
   private void _update_gender ()
@@ -1558,7 +1563,7 @@ public class Folks.Individual : Object,
                   this._stores.unset (store);
                 }
 
-              this._disconnect_from_persona (p);
+              this._disconnect_from_persona (p, replacement_individual);
               iter.remove ();
             }
         }
diff --git a/folks/persona.vala b/folks/persona.vala
index 8f36b81..a49805b 100644
--- a/folks/persona.vala
+++ b/folks/persona.vala
@@ -30,6 +30,8 @@ using GLib;
  */
 public abstract class Folks.Persona : Object
 {
+  private weak Individual _individual;
+
   /**
    * The internal ID used to represent the Persona for linking.
    *
@@ -105,6 +107,33 @@ public abstract class Folks.Persona : Object
   public weak PersonaStore store { get; construct; }
 
   /**
+   * The { link Individual} which contains this Persona.
+   *
+   * This may be `null`, but should only ever be so when the Persona has just
+   * been created, when its { link PersonaStore} is being destroyed, or when
+   * it's moving between { link Individual}s.
+   *
+   * @since UNRELEASED
+   */
+  public weak Individual? individual
+    {
+      get
+        {
+          assert (this._individual == null ||
+              this._individual.personas.contains (this));
+
+          return this._individual;
+        }
+
+      internal set
+        {
+          assert (value == null || value.personas.contains (this));
+
+          this._individual = value;
+        }
+    }
+
+  /**
    * The names of the properties of this Persona which are linkable.
    *
    * If a property name is in this list, and the Persona is from a



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