1 /*
2  *  compatibilityattribute.cpp  -  Akonadi attribute holding Collection compatibility
3  *  This file is part of kalarmcal library, which provides access to KAlarm
4  *  calendar data.
5  *  SPDX-FileCopyrightText: 2011-2019 David Jarvie <djarvie@kde.org>
6  *
7  *  SPDX-License-Identifier: LGPL-2.0-or-later
8  */
9 
10 #include "compatibilityattribute.h"
11 
12 #include "kalarmcal_debug.h"
13 
14 namespace KAlarmCal
15 {
16 
17 class Q_DECL_HIDDEN CompatibilityAttribute::Private
18 {
19 public:
Private()20     Private()  {}
operator ==(KAlarmCal::CompatibilityAttribute::Private other) const21     bool operator==(KAlarmCal::CompatibilityAttribute::Private other) const
22     {
23         return mCompatibility == other.mCompatibility
24            &&  mVersion       == other.mVersion;
25     }
26 
27     KACalendar::Compat mCompatibility{KACalendar::Incompatible};  // calendar compatibility with current KAlarm format
28     int                mVersion{KACalendar::IncompatibleFormat};  // KAlarm calendar format version
29 };
30 
CompatibilityAttribute()31 CompatibilityAttribute::CompatibilityAttribute()
32     : d(new Private)
33 {
34 }
35 
CompatibilityAttribute(const CompatibilityAttribute & rhs)36 CompatibilityAttribute::CompatibilityAttribute(const CompatibilityAttribute &rhs)
37     : Akonadi::Attribute(rhs),
38       d(new Private(*rhs.d))
39 {
40 }
41 
~CompatibilityAttribute()42 CompatibilityAttribute::~CompatibilityAttribute()
43 {
44     delete d;
45 }
46 
operator =(const CompatibilityAttribute & other)47 CompatibilityAttribute &CompatibilityAttribute::operator=(const CompatibilityAttribute &other)
48 {
49     if (&other != this) {
50         Attribute::operator=(other);
51         *d = *other.d;
52     }
53     return *this;
54 }
55 
operator ==(const CompatibilityAttribute & other) const56 bool CompatibilityAttribute::operator==(const CompatibilityAttribute &other) const
57 {
58     return *d == *other.d;
59 }
60 
clone() const61 CompatibilityAttribute *CompatibilityAttribute::clone() const
62 {
63     return new CompatibilityAttribute(*this);
64 }
65 
compatibility() const66 KACalendar::Compat CompatibilityAttribute::compatibility() const
67 {
68     return d->mCompatibility;
69 }
70 
setCompatibility(KACalendar::Compat c)71 void CompatibilityAttribute::setCompatibility(KACalendar::Compat c)
72 {
73     d->mCompatibility = c;
74 }
75 
version() const76 int CompatibilityAttribute::version() const
77 {
78     return d->mVersion;
79 }
80 
setVersion(int v)81 void CompatibilityAttribute::setVersion(int v)
82 {
83     d->mVersion = v;
84 }
85 
type() const86 QByteArray CompatibilityAttribute::type() const
87 {
88     return name();
89 }
90 
name()91 QByteArray CompatibilityAttribute::name()
92 {
93     static const QByteArray attType("KAlarmCompatibility");
94     return attType;
95 }
96 
serialized() const97 QByteArray CompatibilityAttribute::serialized() const
98 {
99     const QByteArray v = QByteArray::number(d->mCompatibility) + ' '
100                          + QByteArray::number(d->mVersion);
101     qCDebug(KALARMCAL_LOG) << v;
102     return v;
103 }
104 
deserialize(const QByteArray & data)105 void CompatibilityAttribute::deserialize(const QByteArray &data)
106 {
107     qCDebug(KALARMCAL_LOG) << data;
108 
109     // Set default values
110     d->mCompatibility = KACalendar::Incompatible;
111     d->mVersion       = KACalendar::IncompatibleFormat;
112 
113     bool ok;
114     const QList<QByteArray> items = data.simplified().split(' ');
115     const int count = items.count();
116     int index = 0;
117     if (count > index) {
118         // 0: calendar format compatibility
119         const int c = items[index++].toInt(&ok);
120         const KACalendar::Compat AllCompat(KACalendar::Current | KACalendar::Converted | KACalendar::Convertible | KACalendar::Incompatible | KACalendar::Unknown);
121         if (!ok  || (c & static_cast<int>(AllCompat)) != c) {
122             qCritical() << "Invalid compatibility:" << c;
123             return;
124         }
125         d->mCompatibility = static_cast<KACalendar::Compat>(c);
126     }
127     if (count > index) {
128         // 1: KAlarm calendar version number
129         const int c = items[index++].toInt(&ok);
130         if (!ok) {
131             qCritical() << "Invalid version:" << c;
132             return;
133         }
134         d->mVersion = c;
135     }
136 }
137 
138 } // namespace KAlarmCal
139 
140 // vim: et sw=4:
141