52
56
#include "../lib/phonedirectorymodel.h"
53
57
#include "../lib/numbercategorymodel.h"
54
58
#include "../lib/numbercategory.h"
59
#include "../lib/contactmodel.h"
55
60
#include "kcfg_settings.h"
57
///Init static attributes
58
AkonadiBackend* AkonadiBackend::m_pInstance = nullptr;
62
Akonadi::Session* AkonadiBackend::m_pSession = nullptr;
63
QHash<Akonadi::Collection::Id, AkonadiBackend*> AkonadiBackend::m_hParentLookup;
61
AkonadiBackend::AkonadiBackend(QObject* parent) : AbstractContactBackend(parent)
63
m_pSession = new Akonadi::Session( "SFLPhone::instance" );
66
AkonadiBackend::AkonadiBackend(const Akonadi::Collection& parentCol, QObject* parent) :
67
AbstractContactBackend(m_hParentLookup[parentCol.parent()],parent),m_pJob(nullptr),
68
m_pMonitor(nullptr),m_isEnabled(false),m_wasEnabled(false)
71
m_pSession = new Akonadi::Session( "SFLPhone::instance" );
72
setObjectName(parentCol.name());
74
m_hParentLookup[m_Coll.id()] = this;
78
AkonadiBackend::~AkonadiBackend()
84
m_lBackendContacts.clear();
89
QString AkonadiBackend::name () const
92
Akonadi::EntityDisplayAttribute* attr = m_Coll.attribute<Akonadi::EntityDisplayAttribute>();
94
name = attr->displayName().trimmed();
95
return name.isEmpty()?m_Coll.name():name;
98
QVariant AkonadiBackend::icon() const
100
Akonadi::EntityDisplayAttribute* attr = m_Coll.attribute<Akonadi::EntityDisplayAttribute>();
102
return QVariant(attr->icon());
106
bool AkonadiBackend::isEnabled() const
111
bool AkonadiBackend::load()
113
Akonadi::ItemFetchScope scope;
114
scope.fetchFullPayload(true);
65
116
// fetching all collections recursively, starting at the root collection
66
m_pJob = new Akonadi::CollectionFetchJob( Akonadi::Collection::root(), Akonadi::CollectionFetchJob::Recursive, this );
67
m_pJob->fetchScope().setContentMimeTypes( QStringList() << "text/directory" );
68
connect( m_pJob, SIGNAL(collectionsReceived(Akonadi::Collection::List)), this, SLOT(collectionsReceived(Akonadi::Collection::List)) );
117
m_pJob = new Akonadi::ItemFetchJob( m_Coll, this );
118
m_pJob->setFetchScope(scope);
119
// m_pJob->fetchScope().setContentMimeTypes( QStringList() << "text/x-vcard" );
120
connect( m_pJob, SIGNAL(itemsReceived(Akonadi::Item::List)), this, SLOT(itemsReceived(Akonadi::Item::List)) );
70
122
//Configure change monitor
71
123
m_pMonitor = new Akonadi::Monitor(this);
72
124
m_pMonitor->fetchCollectionStatistics(false);
73
Akonadi::ItemFetchScope scope;
74
scope.fetchFullPayload(true);
75
125
m_pMonitor->setItemFetchScope(scope);
76
connect(m_pMonitor,SIGNAL(itemAdded(Akonadi::Item,Akonadi::Collection)),
77
this,SLOT(slotItemAdded(Akonadi::Item,Akonadi::Collection)));
78
connect(m_pMonitor,SIGNAL(itemChanged(const Akonadi::Item,const QSet<QByteArray>)),
79
this,SLOT(slotItemChanged(const Akonadi::Item,const QSet<QByteArray>)));
80
connect(m_pMonitor,SIGNAL(itemRemoved(const Akonadi::Item)),
81
this,SLOT(slotItemRemoved(const Akonadi::Item)));
85
AkonadiBackend::~AkonadiBackend()
88
if (Call::contactBackend() == this)
89
Call::setContactBackend(nullptr);
95
/*****************************************************************************
99
****************************************************************************/
102
AbstractContactBackend* AkonadiBackend::instance()
104
if (m_pInstance == nullptr) {
105
m_pInstance = new AkonadiBackend(0);
110
///Find contact by UID
111
Contact* AkonadiBackend::getContactByUid(const QString& uid)
113
return m_ContactByUid[uid];
116
///Return contact list
117
const ContactList& AkonadiBackend::getContactList() const
126
connect(m_pMonitor,SIGNAL(itemAdded(Akonadi::Item,Akonadi::Collection)),this,SLOT(slotItemAdded(Akonadi::Item,Akonadi::Collection)));
127
connect(m_pMonitor,SIGNAL(itemChanged(Akonadi::Item,QSet<QByteArray>)),this,SLOT(slotItemChanged(Akonadi::Item,QSet<QByteArray>)));
128
connect(m_pMonitor,SIGNAL(itemRemoved(Akonadi::Item)),this,SLOT(slotItemRemoved(Akonadi::Item)));
131
m_pMonitor->setCollectionMonitored(m_Coll,true);
132
m_isEnabled = true; //FIXME does it make sense to merge loaded and enabled?
136
bool AkonadiBackend::enable (bool enable)
138
if (enable && (!m_wasEnabled)) {
141
else if (m_wasEnabled && enable) {
142
foreach(Contact* contact, m_lBackendContacts) {
143
contact->setActive(true);
145
m_wasEnabled = false;
148
else if (isEnabled()) {
149
foreach(Contact* contact, m_lBackendContacts) {
150
contact->setActive(false);
158
bool AkonadiBackend::reload()
164
QByteArray AkonadiBackend::id() const
166
return QString::number(m_Coll.id()).toAscii();
169
AbstractContactBackend::SupportedFeatures AkonadiBackend::supportedFeatures() const
171
return (AbstractContactBackend::SupportedFeatures) (
172
AbstractContactBackend::SupportedFeatures::NONE |
173
AbstractContactBackend::SupportedFeatures::LOAD |
174
AbstractContactBackend::SupportedFeatures::SAVE |
175
AbstractContactBackend::SupportedFeatures::EDIT |
176
AbstractContactBackend::SupportedFeatures::REMOVE |
177
AbstractContactBackend::SupportedFeatures::ADD |
178
AbstractContactBackend::SupportedFeatures::MANAGEABLE |
179
AbstractContactBackend::SupportedFeatures::DISABLEABLE |
180
AbstractContactBackend::SupportedFeatures::ENABLEABLE
123
184
/*****************************************************************************
264
326
if ( !editor->saveContact() ) {
266
328
kDebug() << "Unable to save new contact to storage";
340
bool AkonadiBackend::save(const Contact* contact)
342
Akonadi::Item item = m_ItemHash[contact->uid()];
343
if (!(item.hasPayload<KABC::Addressee>() && item.payload<KABC::Addressee>().uid() == contact->uid())) {
344
kDebug() << "Contact not found";
347
KABC::Addressee payload = item.payload<KABC::Addressee>();
348
payload.setNickName ( contact->nickName() );
349
payload.setFormattedName ( contact->formattedName() );
350
payload.setGivenName ( contact->firstName() );
351
payload.setFamilyName ( contact->secondName() );
352
payload.setOrganization ( contact->organization() );
353
payload.setDepartment ( contact->department() );
355
foreach (PhoneNumber* nb, contact->phoneNumbers()) {
356
KABC::PhoneNumber pn;
357
pn.setType(nameToType(nb->category()->name()));
359
pn.setNumber(nb->uri());
360
payload.insertPhoneNumber(pn);
362
//TODO save the contact
367
bool AkonadiBackend::append(const Contact* item)
275
373
///Add a new contact
276
void AkonadiBackend::addNewContact(Contact* contact,QWidget* parent)
374
bool AkonadiBackend::addNewContact(Contact* contact,QWidget* parent)
278
376
KABC::Addressee newContact;
279
377
newContact.setNickName ( contact->nickName() );
304
402
if ( !editor->saveContact() ) {
306
404
kDebug() << "Unable to save new contact to storage";
311
410
} //addNewContact
313
412
///Implement virtual pure method
314
void AkonadiBackend::editContact(Contact* contact)
413
bool AkonadiBackend::edit(Contact* contact)
316
editContact(contact,nullptr);
415
return edit(contact,nullptr);
319
418
///Implement virtual pure method
320
void AkonadiBackend::addNewContact(Contact* contact)
419
bool AkonadiBackend::addNew(Contact* contact)
322
addNewContact(contact,nullptr);
421
return addNewContact(contact,nullptr);
325
424
///Add a new phone number to an existing contact
326
void AkonadiBackend::addPhoneNumber(Contact* contact, QString number, QString type)
425
bool AkonadiBackend::addPhoneNumber(Contact* contact, PhoneNumber* number)
328
427
Akonadi::Item item = m_ItemHash[contact->uid()];
329
428
if (!(item.hasPayload<KABC::Addressee>() && item.payload<KABC::Addressee>().uid() == contact->uid())) {
330
429
kDebug() << "Contact not found";
333
432
if ( item.isValid() ) {
334
433
KABC::Addressee payload = item.payload<KABC::Addressee>();
335
payload.insertPhoneNumber(KABC::PhoneNumber(number,nameToType(type)));
434
payload.insertPhoneNumber(KABC::PhoneNumber(number->uri(),nameToType(number->category()->name())));
336
435
item.setPayload<KABC::Addressee>(payload);
337
436
QPointer<Akonadi::ContactEditor> editor = new Akonadi::ContactEditor( Akonadi::ContactEditor::EditMode, (QWidget*)nullptr );
338
437
editor->loadContact(item);
362
463
****************************************************************************/
364
465
///Called when a new collection is added
365
void AkonadiBackend::collectionsReceived( const Akonadi::Collection::List& list)
466
void AkonadiBackend::itemsReceived( const Akonadi::Item::List& list)
367
foreach (const Akonadi::Collection& coll, list) {
369
m_pMonitor->setCollectionMonitored(coll,true);
370
emit collectionChanged();
468
// QList<int> disabledColl = ConfigurationSkeleton::disabledCollectionList();
469
foreach (const Akonadi::Item& item, list) {
470
// if (disabledColl.indexOf(coll.id()) == -1) {
474
slotItemAdded(item,m_Coll);
374
478
///Callback when a new item is added
375
void AkonadiBackend::slotItemAdded(Akonadi::Item item,Akonadi::Collection coll)
479
void AkonadiBackend::slotItemAdded(const Akonadi::Item& item,const Akonadi::Collection& coll)
378
482
Contact* c = addItem(item,ConfigurationSkeleton::hideContactWithoutPhone());
379
483
if (c) { //Not all items will have an addressee payload
380
beginInsertRows(QModelIndex(),m_pContacts.size()-1,m_pContacts.size());
383
484
emit newContactAdded(c);
384
emit layoutChanged();