/*
* Copyright (C) 2012 Collabora Ltd.
*
* This library is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 2.1 of the License, or
* (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this library. If not, see .
*
* Authors:
* Jeremy Whiting
*
* Based on kf-persona.vala by:
* Philip Withnall
*/
using GLib;
using Gee;
using Folks;
using Folks.Backends.Ofono;
/**
* A persona subclass which represents a single persona from a simple key file.
*
* @since 0.9.0
*/
public class Folks.Backends.Ofono.Persona : Folks.Persona,
EmailDetails,
NameDetails,
PhoneDetails
{
private StructuredName? _structured_name = null;
private string _full_name = "";
private string _nickname = "";
private SmallSet _phone_numbers;
private Set _phone_numbers_ro;
private SmallSet _email_addresses;
private Set _email_addresses_ro;
private const string[] _linkable_properties =
{
"phone-numbers",
"email-addresses",
null /* FIXME: https://bugzilla.gnome.org/show_bug.cgi?id=682698 */
};
private static string[] _writeable_properties = {};
/**
* {@inheritDoc}
*/
public override string[] linkable_properties
{
get { return Ofono.Persona._linkable_properties; }
}
/**
* {@inheritDoc}
*/
public override string[] writeable_properties
{
get { return Ofono.Persona._writeable_properties; }
}
/**
* {@inheritDoc}
*/
[CCode (notify = false)]
public Set phone_numbers
{
get { return this._phone_numbers_ro; }
set { this.change_phone_numbers.begin (value); } /* not writeable */
}
/**
* {@inheritDoc}
*/
[CCode (notify = false)]
public StructuredName? structured_name
{
get { return this._structured_name; }
set { this.change_structured_name.begin (value); } /* not writeable */
}
/**
* {@inheritDoc}
*/
[CCode (notify = false)]
public string full_name
{
get { return this._full_name; }
set { this.change_full_name.begin (value); } /* not writeable */
}
/**
* {@inheritDoc}
*/
[CCode (notify = false)]
public string nickname
{
get { return this._nickname; }
set { this.change_nickname.begin (value); } /* not writeable */
}
/**
* {@inheritDoc}
*/
[CCode (notify = false)]
public Set email_addresses
{
get { return this._email_addresses_ro; }
set { this.change_email_addresses.begin (value); } /* not writeable */
}
/**
* Create a new persona.
*
* Create a new persona for the given vCard contents.
*
* @param vcard the vCard data to use for this {@link Persona}.
* @param store the {@link PersonaStore} this {@link Persona} belongs to.
*
* @since 0.9.0
*/
public Persona (string vcard, Folks.PersonaStore store)
{
var iid = Checksum.compute_for_string (ChecksumType.SHA1, vcard);
var uid = Folks.Persona.build_uid ("ofono", store.id, iid);
/* Use the IID as the display ID since no other suitable identifier is
* available which we can guarantee is unique within the store. */
Object (display_id: iid,
iid: iid,
uid: uid,
store: store,
is_user: false);
this._set_vcard (vcard);
}
construct
{
debug ("Adding Ofono Persona '%s' (IID '%s', group '%s')", this.uid,
this.iid, this.display_id);
this._phone_numbers = new SmallSet ();
this._phone_numbers_ro = this._phone_numbers.read_only_view;
this._email_addresses = new SmallSet ();
this._email_addresses_ro = this._email_addresses.read_only_view;
}
private void _set_vcard (string vcard)
{
E.VCard card = new E.VCard.from_string (vcard);
E.VCardAttribute? attribute = card.get_attribute ("TEL");
if (attribute != null)
{
this._phone_numbers.add (new PhoneFieldDetails (attribute.get_value_decoded ().str) );
}
attribute = card.get_attribute ("FN");
if (attribute != null)
{
this._full_name = attribute.get_value_decoded ().str;
}
attribute = card.get_attribute ("NICKNAME");
if (attribute != null)
{
this._nickname = attribute.get_value_decoded ().str;
}
attribute = card.get_attribute ("N");
if (attribute != null)
{
unowned GLib.List values = attribute.get_values_decoded ();
if (values.length () >= 5)
{
this._structured_name = new StructuredName (values.nth_data (0).str,
values.nth_data (1).str,
values.nth_data (2).str,
values.nth_data (3).str,
values.nth_data (4).str);
}
else
{
warning ("Expected 5 components to N value of vcard, got %u", values.length ());
}
}
attribute = card.get_attribute ("EMAIL");
if (attribute != null)
{
this._email_addresses.add (new EmailFieldDetails (attribute.get_value_decoded ().str) );
}
}
/**
* {@inheritDoc}
*/
public override void linkable_property_to_links (string prop_name,
Folks.Persona.LinkablePropertyCallback callback)
{
if (prop_name == "phone-numbers")
{
foreach (var phone_number in this._phone_numbers)
{
if (phone_number.value != null)
callback (phone_number.value);
}
}
else if (prop_name == "email-addresses")
{
foreach (var email_address in this._email_addresses)
{
if (email_address.value != null)
callback (email_address.value);
}
}
else
{
/* Chain up */
base.linkable_property_to_links (prop_name, callback);
}
}
}