qtmobility/plugins/contacts/maemo5/qcontactmaemo5backend.cpp
changeset 5 453da2cfceef
parent 4 90517678cc4f
child 11 06b8e2af4411
equal deleted inserted replaced
4:90517678cc4f 5:453da2cfceef
    40 ****************************************************************************/
    40 ****************************************************************************/
    41 
    41 
    42 #include "qcontactmaemo5backend_p.h"
    42 #include "qcontactmaemo5backend_p.h"
    43 
    43 
    44 #include <QSharedData>
    44 #include <QSharedData>
       
    45 #include <QTimer>
    45 
    46 
    46 #include "qcontactmaemo5debug_p.h"
    47 #include "qcontactmaemo5debug_p.h"
    47 
    48 
    48 DEFINE_GLOBAL_DEBUG_VAR
    49 DEFINE_GLOBAL_DEBUG_VAR
    49 
    50 
   123         return true;
   124         return true;
   124     }
   125     }
   125 
   126 
   126     *error = QContactManager::NotSupportedError; // XXX TODO: mutable definitions?
   127     *error = QContactManager::NotSupportedError; // XXX TODO: mutable definitions?
   127     return false;
   128     return false;
       
   129 }
       
   130 
       
   131 QContact QContactMaemo5Engine::compatibleContact(const QContact& contact, QContactManager::Error* error) const
       
   132 {
       
   133     return QContactManagerEngine::compatibleContact(contact, error);
   128 }
   134 }
   129 
   135 
   130 QContactLocalId QContactMaemo5Engine::selfContactId(QContactManager::Error* error) const
   136 QContactLocalId QContactMaemo5Engine::selfContactId(QContactManager::Error* error) const
   131 {
   137 {
   132   Q_CHECK_PTR(d->m_abook);
   138   Q_CHECK_PTR(d->m_abook);
   179     QContactManager::Error tempError = QContactManager::NoError;
   185     QContactManager::Error tempError = QContactManager::NoError;
   180     QContact curr;
   186     QContact curr;
   181     for (int i = 0; i < contacts->size(); i++) {
   187     for (int i = 0; i < contacts->size(); i++) {
   182         curr = contacts->at(i);
   188         curr = contacts->at(i);
   183         if (!saveContact(&curr, &tempError)) {
   189         if (!saveContact(&curr, &tempError)) {
   184             errorMap->insert(i, tempError);
   190             if (errorMap)
       
   191                 errorMap->insert(i, tempError);
   185             *error = tempError;
   192             *error = tempError;
   186         } else {
   193         } else {
   187             contacts->replace(i, curr);
   194             contacts->replace(i, curr);
   188         }
   195         }
   189     }
   196     }
   196     *error = QContactManager::NoError;
   203     *error = QContactManager::NoError;
   197     QContactManager::Error tempError = QContactManager::NoError;
   204     QContactManager::Error tempError = QContactManager::NoError;
   198     QContact curr;
   205     QContact curr;
   199     for (int i = 0; i < ids.size(); i++) {
   206     for (int i = 0; i < ids.size(); i++) {
   200         if (!removeContact(ids.at(i), &tempError)) {
   207         if (!removeContact(ids.at(i), &tempError)) {
   201             errorMap->insert(i, tempError);
   208             if (errorMap)
       
   209                 errorMap->insert(i, tempError);
   202             *error = tempError;
   210             *error = tempError;
   203         }
   211         }
   204     }
   212     }
   205 
   213 
   206     return (*error == QContactManager::NoError);
   214     return (*error == QContactManager::NoError);
   247     QContactDetailFieldDefinition gsfd; //Generic string field definition
   255     QContactDetailFieldDefinition gsfd; //Generic string field definition
   248     gsfd.setDataType(QVariant::String);
   256     gsfd.setDataType(QVariant::String);
   249     
   257     
   250     // QContactAddress
   258     // QContactAddress
   251     fields = defns[contactType][QContactAddress::DefinitionName].fields();
   259     fields = defns[contactType][QContactAddress::DefinitionName].fields();
   252     //fields.remove(QContactAddress::FieldSubTypes);
   260     fields.remove(QContactAddress::FieldSubTypes);
   253     fields.insert("Estension", gsfd);
   261     fields.insert(AddressFieldExtension, gsfd);
   254     fields.insert(QContactDetail::FieldDetailUri, gsfd);
   262     fields.insert(QContactDetail::FieldDetailUri, gsfd);
   255     defns[contactType][QContactAddress::DefinitionName].setFields(fields);
   263     defns[contactType][QContactAddress::DefinitionName].setFields(fields);
   256     
   264     
   257     // QContactAnniversary
   265     // No QContactAnniversary
   258     defns[contactType].remove(QContactAnniversary::DefinitionName);
   266     defns[contactType].remove(QContactAnniversary::DefinitionName);
   259     
   267     
   260     // QContactAvatar
   268     // No QContactAvatar
       
   269     defns[contactType].remove(QContactAvatar::DefinitionName);
       
   270 
   261     // TODO setUnique(true);
   271     // TODO setUnique(true);
   262     // QContactBirthday
   272     // QContactBirthday
       
   273     fields = defns[contactType][QContactBirthday::DefinitionName].fields();
       
   274     fields.remove(QContactDetail::FieldContext);
       
   275     defns[contactType][QContactBirthday::DefinitionName].setFields(fields);
       
   276 
   263     // QContactDisplayLabel
   277     // QContactDisplayLabel
       
   278     fields = defns[contactType][QContactDisplayLabel::DefinitionName].fields();
       
   279     defns[contactType][QContactDisplayLabel::DefinitionName].setFields(fields);
   264     
   280     
   265     // QContactEmailAddress
   281     // QContactEmailAddress
   266     fields = defns[contactType][QContactEmailAddress::DefinitionName].fields();
   282     fields = defns[contactType][QContactEmailAddress::DefinitionName].fields();
   267     fields.insert(QContactDetail::FieldDetailUri, gsfd);
   283     fields.insert(QContactDetail::FieldDetailUri, gsfd);
   268     defns[contactType][QContactEmailAddress::DefinitionName].setFields(fields);
   284     defns[contactType][QContactEmailAddress::DefinitionName].setFields(fields);
   269     
   285     
   270     // QContactFamily
   286     // QContactFamily
       
   287     fields = defns[contactType][QContactFamily::DefinitionName].fields();
       
   288     fields.remove(QContactDetail::FieldContext);
       
   289     defns[contactType][QContactFamily::DefinitionName].setFields(fields);
       
   290 
   271     // QContactGender
   291     // QContactGender
   272     // QContactGeoLocation
   292     fields = defns[contactType][QContactGender::DefinitionName].fields();
       
   293     fields.remove(QContactDetail::FieldContext);
       
   294     defns[contactType][QContactGender::DefinitionName].setFields(fields);
       
   295 
       
   296     // No QContactGeoLocation
   273     defns[contactType].remove(QContactGeoLocation::DefinitionName);
   297     defns[contactType].remove(QContactGeoLocation::DefinitionName);
   274     
   298     
   275     // QContactGuid
   299     // QContactGuid
       
   300     fields = defns[contactType][QContactGuid::DefinitionName].fields();
       
   301     fields.remove(QContactDetail::FieldContext);
       
   302     defns[contactType][QContactGuid::DefinitionName].setFields(fields);
       
   303   
       
   304     // No QContactGlobalPresence
       
   305     defns[contactType].remove(QContactGlobalPresence::DefinitionName);
       
   306 
   276     // QContactName
   307     // QContactName
   277     fields = defns[contactType][QContactName::DefinitionName].fields();
   308     fields = defns[contactType][QContactName::DefinitionName].fields();
       
   309     fields.remove(QContactDetail::FieldContext);
   278     fields.remove(QContactName::FieldCustomLabel);
   310     fields.remove(QContactName::FieldCustomLabel);
       
   311     fields.remove(QContactName::FieldMiddleName);
   279     fields.remove(QContactName::FieldPrefix);
   312     fields.remove(QContactName::FieldPrefix);
   280     fields.remove(QContactName::FieldSuffix);
   313     fields.remove(QContactName::FieldSuffix);
   281     defns[contactType][QContactName::DefinitionName].setFields(fields);
   314     defns[contactType][QContactName::DefinitionName].setFields(fields);
   282     
   315     
   283     // QContactNickname
   316     // QContactNickname
       
   317     fields = defns[contactType][QContactNickname::DefinitionName].fields();
       
   318     fields.remove(QContactDetail::FieldContext);
       
   319     defns[contactType][QContactNickname::DefinitionName].setFields(fields);
       
   320 
   284     // QContactNote
   321     // QContactNote
       
   322     fields = defns[contactType][QContactNote::DefinitionName].fields();
       
   323     fields.remove(QContactDetail::FieldContext);
       
   324     defns[contactType][QContactNote::DefinitionName].setFields(fields);
       
   325 
   285     // QContactOnlineAccount
   326     // QContactOnlineAccount
   286     fields = defns[contactType][QContactOnlineAccount::DefinitionName].fields();
   327     fields = defns[contactType][QContactOnlineAccount::DefinitionName].fields();
       
   328     fields.remove(QContactDetail::FieldContext);
   287     fields.remove(QContactOnlineAccount::FieldAccountUri);
   329     fields.remove(QContactOnlineAccount::FieldAccountUri);
   288     fields.remove(QContactOnlineAccount::FieldSubTypes);
   330     fields.remove(QContactOnlineAccount::FieldSubTypes);
   289     fields.insert("AccountPath", gsfd);
   331     fields.insert("AccountPath", gsfd);
   290     defns[contactType][QContactOnlineAccount::DefinitionName].setFields(fields);
   332     defns[contactType][QContactOnlineAccount::DefinitionName].setFields(fields);
   291     
   333     
   292     // QContactOrganization
   334     // QContactOrganization
   293     fields = defns[contactType][QContactOrganization::DefinitionName].fields();
   335     fields = defns[contactType][QContactOrganization::DefinitionName].fields();
       
   336     fields.remove(QContactDetail::FieldContext);
   294     fields.remove(QContactOrganization::FieldAssistantName);
   337     fields.remove(QContactOrganization::FieldAssistantName);
   295     fields.remove(QContactOrganization::FieldDepartment);
   338     fields.remove(QContactOrganization::FieldDepartment);
   296     fields.remove(QContactOrganization::FieldLocation);
   339     fields.remove(QContactOrganization::FieldLocation);
   297     fields.remove(QContactOrganization::FieldLogoUrl);
   340     fields.remove(QContactOrganization::FieldLogoUrl);
   298     fields.remove(QContactOrganization::FieldName);
   341     fields.remove(QContactOrganization::FieldName);
   300     defns[contactType][QContactOrganization::DefinitionName].setFields(fields);
   343     defns[contactType][QContactOrganization::DefinitionName].setFields(fields);
   301     
   344     
   302     // QContactPhoneNumber
   345     // QContactPhoneNumber
   303     fields = defns[contactType][QContactPhoneNumber::DefinitionName].fields();
   346     fields = defns[contactType][QContactPhoneNumber::DefinitionName].fields();
   304     fields.insert(QContactDetail::FieldDetailUri, gsfd);
   347     fields.insert(QContactDetail::FieldDetailUri, gsfd);
       
   348     QContactDetailFieldDefinition phoneSubtype = fields.value(QContactPhoneNumber::FieldSubTypes);
       
   349     QVariantList allowableValues;
       
   350     allowableValues << QContactPhoneNumber::SubTypeMobile;
       
   351     allowableValues << QContactPhoneNumber::SubTypeVoice;
       
   352     phoneSubtype.setAllowableValues(allowableValues);
       
   353     fields.insert(QContactPhoneNumber::FieldSubTypes, phoneSubtype);
   305     defns[contactType][QContactPhoneNumber::DefinitionName].setFields(fields);
   354     defns[contactType][QContactPhoneNumber::DefinitionName].setFields(fields);
   306     
   355 
   307     // QContactSyncTarget
   356     // No QContactPresence
       
   357     defns[contactType].remove(QContactPresence::DefinitionName);
       
   358 
       
   359     // No QContactRingtone
       
   360     defns[contactType].remove(QContactRingtone::DefinitionName);
       
   361     
       
   362     // No QContactSyncTarget
   308     defns[contactType].remove(QContactSyncTarget::DefinitionName);
   363     defns[contactType].remove(QContactSyncTarget::DefinitionName);
       
   364 
       
   365     // No QContactTag
       
   366     defns[contactType].remove(QContactTag::DefinitionName);
   309     
   367     
   310     // QContactTimestamp
   368     // QContactTimestamp
       
   369     fields = defns[contactType][QContactTimestamp::DefinitionName].fields();
       
   370     fields.remove(QContactDetail::FieldContext);
       
   371     defns[contactType][QContactTimestamp::DefinitionName].setFields(fields);
       
   372 
   311     // QContactType
   373     // QContactType
       
   374     fields = defns[contactType][QContactType::DefinitionName].fields();
       
   375     fields.remove(QContactDetail::FieldContext);
       
   376     defns[contactType][QContactType::DefinitionName].setFields(fields);
       
   377 
   312     // QContactUrl
   378     // QContactUrl
   313     fields = defns[contactType][QContactUrl::DefinitionName].fields();
   379     fields = defns[contactType][QContactUrl::DefinitionName].fields();
       
   380     fields.remove(QContactDetail::FieldContext);
   314     fields.remove(QContactUrl::FieldSubType);
   381     fields.remove(QContactUrl::FieldSubType);
   315     defns[contactType][QContactUrl::DefinitionName].setFields(fields);
   382     defns[contactType][QContactUrl::DefinitionName].setFields(fields);
   316   
       
   317     //Still unmanaged: GlobalPresence, Presence, Ringtone, Tag
       
   318     
   383     
   319     QCM5_DEBUG << "Contact type" << contactType << "Keys" <<  defns.keys();
   384     QCM5_DEBUG << "Contact type" << contactType << "Keys" <<  defns.keys();
   320     
   385     
   321     *error = QContactManager::NoError;
   386     *error = QContactManager::NoError;
   322     return defns[contactType];
   387     return defns[contactType];
   359   st.append(QVariant::Date);
   424   st.append(QVariant::Date);
   360   st.append(QVariant::DateTime);
   425   st.append(QVariant::DateTime);
   361 
   426 
   362   return st;   
   427   return st;   
   363 }
   428 }
       
   429 
       
   430 void QContactMaemo5Engine::requestDestroyed(QContactAbstractRequest* req){
       
   431   m_asynchronousOperations.removeOne(req);
       
   432 }
       
   433 
       
   434 bool QContactMaemo5Engine::startRequest(QContactAbstractRequest* req){
       
   435   if (!m_asynchronousOperations.contains(req))
       
   436     m_asynchronousOperations.enqueue(req);
       
   437   updateRequestState(req, QContactAbstractRequest::ActiveState);
       
   438   QTimer::singleShot(0, this, SLOT(performAsynchronousOperation()));
       
   439   return true;
       
   440 }
       
   441 
       
   442 bool QContactMaemo5Engine::cancelRequest(QContactAbstractRequest* req){
       
   443   updateRequestState(req, QContactAbstractRequest::CanceledState);
       
   444   return true;
       
   445 }
       
   446 
       
   447 bool QContactMaemo5Engine::waitForRequestProgress(QContactAbstractRequest* req, int msecs){
       
   448   Q_UNUSED(msecs);
       
   449   
       
   450   if (!m_asynchronousOperations.removeOne(req))
       
   451     return false; // didn't exist.
       
   452 
       
   453   // replace at head of queue
       
   454   m_asynchronousOperations.insert(0, req);
       
   455 
       
   456   // and perform the operation.
       
   457   performAsynchronousOperation();
       
   458 
       
   459   return true;
       
   460 }
       
   461 
       
   462 bool QContactMaemo5Engine::waitForRequestFinished(QContactAbstractRequest* req, int msecs){
       
   463   // in our implementation, we always complete any operation we start.
       
   464   // so, waitForRequestFinished is equivalent to waitForRequestProgress.
       
   465   return waitForRequestProgress(req, msecs);
       
   466 }
       
   467 
       
   468 void QContactMaemo5Engine::performAsynchronousOperation(){
       
   469   QContactAbstractRequest *currentRequest;
       
   470 
       
   471   // take the first pending request and finish it
       
   472   if (m_asynchronousOperations.isEmpty())
       
   473     return;
       
   474   currentRequest = m_asynchronousOperations.dequeue();
       
   475 
       
   476   // check to see if it is cancelling; if so, remove it from the queue and return.
       
   477   if (currentRequest->state() == QContactAbstractRequest::CanceledState)
       
   478     return;
       
   479 
       
   480   // Now perform the active request and emit required signals.
       
   481   Q_ASSERT(currentRequest->state() == QContactAbstractRequest::ActiveState);
       
   482   switch (currentRequest->type()) {
       
   483     case QContactAbstractRequest::ContactFetchRequest:
       
   484     {
       
   485       QContactFetchRequest* r = static_cast<QContactFetchRequest*>(currentRequest);
       
   486       QContactFilter filter = r->filter();
       
   487       QList<QContactSortOrder> sorting = r->sorting();
       
   488       QContactFetchHint fh = r->fetchHint();
       
   489 
       
   490       QContactManager::Error operationError;
       
   491       QList<QContact> requestedContacts = contacts(filter, sorting, fh, &operationError);
       
   492 
       
   493       // update the request with the results.
       
   494       updateContactFetchRequest(r, requestedContacts, operationError, QContactAbstractRequest::FinishedState); // emit resultsAvailable()
       
   495     } break;
       
   496     case QContactAbstractRequest::ContactLocalIdFetchRequest:
       
   497     {
       
   498       QContactLocalIdFetchRequest* r = static_cast<QContactLocalIdFetchRequest*>(currentRequest);
       
   499       QContactFilter filter = r->filter();
       
   500       QList<QContactSortOrder> sorting = r->sorting();
       
   501 
       
   502       QContactManager::Error operationError = QContactManager::NoError;
       
   503       QList<QContactLocalId> requestedContactIds = contactIds(filter, sorting, &operationError);
       
   504 
       
   505       updateContactLocalIdFetchRequest(r, requestedContactIds, operationError, QContactAbstractRequest::FinishedState);
       
   506     } break;
       
   507     case QContactAbstractRequest::ContactSaveRequest:
       
   508     {
       
   509       QContactSaveRequest* r = static_cast<QContactSaveRequest*>(currentRequest);
       
   510       QList<QContact> contacts = r->contacts();
       
   511 
       
   512       QContactManager::Error operationError = QContactManager::NoError;
       
   513       QMap<int, QContactManager::Error> errorMap;
       
   514       saveContacts(&contacts, &errorMap, &operationError);
       
   515 
       
   516       updateContactSaveRequest(r, contacts, operationError, errorMap, QContactAbstractRequest::FinishedState); // there will always be results of some form.  emit resultsAvailable().
       
   517      } break;
       
   518      case QContactAbstractRequest::ContactRemoveRequest:
       
   519      {
       
   520        // this implementation provides scant information to the user
       
   521        // the operation either succeeds (all contacts matching the filter were removed)
       
   522        // or it fails (one or more contacts matching the filter could not be removed)
       
   523        // if a failure occurred, the request error will be set to the most recent
       
   524        // error that occurred during the remove operation.
       
   525        QContactRemoveRequest* r = static_cast<QContactRemoveRequest*>(currentRequest);
       
   526        QContactManager::Error operationError = QContactManager::NoError;
       
   527        QList<QContactLocalId> contactsToRemove = r->contactIds();
       
   528        QMap<int, QContactManager::Error> errorMap;
       
   529 
       
   530        for (int i = 0; i < contactsToRemove.size(); i++) {
       
   531          QContactManager::Error tempError;
       
   532          removeContact(contactsToRemove.at(i), /*changeSet,*/ &tempError);
       
   533 
       
   534          errorMap.insert(i, tempError);                
       
   535          if (tempError != QContactManager::NoError) {
       
   536            operationError = tempError;
       
   537          }
       
   538        }
       
   539 
       
   540        updateContactRemoveRequest(r, operationError, errorMap, QContactAbstractRequest::FinishedState);
       
   541      } break;
       
   542      case QContactAbstractRequest::DetailDefinitionFetchRequest:
       
   543      {
       
   544        QContactDetailDefinitionFetchRequest* r = static_cast<QContactDetailDefinitionFetchRequest*>(currentRequest);
       
   545        QContactManager::Error operationError = QContactManager::NoError;
       
   546        QMap<int, QContactManager::Error> errorMap;
       
   547        QMap<QString, QContactDetailDefinition> requestedDefinitions;
       
   548        QStringList names = r->definitionNames();
       
   549        if (names.isEmpty())
       
   550          names = detailDefinitions(r->contactType(), &operationError).keys(); // all definitions.
       
   551 
       
   552        QContactManager::Error tempError;
       
   553        for (int i = 0; i < names.size(); i++) {
       
   554          QContactDetailDefinition current = detailDefinition(names.at(i), r->contactType(), &tempError);
       
   555          requestedDefinitions.insert(names.at(i), current);
       
   556 
       
   557          errorMap.insert(i, tempError);              
       
   558          if (tempError != QContactManager::NoError) {
       
   559            operationError = tempError;
       
   560          }
       
   561        }
       
   562 
       
   563        updateDefinitionFetchRequest(r, requestedDefinitions, operationError, errorMap, QContactAbstractRequest::FinishedState);
       
   564      } break;
       
   565      default:
       
   566      {
       
   567        // symbian engine currently does not support mutable definitions.
       
   568      } break;
       
   569 
       
   570     
       
   571   } 
       
   572 }
       
   573