Closes: bug#655921 - Change RoleDetails.roles to support vCard-like arbitrary parameters
class
* Bug 653682 — Change WebServiceDetails.web_service_addresses to support
vCard-like arbitrary parameters
+* Bug 655921 — Change RoleDetails.roles to support vCard-like arbitrary
+ parameters
API changes:
* Swf.Persona retains and exposes its libsocialweb Contact
* Remove all PhoneDetails functions (obsoleted by PhoneFieldDetails)
* Add and use WebServiceFieldDetails for
WebServiceFieldDetails.web_service_addresses
+* Use RoleFieldDetails for RoleDetails.roles
Overview of changes from libfolks 0.5.1 to libfolks 0.5.2
=========================================================
}
else if (k == Folks.PersonaStore.detail_key (PersonaDetail.ROLES))
{
- var roles = (Gee.HashSet<Role>) v.get_object ();
+ var roles = (Gee.HashSet<RoleFieldDetails>) v.get_object ();
int roles_cnt = 0;
- foreach (var r in roles)
+ foreach (var role_fd in roles)
{
var role_affl = "_:role_affl%d".printf (roles_cnt);
builder.predicate ("a");
builder.object (Trf.OntologyDefs.NCO_AFFILIATION);
builder.predicate (Trf.OntologyDefs.NCO_ROLE);
- builder.object_string (r.role);
- builder.predicate (Trf.OntologyDefs.NCO_ORG);
- builder.object_string (r.organisation_name);
+ builder.object_string (role_fd.value.role);
builder.predicate (Trf.OntologyDefs.NCO_TITLE);
- builder.object_string (r.title);
+ builder.object_string (role_fd.value.title);
+ builder.predicate (Trf.OntologyDefs.NCO_ORG);
+ builder.object_string (role_fd.value.organisation_name);
builder.subject ("_:p");
builder.predicate (Trf.OntologyDefs.NCO_HAS_AFFILIATION);
}
internal async void _set_roles (Folks.Persona persona,
- Set<Role> roles)
+ Set<RoleFieldDetails> roles)
{
const string del_t = "DELETE { " +
" ?p " + Trf.OntologyDefs.NCO_HAS_AFFILIATION + " ?a " +
builder.insert_open (null);
int i = 0;
- foreach (var r in roles)
+ foreach (var role_fd in roles)
{
string affl = "_:a%d".printf (i);
builder.predicate ("a");
builder.object (Trf.OntologyDefs.NCO_AFFILIATION);
builder.predicate (Trf.OntologyDefs.NCO_ROLE);
- builder.object_string (r.role);
- builder.predicate (Trf.OntologyDefs.NCO_ORG);
- builder.object_string (r.organisation_name);
+ builder.object_string (role_fd.value.role);
builder.predicate (Trf.OntologyDefs.NCO_TITLE);
- builder.object_string (r.title);
+ builder.object_string (role_fd.value.title);
+ builder.predicate (Trf.OntologyDefs.NCO_ORG);
+ builder.object_string (role_fd.value.organisation_name);
builder.subject ("?contact");
builder.predicate (Trf.OntologyDefs.NCO_HAS_AFFILIATION);
builder.object (affl);
private set {}
}
- private HashSet<Role> _roles;
- private Set<Role> _roles_ro;
+ private HashSet<RoleFieldDetails> _roles;
+ private Set<RoleFieldDetails> _roles_ro;
/**
* {@inheritDoc}
*/
- public Set<Role> roles
+ public Set<RoleFieldDetails> roles
{
get { return this._roles_ro; }
public set
(GLib.HashFunc) EmailFieldDetails.hash,
(GLib.EqualFunc) EmailFieldDetails.equal);
this._email_addresses_ro = this._email_addresses.read_only_view;
- this._roles = new HashSet<Role> ((GLib.HashFunc) Role.hash,
- (GLib.EqualFunc) Role.equal);
+ this._roles = new HashSet<RoleFieldDetails> (
+ (GLib.HashFunc) RoleFieldDetails.hash,
+ (GLib.EqualFunc) RoleFieldDetails.equal);
this._roles_ro = this._roles.read_only_view;
this._notes = new HashSet<NoteFieldDetails> (
(GLib.HashFunc) NoteFieldDetails.hash,
return;
}
- HashSet<Role> roles = new HashSet<Role> (
- (GLib.HashFunc) Role.hash,
- (GLib.EqualFunc) Role.equal);
+ HashSet<RoleFieldDetails> role_fds = new HashSet<RoleFieldDetails> (
+ (GLib.HashFunc) RoleFieldDetails.hash,
+ (GLib.EqualFunc) RoleFieldDetails.equal);
string[] roles_a = roles_field.split ("\n");
var new_role = new Role (title, organisation, tracker_id);
new_role.role = role;
- roles.add (new_role);
+ var role_fd = new RoleFieldDetails (new_role);
+ role_fds.add (role_fd);
}
- this._roles = roles;
+ this._roles = role_fds;
this._roles_ro = this._roles.read_only_view;
}
{
var new_role = new Role (title, org, tracker_id);
new_role.role = role;
-
- if (this._roles.add (new_role))
+ var role_fd = new RoleFieldDetails (new_role);
+ if (this._roles.add (role_fd))
{
this.notify_property ("roles");
return true;
internal bool _remove_role (string tracker_id)
{
- foreach (var r in this._roles)
+ foreach (var role_fd in this._roles)
{
- if (r.uid == tracker_id)
+ if (role_fd.value.uid == tracker_id)
{
- this._roles.remove (r);
+ this._roles.remove (role_fd);
this.notify_property ("roles");
return true;
}
}
}
- private HashSet<Role> _roles;
- private Set<Role> _roles_ro;
+ private HashSet<RoleFieldDetails> _roles;
+ private Set<RoleFieldDetails> _roles_ro;
/**
* {@inheritDoc}
*/
- public Set<Role> roles
+ public Set<RoleFieldDetails> roles
{
get { return this._roles_ro; }
private set
(GLib.HashFunc) EmailFieldDetails.hash,
(GLib.EqualFunc) EmailFieldDetails.equal);
this._email_addresses_ro = this._email_addresses.read_only_view;
- this._roles = new HashSet<Role>
- ((GLib.HashFunc) Role.hash, (GLib.EqualFunc) Role.equal);
+ this._roles = new HashSet<RoleFieldDetails> (
+ (GLib.HashFunc) RoleFieldDetails.hash,
+ (GLib.EqualFunc) RoleFieldDetails.equal);
this._roles_ro = this._roles.read_only_view;
this._local_ids = new HashSet<string> ();
this._local_ids_ro = this._local_ids.read_only_view;
var role_details = persona as RoleDetails;
if (role_details != null)
{
- foreach (var r in role_details.roles)
+ foreach (var role_fd in role_details.roles)
{
- this._roles.add (r);
+ this._roles.add (role_fd);
}
}
}
*
* Authors:
* Raul Gutierrez Segales <raul.gutierrez.segales@collabora.co.uk>
+ * Travis Reitter <travis.reitter@collabora.co.uk>
*/
using Gee;
}
/**
+ * Object representing details of a contact in an organisation which can have
+ * some parameters associated with it.
+ *
+ * See {@link Folks.AbstractFieldDetails}.
+ *
+ * @since UNRELEASED
+ */
+public class Folks.RoleFieldDetails : AbstractFieldDetails<Role>
+{
+ /**
+ * Create a new RoleFieldDetails.
+ *
+ * @param value the {@link Role}} 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 RoleFieldDetails
+ *
+ * @since UNRELEASED
+ */
+ public RoleFieldDetails (Role 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)
+ {
+ var that_fd = that as RoleFieldDetails;
+
+ if (that_fd == null)
+ return false;
+
+ return Role.equal (this.value, that_fd.value);
+ }
+
+ /**
+ * {@inheritDoc}
+ *
+ * @since UNRELEASED
+ */
+ public override uint hash ()
+ {
+ return str_hash (this.value.to_string ());
+ }
+}
+
+/**
* This interfaces represents the list of roles a {@link Persona} and
* {@link Individual} might have.
*
/**
* The roles of the contact.
*
- * @since 0.5.1
+ * @since UNRELEASED
*/
- public abstract Set<Role> roles { get; set; }
+ public abstract Set<RoleFieldDetails> roles { get; set; }
}
(owned) v11);
Value? v12 = Value (typeof (Set<Role>));
- var roles = new HashSet<Role> ();
- Role r1 = new Role (this._title_1, this._organisation_1);
+ var role_fds = new HashSet<RoleFieldDetails> (
+ (GLib.HashFunc) RoleFieldDetails.hash,
+ (GLib.EqualFunc) RoleFieldDetails.equal);
+ var r1 = new Role (this._title_1, this._organisation_1);
r1.role = this._role_1;
- roles.add (r1);
- v12.set_object (roles);
+ var role_fd1 = new RoleFieldDetails (r1);
+ role_fds.add (role_fd1);
+ v12.set_object (role_fds);
details.insert (Folks.PersonaStore.detail_key (PersonaDetail.ROLES),
(owned) v12);
}
}
- foreach (var r in i.roles)
+ foreach (var role_fd in i.roles)
{
- if (r.title == this._title_1 &&
- r.organisation_name == this._organisation_1 &&
- r.role == this._role_1)
- {
- this._properties_found.replace ("role-1", true);
- }
+ var role_expected = new Role (this._title_1, this._organisation_1);
+ role_expected.role = this._role_1;
+ var role_fd_expected = new RoleFieldDetails (role_expected);
+ if (role_fd.equal (role_fd_expected))
+ this._properties_found.replace ("role-1", true);
}
foreach (var pafd in i.postal_addresses)
{
if (i.full_name == this._fullname)
{
- foreach (var role in i.roles)
+ foreach (var role_fd in i.roles)
{
- if (role.title == "boss" &&
- role.organisation_name == "Company" &&
- role.role == "Role")
+ var role_expected = new Role ("boss", "Company");
+ role_expected.role = "Role";
+ var role_fd_expected = new RoleFieldDetails (role_expected);
+ if (role_fd.equal (role_fd_expected))
{
this._found_role = true;
this._main_loop.quit ();
private IndividualAggregator _aggregator;
private string _persona_fullname;
private bool _role_found;
- private Role _role;
+ private RoleFieldDetails _role_fd;
public SetRolesTests ()
{
c1.set (Trf.OntologyDefs.NCO_FULLNAME, this._persona_fullname);
this._tracker_backend.add_contact (c1);
- this._role = new Role ("some title", "some organisation");
- this._role.role = "some role";
+ var role = new Role ("some title", "some organisation");
+ role.role = "some role";
+ this._role_fd = new RoleFieldDetails (role);
this._tracker_backend.set_up ();
{
i.notify["roles"].connect (this._notify_roles_cb);
- Gee.HashSet<Role> roles = new HashSet<Role>
- ((GLib.HashFunc) Role.hash, (GLib.EqualFunc) Role.equal);
- var r = new Role ("some title", "some organisation");
- r.role = "some role";
- roles.add ((owned) r);
+ Gee.HashSet<RoleFieldDetails> role_fds =
+ new HashSet<RoleFieldDetails>
+ ((GLib.HashFunc) RoleFieldDetails.hash,
+ (GLib.EqualFunc) RoleFieldDetails.equal);
+ var role = new Role ("some title", "some organisation");
+ role.role = "some role";
+ var role_fd = new RoleFieldDetails (role);
+ role_fds.add ((owned) role_fd);
foreach (var p in i.personas)
{
- ((RoleDetails) p).roles = roles;
+ ((RoleDetails) p).roles = role_fds;
}
}
}
Folks.Individual i = (Folks.Individual) individual_obj;
if (i.full_name == this._persona_fullname)
{
- foreach (var r in i.roles)
+ foreach (var role_fd in i.roles)
{
- if (Role.equal (r, this._role))
+ if (role_fd.equal (this._role_fd))
{
this._role_found = true;
this._main_loop.quit ();