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 |