SeasidePerson *SeasideCache::personByPhoneNumber(const QString &msisdn)
{
    QHash<QString, QContactLocalId>::iterator it = instance->m_phoneNumberIds.find(msisdn);
    if (it != instance->m_phoneNumberIds.end())
        return personById(*it);
    return 0;
}
QString SeasidePeopleModel::exportContacts() const
{
    QVersitContactExporter exporter;

    QList<QContact> contacts;
    contacts.reserve(priv->contactIds.size());

    foreach (const QContactLocalId &contactId, priv->contactIds) {
        SeasidePerson *p = personById(contactId);

        if (p->id() == manager()->selfContactId())
            continue;

        contacts.append(p->contact());
    }

    if (!exporter.exportContacts(contacts)) {
        qWarning() << Q_FUNC_INFO << "Failed to export contacts: " << exporter.errorMap();
        return QString();
    }

    QFile
        vcard(QDesktopServices::storageLocation(QDesktopServices::DocumentsLocation)
              + QDir::separator()
              + QDateTime::currentDateTime().toString("ss_mm_hh_dd_mm_yyyy")
              + ".vcf");

    if (!vcard.open(QIODevice::WriteOnly)) {
        qWarning() << "Cannot open " << vcard.fileName();
        return QString();
    }

    QVersitWriter writer(&vcard);
    if (!writer.startWriting(exporter.documents())) {
        qWarning() << Q_FUNC_INFO << "Can't start writing vcards " << writer.error();
        return QString();
    }

    // TODO: thread
    writer.waitForFinished();
    return vcard.fileName();
}
SeasidePerson *SeasideCache::selfPerson()
{
    return personById(instance->m_manager.selfContactId());
}