Page MenuHomePhorge

kabcconversion.cpp
No OneTemporary

Authored By
Unknown
Size
30 KB
Referenced Files
None
Subscribers
None

kabcconversion.cpp

/*
* Copyright (C) 2011 Christian Mollekopf <mollekopf@kolabsys.com>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "kabcconversion.h"
#include "commonconversion.h"
#include <kcalcore/freebusyurlstore.h>
#include <kdebug.h>
#include <qbuffer.h>
#include "kolabformat/errorhandler.h"
namespace Kolab {
namespace Conversion {
//The following was copied from kdepim/libkleo/kleo/enum.h,.cpp
enum CryptoMessageFormat {
InlineOpenPGPFormat = 1,
OpenPGPMIMEFormat = 2,
SMIMEFormat = 4,
SMIMEOpaqueFormat = 8,
AnyOpenPGP = InlineOpenPGPFormat|OpenPGPMIMEFormat,
AnySMIME = SMIMEOpaqueFormat|SMIMEFormat,
AutoFormat = AnyOpenPGP|AnySMIME
};
enum EncryptionPreference {
UnknownPreference = 0,
NeverEncrypt = 1,
AlwaysEncrypt = 2,
AlwaysEncryptIfPossible = 3,
AlwaysAskForEncryption = 4,
AskWheneverPossible = 5,
MaxEncryptionPreference = AskWheneverPossible
};
enum SigningPreference {
UnknownSigningPreference = 0,
NeverSign = 1,
AlwaysSign = 2,
AlwaysSignIfPossible = 3,
AlwaysAskForSigning = 4,
AskSigningWheneverPossible = 5,
MaxSigningPreference = AskSigningWheneverPossible
};
static const struct {
CryptoMessageFormat format;
const char * displayName;
const char * configName;
} cryptoMessageFormats[] = {
{ InlineOpenPGPFormat,
("Inline OpenPGP (deprecated)"),
"inline openpgp" },
{ OpenPGPMIMEFormat,
("OpenPGP/MIME"),
"openpgp/mime" },
{ SMIMEFormat,
("S/MIME"),
"s/mime" },
{ SMIMEOpaqueFormat,
("S/MIME Opaque"),
"s/mime opaque" },
};
static const unsigned int numCryptoMessageFormats
= sizeof cryptoMessageFormats / sizeof *cryptoMessageFormats ;
const char * cryptoMessageFormatToString( CryptoMessageFormat f ) {
if ( f == AutoFormat )
return "auto";
for ( unsigned int i = 0 ; i < numCryptoMessageFormats ; ++i )
if ( f == cryptoMessageFormats[i].format )
return cryptoMessageFormats[i].configName;
return 0;
}
QStringList cryptoMessageFormatsToStringList( unsigned int f ) {
QStringList result;
for ( unsigned int i = 0 ; i < numCryptoMessageFormats ; ++i )
if ( f & cryptoMessageFormats[i].format )
result.push_back( cryptoMessageFormats[i].configName );
return result;
}
CryptoMessageFormat stringToCryptoMessageFormat( const QString & s ) {
const QString t = s.toLower();
for ( unsigned int i = 0 ; i < numCryptoMessageFormats ; ++i )
if ( t == cryptoMessageFormats[i].configName )
return cryptoMessageFormats[i].format;
return AutoFormat;
}
unsigned int stringListToCryptoMessageFormats( const QStringList & sl ) {
unsigned int result = 0;
for ( QStringList::const_iterator it = sl.begin() ; it != sl.end() ; ++it )
result |= stringToCryptoMessageFormat( *it );
return result;
}
// For the config values used below, see also kaddressbook/editors/cryptowidget.cpp
const char* encryptionPreferenceToString( EncryptionPreference pref )
{
switch( pref ) {
case UnknownPreference:
return 0;
case NeverEncrypt:
return "never";
case AlwaysEncrypt:
return "always";
case AlwaysEncryptIfPossible:
return "alwaysIfPossible";
case AlwaysAskForEncryption:
return "askAlways";
case AskWheneverPossible:
return "askWhenPossible";
}
return 0; // keep the compiler happy
}
EncryptionPreference stringToEncryptionPreference( const QString& str )
{
if ( str == "never" )
return NeverEncrypt;
if ( str == "always" )
return AlwaysEncrypt;
if ( str == "alwaysIfPossible" )
return AlwaysEncryptIfPossible;
if ( str == "askAlways" )
return AlwaysAskForEncryption;
if ( str == "askWhenPossible" )
return AskWheneverPossible;
return UnknownPreference;
}
const char* signingPreferenceToString( SigningPreference pref )
{
switch( pref ) {
case UnknownSigningPreference:
return 0;
case NeverSign:
return "never";
case AlwaysSign:
return "always";
case AlwaysSignIfPossible:
return "alwaysIfPossible";
case AlwaysAskForSigning:
return "askAlways";
case AskSigningWheneverPossible:
return "askWhenPossible";
}
return 0; // keep the compiler happy
}
SigningPreference stringToSigningPreference( const QString& str )
{
if ( str == "never" )
return NeverSign;
if ( str == "always" )
return AlwaysSign;
if ( str == "alwaysIfPossible" )
return AlwaysSignIfPossible;
if ( str == "askAlways" )
return AlwaysAskForSigning;
if ( str == "askWhenPossible" )
return AskSigningWheneverPossible;
return UnknownSigningPreference;
}
int fromAddressType(int kabcType, bool &pref)
{
int type = 0;
if (kabcType & KABC::Address::Dom) {
Warning() << "domestic address is not supported";
}
if (kabcType & KABC::Address::Intl) {
Warning() << "international address is not supported";
}
if (kabcType & KABC::Address::Pref) {
pref = true;
}
if (kabcType & KABC::Address::Postal) {
Warning() << "postal address is not supported";
}
if (kabcType & KABC::Address::Parcel) {
Warning() << "parcel is not supported";
}
if (kabcType & KABC::Address::Home) {
type |= Kolab::Address::Home;
}
if (kabcType & KABC::Address::Work) {
type |= Kolab::Address::Work;
}
return type;
}
KABC::Address::Type toAddressType(int types, bool pref)
{
KABC::Address::Type type = 0;
if (pref) {
type |= KABC::Address::Pref;
}
if (types & Kolab::Address::Home) {
type |= KABC::Address::Home;
}
if (types & Kolab::Address::Work) {
type |= KABC::Address::Work;
}
return type;
}
int fromPhoneType(int kabcType, bool &pref)
{
int type = 0;
if (kabcType & KABC::PhoneNumber::Home) {
type |= Kolab::Telephone::Home;
}
if (kabcType & KABC::PhoneNumber::Work) {
type |= Kolab::Telephone::Work;
}
if (kabcType & KABC::PhoneNumber::Msg) {
type |= Kolab::Telephone::Text;
}
if (kabcType & KABC::PhoneNumber::Pref) {
pref = true;
}
if (kabcType & KABC::PhoneNumber::Voice) {
type |= Kolab::Telephone::Voice;
}
if (kabcType & KABC::PhoneNumber::Fax) {
type |= Kolab::Telephone::Fax;
}
if (kabcType & KABC::PhoneNumber::Cell) {
type |= Kolab::Telephone::Cell;
}
if (kabcType & KABC::PhoneNumber::Video) {
type |= Kolab::Telephone::Video;
}
if (kabcType & KABC::PhoneNumber::Bbs) {
Warning() << "mailbox number is not supported";
}
if (kabcType & KABC::PhoneNumber::Modem) {
Warning() << "modem is not supported";
}
if (kabcType & KABC::PhoneNumber::Car) {
type |= Kolab::Telephone::Car;
}
if (kabcType & KABC::PhoneNumber::Isdn) {
Warning() << "isdn number is not supported";
}
if (kabcType & KABC::PhoneNumber::Pcs) {
type |= Kolab::Telephone::Text;
}
if (kabcType & KABC::PhoneNumber::Pager) {
type |= Kolab::Telephone::Pager;
}
return type;
}
KABC::PhoneNumber::Type toPhoneType(int types, bool pref)
{
KABC::PhoneNumber::Type type = 0;
if (types & Kolab::Telephone::Home) {
type |= KABC::PhoneNumber::Home;
}
if (types & Kolab::Telephone::Work) {
type |= KABC::PhoneNumber::Work;
}
if (types & Kolab::Telephone::Text) {
type |= KABC::PhoneNumber::Msg;
}
if (pref) {
type |= KABC::PhoneNumber::Pref;
}
if (types & Kolab::Telephone::Voice) {
type |= KABC::PhoneNumber::Voice;
}
if (types & Kolab::Telephone::Fax) {
type |= KABC::PhoneNumber::Fax;
}
if (types & Kolab::Telephone::Cell) {
type |= KABC::PhoneNumber::Cell;
}
if (types & Kolab::Telephone::Video) {
type |= KABC::PhoneNumber::Video;
}
if (types & Kolab::Telephone::Car) {
type |= KABC::PhoneNumber::Car;
}
if (types & Kolab::Telephone::Text) {
type |= KABC::PhoneNumber::Pcs;
}
if (types & Kolab::Telephone::Pager) {
type |= KABC::PhoneNumber::Pager;
}
return type;
}
std::string fromPicture(const KABC::Picture &pic, std::string &mimetype)
{
QByteArray input;
QBuffer buffer( &input );
buffer.open( QIODevice::WriteOnly );
QImage img;
if ( pic.isIntern() ) {
if ( !pic.data().isNull() ) {
img = pic.data();
}
} else if ( !pic.url().isEmpty() ) {
QString tmpFile;
kWarning() << "external pictures are currently not supported";
//FIXME add kio support to libcalendaring or use libcurl
// if ( KIO::NetAccess::download( pic.url(), tmpFile, 0 /*no widget known*/ ) ) {
// img.load( tmpFile );
// KIO::NetAccess::removeTempFile( tmpFile );
// }
}
if (img.isNull()) {
Error() << "invalid picture";
return std::string();
}
if ( !img.hasAlphaChannel() ) {
if (!img.save( &buffer, "JPEG" )) {
Error() << "error on jpeg save";
return std::string();
}
mimetype = "image/jpeg";
} else {
if (!img.save( &buffer, "PNG" )) {
Error() << "error on png save";
return std::string();
}
mimetype = "image/png";
}
return std::string(input.data(), input.size());
}
KABC::Picture toPicture(const std::string &data, const std::string &mimetype) {
QImage img;
if (!img.loadFromData( QByteArray::fromRawData(data.data(), data.size()) )) {
Error() << "failed to load picture";
}
KABC::Picture logo(img);
if (logo.isEmpty()) {
Error() << "failed to read picture";
}
logo.setType(QString::fromStdString(mimetype));
return logo;
}
template <typename T>
void setCustom(const std::string &value, const std::string &id, T &object)
{
std::vector <Kolab::CustomProperty > properties = object.customProperties();
properties.push_back(CustomProperty(id, value));
object.setCustomProperties(properties);
}
template <typename T>
std::string getCustom(const std::string &id, T &object)
{
const std::vector <Kolab::CustomProperty > &properties = object.customProperties();
foreach(const Kolab::CustomProperty &prop, properties) {
if (prop.identifier == id) {
return prop.value;
}
}
return std::string();
}
KABC::Addressee toKABC(const Kolab::Contact &contact)
{
KABC::Addressee addressee;
addressee.setUid(QString::fromStdString(contact.uid()));
addressee.setCategories(toStringList(contact.categories()));
//addressee.setName(QString::fromStdString(contact.name()));//This one is only for compatiblity (and results in a non-existing name property)
addressee.setFormattedName(QString::fromStdString(contact.name())); //This on corresponds to fn
const Kolab::NameComponents &nc = contact.nameComponents();
if (!nc.surnames().empty()) {
addressee.setFamilyName(QString::fromStdString(nc.surnames().front()));
}
if (!nc.given().empty()) {
addressee.setGivenName(QString::fromStdString(nc.given().front()));
}
if (!nc.additional().empty()) {
addressee.setAdditionalName(QString::fromStdString(nc.additional().front()));
}
if (!nc.prefixes().empty()) {
addressee.setPrefix(QString::fromStdString(nc.prefixes().front()));
}
if (!nc.suffixes().empty()) {
addressee.setSuffix(QString::fromStdString(nc.suffixes().front()));
}
addressee.setNote(QString::fromStdString(contact.note()));
addressee.setSecrecy(KABC::Secrecy::Public); //We don't have any privacy setting in xCard
QString preferredEmail;
if (!contact.emailAddresses().empty()) {
addressee.setEmails(toStringList(contact.emailAddresses()));
if ((contact.emailAddressPreferredIndex() >= 0) && (contact.emailAddressPreferredIndex() < contact.emailAddresses().size())) {
preferredEmail = QString::fromStdString(contact.emailAddresses().at(contact.emailAddressPreferredIndex()));
} else {
preferredEmail = QString::fromStdString(contact.emailAddresses().at(0));
}
addressee.insertEmail(preferredEmail, true);
}
if (!contact.freeBusyUrl().empty()) {
if (preferredEmail.isEmpty()) {
Error() << "f/b url is set but no email address available, skipping";
} else {
KCalCore::FreeBusyUrlStore::self()->writeUrl( preferredEmail, QString::fromStdString(contact.freeBusyUrl()) );
KCalCore::FreeBusyUrlStore::self()->sync();
}
}
if (!contact.nickNames().empty()) {
addressee.setNickName(QString::fromStdString(contact.nickNames().at(0))); //TODO support multiple
}
if (contact.bDay().isValid()) {
addressee.setBirthday(toDate(contact.bDay()).dateTime());
}
if (!contact.titles().empty()) {
addressee.setTitle(QString::fromStdString(contact.titles().at(0))); //TODO support multiple
}
if (!contact.urls().empty()) {
addressee.setUrl(QString::fromStdString(contact.urls().at(0).url())); //TODO support multiple
foreach(const Kolab::Url &u, contact.urls()) {
if (u.type() == Kolab::Url::Blog) {
addressee.insertCustom("KADDRESSBOOK", "BlogFeed", QString::fromStdString(u.url()));
}
}
}
if (!contact.affiliations().empty()) {
//Storing only a const reference leads to segfaults. No idea why.
const Kolab::Affiliation aff = contact.affiliations().at(0); //TODO support multiple
if (!aff.organisation().empty()) {
addressee.setOrganization(QString::fromStdString(aff.organisation()));
}
if (!aff.organisationalUnits().empty()) {
addressee.setDepartment(QString::fromStdString(aff.organisationalUnits().at(0))); //TODO support multiple
}
if (!aff.roles().empty()) {
addressee.setRole(QString::fromStdString(aff.roles().at(0))); //TODO support multiple
}
if (!aff.logo().empty()) {
addressee.setLogo(toPicture(aff.logo(), aff.logoMimetype()));
}
foreach(const Kolab::Related &related, aff.relateds()) {
if (related.type() != Kolab::Related::Text) {
Error() << "invalid relation type";
continue;
}
if (related.relationTypes() & Kolab::Related::Assistant) {
addressee.insertCustom(QLatin1String("KADDRESSBOOK"), QLatin1String("X-AssistantsName"), QString::fromStdString(related.text()));
}
if (related.relationTypes() & Kolab::Related::Manager) {
addressee.insertCustom(QLatin1String("KADDRESSBOOK"), QLatin1String("X-ManagersName"), QString::fromStdString(related.text()));
}
}
foreach(const Kolab::Address &address, aff.addresses()) {
addressee.insertCustom(QLatin1String("KADDRESSBOOK"), QLatin1String("X-Office"), QString::fromStdString(address.label())); //TODO support proper addresses
}
}
const std::string &prof = getCustom("X-Profession", contact);
if (!prof.empty()) {
addressee.insertCustom(QLatin1String("KADDRESSBOOK"), QLatin1String("X-Profession"), QString::fromStdString(prof));
}
const std::string &adrBook = getCustom("X-AddressBook", contact);
if (!adrBook.empty()) {
addressee.insertCustom(QLatin1String("KADDRESSBOOK"), QLatin1String("X-AddressBook"), QString::fromStdString(prof));
}
if (!contact.photo().empty()) {
addressee.setPhoto(toPicture(contact.photo(), contact.photoMimetype()));
}
if (!contact.telephones().empty()) {
int index = 0;
foreach(const Kolab::Telephone &tel, contact.telephones()) {
bool pref = false;
if (index == contact.telephonesPreferredIndex()) {
pref = true;
}
KABC::PhoneNumber number(QString::fromStdString(tel.number()), toPhoneType(tel.types(), pref));
index++;
addressee.insertPhoneNumber(number);
}
}
if (!contact.addresses().empty()) {
int index = 0;
foreach(const Kolab::Address &a, contact.addresses()) {
bool pref = false;
if (index == contact.addressPreferredIndex()) {
pref = true;
}
KABC::Address adr(toAddressType(a.types(), pref));
adr.setLabel(QString::fromStdString(a.label()));
adr.setStreet(QString::fromStdString(a.street()));
adr.setLocality(QString::fromStdString(a.locality()));
adr.setRegion(QString::fromStdString(a.region()));
adr.setPostalCode(QString::fromStdString(a.code()));
adr.setCountry(QString::fromStdString(a.country()));
index++;
addressee.insertAddress(adr);
}
}
if (contact.anniversary().isValid()) {
addressee.insertCustom(QLatin1String("KADDRESSBOOK"), QLatin1String("X-Anniversary"), toDate(contact.anniversary()).toString(KDateTime::ISODate));
}
if (!contact.imAddresses().empty()) {
addressee.insertCustom(QLatin1String("KADDRESSBOOK"), QLatin1String("X-IMAddress"),QString::fromStdString(contact.imAddresses()[0])); //TODO support multiple
}
if (!contact.relateds().empty()) {
foreach(const Kolab::Related &rel, contact.relateds()) {
if (rel.type() != Kolab::Related::Text) {
Error() << "relation type not supported";
continue;
}
if (rel.relationTypes() & Kolab::Related::Spouse) {
addressee.insertCustom(QLatin1String("KADDRESSBOOK"), QLatin1String("X-SpousesName"),QString::fromStdString(rel.text())); //TODO support multiple
} else {
Warning() << "relation not supported";
continue;
}
}
}
return addressee;
}
Kolab::Contact fromKABC(const KABC::Addressee &addressee)
{
int prefNum = -1;
int prefCounter = -1;
Kolab::Contact c;
c.setUid(addressee.uid().toStdString());
c.setCategories(fromStringList(addressee.categories()));
c.setName(addressee.formattedName().toStdString());
Kolab::NameComponents nc;
nc.setSurnames(std::vector<std::string>() << addressee.familyName().toStdString());
nc.setGiven(std::vector<std::string>() << addressee.givenName().toStdString());
nc.setAdditional(std::vector<std::string>() << addressee.additionalName().toStdString());
nc.setPrefixes(std::vector<std::string>() << addressee.prefix().toStdString());
nc.setSuffixes(std::vector<std::string>() << addressee.suffix().toStdString());
c.setNameComponents(nc);
c.setNote(addressee.note().toStdString());
if ( !addressee.preferredEmail().isEmpty() ) {
c.setFreeBusyUrl(KCalCore::FreeBusyUrlStore::self()->readUrl( addressee.preferredEmail() ).toStdString());
}
if (!addressee.title().isEmpty()) {
c.setTitles(std::vector<std::string>() << addressee.title().toStdString());
}
Kolab::Affiliation businessAff;
businessAff.setOrganisation(addressee.organization().toStdString());
if (!addressee.department().isEmpty()) {
businessAff.setOrganisationalUnits(std::vector<std::string>() << addressee.department().toStdString());
}
if (!addressee.logo().isEmpty()) {
std::string logoMimetype;
const std::string &logo = fromPicture(addressee.logo(), logoMimetype);
businessAff.setLogo(logo, logoMimetype);
}
if (!addressee.role().isEmpty()) {
businessAff.setRoles(std::vector<std::string>() << addressee.role().toStdString());
}
const QString &office = addressee.custom(QLatin1String("KADDRESSBOOK"), QLatin1String("X-Office"));
if (!office.isEmpty()) {
Kolab::Address a;
a.setTypes(Kolab::Address::Work);
a.setLabel(addressee.custom(QLatin1String("KADDRESSBOOK"), QLatin1String("X-Office")).toStdString());
businessAff.setAddresses(std::vector<Kolab::Address>() << a);
}
std::vector<Kolab::Related> relateds;
const QString &manager = addressee.custom(QLatin1String("KADDRESSBOOK"), QLatin1String("X-ManagersName"));
if (!manager.isEmpty()) {
relateds.push_back(Kolab::Related(Kolab::Related::Text, manager.toStdString(), Kolab::Related::Manager));
}
const QString &assistant = addressee.custom(QLatin1String("KADDRESSBOOK"), QLatin1String("X-AssistantsName"));
if (!assistant.isEmpty()) {
relateds.push_back(Kolab::Related(Kolab::Related::Text, assistant.toStdString(), Kolab::Related::Assistant));
}
if (!relateds.empty()) {
businessAff.setRelateds(relateds);
}
c.setAffiliations(std::vector<Kolab::Affiliation>() << businessAff);
std::vector<Kolab::Url> urls;
if (!addressee.url().isEmpty()) {
urls.push_back(Kolab::Url(addressee.url().url().toStdString()));
}
const QString &blogUrl = addressee.custom(QLatin1String("KADDRESSBOOK"), QLatin1String("BlogFeed"));
if (!blogUrl.isEmpty()) {
urls.push_back(Kolab::Url(blogUrl.toStdString(), Kolab::Url::Blog));
}
c.setUrls(urls);
std::vector<Kolab::Address> addresses;
prefNum = -1;
prefCounter = -1;
foreach(const KABC::Address &a, addressee.addresses()) {
Kolab::Address adr;
bool pref = false;
adr.setTypes(fromAddressType(a.type(), pref));
prefCounter++;
if (pref) {
prefNum = prefCounter;
}
adr.setLabel(a.label().toStdString());
adr.setStreet(a.street().toStdString());
adr.setLocality(a.locality().toStdString());
adr.setRegion(a.region().toStdString());
adr.setCode(a.postalCode().toStdString());
adr.setCountry(a.country().toStdString());
addresses.push_back(adr);
}
c.setAddresses(addresses, prefNum);
if (!addressee.nickName().isEmpty()) {
c.setNickNames(std::vector<std::string>() << addressee.nickName().toStdString());
}
const QString &spouse = addressee.custom(QLatin1String("KADDRESSBOOK"), QLatin1String("X-SpousesName"));
if (!spouse.isEmpty()) {
c.setRelateds(std::vector<Kolab::Related>() << Kolab::Related(Kolab::Related::Text, spouse.toStdString(), Kolab::Related::Spouse));
}
c.setBDay(fromDate(KDateTime(addressee.birthday(), KDateTime::ClockTime)));
c.setAnniversary(fromDate(KDateTime(QDate::fromString( addressee.custom(QLatin1String("KADDRESSBOOK"), QLatin1String("X-Anniversary")), Qt::ISODate ), KDateTime::ClockTime)));
if (!addressee.photo().isEmpty()) {
std::string mimetype;
const std::string &photo = fromPicture(addressee.photo(), mimetype);
c.setPhoto(photo, mimetype);
}
//TODO
// c.setGender();
// c.setLanguages();
std::vector <Kolab::Telephone> phones;
prefNum = -1;
prefCounter = -1;
foreach (const KABC::PhoneNumber &n, addressee.phoneNumbers()) {
Kolab::Telephone p;
p.setNumber(n.number().toStdString());
bool pref = false;
p.setTypes(fromPhoneType(n.type(), pref));
prefCounter++;
if (pref) {
prefNum = prefCounter;
}
phones.push_back(p);
}
c.setTelephones(phones, prefNum);
const QString &imAddress = addressee.custom(QLatin1String("KADDRESSBOOK"), QLatin1String("X-IMAddress"));
if (!imAddress.isEmpty()) {
c.setIMaddresses(std::vector<std::string>() << imAddress.toStdString(), 0);
}
int prefEmail = -1;
foreach(const QString &e, addressee.emails()) {
prefEmail++;
if (e == addressee.preferredEmail()) {
break;
}
}
c.setEmailAddresses(fromStringList(addressee.emails()), prefEmail);
if (addressee.geo().isValid()) {
c.setGPSpos(std::vector<Kolab::Geo>() << Kolab::Geo(addressee.geo().latitude(), addressee.geo().longitude()));
}
Kolab::Crypto crypto;
const QStringList protocolPrefs = addressee.custom( "KADDRESSBOOK", "CRYPTOPROTOPREF" ).split( ',', QString::SkipEmptyParts );
const uint cryptoFormats = stringListToCryptoMessageFormats( protocolPrefs );
int formats = 0;
if (cryptoFormats & InlineOpenPGPFormat) {
formats |= Kolab::Crypto::PGPinline;
}
if (cryptoFormats & OpenPGPMIMEFormat) {
formats |= Kolab::Crypto::PGPmime;
}
if (cryptoFormats & SMIMEFormat) {
formats |= Kolab::Crypto::SMIME;
}
if (cryptoFormats & SMIMEOpaqueFormat) {
formats |= Kolab::Crypto::SMIMEopaque;
}
crypto.setAllowed(formats);
Kolab::Crypto::CryptoPref signPref = Kolab::Crypto::Ask;
switch (stringToSigningPreference(addressee.custom( "KADDRESSBOOK", "CRYPTOSIGNPREF" ) )) {
case NeverSign:
signPref = Kolab::Crypto::Never;
break;
case AlwaysSign:
signPref = Kolab::Crypto::Always;
break;
case AlwaysSignIfPossible:
signPref = Kolab::Crypto::IfPossible;
break;
case AlwaysAskForSigning:
case AskSigningWheneverPossible:
signPref = Kolab::Crypto::Ask;
break;
default:
signPref = Kolab::Crypto::Ask;
}
crypto.setSignPref(signPref);
Kolab::Crypto::CryptoPref encryptPref = Kolab::Crypto::Ask;
switch (stringToSigningPreference(addressee.custom( "KADDRESSBOOK", "CRYPTOENCRYPTPREF" ) )) {
case NeverEncrypt:
encryptPref = Kolab::Crypto::Never;
break;
case AlwaysEncrypt:
encryptPref = Kolab::Crypto::Always;
break;
case AlwaysEncryptIfPossible:
encryptPref = Kolab::Crypto::IfPossible;
break;
case AlwaysAskForEncryption:
case AskWheneverPossible:
encryptPref = Kolab::Crypto::Ask;
break;
default:
encryptPref = Kolab::Crypto::Ask;
}
crypto.setEncryptPref(encryptPref);
c.setCrypto(crypto);
//FIXME the keys are most certainly worng, look at cryptopageplugin.cpp
std::vector<Kolab::Key> keys;
const std::string &pgpkey = addressee.custom( "KADDRESSBOOK", "OPENPGPFP" ).toStdString();
if (!pgpkey.empty()) {
keys.push_back(Kolab::Key(pgpkey, Kolab::Key::PGP));
}
const std::string &smimekey = addressee.custom( "KADDRESSBOOK", "SMIMEFP" ).toStdString();
if (!smimekey.empty()) {
keys.push_back(Kolab::Key(smimekey, Kolab::Key::PKCS7_MIME));
}
c.setKeys(keys);
if (!addressee.sound().isEmpty()) {
Warning() << "sound is not supported";
}
const std::string &profession = addressee.custom( "KADDRESSBOOK", "X-Profession" ).toStdString();
if (!profession.empty()) {
setCustom(profession, "X-Profession", c);
}
const std::string &adrBook = addressee.custom( "KADDRESSBOOK", "X-AddressBook" ).toStdString();
if (!adrBook.empty()) {
setCustom(adrBook, "X-AddressBook", c);
}
//TODO preserve all custom properties (also such which are unknown to us)
return c;
}
DistList fromKABC(const KABC::ContactGroup &cg)
{
DistList dl;
dl.setName(cg.name().toStdString());
dl.setUid(cg.id().toStdString());
std::vector <Kolab::ContactReference > members;
for (int i = 0; i < cg.dataCount(); i++) {
const KABC::ContactGroup::Data &data = cg.data(i);
members.push_back(Kolab::ContactReference(Kolab::ContactReference::EmailReference, data.email().toStdString(), data.name().toStdString()));
}
for (int i = 0; i < cg.contactReferenceCount(); i++) {
const KABC::ContactGroup::ContactReference &ref = cg.contactReference(i);
members.push_back(Kolab::ContactReference(Kolab::ContactReference::UidReference, ref.uid().toStdString()));
}
if (cg.contactGroupReferenceCount() > 0) {
kWarning() << "Tried to save contact group references, which should have been resolved already";
}
dl.setMembers(members);
return dl;
}
KABC::ContactGroup toKABC(const DistList &dl)
{
KABC::ContactGroup cg(QString::fromStdString(dl.name()));
cg.setId(QString::fromStdString(dl.uid()));
foreach(const Kolab::ContactReference &m, dl.members()) {
KABC::ContactGroup::Data data;
switch (m.type()) {
case Kolab::ContactReference::EmailReference:
cg.append(KABC::ContactGroup::Data(QString::fromStdString(m.name()), QString::fromStdString(m.email())));
break;
case Kolab::ContactReference::UidReference:
cg.append(KABC::ContactGroup::ContactReference(QString::fromStdString(m.uid())));
break;
default:
Error() << "invalid contact reference";
}
}
return cg;
}
} //Namespace
} //Namespace

File Metadata

Mime Type
text/x-c++
Expires
Apr 4 2026, 9:58 AM (4 w, 2 d ago)
Storage Engine
local-disk
Storage Format
Raw Data
Storage Handle
6d/40/4d3be43b2cb2c480815db053cdfb
Default Alt Text
kabcconversion.cpp (30 KB)

Event Timeline