/*! * 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 CntTransformUrl::detailDefinitions(QMap<QString, QContactDetailDefinition> &definitions, const QString &contactType) const { Q_UNUSED(contactType); if(definitions.contains(QContactUrl::DefinitionName)) { QContactDetailDefinition d = definitions.value(QContactUrl::DefinitionName); QMap<QString, QContactDetailFieldDefinition> fields = d.fields(); QContactDetailFieldDefinition f; f.setDataType(QVariant::String); //only allowed to be a single subtype f.setAllowableValues(QVariantList() << QString(QLatin1String(QContactUrl::SubTypeHomePage))); fields.insert(QContactUrl::FieldSubType, 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 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 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); }
/*! * 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); }