Skip to content

Commit

Permalink
Merge branch 'qtpimupgrade' into 'master'
Browse files Browse the repository at this point in the history
[qtcontacts-sqlite] Support QContactCollection semantics. Contributes to JB#50551

See merge request mer-core/qtcontacts-sqlite!43
  • Loading branch information
chriadam committed Sep 25, 2020
2 parents d274d3b + 2e30ae4 commit 92edb86
Show file tree
Hide file tree
Showing 68 changed files with 14,877 additions and 10,555 deletions.
3 changes: 3 additions & 0 deletions config.pri
@@ -1,3 +1,6 @@
# Try to optimise for code size a bit
QMAKE_CXXFLAGS += -ffunction-sections -fdata-sections -Wl,--gc-sections -flto

CONFIG += \
c++11 \
link_pkgconfig
Expand Down
4 changes: 2 additions & 2 deletions rpm/qtcontacts-sqlite-qt5.spec
@@ -1,5 +1,5 @@
Name: qtcontacts-sqlite-qt5
Version: 0.2.41
Version: 0.3.0
Release: 0
Summary: SQLite-based plugin for QtPIM Contacts
License: BSD
Expand All @@ -8,7 +8,7 @@ Source0: %{name}-%{version}.tar.gz
BuildRequires: pkgconfig(Qt5Core)
BuildRequires: pkgconfig(Qt5Sql)
BuildRequires: pkgconfig(Qt5DBus)
BuildRequires: pkgconfig(Qt5Contacts)
BuildRequires: pkgconfig(Qt5Contacts) >= 5.2.0
BuildRequires: pkgconfig(mlite5)
Requires: qt5-plugin-sqldriver-sqlite

Expand Down
124 changes: 69 additions & 55 deletions src/engine/contactid.cpp
@@ -1,5 +1,6 @@
/*
* Copyright (C) 2013 Jolla Ltd. <chris.adams@jollamobile.com>
* Copyright (C) 2013 - 2014 Jolla Ltd.
* Copyright (C) 2020 Open Mobile Platform LLC.
*
* You may use this file under the terms of the BSD license as follows:
*
Expand Down Expand Up @@ -37,131 +38,144 @@

namespace {

const QString default_uri = QString::fromLatin1("org.nemomobile.contacts.sqlite");

QString dbIdToString(quint32 dbId)
QString dbIdToString(quint32 dbId, bool isCollection = false)
{
return QString::fromLatin1("sql-%1").arg(dbId);
return isCollection ? QStringLiteral("col-%1").arg(dbId)
: QStringLiteral("sql-%1").arg(dbId);
}

quint32 dbIdFromString(const QString &s)
quint32 dbIdFromString(const QString &s, bool isCollection = false)
{
if (s.startsWith(QString::fromLatin1("sql-"))) {
if ((isCollection && s.startsWith(QStringLiteral("col-")))
|| (!isCollection && s.startsWith(QStringLiteral("sql-")))) {
return s.mid(4).toUInt();
}
return 0;
}

QByteArray dbIdToByteArray(quint32 dbId, bool isCollection = false)
{
return isCollection ? (QByteArrayLiteral("col-") + QByteArray::number(dbId))
: (QByteArrayLiteral("sql-") + QByteArray::number(dbId));
}

quint32 dbIdFromByteArray(const QByteArray &b, bool isCollection = false)
{
if ((isCollection && b.startsWith(QByteArrayLiteral("col-")))
|| (!isCollection && b.startsWith(QByteArrayLiteral("sql-")))) {
return b.mid(4).toUInt();
}
return 0;
}

}

#include <QContactManagerEngine>

QContactId ContactId::apiId(const QContact &contact)
namespace ContactId {

QContactId apiId(const QContact &contact)
{
return contact.id();
}

QContactId ContactId::apiId(quint32 dbId)
QContactId apiId(quint32 dbId, const QString &manager_uri)
{
ContactId *eid = new ContactId(dbId);
return QContactId(eid);
return QContactId(manager_uri, dbIdToByteArray(dbId));
}

quint32 ContactId::databaseId(const QContact &contact)
quint32 databaseId(const QContact &contact)
{
return databaseId(contact.id());
}

quint32 ContactId::databaseId(const QContactId &apiId)
quint32 databaseId(const QContactId &apiId)
{
if (const QContactEngineId *eid = QContactManagerEngine::engineId(apiId)) {
const ContactId *iid = static_cast<const ContactId*>(eid);
return iid->m_databaseId;
}
return 0;
return dbIdFromByteArray(apiId.localId());
}

const QContactId &ContactId::contactId(const QContactId &apiId)
QString toString(const QContactId &apiId)
{
return apiId;
return dbIdToString(databaseId(apiId));
}

QContactId ContactId::fromString(const QString &s)
QString toString(const QContact &c)
{
return apiId(dbIdFromString(s));
return toString(c.id());
}

ContactId::ContactId(quint32 dbId)
: QContactEngineId()
, m_databaseId(dbId)
QContactId fromString(const QString &s, const QString &manager_uri)
{
return apiId(dbIdFromString(s), manager_uri);
}

ContactId::ContactId(const QString &s)
: QContactEngineId()
, m_databaseId(dbIdFromString(s))
bool isValid(const QContact &contact)
{
return isValid(databaseId(contact));
}

bool ContactId::isEqualTo(const QContactEngineId *other) const
bool isValid(const QContactId &contactId)
{
return m_databaseId == static_cast<const ContactId*>(other)->m_databaseId;
return isValid(databaseId(contactId));
}

bool ContactId::isLessThan(const QContactEngineId *other) const
bool isValid(quint32 dbId)
{
return m_databaseId < static_cast<const ContactId*>(other)->m_databaseId;
return (dbId != 0);
}

QString ContactId::managerUri() const
} // namespace ContactId


namespace ContactCollectionId {

QContactCollectionId apiId(const QContactCollection &collection)
{
return QContactManager::buildUri(default_uri, QMap<QString, QString>());
return collection.id();
}

QContactEngineId* ContactId::clone() const
QContactCollectionId apiId(quint32 dbId, const QString &manager_uri)
{
return new ContactId(m_databaseId);
return QContactCollectionId(manager_uri, dbIdToByteArray(dbId, true));
}

QString ContactId::toString() const
quint32 databaseId(const QContactCollection &collection)
{
return dbIdToString(m_databaseId);
return databaseId(collection.id());
}

uint ContactId::hash() const
quint32 databaseId(const QContactCollectionId &apiId)
{
return m_databaseId;
return dbIdFromByteArray(apiId.localId(), true);
}

#ifndef QT_NO_DEBUG_STREAM
QDebug &ContactId::debugStreamOut(QDebug &dbg) const
QString toString(const QContactCollectionId &apiId)
{
return dbg << dbIdToString(m_databaseId);
return dbIdToString(databaseId(apiId), true);
}
#endif // QT_NO_DEBUG_STREAM

bool ContactId::isValid(const QContact &contact)
QString toString(const QContactCollection &c)
{
return isValid(databaseId(contact));
return toString(c.id());
}

bool ContactId::isValid(const QContactId &contactId)
QContactCollectionId fromString(const QString &s, const QString &manager_uri)
{
return isValid(databaseId(contactId));
return apiId(dbIdFromString(s, true), manager_uri);
}

bool ContactId::isValid(quint32 dbId)
bool isValid(const QContactCollection &collection)
{
return (dbId != 0);
return isValid(databaseId(collection));
}

QString ContactId::toString(const QContactId &apiId)
bool isValid(const QContactCollectionId &collectionId)
{
return dbIdToString(databaseId(apiId));
return isValid(databaseId(collectionId));
}

QString ContactId::toString(const QContact &c)
bool isValid(quint32 dbId)
{
return toString(c.id());
return (dbId != 0);
}

} // namespace ContactCollectionId
61 changes: 28 additions & 33 deletions src/engine/contactid_p.h
@@ -1,5 +1,6 @@
/*
* Copyright (C) 2013 Jolla Ltd. <chris.adams@jollamobile.com>
* Copyright (C) 2013 - 2014 Jolla Ltd.
* Copyright (C) 2020 Open Mobile Platform LLC.
*
* You may use this file under the terms of the BSD license as follows:
*
Expand Down Expand Up @@ -34,51 +35,45 @@

#include <QtGlobal>
#include <QContactId>
#include <QContactCollectionId>
#include <QContact>

#include <QContactEngineId>
#include <QContactCollection>

QTCONTACTS_USE_NAMESPACE

class ContactId : public QContactEngineId
{
public:
static QContactId apiId(const QContact &contact);
static QContactId apiId(quint32 databaseId);

static quint32 databaseId(const QContact &contact);
static quint32 databaseId(const QContactId &apiId);
namespace ContactId {
QContactId apiId(const QContact &contact);
QContactId apiId(quint32 databaseId, const QString &manager_uri);

static const QContactId &contactId(const QContactId &apiId);
quint32 databaseId(const QContact &contact);
quint32 databaseId(const QContactId &apiId);

static bool isValid(const QContact &contact);
static bool isValid(const QContactId &apiId);
static bool isValid(quint32 dbId);
bool isValid(const QContact &contact);
bool isValid(const QContactId &apiId);
bool isValid(quint32 dbId);

static QString toString(const QContactId &apiId);
static QString toString(const QContact &c);
QString toString(const QContactId &apiId);
QString toString(const QContact &c);

static QContactId fromString(const QString &id);
QContactId fromString(const QString &id);
} // namespace ContactId

ContactId(quint32 databaseId);
ContactId(const QString &s);
namespace ContactCollectionId {
QContactCollectionId apiId(const QContactCollection &collection);
QContactCollectionId apiId(quint32 databaseId, const QString &manager_uri);

// implementing QContactEngineId:
bool isEqualTo(const QContactEngineId *other) const;
bool isLessThan(const QContactEngineId *other) const;
QString managerUri() const;
QContactEngineId* clone() const;
QString toString() const;
quint32 databaseId(const QContactCollection &collection);
quint32 databaseId(const QContactCollectionId &apiId);

#ifndef QT_NO_DEBUG_STREAM
QDebug& debugStreamOut(QDebug &dbg) const;
#endif
bool isValid(const QContactCollection &collection);
bool isValid(const QContactCollectionId &apiId);
bool isValid(quint32 dbId);

uint hash() const;
QString toString(const QContactCollectionId &apiId);
QString toString(const QContactCollection &c);

private:
quint32 m_databaseId;
};
QContactCollectionId fromString(const QString &id);
} // namespace ContactId

#endif // QTCONTACTSSQLITE_CONTACTIDIMPL

49 changes: 44 additions & 5 deletions src/engine/contactnotifier.cpp
@@ -1,5 +1,6 @@
/*
* Copyright (C) 2013 Jolla Ltd. <andrew.den.exter@jollamobile.com>
* Copyright (C) 2013 Jolla Ltd.
* Copyright (C) 2019 - 2020 Open Mobile Platform LLC.
*
* You may use this file under the terms of the BSD license as follows:
*
Expand Down Expand Up @@ -80,6 +81,16 @@ QVector<quint32> idVector(const QList<QContactId> &contactIds)
return ids;
}

QVector<quint32> idVector(const QList<QContactCollectionId> &collectionIds)
{
QVector<quint32> ids;
ids.reserve(collectionIds.size());
foreach (const QContactCollectionId &id, collectionIds) {
ids.append(ContactCollectionId::databaseId(id));
}
return ids;
}

}

ContactNotifier::ContactNotifier(bool nonprivileged)
Expand All @@ -88,6 +99,33 @@ ContactNotifier::ContactNotifier(bool nonprivileged)
initialize();
}

void ContactNotifier::collectionsAdded(const QList<QContactCollectionId> &collectionIds)
{
if (!collectionIds.isEmpty()) {
QDBusMessage message = createSignal("collectionsAdded", m_nonprivileged);
message.setArguments(QVariantList() << QVariant::fromValue(idVector(collectionIds)));
QDBusConnection::sessionBus().send(message);
}
}

void ContactNotifier::collectionsChanged(const QList<QContactCollectionId> &collectionIds)
{
if (!collectionIds.isEmpty()) {
QDBusMessage message = createSignal("collectionsChanged", m_nonprivileged);
message.setArguments(QVariantList() << QVariant::fromValue(idVector(collectionIds)));
QDBusConnection::sessionBus().send(message);
}
}

void ContactNotifier::collectionsRemoved(const QList<QContactCollectionId> &collectionIds)
{
if (!collectionIds.isEmpty()) {
QDBusMessage message = createSignal("collectionsRemoved", m_nonprivileged);
message.setArguments(QVariantList() << QVariant::fromValue(idVector(collectionIds)));
QDBusConnection::sessionBus().send(message);
}
}

void ContactNotifier::contactsAdded(const QList<QContactId> &contactIds)
{
if (!contactIds.isEmpty()) {
Expand Down Expand Up @@ -115,11 +153,12 @@ void ContactNotifier::contactsPresenceChanged(const QList<QContactId> &contactId
}
}

void ContactNotifier::syncContactsChanged(const QStringList &syncTargets)
// notify that synced contacts have changed in the given collections
void ContactNotifier::collectionContactsChanged(const QList<QContactCollectionId> &collectionIds)
{
if (!syncTargets.isEmpty()) {
QDBusMessage message = createSignal("syncContactsChanged", m_nonprivileged);
message.setArguments(QVariantList() << syncTargets);
if (!collectionIds.isEmpty()) {
QDBusMessage message = createSignal("collectionContactsChanged", m_nonprivileged);
message.setArguments(QVariantList() << QVariant::fromValue(idVector(collectionIds)));
QDBusConnection::sessionBus().send(message);
}
}
Expand Down

0 comments on commit 92edb86

Please sign in to comment.