--- a/qtmobility/plugins/contacts/symbian/src/cntsymbianengine.cpp Fri Jun 11 14:26:25 2010 +0300
+++ b/qtmobility/plugins/contacts/symbian/src/cntsymbianengine.cpp Wed Jun 23 19:08:38 2010 +0300
@@ -75,6 +75,15 @@
#endif
CntSymbianEngine::CntSymbianEngine(const QMap<QString, QString>& parameters, QContactManager::Error* error)
+ : m_dataBase(0),
+ m_managerUri(0),
+ m_transformContact(0),
+ m_contactFilter(0),
+#ifndef SYMBIAN_BACKEND_USE_SQLITE
+ m_contactSorter(0),
+#endif
+ m_relationship(0),
+ m_displayLabel(0)
{
*error = QContactManager::NoError;
@@ -355,7 +364,7 @@
/*!
* Private leaving implementation for contact()
*/
-QContact CntSymbianEngine::fetchContactL(const QContactLocalId &localId, const QStringList& definitionRestrictions) const
+QContact CntSymbianEngine::fetchContactL(const QContactLocalId &localId, const QStringList& detailDefinitionsHint) const
{
// A contact with a zero id is not expected to exist.
// Symbian contact database uses id 0 internally as the id of the
@@ -364,11 +373,28 @@
User::Leave(KErrNotFound);
// Read the contact from the CContactDatabase
- CContactItem* contactItem = m_dataBase->contactDatabase()->ReadContactL(localId);
+ CContactItem* contactItem(0);
+ if (!detailDefinitionsHint.isEmpty()) {
+ // Create a view definition with only the fields that map to the fetch hint
+ CContactItemViewDef *viewDef = CContactItemViewDef::NewLC(
+ CContactItemViewDef::EIncludeFields, CContactItemViewDef::EMaskHiddenFields);
+ foreach (QString detailDefinitionHint, detailDefinitionsHint) {
+ QList<TUid> uids = m_transformContact->itemFieldUidsL(detailDefinitionHint);
+ foreach (TUid uid, uids) {
+ viewDef->AddL(uid);
+ }
+ }
+ contactItem = m_dataBase->contactDatabase()->ReadContactL(localId, *viewDef);
+ CleanupStack::PopAndDestroy(viewDef);
+ } else {
+ // The fetch hint does not contain detail definitions hint so get all
+ // the contact item fields that are available
+ contactItem = m_dataBase->contactDatabase()->ReadContactL(localId);
+ }
CleanupStack::PushL(contactItem);
// Convert to a QContact
- QContact contact = m_transformContact->transformContactL(*contactItem, definitionRestrictions);
+ QContact contact = m_transformContact->transformContactL(*contactItem);
// Transform details that are not available until the contact has been saved
m_transformContact->transformPostSaveDetailsL(*contactItem, contact, *m_dataBase->contactDatabase(), m_managerUri);
@@ -392,13 +418,14 @@
int err(0);
QContactLocalId id(0);
TRAP(err, id = addContactL(contact));
+#ifdef SYMBIAN_BACKEND_SIGNAL_EMISSION_TWEAK
if(err == KErrNone)
{
changeSet.insertAddedContact(id);
m_dataBase->appendContactEmitted(id);
}
+#endif
CntSymbianTransformError::transformError(err, qtError);
-
return (err==KErrNone);
}
@@ -418,12 +445,15 @@
// Create a new contact card.
CContactItem* contactItem = CContactCard::NewLC();
m_transformContact->transformContactL(contact, *contactItem);
+
// Add to the database
id = m_dataBase->contactDatabase()->AddNewContactL(*contactItem);
+
// Reload contact item
CleanupStack::PopAndDestroy(contactItem);
contactItem = 0;
contactItem = m_dataBase->contactDatabase()->ReadContactLC(id);
+
// Transform details that are not available until the contact has been saved
m_transformContact->transformPostSaveDetailsL(*contactItem, contact, *m_dataBase->contactDatabase(), m_managerUri);
CleanupStack::PopAndDestroy(contactItem);
@@ -445,10 +475,10 @@
//update contact, will add the fields to the already saved group
updateContactL(contact);
+
// Transform details that are not available until the contact has been saved
contactItem = m_dataBase->contactDatabase()->ReadContactLC(id);
m_transformContact->transformPostSaveDetailsL(*contactItem, contact, *m_dataBase->contactDatabase(), m_managerUri);
-
CleanupStack::PopAndDestroy(contactItem);
}
// Leave with an error
@@ -472,12 +502,14 @@
{
int err(0);
TRAP(err, updateContactL(contact));
+#ifdef SYMBIAN_BACKEND_SIGNAL_EMISSION_TWEAK
if(err == KErrNone)
{
//TODO: check what to do with groupsChanged
changeSet.insertChangedContact(contact.localId());
m_dataBase->appendContactEmitted(contact.localId());
}
+#endif
CntSymbianTransformError::transformError(err, qtError);
return (err==KErrNone);
}
@@ -537,12 +569,14 @@
{
// removeContactL() can't throw c++ exception
TRAPD(err, removeContactL(id));
+#ifdef SYMBIAN_BACKEND_SIGNAL_EMISSION_TWEAK
if(err == KErrNone)
{
//TODO: check what to do with groupsChanged?
changeSet.insertRemovedContact(id);
m_dataBase->appendContactEmitted(id);
}
+#endif
CntSymbianTransformError::transformError(err, qtError);
return (err==KErrNone);
}
@@ -550,7 +584,7 @@
/*!
* Private leaving implementation for removeContact
*/
-int CntSymbianEngine::removeContactL(QContactLocalId id)
+void CntSymbianEngine::removeContactL(QContactLocalId id)
{
// A contact with a zero id is not expected to exist.
// Symbian contact database uses id 0 internally as the id of the
@@ -575,8 +609,6 @@
// TODO: A better solution must be found.
m_dataBase->contactDatabase()->CompactL();
#endif
-
- return 0;
}
bool CntSymbianEngine::removeContact(const QContactLocalId& contactId, QContactManager::Error* error)
@@ -585,11 +617,13 @@
QContactLocalId selfCntId = selfContactId(&err); // err ignored
QContactChangeSet changeSet;
TBool ret = removeContact(contactId, changeSet, error);
+#ifdef SYMBIAN_BACKEND_SIGNAL_EMISSION_TWEAK
if (ret && contactId == selfCntId ) {
QOwnCardPair ownCard(selfCntId, QContactLocalId(0));
changeSet.setOldAndNewSelfContactId(ownCard);
}
changeSet.emitSignals(this);
+#endif
return ret;
}
@@ -628,12 +662,15 @@
if (errorMap) {
errorMap->insert(i, functionError);
}
- } else {
+ }
+#ifdef SYMBIAN_BACKEND_SIGNAL_EMISSION_TWEAK
+ else {
if (current == selfCntId ) {
QOwnCardPair ownCard(selfCntId, QContactLocalId(0));
changeSet.setOldAndNewSelfContactId(ownCard);
}
}
+#endif
}
changeSet.emitSignals(this);
return (*error == QContactManager::NoError);
@@ -654,12 +691,13 @@
bool CntSymbianEngine::saveRelationship(QContactRelationship* relationship, QContactManager::Error* error)
{
- //affected contacts
- QContactChangeSet changeSet;
-
//save the relationship
QSet<QContactLocalId> affectedContactIds;
bool returnValue = m_relationship->saveRelationship(&affectedContactIds, relationship, error);
+
+#ifdef SYMBIAN_BACKEND_SIGNAL_EMISSION_TWEAK
+ //affected contacts
+ QContactChangeSet changeSet;
changeSet.insertAddedRelationshipsContacts(affectedContactIds.toList());
//add contacts to the list that shouldn't be emitted
@@ -667,18 +705,20 @@
//emit signals
changeSet.emitSignals(this);
+#endif
return returnValue;
}
bool CntSymbianEngine::saveRelationships(QList<QContactRelationship>* relationships, QMap<int, QContactManager::Error>* errorMap, QContactManager::Error* error)
{
- //affected contacts
- QContactChangeSet changeSet;
-
//save the relationships
QSet<QContactLocalId> affectedContactIds;
bool returnValue = m_relationship->saveRelationships(&affectedContactIds, relationships, errorMap, error);
+
+#ifdef SYMBIAN_BACKEND_SIGNAL_EMISSION_TWEAK
+ //affected contacts
+ QContactChangeSet changeSet;
changeSet.insertAddedRelationshipsContacts(affectedContactIds.toList());
//add contacts to the list that shouldn't be emitted
@@ -686,18 +726,20 @@
//emit signals
changeSet.emitSignals(this);
+#endif
return returnValue;
}
bool CntSymbianEngine::removeRelationship(const QContactRelationship& relationship, QContactManager::Error* error)
{
- //affected contacts
- QContactChangeSet changeSet;
-
//remove the relationship
QSet<QContactLocalId> affectedContactIds;
bool returnValue = m_relationship->removeRelationship(&affectedContactIds, relationship, error);
+
+#ifdef SYMBIAN_BACKEND_SIGNAL_EMISSION_TWEAK
+ //affected contacts
+ QContactChangeSet changeSet;
changeSet.insertRemovedRelationshipsContacts(affectedContactIds.toList());
//add contacts to the list that shouldn't be emitted
@@ -705,18 +747,20 @@
//emit signals
changeSet.emitSignals(this);
+#endif
return returnValue;
}
bool CntSymbianEngine::removeRelationships(const QList<QContactRelationship>& relationships, QMap<int, QContactManager::Error>* errorMap, QContactManager::Error* error)
{
- //affected contacts
- QContactChangeSet changeSet;
-
//remove the relationships
QSet<QContactLocalId> affectedContactIds;
bool returnValue = m_relationship->removeRelationships(&affectedContactIds, relationships, errorMap, error);
+
+#ifdef SYMBIAN_BACKEND_SIGNAL_EMISSION_TWEAK
+ //affected contacts
+ QContactChangeSet changeSet;
changeSet.insertRemovedRelationshipsContacts(affectedContactIds.toList());
//add contacts to the list that shouldn't be emitted
@@ -724,13 +768,13 @@
//emit signals
changeSet.emitSignals(this);
+#endif
return returnValue;
}
QMap<QString, QContactDetailDefinition> CntSymbianEngine::detailDefinitions(const QString& contactType, QContactManager::Error* error) const
{
- // TODO: update for SIM contacts later
if (contactType != QContactType::TypeContact && contactType != QContactType::TypeGroup) {
*error = QContactManager::InvalidContactTypeError;
return QMap<QString, QContactDetailDefinition>();