void CalendarResource::itemChanged(const Akonadi::Item &item, const QSet< QByteArray > &partIdentifiers) { Q_UNUSED(partIdentifiers); if (!canPerformTask<KCalCore::Event::Ptr>(item, KCalCore::Event::eventMimeType()) && !canPerformTask<KCalCore::Todo::Ptr>(item, KCalCore::Todo::todoMimeType())) { return; } KGAPI2::Job *job = Q_NULLPTR; if (item.hasPayload<KCalCore::Event::Ptr>()) { KCalCore::Event::Ptr event = item.payload<KCalCore::Event::Ptr>(); EventPtr kevent(new Event(*event)); kevent->setUid(item.remoteId()); job = new EventModifyJob(kevent, item.parentCollection().remoteId(), account(), this); connect(job, &EventCreateJob::finished, this, &CalendarResource::slotGenericJobFinished); } else if (item.hasPayload<KCalCore::Todo::Ptr>()) { KCalCore::Todo::Ptr todo = item.payload<KCalCore::Todo::Ptr>(); TaskPtr ktodo(new Task(*todo)); QString parentUid = todo->relatedTo(KCalCore::Incidence::RelTypeParent); job = new TaskMoveJob(item.remoteId(), item.parentCollection().remoteId(), parentUid, account(), this); job->setProperty(ITEM_PROPERTY, QVariant::fromValue(item)); connect(job, &EventCreateJob::finished, this, &CalendarResource::slotModifyTaskReparentFinished); } else { cancelTask(i18n("Invalid payload type")); return; } job->setProperty(ITEM_PROPERTY, QVariant::fromValue(item)); }
int ContactsHandler::setEntry(const Akonadi::Item &item, QString &newId, QString &errorMessage) { if (!item.hasPayload<KContacts::Addressee>()) { qCCritical(FATCRM_SUGARCRMRESOURCE_LOG) << "item (id=" << item.id() << ", remoteId=" << item.remoteId() << ", mime=" << item.mimeType() << ") is missing Addressee payload"; return SugarJob::InvalidContextError; } 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(QStringLiteral("id")); field.setValue(item.remoteId()); itemList << field; } // add regular sugar fields const KContacts::Addressee addressee = item.payload<KContacts::Addressee>(); KDSoapGenerated::TNS__Name_value_list valueList = addresseeToNameValueList(addressee, itemList); return mSession->protocol()->setEntry(module(), valueList, newId, errorMessage); }
int DocumentsHandler::setEntry(const Akonadi::Item &item, QString &newId, QString &errorMessage) { if (!item.hasPayload<SugarDocument>()) { qCCritical(FATCRM_SUGARCRMRESOURCE_LOG) << "item (id=" << item.id() << ", remoteId=" << item.remoteId() << ", mime=" << item.mimeType() << ") is missing Document payload"; return SugarJob::InvalidContextError; } QList<KDSoapGenerated::TNS__Name_value> itemList; // if there is an id add it, otherwise skip this field // no id will result in the email being added if (!item.remoteId().isEmpty()) { KDSoapGenerated::TNS__Name_value field; field.setName(QStringLiteral("id")); field.setValue(item.remoteId()); itemList << field; } const SugarDocument document = item.payload<SugarDocument>(); const SugarDocument::AccessorHash accessors = SugarDocument::accessorHash(); SugarDocument::AccessorHash::const_iterator it = accessors.constBegin(); SugarDocument::AccessorHash::const_iterator endIt = accessors.constEnd(); for (; it != endIt; ++it) { // check if this is a read-only field if (it.key() == QLatin1String("id")) { continue; } const SugarDocument::valueGetter getter = (*it).getter; KDSoapGenerated::TNS__Name_value field; field.setName(sugarFieldFromCrmField(it.key())); field.setValue(KDCRMUtils::encodeXML((document.*getter)())); itemList << field; } // plus custom fields QMap<QString, QString> customFields = document.customFields(); QMap<QString, QString>::const_iterator cit = customFields.constBegin(); const QMap<QString, QString>::const_iterator end = customFields.constEnd(); for ( ; cit != end ; ++cit ) { KDSoapGenerated::TNS__Name_value field; field.setName(customSugarFieldFromCrmField(cit.key())); field.setValue(KDCRMUtils::encodeXML(cit.value())); itemList << field; } KDSoapGenerated::TNS__Name_value_list valueList; valueList.setItems(itemList); return mSession->protocol()->setEntry(module(), valueList, newId, errorMessage); }
void EwsMtaResource::sendItem(const Akonadi::Item &item) { qDebug() << "sendItem" << item.remoteId(); if (!connectEws()) { itemSent(item, TransportFailed, i18n("Unable to connect to master EWS resource")); return; } mItemHash.insert(item.remoteId(), item); KMime::Message::Ptr msg = item.payload<KMime::Message::Ptr>(); QByteArray mimeContent = msg->encodedContent(true); mEwsResource->sendMessage(item.remoteId(), mimeContent); }
void CalendarResource::itemRemoved(const Akonadi::Item &item) { if (!canPerformTask()) { return; } if (item.mimeType() == KCalCore::Event::eventMimeType()) { KGAPI2::Job *job = new EventDeleteJob(item.remoteId(), item.parentCollection().remoteId(), account(), this); job->setProperty(ITEM_PROPERTY, QVariant::fromValue(item)); connect(job, &EventCreateJob::finished, this, &CalendarResource::slotGenericJobFinished); } else if (item.mimeType() == KCalCore::Todo::todoMimeType()) { /* Google always automatically removes tasks with all their subtasks. In KOrganizer * by default we only remove the item we are given. For this reason we have to first * fetch all tasks, find all sub-tasks for the task being removed and detach them * from the task. Only then the task can be safely removed. */ ItemFetchJob *fetchJob = new ItemFetchJob(item.parentCollection()); fetchJob->setAutoDelete(true); fetchJob->fetchScope().fetchFullPayload(true); fetchJob->setProperty(ITEM_PROPERTY, qVariantFromValue(item)); connect(fetchJob, &ItemFetchJob::finished, this, &CalendarResource::slotRemoveTaskFetchJobFinished); fetchJob->start(); } else { cancelTask(i18n("Invalid payload type. Expected event or todo, got %1", item.mimeType())); } }
bool KAlarmResource::doRetrieveItem(const Akonadi::Item& item, const QSet<QByteArray>& parts) { Q_UNUSED(parts); const QString rid = item.remoteId(); const KCal::Event* kcalEvent = calendar()->event(rid); if (!kcalEvent) { emit error(i18n("Event with uid '%1' not found.", rid)); return false; } if (kcalEvent->alarms().isEmpty()) { emit error(i18n("Event with uid '%1' contains no usable alarms.", rid)); return false; } KAEventData* event = new KAEventData(0, kcalEvent); QString mime = mimeType(event); if (mime.isEmpty()) { emit error(i18n("Event with uid '%1' contains no usable alarms.", rid)); delete event; return false; } Item i = item; i.setMimeType(mime); i.setPayload<EventPtr>(EventPtr(event)); itemRetrieved(i); return true; }
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; }
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; }
bool TasksHandler::setEntry( const Akonadi::Item &item ) { if ( !item.hasPayload<KCalCore::Todo::Ptr>() ) { kError() << "item (id=" << item.id() << ", remoteId=" << item.remoteId() << ", mime=" << item.mimeType() << ") is missing Todo payload"; return false; } QList<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() ) { TNS__Name_value field; field.setName( QLatin1String( "id" ) ); field.setValue( item.remoteId() ); itemList << field; } const KCalCore::Todo::Ptr todo = item.payload<KCalCore::Todo::Ptr>(); AccessorHash::const_iterator it = mAccessors->constBegin(); AccessorHash::const_iterator endIt = mAccessors->constEnd(); for ( ; it != endIt; ++it ) { // check if this is a read-only field if ( (*it)->getter == 0 ) { continue; } TNS__Name_value field; field.setName(sugarFieldFromCrmField(it.key())); field.setValue(KDCRMUtils::encodeXML((*it)->getter(*todo))); itemList << field; } TNS__Name_value_list valueList; valueList.setItems( itemList ); soap()->asyncSet_entry( sessionId(), moduleName(), valueList ); return true; }
bool KolabHelpers::checkForErrors(const Akonadi::Item &item) { if (!Kolab::ErrorHandler::instance().errorOccured()) { Kolab::ErrorHandler::instance().clear(); return false; } QString errorMsg; foreach (const Kolab::ErrorHandler::Err &error, Kolab::ErrorHandler::instance().getErrors()) { errorMsg.append(error.message); errorMsg.append(QLatin1String("\n")); } qCWarning(KOLABRESOURCE_LOG) << "Error on item with id: " << item.id() << " remote id: " << item.remoteId() << ":\n" << errorMsg; Kolab::ErrorHandler::instance().clear(); return true; }
Akonadi::Item KolabHelpers::translateFromImap(Kolab::FolderType folderType, const Akonadi::Item &imapItem, bool &ok) { //Avoid trying to convert imap messages if (folderType == Kolab::MailType) { return imapItem; } //No payload, probably a flag change or alike, we just pass it through if (!imapItem.hasPayload()) { return imapItem; } if (!imapItem.hasPayload<KMime::Message::Ptr>()) { qCWarning(KOLABRESOURCE_LOG) << "Payload is not a MessagePtr!"; Q_ASSERT(false); ok = false; return imapItem; } const KMime::Message::Ptr payload = imapItem.payload<KMime::Message::Ptr>(); const Kolab::KolabObjectReader reader(payload); if (checkForErrors(imapItem)) { ok = true; //We return an error object so the sync keeps working, and we can clean up the mess by simply deleting the object in the application. return getErrorItem(folderType, imapItem.remoteId()); } switch (reader.getType()) { case Kolab::EventObject: case Kolab::TodoObject: case Kolab::JournalObject: { const KCalCore::Incidence::Ptr incidencePtr = reader.getIncidence(); if (!incidencePtr) { qCWarning(KOLABRESOURCE_LOG) << "Failed to read incidence."; ok = false; return Akonadi::Item(); } Akonadi::Item newItem(incidencePtr->mimeType()); newItem.setPayload(incidencePtr); newItem.setRemoteId(imapItem.remoteId()); newItem.setGid(incidencePtr->instanceIdentifier()); return newItem; } break; case Kolab::NoteObject: { const KMime::Message::Ptr note = reader.getNote(); if (!note) { qCWarning(KOLABRESOURCE_LOG) << "Failed to read note."; ok = false; return Akonadi::Item(); } Akonadi::Item newItem(QStringLiteral("text/x-vnd.akonadi.note")); newItem.setPayload(note); newItem.setRemoteId(imapItem.remoteId()); const Akonadi::NoteUtils::NoteMessageWrapper wrapper(note); newItem.setGid(wrapper.uid()); return newItem; } break; case Kolab::ContactObject: { Akonadi::Item newItem(KContacts::Addressee::mimeType()); newItem.setPayload(reader.getContact()); newItem.setRemoteId(imapItem.remoteId()); newItem.setGid(reader.getContact().uid()); return newItem; } break; case Kolab::DistlistObject: { KContacts::ContactGroup contactGroup = reader.getDistlist(); QList<KContacts::ContactGroup::ContactReference> toAdd; for (uint index = 0; index < contactGroup.contactReferenceCount(); ++index) { const KContacts::ContactGroup::ContactReference &reference = contactGroup.contactReference(index); KContacts::ContactGroup::ContactReference ref; ref.setGid(reference.uid()); //libkolab set a gid with setUid() toAdd << ref; } contactGroup.removeAllContactReferences(); foreach (const KContacts::ContactGroup::ContactReference &ref, toAdd) { contactGroup.append(ref); } Akonadi::Item newItem(KContacts::ContactGroup::mimeType()); newItem.setPayload(contactGroup); newItem.setRemoteId(imapItem.remoteId()); newItem.setGid(contactGroup.id()); return newItem; } break; default: qCWarning(KOLABRESOURCE_LOG) << "Object type not handled"; ok = false; break; }