[folks] Support vCard-like parameters for web service addresses



commit eb1d4fd077d5a8489b750d82fde8f13d9a3c8e4b
Author: Travis Reitter <travis reitter collabora co uk>
Date:   Tue Aug 9 17:40:41 2011 +0200

    Support vCard-like parameters for web service addresses
    
    Closes: bgo#653682 - Change WebServiceDetails.web_service_addresses to support
    vCard-like arbitrary parameters

 NEWS                                        |    4 ++
 backends/eds/lib/edsf-persona-store.vala    |   15 ++++---
 backends/eds/lib/edsf-persona.vala          |   17 +++++---
 backends/key-file/kf-persona-store.vala     |    4 +-
 backends/key-file/kf-persona.vala           |   38 ++++++++++-------
 backends/libsocialweb/lib/swf-persona.vala  |   10 +++-
 backends/tracker/lib/trf-persona-store.vala |   26 +++++++-----
 backends/tracker/lib/trf-persona.vala       |   15 ++++---
 folks/individual-aggregator.vala            |   17 +++++---
 folks/individual.vala                       |   17 ++++----
 folks/web-service-details.vala              |   59 +++++++++++++++++++++++++--
 tests/eds/link-personas.vala                |   30 +++++++++-----
 12 files changed, 174 insertions(+), 78 deletions(-)
---
diff --git a/NEWS b/NEWS
index 9383b83..9ce3520 100644
--- a/NEWS
+++ b/NEWS
@@ -41,6 +41,8 @@ Bugs fixed:
   class
 * Bug 655920 â Rebase PhoneDetails.numbers upon an AbstractFieldDetails-derived
   class
+* Bug 653682 â Change WebServiceDetails.web_service_addresses to support
+  vCard-like arbitrary parameters
 
 API changes:
 * Swf.Persona retains and exposes its libsocialweb Contact
@@ -73,6 +75,8 @@ API changes:
 * Remove Note class (obsoleted by NoteFieldDetails)
 * Add and use PhoneFieldDetails for PhoneFieldDetails.phone_numbers
 * Remove all PhoneDetails functions (obsoleted by PhoneFieldDetails)
+* Add and use WebServiceFieldDetails for
+  WebServiceFieldDetails.web_service_addresses
 
 Overview of changes from libfolks 0.5.1 to libfolks 0.5.2
 =========================================================
diff --git a/backends/eds/lib/edsf-persona-store.vala b/backends/eds/lib/edsf-persona-store.vala
index 63b3416..9234f27 100644
--- a/backends/eds/lib/edsf-persona-store.vala
+++ b/backends/eds/lib/edsf-persona-store.vala
@@ -283,8 +283,9 @@ public class Edsf.PersonaStore : Folks.PersonaStore
           else if (k == Folks.PersonaStore.detail_key
               (PersonaDetail.WEB_SERVICE_ADDRESSES))
             {
-              HashMultiMap<string, string> web_service_addresses =
-                (HashMultiMap<string, string>) v.get_object ();
+              HashMultiMap<string, WebServiceFieldDetails>
+                web_service_addresses =
+                (HashMultiMap<string, WebServiceFieldDetails>) v.get_object ();
               yield this._set_contact_web_service_addresses (contact,
                   web_service_addresses);
             }
@@ -668,9 +669,9 @@ public class Edsf.PersonaStore : Folks.PersonaStore
     }
 
   internal async void _set_web_service_addresses (Edsf.Persona persona,
-      MultiMap<string, string> web_service_addresses)
+      MultiMap<string, WebServiceFieldDetails> web_service_addresses)
     {
-      if (Utils.multi_map_str_str_equal (persona.web_service_addresses,
+      if (Utils.multi_map_str_afd_equal (persona.web_service_addresses,
             web_service_addresses))
         return;
 
@@ -688,7 +689,7 @@ public class Edsf.PersonaStore : Folks.PersonaStore
     }
 
   private async void _set_contact_web_service_addresses (E.Contact contact,
-      MultiMap<string, string> web_service_addresses)
+      MultiMap<string, WebServiceFieldDetails> web_service_addresses)
     {
       var attr = contact.get_attribute ("X-FOLKS-WEB-SERVICES-IDS");
       if (attr != null)
@@ -700,9 +701,9 @@ public class Edsf.PersonaStore : Folks.PersonaStore
       foreach (var service in web_service_addresses.get_keys ())
         {
           var param = new E.VCardAttributeParam (service);
-          foreach (var id in web_service_addresses.get (service))
+          foreach (var ws_fd in web_service_addresses.get (service))
             {
-              param.add_value (id);
+              param.add_value (ws_fd.value);
             }
           attr_n.add_param (param);
         }
diff --git a/backends/eds/lib/edsf-persona.vala b/backends/eds/lib/edsf-persona.vala
index b347388..a0f789a 100644
--- a/backends/eds/lib/edsf-persona.vala
+++ b/backends/eds/lib/edsf-persona.vala
@@ -127,7 +127,7 @@ public class Edsf.Persona : Folks.Persona,
   private HashSet<string> _local_ids;
   private Set<string> _local_ids_ro;
 
-  private HashMultiMap<string, string> _web_service_addresses;
+  private HashMultiMap<string, WebServiceFieldDetails> _web_service_addresses;
 
   /**
    * The e-d-s contact represented by this Persona
@@ -141,7 +141,7 @@ public class Edsf.Persona : Folks.Persona,
   /**
    * { inheritDoc}
    */
-  public MultiMap<string, string> web_service_addresses
+  public MultiMap<string, WebServiceFieldDetails> web_service_addresses
     {
       get { return this._web_service_addresses; }
       set
@@ -504,7 +504,11 @@ public class Edsf.Persona : Folks.Persona,
       this._postal_addresses_ro = this._postal_addresses.read_only_view;
       this._local_ids = new HashSet<string> ();
       this._local_ids_ro = this._local_ids.read_only_view;
-      this._web_service_addresses = new HashMultiMap<string, string> ();
+      this._web_service_addresses =
+        new HashMultiMap<string, WebServiceFieldDetails> (
+            null, null,
+            (GLib.HashFunc) WebServiceFieldDetails.hash,
+            (GLib.EqualFunc) WebServiceFieldDetails.equal);
       this._groups = new HashSet<string> ();
       this._groups_ro = this._groups.read_only_view;
 
@@ -543,8 +547,8 @@ public class Edsf.Persona : Folks.Persona,
               var web_service_addresses =
                   this._web_service_addresses.get (web_service);
 
-              foreach (string address in web_service_addresses)
-                  callback (web_service + ":" + address);
+              foreach (var ws_fd in web_service_addresses)
+                  callback (web_service + ":" + ws_fd.value);
             }
         }
       else
@@ -619,7 +623,8 @@ public class Edsf.Persona : Folks.Persona,
               var service_name = service.get_name ().down ();
               foreach (var service_id in service.get_values ())
                 {
-                  this._web_service_addresses.set (service_name, service_id);
+                  this._web_service_addresses.set (service_name,
+                      new WebServiceFieldDetails (service_id));
                 }
             }
         }
diff --git a/backends/key-file/kf-persona-store.vala b/backends/key-file/kf-persona-store.vala
index 722fce1..4f2efa9 100644
--- a/backends/key-file/kf-persona-store.vala
+++ b/backends/key-file/kf-persona-store.vala
@@ -312,9 +312,9 @@ public class Folks.Backends.Kf.PersonaStore : Folks.PersonaStore
           : null;
       unowned Value? val2 = details.lookup
           (this.detail_key (PersonaDetail.WEB_SERVICE_ADDRESSES));
-      MultiMap<string, string> web_service_addresses
+      MultiMap<string, WebServiceFieldDetails> web_service_addresses
           = val2 != null
-          ? (MultiMap<string, string>) val2.get_object ()
+          ? (MultiMap<string, WebServiceFieldDetails>) val2.get_object ()
           : null;
       uint im_addresses_size = (im_addresses == null)
           ? 0 : im_addresses.size;
diff --git a/backends/key-file/kf-persona.vala b/backends/key-file/kf-persona.vala
index 724a37c..4640dff 100644
--- a/backends/key-file/kf-persona.vala
+++ b/backends/key-file/kf-persona.vala
@@ -35,7 +35,7 @@ public class Folks.Backends.Kf.Persona : Folks.Persona,
 {
   private unowned GLib.KeyFile _key_file;
   private HashMultiMap<string, ImFieldDetails> _im_addresses;
-  private HashMultiMap<string, string> _web_service_addresses;
+  private HashMultiMap<string, WebServiceFieldDetails> _web_service_addresses;
   private string _alias;
   private const string[] _linkable_properties =
     {
@@ -164,7 +164,7 @@ public class Folks.Backends.Kf.Persona : Folks.Persona,
   /**
    * { inheritDoc}
    */
-  public MultiMap<string, string> web_service_addresses
+  public MultiMap<string, WebServiceFieldDetails> web_service_addresses
     {
       get
         { return this._web_service_addresses; }
@@ -176,7 +176,8 @@ public class Folks.Backends.Kf.Persona : Folks.Persona,
             {
               try
                 {
-                  this._key_file.remove_key (this.display_id, "web-service." + web_service);
+                  this._key_file.remove_key (this.display_id,
+                      "web-service." + web_service);
                 }
               catch (KeyFileError e)
                 {
@@ -187,22 +188,25 @@ public class Folks.Backends.Kf.Persona : Folks.Persona,
 
           /* Add the new web service addresses to the key file and build a
            * table of them to set as the new property value */
-          var web_service_addresses = new HashMultiMap<string, string> ();
+          var web_service_addresses =
+            new HashMultiMap<string, WebServiceFieldDetails> (
+                null, null,
+                (GLib.HashFunc) WebServiceFieldDetails.hash,
+                (GLib.EqualFunc) WebServiceFieldDetails.equal);
 
           foreach (var web_service in value.get_keys ())
             {
-              var addresses = value.get (web_service);
+              var ws_fds = value.get (web_service);
 
-              string[] addrs = (string[]) addresses.to_array ();
-              addrs.length = addresses.size;
+              string[] addrs = new string[0];
+              foreach (var ws_fd in ws_fds)
+                addrs += ws_fd.value;
 
               this._key_file.set_string_list (this.display_id,
                   "web-service." + web_service, addrs);
 
-              foreach (var address in addresses)
-                {
-                  web_service_addresses.set (web_service, address);
-                }
+              foreach (var ws_fd in ws_fds)
+                web_service_addresses.set (web_service, ws_fd);
             }
 
           this._web_service_addresses = web_service_addresses;
@@ -235,7 +239,11 @@ public class Folks.Backends.Kf.Persona : Folks.Persona,
       this._key_file = key_file;
       this._im_addresses = new HashMultiMap<string, ImFieldDetails> (
           null, null, ImFieldDetails.hash, (EqualFunc) ImFieldDetails.equal);
-      this._web_service_addresses = new HashMultiMap<string, string> ();
+      this._web_service_addresses =
+        new HashMultiMap<string, WebServiceFieldDetails> (
+            null, null,
+            (GLib.HashFunc) WebServiceFieldDetails.hash,
+            (GLib.EqualFunc) WebServiceFieldDetails.equal);
 
       /* Load the IM addresses from the key file */
       try
@@ -264,7 +272,7 @@ public class Folks.Backends.Kf.Persona : Folks.Persona,
                   foreach (var web_service_address in web_service_addresses)
                     {
                       this._web_service_addresses.set (web_service,
-                          web_service_address);
+                          new WebServiceFieldDetails (web_service_address));
                     }
 
                   continue;
@@ -332,8 +340,8 @@ public class Folks.Backends.Kf.Persona : Folks.Persona,
               var web_service_addresses =
                   this._web_service_addresses.get (web_service);
 
-              foreach (string address in web_service_addresses)
-                  callback (web_service + ":" + address);
+              foreach (var ws_fd in web_service_addresses)
+                  callback (web_service + ":" + ws_fd.value);
             }
         }
       else
diff --git a/backends/libsocialweb/lib/swf-persona.vala b/backends/libsocialweb/lib/swf-persona.vala
index b5676c9..d544270 100644
--- a/backends/libsocialweb/lib/swf-persona.vala
+++ b/backends/libsocialweb/lib/swf-persona.vala
@@ -120,8 +120,11 @@ public class Swf.Persona : Folks.Persona,
       new HashMultiMap<string, ImFieldDetails> (null, null,
           ImFieldDetails.hash, (EqualFunc) ImFieldDetails.equal);
 
-  private HashMultiMap<string, string> _web_service_addresses =
-      new HashMultiMap<string, string> ();
+  private HashMultiMap<string, WebServiceFieldDetails> _web_service_addresses =
+      new HashMultiMap<string, WebServiceFieldDetails> (
+          null, null,
+          (GLib.HashFunc) WebServiceFieldDetails.hash,
+          (GLib.EqualFunc) WebServiceFieldDetails.equal);
 
   /**
    * { inheritDoc}
@@ -250,7 +253,8 @@ public class Swf.Persona : Folks.Persona,
             }
         }
 
-      this._web_service_addresses.set (service, id);
+      this._web_service_addresses.set (service,
+          new WebServiceFieldDetails (id));
 
       update (contact);
     }
diff --git a/backends/tracker/lib/trf-persona-store.vala b/backends/tracker/lib/trf-persona-store.vala
index d1ef72b..c5ee25f 100644
--- a/backends/tracker/lib/trf-persona-store.vala
+++ b/backends/tracker/lib/trf-persona-store.vala
@@ -664,8 +664,8 @@ public class Trf.PersonaStore : Folks.PersonaStore
               Folks.PersonaStore.detail_key (
                   PersonaDetail.WEB_SERVICE_ADDRESSES))
             {
-              MultiMap<string, string> ws_obj =
-                (MultiMap<string, string>) v.get_object ();
+              var ws_obj =
+                (MultiMap<string, WebServiceFieldDetails>) v.get_object ();
 
               var ws_addrs = Trf.PersonaStore.serialize_web_services (ws_obj);
 
@@ -732,7 +732,7 @@ public class Trf.PersonaStore : Folks.PersonaStore
    * @since 0.5.1
    */
   public static string serialize_web_services (
-      MultiMap<string, string> ws_obj)
+      MultiMap<string, WebServiceFieldDetails> ws_obj)
     {
       var str = "";
 
@@ -745,16 +745,16 @@ public class Trf.PersonaStore : Folks.PersonaStore
 
           str += service + ":";
 
-          var addrs = ws_obj.get (service);
+          var ws_fds = ws_obj.get (service);
           bool first = true;
-          foreach (var addr in addrs)
+          foreach (var ws_fd in ws_fds)
             {
               if (first == false)
                 {
                   str += ",";
                 }
 
-              str += addr;
+              str += ws_fd.value;
               first = false;
             }
         }
@@ -768,10 +768,14 @@ public class Trf.PersonaStore : Folks.PersonaStore
    *
    * @since 0.5.1
    */
-  public static MultiMap<string, string> unserialize_web_services
-      (string ws_addrs)
+  public static
+    MultiMap<string, WebServiceFieldDetails> unserialize_web_services (
+        string ws_addrs)
     {
-      var ret = new HashMultiMap<string, string> ();
+      var ret = new HashMultiMap<string, WebServiceFieldDetails> (
+          null, null,
+          (GLib.HashFunc) WebServiceFieldDetails.hash,
+          (GLib.EqualFunc) WebServiceFieldDetails.equal);
 
       var services = ws_addrs.split (";");
       foreach (var service_line in services)
@@ -782,7 +786,7 @@ public class Trf.PersonaStore : Folks.PersonaStore
 
             foreach (var a in addrs)
               {
-                ret.set (service_name, a);
+                ret.set (service_name, new WebServiceFieldDetails (a));
               }
           }
 
@@ -1875,7 +1879,7 @@ public class Trf.PersonaStore : Folks.PersonaStore
     }
 
   internal async void _set_web_service_addrs (Trf.Persona persona,
-      MultiMap<string, string> ws_obj)
+      MultiMap<string, WebServiceFieldDetails> ws_obj)
     {
       var ws_addrs = Trf.PersonaStore.serialize_web_services (ws_obj);
       yield this._set_tracker_property (persona,
diff --git a/backends/tracker/lib/trf-persona.vala b/backends/tracker/lib/trf-persona.vala
index 9024eb2..5b97a52 100644
--- a/backends/tracker/lib/trf-persona.vala
+++ b/backends/tracker/lib/trf-persona.vala
@@ -341,13 +341,16 @@ public class Trf.Persona : Folks.Persona,
         }
     }
 
-  private HashMultiMap<string, string> _web_service_addresses =
-      new HashMultiMap<string, string> ();
+  private HashMultiMap<string, WebServiceFieldDetails> _web_service_addresses =
+      new HashMultiMap<string, WebServiceFieldDetails> (
+          null, null,
+          (GLib.HashFunc) WebServiceFieldDetails.hash,
+          (GLib.EqualFunc) WebServiceFieldDetails.equal);
 
   /**
    * { inheritDoc}
    */
-  public MultiMap<string, string> web_service_addresses
+  public MultiMap<string, WebServiceFieldDetails> web_service_addresses
     {
       get { return this._web_service_addresses; }
       set
@@ -473,8 +476,8 @@ public class Trf.Persona : Folks.Persona,
               var web_service_addresses =
                   this._web_service_addresses.get (web_service);
 
-              foreach (string address in web_service_addresses)
-                  callback (web_service + ":" + address);
+              foreach (var ws_fd in web_service_addresses)
+                  callback (web_service + ":" + ws_fd.value);
             }
         }
       else
@@ -870,7 +873,7 @@ public class Trf.Persona : Folks.Persona,
   internal bool _set_web_service_addrs (string ws_addrs)
     {
       this._web_service_addresses =
-        (HashMultiMap<string, string>)
+        (HashMultiMap<string, WebServiceFieldDetails>)
             Trf.PersonaStore.unserialize_web_services (ws_addrs);
       this.notify_property ("web-service-addresses");
       return true;
diff --git a/folks/individual-aggregator.vala b/folks/individual-aggregator.vala
index ec10d28..e42715c 100644
--- a/folks/individual-aggregator.vala
+++ b/folks/individual-aggregator.vala
@@ -1152,8 +1152,15 @@ public class Folks.IndividualAggregator : Object
           this._configured_writeable_store_type_id);
 
       /* `protocols_addrs_set` will be passed to the new Kf.Persona */
-      var protocols_addrs_set = new HashMultiMap<string, ImFieldDetails> ();
-      var web_service_addrs_set = new HashMultiMap<string, string> ();
+      var protocols_addrs_set = new HashMultiMap<string, ImFieldDetails> (
+            null, null,
+            (GLib.HashFunc) ImFieldDetails.hash,
+            (GLib.EqualFunc) ImFieldDetails.equal);
+      var web_service_addrs_set =
+        new HashMultiMap<string, WebServiceFieldDetails> (
+            null, null,
+            (GLib.HashFunc) WebServiceFieldDetails.hash,
+            (GLib.EqualFunc) WebServiceFieldDetails.equal);
 
       /* List of local_ids */
       var local_ids = new Gee.HashSet<string> ();
@@ -1187,10 +1194,8 @@ public class Folks.IndividualAggregator : Object
                   var ws_addresses =
                       ws_details.web_service_addresses.get (web_service);
 
-                  foreach (var ws_address in ws_addresses)
-                    {
-                      web_service_addrs_set.set (web_service, ws_address);
-                    }
+                  foreach (var ws_fd in ws_addresses)
+                    web_service_addrs_set.set (web_service, ws_fd);
                 }
             }
 
diff --git a/folks/individual.vala b/folks/individual.vala
index 9ca9ee4..959a612 100644
--- a/folks/individual.vala
+++ b/folks/individual.vala
@@ -97,7 +97,7 @@ public class Folks.Individual : Object,
    * Persona.is_user == true. Iff this is > 0, Individual.is_user == true. */
   private uint _persona_user_count = 0;
   private HashMultiMap<string, ImFieldDetails> _im_addresses;
-  private HashMultiMap<string, string> _web_service_addresses;
+  private HashMultiMap<string, WebServiceFieldDetails> _web_service_addresses;
   private string _nickname = "";
 
   /**
@@ -506,7 +506,7 @@ public class Folks.Individual : Object,
   /**
    * { inheritDoc}
    */
-  public MultiMap<string, string> web_service_addresses
+  public MultiMap<string, WebServiceFieldDetails> web_service_addresses
     {
       get { return this._web_service_addresses; }
       private set {}
@@ -689,7 +689,11 @@ public class Folks.Individual : Object,
 
       this._im_addresses = new HashMultiMap<string, ImFieldDetails> (
           null, null, ImFieldDetails.hash, (EqualFunc) ImFieldDetails.equal);
-      this._web_service_addresses = new HashMultiMap<string, string> ();
+      this._web_service_addresses =
+        new HashMultiMap<string, WebServiceFieldDetails> (
+            null, null,
+            (GLib.HashFunc) WebServiceFieldDetails.hash,
+            (GLib.EqualFunc) WebServiceFieldDetails.equal);
       this._persona_set =
           new HashSet<Persona> (direct_hash, direct_equal);
       this._persona_set_ro = this._persona_set.read_only_view;
@@ -1107,11 +1111,8 @@ public class Folks.Individual : Object,
                       web_service_details.web_service_addresses.get (
                           cur_web_service);
 
-                  foreach (var address in cur_addresses)
-                    {
-                      this._web_service_addresses.set (cur_web_service,
-                          address);
-                    }
+                  foreach (var ws_fd in cur_addresses)
+                    this._web_service_addresses.set (cur_web_service, ws_fd);
                 }
             }
         }
diff --git a/folks/web-service-details.vala b/folks/web-service-details.vala
index 7e848a0..35a31bc 100644
--- a/folks/web-service-details.vala
+++ b/folks/web-service-details.vala
@@ -21,8 +21,58 @@
 using Gee;
 
 /**
- * web service addresses exposed by an object implementing
- * { link PresenceDetails}.
+ * Object representing a web service contact that can have some parameters
+ * associated with it.
+ *
+ * See { link Folks.AbstractFieldDetails}.
+ *
+ * @since UNRELEASED
+ */
+public class Folks.WebServiceFieldDetails : AbstractFieldDetails<string>
+{
+  /**
+   * Create a new WebServiceFieldDetails.
+   *
+   * @param value the value of the field
+   * @param parameters initial parameters. See
+   * { link AbstractFieldDetails.parameters}. A `null` value is equivalent to an
+   * empty map of parameters.
+   *
+   * @return a new WebServiceFieldDetails
+   *
+   * @since UNRELEASED
+   */
+  public WebServiceFieldDetails (string value,
+      MultiMap<string, string>? parameters = null)
+    {
+      this.value = value;
+      if (parameters != null)
+        this.parameters = parameters;
+    }
+
+  /**
+   * { inheritDoc}
+   *
+   * @since UNRELEASED
+   */
+  public override bool equal (AbstractFieldDetails<string> that)
+    {
+      return base.equal<string> (that);
+    }
+
+  /**
+   * { inheritDoc}
+   *
+   * @since UNRELEASED
+   */
+  public override uint hash ()
+    {
+      return base.hash ();
+    }
+}
+
+/**
+ * Web service contact details.
  *
  * @since 0.5.0
  */
@@ -37,9 +87,10 @@ public interface Folks.WebServiceDetails : Object
    * Web service addresses are guaranteed to be unique per web service, but
    * not necessarily unique amongst all web services.
    *
-   * @since 0.5.1
+   * @since UNRELEASED
    */
-  public abstract Gee.MultiMap<string, string> web_service_addresses
+  public abstract
+    Gee.MultiMap<string, WebServiceFieldDetails> web_service_addresses
     {
       get; set;
     }
diff --git a/tests/eds/link-personas.vala b/tests/eds/link-personas.vala
index d3556f5..1eaeca3 100644
--- a/tests/eds/link-personas.vala
+++ b/tests/eds/link-personas.vala
@@ -212,9 +212,12 @@ public class LinkPersonasTests : Folks.TestCase
         }
       else if (this._linking_method == LinkingMethod.WEB_SERVICE_ADDRESSES)
         {
-          v1 = Value (typeof (MultiMap<string, string>));
-          var wsa1 = new HashMultiMap<string, string> ();
-          wsa1.set ("twitter", this._im_address_1);
+          v1 = Value (typeof (MultiMap<string, WebServiceFieldDetails>));
+          var wsa1 = new HashMultiMap<string, WebServiceFieldDetails> (
+              null, null,
+              (GLib.HashFunc) WebServiceFieldDetails.hash,
+              (GLib.EqualFunc) WebServiceFieldDetails.equal);
+          wsa1.set ("twitter", new WebServiceFieldDetails (this._im_address_1));
           v1.set_object (wsa1);
           details1.insert (wsk, (owned) v1);
         }
@@ -240,9 +243,12 @@ public class LinkPersonasTests : Folks.TestCase
         }
       else if (this._linking_method == LinkingMethod.WEB_SERVICE_ADDRESSES)
         {
-          v3 = Value (typeof (MultiMap<string, string>));
-          var wsa2 = new HashMultiMap<string, string> ();
-          wsa2.set ("lastfm", this._im_address_2);
+          v3 = Value (typeof (MultiMap<string, WebServiceFieldDetails>));
+          var wsa2 = new HashMultiMap<string, WebServiceFieldDetails> (
+              null, null,
+              (GLib.HashFunc) WebServiceFieldDetails.hash,
+              (GLib.EqualFunc) WebServiceFieldDetails.equal);
+          wsa2.set ("lastfm", new WebServiceFieldDetails (this._im_address_2));
           v3.set_object (wsa2);
           details2.insert (wsk, (owned) v3);
         }
@@ -362,14 +368,18 @@ public class LinkPersonasTests : Folks.TestCase
             {
               foreach (var service in i.web_service_addresses.get_keys ())
                 {
-                  var ws_ids = i.web_service_addresses.get (service);
-                  foreach (var ws_id in ws_ids)
+                  var ws_fds = i.web_service_addresses.get (service);
+                  foreach (var ws_fd in ws_fds)
                     {
-                      if (ws_id == this._linking_props.get ("prop1"))
+                      if (ws_fd.equal (
+                            new WebServiceFieldDetails (
+                                this._linking_props.get ("prop1"))))
                         {
                           this._linking_props.unset ("prop1");
                         }
-                      else if (ws_id == this._linking_props.get ("prop2"))
+                      else if (ws_fd.equal (
+                            new WebServiceFieldDetails (
+                                this._linking_props.get ("prop2"))))
                         {
                           this._linking_props.unset ("prop2");
                         }



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