qtmobility/plugins/contacts/wince/qcontactwincebackend.cpp
changeset 4 90517678cc4f
parent 1 2b40d63a9c3d
child 5 453da2cfceef
--- a/qtmobility/plugins/contacts/wince/qcontactwincebackend.cpp	Fri Apr 16 15:51:22 2010 +0300
+++ b/qtmobility/plugins/contacts/wince/qcontactwincebackend.cpp	Mon May 03 13:18:40 2010 +0300
@@ -68,10 +68,10 @@
  */
 
 
-QContactWinCEEngine::QContactWinCEEngine(ContactWinceFactory* factory, const QString& engineName, const QMap<QString, QString>& , QContactManager::Error& error)
+QContactWinCEEngine::QContactWinCEEngine(ContactWinceFactory* factory, const QString& engineName, const QMap<QString, QString>& , QContactManager::Error* error)
     : d(new QContactWinCEEngineData)
 {
-    error = QContactManager::NoError;
+    *error = QContactManager::NoError;
     
     buildHashForContactDetailToPoomPropId();
     d->m_engineName = engineName;
@@ -137,21 +137,15 @@
     d->m_factory->resetEngine();
 }
 
-void QContactWinCEEngine::deref()
-{
-    if (!d->m_refCount.deref())
-        delete this;
-}
-
 QString QContactWinCEEngine::managerName() const
 {
     return d->m_engineName;
 }
 
-QContact QContactWinCEEngine::contact(const QContactLocalId& contactId, const QStringList& definitionRestrictions, QContactManager::Error& error) const
+QContact QContactWinCEEngine::contact(const QContactLocalId& contactId, const QtMobility::QContactFetchHint& hint, QContactManager::Error* error) const
 {
     // TODO: implementation for definitionRestrictions!
-    Q_UNUSED(definitionRestrictions);
+    Q_UNUSED(hint);
     QContact ret;
 
     // id == 0 gives a bad argument error from POOM, so don't even try it
@@ -161,29 +155,29 @@
         HRESULT hr = d->m_app->GetItemFromOidEx(contactId, 0, &item);
         if (SUCCEEDED(hr)) {
             if (item) {
-                error = QContactManager::NoError;
+                *error = QContactManager::NoError;
                 ret = convertToQContact(item);
             } else {
-                error = QContactManager::DoesNotExistError;
+                *error = QContactManager::DoesNotExistError;
             }
         } else {
             if (HRESULT_CODE(hr) == ERROR_NOT_FOUND) {
-                error = QContactManager::DoesNotExistError;
+                *error = QContactManager::DoesNotExistError;
             } else {
                 qWarning() << "Failed to retrieve contact:" << HRESULT_CODE(hr);
-                error = QContactManager::UnspecifiedError;
+                *error = QContactManager::UnspecifiedError;
             }
         }
     } else {
-        error = QContactManager::DoesNotExistError;
+        *error = QContactManager::DoesNotExistError;
     }
     return ret;
 }
 
-bool QContactWinCEEngine::saveContact(QContact* contact, QContactManager::Error& error)
+bool QContactWinCEEngine::saveContact(QContact* contact, QContactManager::Error* error)
 {
     if (contact == 0) {
-        error = QContactManager::BadArgumentError;
+        *error = QContactManager::BadArgumentError;
         return false;
     }
 
@@ -191,7 +185,7 @@
 
     // ensure that the contact's details conform to their definitions
     if (!validateContact(*contact, error)) {
-        error = QContactManager::InvalidDetailError;
+        *error = QContactManager::InvalidDetailError;
         return false;
     }
 
@@ -206,11 +200,11 @@
         } else {
             if (HRESULT_CODE(hr) == ERROR_NOT_FOUND) {
                 // Well, doesn't exist any more
-                error = QContactManager::DoesNotExistError;
+                *error = QContactManager::DoesNotExistError;
                 d->m_ids.removeAll(contact->localId());
             } else {
                 qWarning() << "Didn't get old contact" << HRESULT_CODE(hr);
-                error = QContactManager::UnspecifiedError;
+                *error = QContactManager::UnspecifiedError;
             }
         }
     } else if (contact->localId() == 0) {
@@ -224,35 +218,35 @@
             if (SUCCEEDED(hr)) {
             } else {
                 qWarning() << "Failed to query interface" << HRESULT_CODE(hr);
-                error = QContactManager::UnspecifiedError;
+                *error = QContactManager::UnspecifiedError;
             }
         } else {
             qWarning() << "Failed to create contact: "<< HRESULT_CODE(hr);
-            error = QContactManager::OutOfMemoryError;
+            *error = QContactManager::OutOfMemoryError;
         }
     } else {
         // Saving a contact with a non zero id, but that doesn't exist
-        error = QContactManager::DoesNotExistError;
+        *error = QContactManager::DoesNotExistError;
     }
 
     if (icontact) {
         // Convert our QContact to the Icontact (via setProps)
-        if (convertFromQContact(*contact, icontact, error)) {
+        if (convertFromQContact(*contact, icontact, *error)) {
             HRESULT hr = icontact->Save();
             if (SUCCEEDED(hr)) {
                 // yay! we also need to set the new contact id
                 long oid = 0;
                 hr = icontact->get_Oid(&oid);
                 if (SUCCEEDED(hr)) {
-                    error = QContactManager::NoError; 
-                    QContact c = this->contact((QContactLocalId)oid, QStringList(), error);
+                    *error = QContactManager::NoError;
+                    QContact c = this->contact((QContactLocalId)oid, QContactFetchHint(), error);
                     
-                    if (error == QContactManager::NoError) {
+                    if (*error == QContactManager::NoError) {
                         *contact = c;
                         if (wasOld) {
-                            cs.changedContacts().insert(contact->localId());
+                            cs.insertChangedContact(contact->localId());
                         } else {
-                            cs.addedContacts().insert(contact->localId());
+                            cs.insertAddedContact(contact->localId());
                             d->m_ids.append(contact->localId());
                         }
                     }
@@ -262,7 +256,7 @@
                 }
                 qWarning() << "Saved contact, but couldn't retrieve id again??" << HRESULT_CODE(hr);
                 // Blargh.
-                error = QContactManager::UnspecifiedError;
+                *error = QContactManager::UnspecifiedError;
             } else {
                 qWarning() << "Failed to save contact" << HRESULT_CODE(hr);
             }
@@ -275,7 +269,7 @@
     return false;
 }
 
-bool QContactWinCEEngine::removeContact(const QContactLocalId& contactId, QContactManager::Error& error)
+bool QContactWinCEEngine::removeContact(const QContactLocalId& contactId, QContactManager::Error* error)
 {
     // Fetch an IItem* for this
     if (contactId != 0) {
@@ -286,32 +280,32 @@
         if (SUCCEEDED(hr)) {
             hr = item->Delete();
             if (SUCCEEDED(hr)) {
-                error = QContactManager::NoError;
+                *error = QContactManager::NoError;
                 d->m_ids.removeAll(contactId);
-                cs.removedContacts().insert(contactId);
+                cs.insertRemovedContact(contactId);
                 cs.emitSignals(this);
                 return true;
             }
             qWarning() << "Failed to delete:" << HRESULT_CODE(hr);
-            error = QContactManager::UnspecifiedError;
+            *error = QContactManager::UnspecifiedError;
         } else {
             if (HRESULT_CODE(hr) == ERROR_NOT_FOUND) {
-                error = QContactManager::DoesNotExistError;
+                *error = QContactManager::DoesNotExistError;
             } else {
                 qWarning() << "Failed to retrieve item pointer in delete" << HRESULT_CODE(hr);
-                error = QContactManager::UnspecifiedError;
+                *error = QContactManager::UnspecifiedError;
             }
         }
     } else {
         // Id 0 does not exist
-        error = QContactManager::DoesNotExistError;
+        *error = QContactManager::DoesNotExistError;
     }
     return false;
 }
 
-QMap<QString, QContactDetailDefinition> QContactWinCEEngine::detailDefinitions(const QString& contactType, QContactManager::Error& error) const
+QMap<QString, QContactDetailDefinition> QContactWinCEEngine::detailDefinitions(const QString& contactType, QContactManager::Error* error) const
 {
-    error = QContactManager::NoError;
+    *error = QContactManager::NoError;
     QMap<QString, QMap<QString, QContactDetailDefinition> > defns = QContactManagerEngine::schemaDefinitions();
 
     // Remove the details we don't support
@@ -330,7 +324,7 @@
 
     // No logo for organisation
     fields = defns[contactType][QContactOrganization::DefinitionName].fields();
-    fields.remove(QContactOrganization::FieldLogo);
+    fields.remove(QContactOrganization::FieldLogoUrl);
     defns[contactType][QContactOrganization::DefinitionName].setFields(fields);
 
     // No subtypes for these details
@@ -392,8 +386,9 @@
 }
 
 /*! \reimp */
-bool QContactWinCEEngine::hasFeature(QContactManager::ManagerFeature feature) const
+bool QContactWinCEEngine::hasFeature(QContactManager::ManagerFeature feature, const QString& contactType) const
 {
+    Q_UNUSED(contactType);
     // The Windows CE backend is an "isolated" backend
     if (feature == QContactManager::Anonymous)
         return true;
@@ -403,7 +398,7 @@
 }
 
 /* Synthesise the display label of a contact */
-QString QContactWinCEEngine::synthesizedDisplayLabel(const QContact& contact, QContactManager::Error& error) const
+QString QContactWinCEEngine::synthesizedDisplayLabel(const QContact& contact, QContactManager::Error* error) const
 {
     Q_UNUSED(error)
     // The POOM API (well, lack thereof) makes this a bit strange.
@@ -474,6 +469,142 @@
     }
     return false;
 }
+
+/*! \reimp */
+QMap<QString, QString> QContactWinCEEngine::managerParameters() const
+{
+    return QMap<QString, QString>();
+}
+
+/*! \reimp */
+int QContactWinCEEngine::managerVersion() const
+{
+    return QTCONTACTS_VERSION;
+}
+
+/*! \reimp */
+QList<QContact> QContactWinCEEngine::contacts(const QContactFilter& filter, const QList<QContactSortOrder>& sortOrders, const QContactFetchHint& fetchHint, QContactManager::Error* error) const
+{
+    QList<QContactLocalId> ids = contactIds(filter, sortOrders, error);
+    QList<QContact> cs;
+    if (*error == QContactManager::NoError) {
+        foreach (const QContactLocalId& id, ids) {
+            cs << contact(id, fetchHint, error);
+        }
+    }
+    return cs;
+}
+
+/*! \reimp */
+bool QContactWinCEEngine::saveRelationship(QContactRelationship* relationship, QContactManager::Error* error)
+{
+    Q_UNUSED(relationship);
+    *error = QContactManager::NotSupportedError;
+    return false;
+}
+
+/*! \reimp */
+bool QContactWinCEEngine::removeRelationship(const QContactRelationship& relationship, QContactManager::Error* error)
+{
+    Q_UNUSED(relationship);
+    *error = QContactManager::NotSupportedError;
+    return false;
+}
+
+/*! \reimp */
+bool QContactWinCEEngine::saveContacts(QList<QContact>* contacts, QMap<int, QContactManager::Error>* errorMap, QContactManager::Error* error)
+{
+    bool ret = true;
+
+    for (int j = 0; j < contacts->size(); j++) {
+        if (!saveContact(&((*contacts)[j]), error)) {
+            ret = false;
+        }
+        if (*error != QContactManager::NoError) {
+            errorMap->insert(j, *error);
+        }
+    }
+    return ret;
+}
+
+/*! \reimp */
+bool QContactWinCEEngine::removeContacts(const QList<QContactLocalId>& contactIds, QMap<int, QContactManager::Error>* errorMap, QContactManager::Error* error)
+{
+    bool ret = true;
+
+    for (int j = 0; j < contactIds.size(); j++) {
+        if (!removeContact(contactIds[j], error)) {
+            ret = false;
+        }
+
+        if (*error != QContactManager::NoError) {
+            errorMap->insert(j, *error);
+        }
+    }
+    return ret;
+}
+
+/*! \reimp */
+bool QContactWinCEEngine::setSelfContactId(const QContactLocalId& contactId, QContactManager::Error* error)
+{
+    Q_UNUSED(contactId);
+    *error = QContactManager::NotSupportedError;
+    return false;
+}
+
+/*! \reimp */
+QContactLocalId QContactWinCEEngine::selfContactId(QContactManager::Error* error) const
+{
+    *error = QContactManager::NotSupportedError;
+    return QContactLocalId();
+}
+
+/*! \reimp */
+QList<QContactRelationship> QContactWinCEEngine::relationships(const QString& relationshipType, const QContactId& participantId, QContactRelationship::Role role, QContactManager::Error* error) const
+{
+    Q_UNUSED(relationshipType);
+    Q_UNUSED(participantId);
+    Q_UNUSED(role);
+    *error = QContactManager::NotSupportedError;
+    return QList<QContactRelationship>();
+}
+
+/*! \reimp */
+bool QContactWinCEEngine::saveRelationships(QList<QContactRelationship>* relationships, QMap<int, QContactManager::Error>* errorMap, QContactManager::Error* error)
+{
+    Q_UNUSED(relationships);
+    Q_UNUSED(errorMap);
+    *error = QContactManager::NotSupportedError;
+    return false;
+}
+
+/*! \reimp */
+bool QContactWinCEEngine::removeRelationships(const QList<QContactRelationship>& relationships, QMap<int, QContactManager::Error>* errorMap, QContactManager::Error* error)
+{
+    Q_UNUSED(relationships);
+    Q_UNUSED(errorMap);
+    *error = QContactManager::NotSupportedError;
+    return false;
+}
+
+/*! \reimp */
+bool QContactWinCEEngine::saveDetailDefinition(const QContactDetailDefinition& def, const QString& contactType, QContactManager::Error* error)
+{
+    Q_UNUSED(def);
+    Q_UNUSED(contactType);
+    *error = QContactManager::NotSupportedError;
+    return false;
+}
+
+/*! \reimp */
+bool QContactWinCEEngine::removeDetailDefinition(const QString& definitionId, const QString& contactType, QContactManager::Error* error)
+{
+    Q_UNUSED(definitionId);
+    Q_UNUSED(contactType);
+    *error = QContactManager::NotSupportedError;
+    return false;
+}
+
 /*!
  * Returns the list of data types supported by the WinCE engine
  */
@@ -497,7 +628,7 @@
 }
 
 /* Factory lives here in the basement */
-QContactManagerEngine* ContactWinceFactory::engine(const QMap<QString, QString>& parameters, QContactManager::Error& error)
+QContactManagerEngine* ContactWinceFactory::engine(const QMap<QString, QString>& parameters, QContactManager::Error* error)
 {
     QMutexLocker locker(&m_mutex);
     if (!m_engine) {