1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218
|
/*
This file is part of Akonadi KolabProxy.
SPDX-FileCopyrightText: 2009 Kevin Krammer <kevin.krammer@gmx.at>
SPDX-License-Identifier: LGPL-2.0-or-later
*/
#include "distributionlist.h"
#include "pimkolab_debug.h"
#include <KContacts/ContactGroup>
using namespace KolabV2;
namespace
{
inline QString unhandledTagAppName()
{
return QStringLiteral("KOLABUNHANDLED");
} // no hyphens in appnames!
}
// saving (contactgroup->xml)
DistributionList::DistributionList(const KContacts::ContactGroup *contactGroup)
{
setFields(contactGroup);
}
// loading (xml->contactgroup)
DistributionList::DistributionList(const QString &xml)
{
load(xml);
}
DistributionList::~DistributionList() = default;
void DistributionList::setName(const QString &name)
{
mName = name;
}
QString DistributionList::name() const
{
return mName;
}
void KolabV2::DistributionList::loadDistrListMember(const QDomElement &element)
{
Member member;
for (QDomNode n = element.firstChild(); !n.isNull(); n = n.nextSibling()) {
if (n.isComment()) {
continue;
}
if (n.isElement()) {
QDomElement e = n.toElement();
const QString tagName = e.tagName();
if (tagName == QLatin1StringView("display-name")) {
member.displayName = e.text();
} else if (tagName == QLatin1StringView("smtp-address")) {
member.email = e.text();
} else if (tagName == QLatin1StringView("uid")) {
member.uid = e.text();
}
}
}
mDistrListMembers.append(member);
}
void DistributionList::saveDistrListMembers(QDomElement &element) const
{
QList<Member>::ConstIterator it = mDistrListMembers.constBegin();
const QList<Member>::ConstIterator end = mDistrListMembers.constEnd();
for (; it != end; ++it) {
QDomElement e = element.ownerDocument().createElement(QStringLiteral("member"));
element.appendChild(e);
const Member &m = *it;
if (!m.uid.isEmpty()) {
writeString(e, QStringLiteral("uid"), m.uid);
} else {
writeString(e, QStringLiteral("display-name"), m.displayName);
writeString(e, QStringLiteral("smtp-address"), m.email);
}
}
}
bool DistributionList::loadAttribute(QDomElement &element)
{
const QString tagName = element.tagName();
switch (tagName[0].toLatin1()) {
case 'd':
if (tagName == QLatin1StringView("display-name")) {
setName(element.text());
return true;
}
break;
case 'm':
if (tagName == QLatin1StringView("member")) {
loadDistrListMember(element);
return true;
}
break;
default:
break;
}
return KolabBase::loadAttribute(element);
}
bool DistributionList::saveAttributes(QDomElement &element) const
{
// Save the base class elements
KolabBase::saveAttributes(element);
writeString(element, QStringLiteral("display-name"), name());
saveDistrListMembers(element);
return true;
}
bool DistributionList::loadXML(const QDomDocument &document)
{
QDomElement top = document.documentElement();
if (top.tagName() != QLatin1StringView("distribution-list")) {
qCWarning(PIMKOLAB_LOG) << QStringLiteral("XML error: Top tag was %1 instead of the expected distribution-list").arg(top.tagName());
return false;
}
for (QDomNode n = top.firstChild(); !n.isNull(); n = n.nextSibling()) {
if (n.isComment()) {
continue;
}
if (n.isElement()) {
QDomElement e = n.toElement();
if (!loadAttribute(e)) {
// Unhandled tag - save for later storage
// qCDebug(PIMKOLAB_LOG) <<"Saving unhandled tag" << e.tagName();
Custom c;
c.app = unhandledTagAppName();
c.name = e.tagName();
c.value = e.text();
mCustomList.append(c);
}
} else {
qCDebug(PIMKOLAB_LOG) << "Node is not a comment or an element???";
}
}
return true;
}
QString DistributionList::saveXML() const
{
QDomDocument document = domTree();
QDomElement element = document.createElement(QStringLiteral("distribution-list"));
element.setAttribute(QStringLiteral("version"), QStringLiteral("1.0"));
saveAttributes(element);
document.appendChild(element);
return document.toString();
}
QString DistributionList::productID() const
{
// TODO should we get name/version from desktop file?
return QStringLiteral("Akonadi Kolab Proxy");
}
// The saving is contactgroup -> DistributionList -> xml, this is the first part
void DistributionList::setFields(const KContacts::ContactGroup *contactGroup)
{
KolabBase::setFields(contactGroup);
setName(contactGroup->name());
// explicit contact data
for (int index = 0; index < contactGroup->dataCount(); ++index) {
const KContacts::ContactGroup::Data &data = contactGroup->data(index);
Member m;
m.displayName = data.name();
m.email = data.email();
mDistrListMembers.append(m);
}
for (int index = 0; index < contactGroup->contactReferenceCount(); ++index) {
const KContacts::ContactGroup::ContactReference &data = contactGroup->contactReference(index);
Member m;
m.uid = data.uid();
mDistrListMembers.append(m);
}
if (contactGroup->contactGroupReferenceCount() > 0) {
qCWarning(PIMKOLAB_LOG) << "Tried to save contact group references, which should have been resolved already";
}
}
// The loading is: xml -> DistributionList -> contactgroup, this is the second part
void DistributionList::saveTo(KContacts::ContactGroup *contactGroup)
{
KolabBase::saveTo(contactGroup);
contactGroup->setName(name());
QList<Member>::ConstIterator mit = mDistrListMembers.constBegin();
const QList<Member>::ConstIterator mEnd = mDistrListMembers.constEnd();
for (; mit != mEnd; ++mit) {
if (!(*mit).uid.isEmpty()) {
contactGroup->append(KContacts::ContactGroup::ContactReference((*mit).uid));
} else {
contactGroup->append(KContacts::ContactGroup::Data((*mit).displayName, (*mit).email));
}
}
}
QString DistributionList::type() const
{
return QStringLiteral("DistributionList");
}
// kate: space-indent on; indent-width 2; replace-tabs on;
|