static void setOtherState(const QString &value, KContacts::Address &address) { address.setRegion(value); }
ObjectPtr Private::JSONToContact(const QVariantMap& data) { ContactPtr contact(new Contact); /* Google contact ID */ contact->setUid(Private::stringFromXMLMap(data, QStringLiteral("id"))); /* Google ETAG. This can be used to identify if the item was changed remotly */ contact->setEtag(data.value(QStringLiteral("gd$etag")).toString()); /* Date and time when contact was updated on the remote server */ contact->setUpdated(QDateTime::fromString(Private::stringFromXMLMap(data, QStringLiteral("updated")), Qt::ISODate)); /* If the contact was deleted, we don't need more info about it. * Just store our own flag, which will be then parsed by the resource * itself. */ contact->setDeleted(data.value(QStringLiteral("gd$deleted")).isValid()); /* Store URL of the picture. The URL will be used later by PhotoJob to fetch the picture * itself. */ const QVariantList links = data.value(QStringLiteral("link")).toList(); Q_FOREACH(const QVariant &link, links) { const QVariantMap linkMap = link.toMap(); if (linkMap.value(QStringLiteral("rel")).toString() == QLatin1String("http://schemas.google.com/contacts/2008/rel#photo")) { contact->setPhotoUrl(linkMap.value(QStringLiteral("href")).toString()); } } /* Name */ if (data.contains(QStringLiteral("title"))) { contact->setName(Private::stringFromXMLMap(data, QStringLiteral("title"))); } /* Formatted name */ if (data.contains(QStringLiteral("gd$name"))) { const QVariantMap name = data.value(QStringLiteral("gd$name")).toMap(); if (name.contains(QStringLiteral("gd$fullName"))) { contact->setFormattedName(Private::stringFromXMLMap(name, QStringLiteral("gd$fullName"))); } if (name.contains(QStringLiteral("gd$givenName"))) { contact->setGivenName(Private::stringFromXMLMap(name, QStringLiteral("gd$givenName"))); } if (name.contains(QStringLiteral("gd$familyName"))) { contact->setFamilyName(Private::stringFromXMLMap(name, QStringLiteral("gd$familyName"))); } if (name.contains(QStringLiteral("gd$additionalName"))) { contact->setAdditionalName(Private::stringFromXMLMap(name, QStringLiteral("gd$additionalName"))); } if (name.contains(QStringLiteral("gd$namePrefix"))) { contact->setPrefix(Private::stringFromXMLMap(name, QStringLiteral("gd$namePrefix"))); } if (name.contains(QStringLiteral("gd$nameSuffix"))) { contact->setSuffix(Private::stringFromXMLMap(name, QStringLiteral("gd$nameSuffix"))); } } /* Note */ if (data.contains(QStringLiteral("content"))) { contact->setNote(Private::stringFromXMLMap(data, QStringLiteral("content"))); } /* Organization (work) - KABC supports only one organization */ if (data.contains(QStringLiteral("gd$organization"))) { const QVariantList organizations = data.value(QStringLiteral("gd$organization")).toList(); const QVariantMap organization = organizations.first().toMap(); if (organization.contains(QStringLiteral("gd$orgName"))) { contact->setOrganization(Private::stringFromXMLMap(organization, QStringLiteral("gd$orgName"))); } if (organization.contains(QStringLiteral("gd$orgDepartment"))) { contact->setDepartment(Private::stringFromXMLMap(organization, QStringLiteral("gd$orgDepartment"))); } if (organization.contains(QStringLiteral("gd$orgTitle"))) { contact->setTitle(Private::stringFromXMLMap(organization, QStringLiteral("gd$orgTitle"))); } if (organization.contains(QStringLiteral("gd$where"))) { contact->setOffice(Private::stringFromXMLMap(organization, QStringLiteral("gd$where"))); } } /* Nickname */ if (data.contains(QStringLiteral("gContact$nickname"))) { contact->setNickName(Private::stringFromXMLMap(data, QStringLiteral("gContact$nickname"))); } /* Occupation (= organization/title) */ if (data.contains(QStringLiteral("gContact$occupation"))) { contact->setProfession(Private::stringFromXMLMap(data, QStringLiteral("gContact$occupation"))); } /* Relationships */ if (data.contains(QStringLiteral("gContact$relation"))) { const QVariantList relations = data.value(QStringLiteral("gContact$relation")).toList(); Q_FOREACH(const QVariant &r, relations) { const QVariantMap relation = r.toMap(); if (relation.value(QStringLiteral("rel")).toString() == QLatin1String("spouse")) { contact->setSpousesName(relation.value(QStringLiteral("$t")).toString()); continue; } if (relation.value(QStringLiteral("rel")).toString() == QLatin1String("manager")) { contact->setManagersName(relation.value(QStringLiteral("$t")).toString()); continue; } if (relation.value(QStringLiteral("rel")).toString() == QLatin1String("assistant")) { contact->setAssistantsName(relation.value(QStringLiteral("$t")).toString()); continue; } } } /* Anniversary */ if (data.contains(QStringLiteral("gContact$event"))) { const QVariantList events = data.value(QStringLiteral("gContact$event")).toList(); Q_FOREACH(const QVariant &e, events) { const QVariantMap event = e.toMap(); if (event.value(QStringLiteral("rel")).toString() == QLatin1String("anniversary")) { QVariantMap when = event.value(QStringLiteral("gd$when")).toMap(); contact->setAnniversary(when.value(QStringLiteral("startTime")).toString()); } } } /* Websites */ if (data.contains(QStringLiteral("gContact$website"))) { const QVariantList websites = data.value(QStringLiteral("gContact$website")).toList(); Q_FOREACH(const QVariant &w, websites) { const QVariantMap web = w.toMap(); if (web.value(QStringLiteral("rel")).toString() == QLatin1String("home-page")) { KContacts::ResourceLocatorUrl url; url.setUrl(QUrl(web.value(QStringLiteral("href")).toString())); contact->setUrl(url); continue; } if (web.value(QStringLiteral("rel")).toString() == QLatin1String("blog")) { contact->setBlogFeed(web.value(QStringLiteral("href")).toString()); continue; } } } /* Emails */ const QVariantList emails = data.value(QStringLiteral("gd$email")).toList(); Q_FOREACH(const QVariant & em, emails) { const QVariantMap email = em.toMap(); contact->insertEmail(email.value(QStringLiteral("address")).toString(), email.value(QStringLiteral("primary")).toBool()); } /* IMs */ const QVariantList ims = data.value(QStringLiteral("gd$im")).toList(); Q_FOREACH(const QVariant & i, ims) { const QVariantMap im = i.toMap(); const QString protocol = Contact::IMSchemeToProtocolName(im.value(QStringLiteral("protocol")).toString()); contact->insertCustom(QLatin1String("messaging/") + protocol, QStringLiteral("All"), im.value(QStringLiteral("address")).toString()); } /* Phone numbers */ const QVariantList phones = data.value(QStringLiteral("gd$phoneNumber")).toList(); Q_FOREACH(const QVariant & p, phones) { const QVariantMap phone = p.toMap(); contact->insertPhoneNumber(KContacts::PhoneNumber(phone.value(QStringLiteral("$t")).toString(), Contact::phoneSchemeToType(phone.value(QStringLiteral("rel")).toString()))); } /* Addresses */ const QVariantList addresses = data.value(QStringLiteral("gd$structuredPostalAddress")).toList(); Q_FOREACH(const QVariant & a, addresses) { const QVariantMap address = a.toMap(); KContacts::Address addr; if (!address.contains(QStringLiteral("gd$city")) && !address.contains(QStringLiteral("gd$country")) && !address.contains(QStringLiteral("gd$postcode")) && !address.contains(QStringLiteral("gd$region")) && !address.contains(QStringLiteral("gd$pobox"))) { addr.setExtended(Private::stringFromXMLMap(address, QStringLiteral("gd$street"))); } else { if (address.contains(QStringLiteral("gd$street"))) { addr.setStreet(Private::stringFromXMLMap(address, QStringLiteral("gd$street"))); } if (address.contains(QStringLiteral("gd$country"))) { addr.setCountry(Private::stringFromXMLMap(address, QStringLiteral("gd$country"))); } if (address.contains(QStringLiteral("gd$city"))) { addr.setLocality(Private::stringFromXMLMap(address, QStringLiteral("gd$city"))); } if (address.contains(QStringLiteral("gd$postcode"))) { addr.setPostalCode(Private::stringFromXMLMap(address, QStringLiteral("gd$postcode"))); } if (address.contains(QStringLiteral("gdregion"))) { addr.setRegion(Private::stringFromXMLMap(address, QStringLiteral("gd$region"))); } if (address.contains(QStringLiteral("gd$pobox"))) { addr.setPostOfficeBox(Private::stringFromXMLMap(address, QStringLiteral("gd$pobox"))); } } addr.setType(Contact::addressSchemeToType(address.value(QStringLiteral("rel")).toString())); contact->insertAddress(addr); } /* Birthday */ const QVariantMap bDay = data.value(QStringLiteral("gContact$birthday")).toMap(); if (!bDay.isEmpty()) { QString birthday = bDay.value(QStringLiteral("when")).toString(); /* Birthdays in format "--MM-DD" are valid and mean that no year has * been specified. Since KABC does not support birthdays without year, * we simulate that by specifying a fake year - 1900 */ if (birthday.startsWith(QLatin1String("--"))) { birthday = QLatin1String("1900") + birthday.mid(1); } contact->setBirthday(QDateTime::fromString(birthday, QStringLiteral("yyyy-MM-dd"))); } /* User-defined fields */ const QVariantList userDefined = data.value(QStringLiteral("gContact$userDefinedField")).toList(); Q_FOREACH(const QVariant & u, userDefined) { const QVariantMap field = u.toMap(); contact->insertCustom(QStringLiteral("KADDRESSBOOK"), field.value(QStringLiteral("key")).toString(), field.value(QStringLiteral("value")).toString()); } /* Groups */ const QVariantList groups = data.value(QStringLiteral("gContact$groupMembershipInfo")).toList(); QStringList groupsList; Q_FOREACH(const QVariant & g, groups) { const QVariantMap group = g.toMap(); if (group.value(QStringLiteral("deleted")).toBool() == false) { groupsList.append(group.value(QStringLiteral("href")).toString()); } } contact->insertCustom(QStringLiteral("GCALENDAR"), QStringLiteral("groupMembershipInfo"), groupsList.join(QStringLiteral(","))); return contact; }