bool SalesforceContactsHandler::setEntry(const Akonadi::Item &item, SforceService *soap) { if (!item.hasPayload<KABC::Addressee>()) { kError() << "item (id=" << item.id() << ", remoteId=" << item.remoteId() << ", mime=" << item.mimeType() << ") is missing Addressee payload"; return false; } ENS__SObject object; object.setType(QLatin1String("Contact")); // if there is an id add it, otherwise skip this field // no id will result in the contact being added if (!item.remoteId().isEmpty()) { object.setId(item.remoteId()); } const KABC::Addressee addressee = item.payload<KABC::Addressee>(); QList<KDSoapValue> valueList; ContactAccessorHash::const_iterator it = mAccessors->constBegin(); ContactAccessorHash::const_iterator endIt = mAccessors->constEnd(); for (; it != endIt; ++it) { // Id is already part of the object, we have the accessor for the query if (it.key() == QLatin1String("Id")) { continue; } if (it->isAvailable) { const QString value = it->getter(addressee); valueList << KDSoapValue(it.key(), value); kDebug() << "Upsert: name=" << it.key() << "value=" << value; } } object.setAny(valueList); TNS__Upsert upsert; upsert.setExternalIDFieldName(QLatin1String("Id")); upsert.setSObjects(QList<ENS__SObject>() << object); soap->asyncUpsert(upsert); return true; }
Akonadi::Item::List SalesforceContactsHandler::itemsFromListEntriesResponse(const TNS__QueryResult &queryResult, const Akonadi::Collection &parentCollection) { Akonadi::Item::List items; Q_FOREACH (const ENS__SObject &entry, queryResult.records()) { const QList<KDSoapValue> valueList = entry.any(); if (valueList.isEmpty()) { kWarning() << "Contacts entry for id=" << entry.id().value() << "has no values"; kDebug() << "fieldsToNull:" << entry.fieldsToNull(); continue; } Akonadi::Item item; item.setRemoteId(entry.id().value()); item.setParentCollection(parentCollection); item.setMimeType(KABC::Addressee::mimeType()); KABC::Addressee addressee; addressee.setUid(entry.id().value()); QList<KDSoapValue>::const_iterator it = valueList.constBegin(); QList<KDSoapValue>::const_iterator endIt = valueList.constEnd(); for (; it != endIt; ++it) { ContactAccessorHash::const_iterator accessorIt = mAccessors->constFind(it->name()); if (accessorIt != mAccessors->constEnd()) { if (accessorIt->isAvailable) { accessorIt->setter(it->value().value<QString>(), addressee); } } else { kWarning() << "Contacts entry for id=" << entry.id().value() << "has unknown value named" << it->name(); } } item.setPayload<KABC::Addressee>(addressee); items << item; } kDebug() << "Query result had" << items.count() << "valid contact items"; return items; }
bool ContactsHandler::setEntry(const Akonadi::Item &item) { if (!item.hasPayload<KABC::Addressee>()) { kError() << "item (id=" << item.id() << ", remoteId=" << item.remoteId() << ", mime=" << item.mimeType() << ") is missing Addressee payload"; return false; } QList<KDSoapGenerated::TNS__Name_value> itemList; // if there is an id add it, otherwise skip this field // no id will result in the contact being added if (!item.remoteId().isEmpty()) { KDSoapGenerated::TNS__Name_value field; field.setName(QLatin1String("id")); field.setValue(item.remoteId()); itemList << field; } const KABC::Addressee addressee = item.payload<KABC::Addressee>(); ContactAccessorHash::const_iterator it = mAccessors->constBegin(); ContactAccessorHash::const_iterator endIt = mAccessors->constEnd(); for (; it != endIt; ++it) { // check if this is a read-only field if ((*it)->getter == 0) { continue; } KDSoapGenerated::TNS__Name_value field; field.setName(it.key()); const QString value = KDCRMUtils::encodeXML((*it)->getter(addressee)); field.setValue(value); itemList << field; } KDSoapGenerated::TNS__Name_value_list valueList; valueList.setItems(itemList); soap()->asyncSet_entry(sessionId(), moduleName(), valueList); return true; }
void ContactsHandler::compare(Akonadi::AbstractDifferencesReporter *reporter, const Akonadi::Item &leftItem, const Akonadi::Item &rightItem) { Q_ASSERT(leftItem.hasPayload<KABC::Addressee>()); Q_ASSERT(rightItem.hasPayload<KABC::Addressee>()); const KABC::Addressee leftContact = leftItem.payload<KABC::Addressee>(); const KABC::Addressee rightContact = rightItem.payload<KABC::Addressee>(); const QString modifiedBy = mSession->userName(); const QString modifiedOn = formatDate(getDateModified(rightContact)); reporter->setLeftPropertyValueTitle(i18nc("@title:column", "Local Contact")); reporter->setRightPropertyValueTitle( i18nc("@title:column", "Serverside Contact: modified by %1 on %2", modifiedBy, modifiedOn)); bool seenPrimaryAddress = false; bool seenOtherAddress = false; ContactAccessorHash::const_iterator it = mAccessors->constBegin(); ContactAccessorHash::const_iterator endIt = mAccessors->constEnd(); for (; it != endIt; ++it) { // check if this is a read-only field if ((*it)->getter == 0) { continue; } QString leftValue = (*it)->getter(leftContact); QString rightValue = (*it)->getter(rightContact); QString diffName = (*it)->diffName; if (diffName.isEmpty()) { // check for special fields if (isAddressValue(it.key())) { if (isPrimaryAddressValue(it.key())) { if (!seenPrimaryAddress) { diffName = i18nc("item:intable", "Primary Address"); seenPrimaryAddress = true; const KABC::Address leftAddress = leftContact.address(KABC::Address::Work | KABC::Address::Pref); const KABC::Address rightAddress = rightContact.address(KABC::Address::Work | KABC::Address::Pref); leftValue = leftAddress.formattedAddress(); rightValue = rightAddress.formattedAddress(); } else { // already printed, skip continue; } } else { if (!seenOtherAddress) { seenOtherAddress = true; diffName = i18nc("item:intable", "Other Address"); const KABC::Address leftAddress = leftContact.address(KABC::Address::Home); const KABC::Address rightAddress = rightContact.address(KABC::Address::Home); leftValue = leftAddress.formattedAddress(); rightValue = rightAddress.formattedAddress(); } else { // already printed, skip continue; } } } else if (it.key() == "do_not_call") { diffName = i18nc("@item:intable", "Do Not Call"); leftValue = getDoNotCall(leftContact) == QLatin1String("1") ? QLatin1String("Yes") : QLatin1String("No"); rightValue = getDoNotCall(rightContact) == QLatin1String("1") ? QLatin1String("Yes") : QLatin1String("No"); } else { // internal field, skip continue; } } if (leftValue.isEmpty() && rightValue.isEmpty()) { continue; } if (leftValue.isEmpty()) { reporter->addProperty(Akonadi::AbstractDifferencesReporter::AdditionalRightMode, diffName, leftValue, rightValue); } else if (rightValue.isEmpty()) { reporter->addProperty(Akonadi::AbstractDifferencesReporter::AdditionalLeftMode, diffName, leftValue, rightValue); } else if (leftValue != rightValue) { reporter->addProperty(Akonadi::AbstractDifferencesReporter::ConflictMode, diffName, leftValue, rightValue); } } }