/*! * Modifies the detail definitions. The default detail definitions are * queried from QContactManagerEngine::schemaDefinitions and then modified * with this function in the transform leaf classes. * * \a definitions The detail definitions to modify. * \a contactType The contact type the definitions apply for. */ void CntTransformOnlineAccount::detailDefinitions(QMap<QString, QContactDetailDefinition> &definitions, const QString& contactType) const { Q_UNUSED(contactType); if(definitions.contains(QContactOnlineAccount::DefinitionName)) { QContactDetailDefinition d = definitions.value(QContactOnlineAccount::DefinitionName); QMap<QString, QContactDetailFieldDefinition> fields = d.fields(); QContactDetailFieldDefinition f; // Support only certain subtypes f.setDataType(QVariant::StringList); QVariantList subTypes; subTypes << QString(QLatin1String(QContactOnlineAccount::SubTypeSip)); subTypes << QString(QLatin1String(QContactOnlineAccount::SubTypeSipVoip)); subTypes << QString(QLatin1String(QContactOnlineAccount::SubTypeImpp)); subTypes << QString(QLatin1String(QContactOnlineAccount::SubTypeVideoShare)); f.setAllowableValues(subTypes); fields[QContactOnlineAccount::FieldSubTypes] = f; // Don't support "ContextOther" f.setDataType(QVariant::StringList); f.setAllowableValues(QVariantList() << QLatin1String(QContactDetail::ContextHome) << QLatin1String(QContactDetail::ContextWork)); fields[QContactDetail::FieldContext] = f; d.setFields(fields); // Replace original definitions definitions.insert(d.name(), d); } }
/*! * Modifies the detail definitions. The default detail definitions are * queried from QContactManagerEngine::schemaDefinitions and then modified * with this function in the transform leaf classes. * * \a definitions The detail definitions to modify. * \a contactType The contact type the definitions apply for. */ void CntTransformOrganisation::detailDefinitions(QMap<QString, QContactDetailDefinition> &definitions, const QString& contactType) const { Q_UNUSED(contactType); if(definitions.contains(QContactOrganization::DefinitionName)) { QContactDetailDefinition d = definitions.value(QContactOrganization::DefinitionName); QMap<QString, QContactDetailFieldDefinition> fields = d.fields(); QContactDetailFieldDefinition f; // Not all fields are supported, replace: fields.clear(); f.setDataType(QVariant::String); f.setAllowableValues(QVariantList()); fields.insert(QContactOrganization::FieldName, f); fields.insert(QContactOrganization::FieldTitle, f); fields.insert(QContactOrganization::FieldAssistantName, f); f.setDataType(QVariant::StringList); fields.insert(QContactOrganization::FieldDepartment, f); d.setFields(fields); // Replace original definitions definitions.insert(d.name(), d); } }
/*! * Modifies the detail definitions. The default detail definitions are * queried from QContactManagerEngine::schemaDefinitions and then modified * with this function in the transform leaf classes. * * \a definitions The detail definitions to modify. * \a contactType The contact type the definitions apply for. */ void CntTransformName::detailDefinitions(QMap<QString, QContactDetailDefinition> &definitions, const QString& contactType) const { if(definitions.contains(QContactName::DefinitionName)) { QContactDetailDefinition d = definitions.value(QContactName::DefinitionName); QMap<QString, QContactDetailFieldDefinition> fields = d.fields(); // groups support only custom label if(contactType == QContactType::TypeGroup) { fields.remove(QContactName::FieldPrefix); fields.remove(QContactName::FieldFirstName); fields.remove(QContactName::FieldMiddleName); fields.remove(QContactName::FieldLastName); fields.remove(QContactName::FieldSuffix); } else { // Note: Custom labels cannot be enabled for a contact in pre-10.1 // platforms because setting custom label for a contact causes // issues for S60 Phonebook editor. If custom label support is // needed in 10.1 or later, it needs to be variated away from // pre-10.1 platforms. #ifndef SYMBIAN_BACKEND_USE_CNTMODEL_V2 fields.remove(QContactName::FieldCustomLabel); #endif } // Context not supported in symbian back-end, remove fields.remove(QContactName::FieldContext); d.setFields(fields); d.setUnique(true); // Replace original definitions definitions.insert(d.name(), d); } }
/*! * Modifies the detail definitions. The default detail definitions are * queried from QContactManagerEngine::schemaDefinitions and then modified * with this function in the transform leaf classes. * * \a definitions The detail definitions to modify. * \a contactType The contact type the definitions apply for. */ void CntTransformOnlineAccount::detailDefinitions(QMap<QString, QContactDetailDefinition> &definitions, const QString& contactType) const { Q_UNUSED(contactType); if(definitions.contains(QContactOnlineAccount::DefinitionName)) { QContactDetailDefinition d = definitions.value(QContactOnlineAccount::DefinitionName); QMap<QString, QContactDetailFieldDefinition> fields = d.fields(); QContactDetailFieldDefinition f; // Not all fields are supported fields.remove(QContactOnlineAccount::FieldCapabilities); fields.remove(QContactOnlineAccount::FieldDetailUri); fields.remove(QContactOnlineAccount::FieldLinkedDetailUris); fields.remove(QContactOnlineAccount::FieldServiceProvider); fields.remove(QContactOnlineAccount::FieldContext); // Support only certain subtypes f.setDataType(QVariant::StringList); QVariantList subTypes; subTypes << QString(QLatin1String(QContactOnlineAccount::SubTypeSip)); subTypes << QString(QLatin1String(QContactOnlineAccount::SubTypeSipVoip)); subTypes << QString(QLatin1String(QContactOnlineAccount::SubTypeVideoShare)); f.setAllowableValues(subTypes); fields[QContactOnlineAccount::FieldSubTypes] = f; d.setFields(fields); // Replace original definitions definitions.insert(d.name(), d); } }
/*! * Modifies the detail definitions. The default detail definitions are * queried from QContactManagerEngine::schemaDefinitions and then modified * with this function in the transform leaf classes. * * \a definitions The detail definitions to modify. * \a contactType The contact type the definitions apply for. */ void CntTransformNickname::detailDefinitions(QMap<QString, QContactDetailDefinition> &definitions, const QString& contactType) const { Q_UNUSED(contactType); if(definitions.contains(QContactNickname::DefinitionName)) { QContactDetailDefinition d = definitions.value(QContactNickname::DefinitionName); QMap<QString, QContactDetailFieldDefinition> fields = d.fields(); // Context not supported in symbian back-end, remove fields.remove(QContactNickname::FieldContext); d.setFields(fields); // Replace original definitions definitions.insert(d.name(), d); } }
bool QContactMaemo5Engine::validateDefinition(const QContactDetailDefinition& definition, QContactManager::Error* error) const { QContactDetailDefinition existing = detailDefinition(definition.name(), QContactType::TypeContact, error); if (existing == definition) { *error = QContactManager::NoError; return true; } *error = QContactManager::NotSupportedError; // XXX TODO: mutable definitions? return false; }
/*! * Modifies the detail definitions. The default detail definitions are * queried from QContactManagerEngine::schemaDefinitions and then modified * with this function in the transform leaf classes. * * \a definitions The detail definitions to modify. * \a contactType The contact type the definitions apply for. */ void CntTransformPresence::detailDefinitions(QMap<QString, QContactDetailDefinition> &definitions, const QString& contactType) const { Q_UNUSED(contactType); if(definitions.contains(QContactPresence::DefinitionName)) { QContactDetailDefinition d = definitions.value(QContactPresence::DefinitionName); QMap<QString, QContactDetailFieldDefinition> fields = d.fields(); QContactDetailFieldDefinition f; // Don't support "ContextOther" f.setDataType(QVariant::StringList); f.setAllowableValues(QVariantList() << QLatin1String(QContactDetail::ContextHome) << QLatin1String(QContactDetail::ContextWork)); fields[QContactDetail::FieldContext] = f; d.setFields(fields); // Replace original definitions definitions.insert(d.name(), d); } }
/*! * Modifies the detail definitions. The default detail definitions are * queried from QContactManagerEngine::schemaDefinitions and then modified * with this function in the transform leaf classes. * * \a definitions The detail definitions to modify. * \a contactType The contact type the definitions apply for. */ void CntTransformFamily::detailDefinitions(QMap<QString, QContactDetailDefinition> &definitions, const QString& contactType) const { Q_UNUSED(contactType); // Note: Family is not defined in the default schema QMap<QString, QContactDetailFieldDefinition> fields; QContactDetailFieldDefinition f; QContactDetailDefinition d; d.setName(QContactFamily::DefinitionName); f.setDataType(QVariant::String); f.setAllowableValues(QVariantList()); fields.insert(QContactFamily::FieldSpouse, f); f.setDataType(QVariant::StringList); fields.insert(QContactFamily::FieldChildren, f); d.setFields(fields); d.setUnique(true); definitions.insert(d.name(), d); }
void MainWindow::on_pushButton_3_clicked() { // qDebug() << "The default manager for the platform is:" << cm.managerName(); // qDebug() << "It" << (cm.isRelationshipTypeSupported(QContactRelationship::HasAssistant) ? "supports" : "does not support") << "assistant relationships."; // qDebug() << "It" << (cm.supportedContactTypes().contains(QContactType::TypeGroup) ? "supports" : "does not support") << "groups."; // qDebug() << "It" << (cm.hasFeature(QContactManager::MutableDefinitions) ? "supports" : "does not support") << "mutable detail definitions."; QList<QContactLocalId> contactIds = cm.contactIds(); QContact a = cm.contact(contactIds.first()); qDebug() << "Viewing the details of" << a.displayLabel(); QList<QContactDetail> allDetails = a.details(); for (int i = 0; i < allDetails.size(); i++) { QContactDetail detail = allDetails.at(i); QContactDetailDefinition currentDefinition = cm.detailDefinition(detail.definitionName()); QMap<QString, QContactDetailFieldDefinition> fields = currentDefinition.fields(); qDebug("\tDetail #%d (%s):", i, detail.definitionName().toAscii().constData()); foreach (const QString& fieldKey, fields.keys()) { qDebug() << "\t\t" << fieldKey << "(" << fields.value(fieldKey).dataType() << ") =" << detail.value(fieldKey); } qDebug(); } QContact b; QContactDetail de; foreach (const QContactLocalId& ids, contactIds ) { b = cm.contact(ids); de = b.detail("PhoneNumber"); bool s = de.hasValue("PhoneNumber"); qDebug()<< " has Value PhoneNumber key"<<s<<"|"<<de.value("PhoneNumber"); QString show; show = b.displayLabel(); show.append("\t"); show.append(de.value("PhoneNumber")); ui->listWidget_2->addItem(show); }
/*! * Modifies the detail definitions. The default detail definitions are * queried from QContactManagerEngine::schemaDefinitions and then modified * with this function in the transform leaf classes. * * \a definitions The detail definitions to modify. * \a contactType The contact type the definitions apply for. */ void CntTransformThumbnail::detailDefinitions(QMap<QString, QContactDetailDefinition> &definitions, const QString& contactType) const { Q_UNUSED(contactType); if(definitions.contains(QContactThumbnail::DefinitionName)) { QContactDetailDefinition d = definitions.value(QContactThumbnail::DefinitionName); QMap<QString, QContactDetailFieldDefinition> fields = d.fields(); QContactDetailFieldDefinition f1; f1.setDataType(QVariant::LongLong); fields.insert(KThumbnailChecksum, f1); QContactDetailFieldDefinition f2; f2.setDataType(QVariant::ByteArray); fields.insert(KThumbnailJpgImage, f2); d.setFields(fields); // Replace original definitions definitions.insert(d.name(), d); } }
/*! * Returns a map of identifier to detail definition which are valid for contacts whose type is the given \a contactType * which are valid for the contacts in this store */ QMap<QString, QContactDetailDefinition> CntSymbianSimEngine::detailDefinitions(const QString& contactType, QContactManager::Error* error) const { if (!supportedContactTypes().contains(contactType)) { // Should never happen *error = QContactManager::NotSupportedError; return QMap<QString, QContactDetailDefinition>(); } // Get store information SimStoreInfo storeInfo = d->m_simStore->storeInfo(); // the map we will eventually return QMap<QString, QContactDetailDefinition> retn; // local variables for reuse QMap<QString, QContactDetailFieldDefinition> fields; QContactDetailFieldDefinition f; QContactDetailDefinition def; QVariantList subTypes; // sync target def.setName(QContactSyncTarget::DefinitionName); fields.clear(); f.setDataType(QVariant::String); subTypes.clear(); subTypes << QString(QLatin1String(KSimSyncTarget)); f.setAllowableValues(subTypes); fields.insert(QContactSyncTarget::FieldSyncTarget, f); def.setFields(fields); def.setUnique(true); retn.insert(def.name(), def); // type def.setName(QContactType::DefinitionName); fields.clear(); f.setDataType(QVariant::String); subTypes.clear(); // groups are not supported subTypes << QString(QLatin1String(QContactType::TypeContact)); f.setAllowableValues(subTypes); fields.insert(QContactType::FieldType, f); // note: NO CONTEXT!! def.setFields(fields); def.setUnique(true); retn.insert(def.name(), def); /* TODO // guid def.setName(QContactGuid::DefinitionName); fields.clear(); f.setDataType(QVariant::String); f.setAllowableValues(QVariantList()); fields.insert(QContactGuid::FieldGuid, f); f.setDataType(QVariant::StringList); f.setAllowableValues(contexts); fields.insert(QContactDetail::FieldContext, f); def.setFields(fields); def.setUnique(false); def.setAccessConstraint(QContactDetailDefinition::CreateOnly); retn.insert(def.name(), def); */ // display label def.setName(QContactDisplayLabel::DefinitionName); fields.clear(); f.setDataType(QVariant::String); f.setAllowableValues(QVariantList()); fields.insert(QContactDisplayLabel::FieldLabel, f); def.setFields(fields); def.setUnique(true); retn.insert(def.name(), def); // email support needs to be checked run-time, because it is SIM specific if (storeInfo.m_emailSupported) { def.setName(QContactEmailAddress::DefinitionName); fields.clear(); f.setDataType(QVariant::String); f.setAllowableValues(QVariantList()); fields.insert(QContactEmailAddress::FieldEmailAddress, f); def.setFields(fields); def.setUnique(true); retn.insert(def.name(), def); } // phone number def.setName(QContactPhoneNumber::DefinitionName); fields.clear(); f.setDataType(QVariant::String); f.setAllowableValues(QVariantList()); fields.insert(QContactPhoneNumber::FieldNumber, f); // TODO: subtypes supported in case a sim contact can have multiple phone numbers? def.setFields(fields); if (storeInfo.m_additionalNumberSupported) { // multiple numbers supported def.setUnique(false); } else { // only one phone number allowed def.setUnique(true); } retn.insert(def.name(), def); // nickname support needs to be checked run-time, because it is SIM specific if (storeInfo.m_secondNameSupported) { def.setName(QContactNickname::DefinitionName); fields.clear(); f.setDataType(QVariant::String); f.setAllowableValues(QVariantList()); fields.insert(QContactNickname::FieldNickname, f); def.setFields(fields); def.setUnique(true); retn.insert(def.name(), def); } // name def.setName(QContactName::DefinitionName); fields.clear(); f.setDataType(QVariant::String); f.setAllowableValues(QVariantList()); fields.insert(QContactName::FieldCustomLabel, f); def.setFields(fields); def.setUnique(true); retn.insert(def.name(), def); return retn; }
void AsyncRequestExample::performRequests() { //! [Creating a new contact in a manager] QContact exampleContact; QContactName nameDetail; nameDetail.setFirstName("Adam"); nameDetail.setLastName("Unlikely"); QContactPhoneNumber phoneNumberDetail; phoneNumberDetail.setNumber("+123 4567"); exampleContact.saveDetail(&nameDetail); exampleContact.saveDetail(&phoneNumberDetail); // save the newly created contact in the manager connect(&m_contactSaveRequest, SIGNAL(stateChanged(QContactAbstractRequest::State)), this, SLOT(contactSaveRequestStateChanged(QContactAbstractRequest::State))); m_contactSaveRequest.setManager(m_manager); m_contactSaveRequest.setContacts(QList<QContact>() << exampleContact); m_contactSaveRequest.start(); //! [Creating a new contact in a manager] m_contactSaveRequest.waitForFinished(); //! [Creating a new contact in a manager waiting until finished] m_contactSaveRequest.setManager(m_manager); m_contactSaveRequest.setContacts(QList<QContact>() << exampleContact); m_contactSaveRequest.start(); m_contactSaveRequest.waitForFinished(); QList<QContact> savedContacts = m_contactSaveRequest.contacts(); //! [Creating a new contact in a manager waiting until finished] //! [Filtering contacts from a manager] connect(&m_contactFetchRequest, SIGNAL(stateChanged(QContactAbstractRequest::State)), this, SLOT(contactFetchRequestStateChanged(QContactAbstractRequest::State))); m_contactFetchRequest.setManager(m_manager); m_contactFetchRequest.setFilter(QContactPhoneNumber::match("+123 4567")); m_contactFetchRequest.start(); //! [Filtering contacts from a manager] m_contactFetchRequest.waitForFinished(); //! [Retrieving an existing contact from a manager] QContactLocalIdFilter idListFilter; idListFilter.setIds(QList<QContactLocalId>() << exampleContact.localId()); m_contactFetchRequest.setManager(m_manager); m_contactFetchRequest.setFilter(idListFilter); m_contactFetchRequest.start(); //! [Retrieving an existing contact from a manager] m_contactFetchRequest.waitForFinished(); //! [Updating an existing contact in a manager] phoneNumberDetail.setNumber("+123 9876"); exampleContact.saveDetail(&phoneNumberDetail); m_contactSaveRequest.setManager(m_manager); m_contactSaveRequest.setContacts(QList<QContact>() << exampleContact); m_contactSaveRequest.start(); //! [Updating an existing contact in a manager] m_contactFetchRequest.waitForFinished(); //! [Removing a contact from a manager] connect(&m_contactRemoveRequest, SIGNAL(stateChanged(QContactAbstractRequest::State)), this, SLOT(contactRemoveRequestStateChanged(QContactAbstractRequest::State))); m_contactRemoveRequest.setManager(m_manager); m_contactRemoveRequest.setContactIds(QList<QContactLocalId>() << exampleContact.localId()); m_contactRemoveRequest.start(); //! [Removing a contact from a manager] m_contactFetchRequest.waitForFinished(); //! [Creating a new relationship between two contacts] // first, create the group and the group member QContact exampleGroup; exampleGroup.setType(QContactType::TypeGroup); QContactNickname groupName; groupName.setNickname("Example Group"); exampleGroup.saveDetail(&groupName); QContact exampleGroupMember; QContactName groupMemberName; groupMemberName.setFirstName("Member"); exampleGroupMember.saveDetail(&groupMemberName); // second, save those contacts in the manager QList<QContact> saveList; saveList << exampleGroup << exampleGroupMember; m_contactSaveRequest.setContacts(saveList); m_contactSaveRequest.start(); m_contactSaveRequest.waitForFinished(); // third, create the relationship between those contacts QContactRelationship groupRelationship; groupRelationship.setFirst(exampleGroup.id()); groupRelationship.setRelationshipType(QContactRelationship::HasMember); groupRelationship.setSecond(exampleGroupMember.id()); // finally, save the relationship in the manager connect(&m_relationshipSaveRequest, SIGNAL(stateChanged(QContactAbstractRequest::State)), this, SLOT(relationshipSaveRequestStateChanged(QContactAbstractRequest::State))); m_relationshipSaveRequest.setManager(m_manager); m_relationshipSaveRequest.setRelationships(QList<QContactRelationship>() << groupRelationship); m_relationshipSaveRequest.start(); //! [Creating a new relationship between two contacts] m_contactFetchRequest.waitForFinished(); //! [Retrieving relationships between contacts] connect(&m_relationshipFetchRequest, SIGNAL(stateChanged(QContactAbstractRequest::State)), this, SLOT(relationshipFetchRequestStateChanged(QContactAbstractRequest::State))); m_relationshipFetchRequest.setManager(m_manager); // retrieve the list of relationships between the example group contact and the example member contact // where the group contact is the first contact in the relationship, and the member contact is the // second contact in the relationship. In order to fetch all relationships between them, another // relationship fetch must be performed with their roles reversed, and the results added together. m_relationshipFetchRequest.setFirst(exampleGroup.id()); m_relationshipFetchRequest.setSecond(exampleGroupMember.id()); m_relationshipFetchRequest.start(); //! [Retrieving relationships between contacts] m_contactFetchRequest.waitForFinished(); //! [Providing a fetch hint] QContactFetchHint hasMemberRelationshipsOnly; hasMemberRelationshipsOnly.setRelationshipTypesHint(QStringList(QContactRelationship::HasMember)); m_contactFetchRequest.setManager(m_manager); m_contactFetchRequest.setFilter(QContactFilter()); // all contacts m_contactFetchRequest.setFetchHint(hasMemberRelationshipsOnly); m_contactFetchRequest.start(); //! [Providing a fetch hint] //! [Removing a relationship] connect(&m_relationshipRemoveRequest, SIGNAL(stateChanged(QContactAbstractRequest::State)), this, SLOT(relationshipRemoveRequestStateChanged(QContactAbstractRequest::State))); m_relationshipRemoveRequest.setManager(m_manager); m_relationshipRemoveRequest.setRelationships(QList<QContactRelationship>() << groupRelationship); m_relationshipRemoveRequest.start(); //! [Removing a relationship] connect(&m_definitionFetchRequest, SIGNAL(stateChanged(QContactAbstractRequest::State)), this, SLOT(definitionFetchRequestStateChanged(QContactAbstractRequest::State))); //! [Querying the schema supported by a manager] m_definitionFetchRequest.setManager(m_manager); m_definitionFetchRequest.setDefinitionNames(QStringList(QContactName::DefinitionName)); m_definitionFetchRequest.start(); m_definitionFetchRequest.waitForFinished(); QMap<QString, QContactDetailDefinition> definitions = m_definitionFetchRequest.definitions(); qDebug() << "This manager" << (definitions.value(QContactName::DefinitionName).fields().contains(QContactName::FieldCustomLabel) ? "supports" : "does not support") << "the custom label field of QContactName"; //! [Querying the schema supported by a manager] connect(&m_definitionSaveRequest, SIGNAL(stateChanged(QContactAbstractRequest::State)), this, SLOT(definitionSaveRequestStateChanged(QContactAbstractRequest::State))); connect(&m_definitionRemoveRequest, SIGNAL(stateChanged(QContactAbstractRequest::State)), this, SLOT(definitionRemoveRequestStateChanged(QContactAbstractRequest::State))); //! [Modifying the schema supported by a manager] // modify the name definition, adding a patronym field QContactDetailDefinition nameDefinition = definitions.value(QContactName::DefinitionName); QContactDetailFieldDefinition fieldPatronym; fieldPatronym.setDataType(QVariant::String); nameDefinition.insertField("Patronym", fieldPatronym); // save the updated definition in the manager if supported... if (m_manager->hasFeature(QContactManager::MutableDefinitions)) { m_definitionSaveRequest.setManager(m_manager); m_definitionSaveRequest.setContactType(QContactType::TypeContact); m_definitionSaveRequest.setDefinitions(QList<QContactDetailDefinition>() << nameDefinition); m_definitionSaveRequest.start(); } //! [Modifying the schema supported by a manager] QCoreApplication::exit(0); }