I have made the following changes intended for : nemo:devel:mw / commhistory-daemon
Please review and accept or decline. BOSS has already run some checks on this request. See the "Messages from BOSS" section below. https://build.merproject.org//request/show/73 Thank You, John Brooks [This message was auto-generated] --- Request # 73: Messages from BOSS: State: review at 2013-03-20T21:27:45 by cibot Reviews: accepted by cibot : Prechecks succeeded. new for nemo:devel:mw : Please replace this text with a review and approve/reject the review (not the SR). BOSS will take care of the rest Changes: submit: home:jbrooks:branches:nemo:devel:mw / commhistory-daemon -> nemo:devel:mw / commhistory-daemon changes files: -------------- --- commhistory-daemon.changes +++ commhistory-daemon.changes @@ -0,0 +1,3 @@ +* Wed Mar 20 2013 John Brooks <[email protected]> - 0.4.6 +- Provide service to set account presence information (from Matt Vogt) + old: ---- commhistory-daemon-0.4.5.tar.bz2 new: ---- commhistory-daemon-0.4.6.tar.bz2 spec files: ----------- --- commhistory-daemon.spec +++ commhistory-daemon.spec @@ -1,6 +1,6 @@ Name: commhistory-daemon Summary: Communications event history database daemon -Version: 0.4.5 +Version: 0.4.6 Release: 2 Group: Communications/Telephony and IM License: LGPL @@ -49,6 +49,7 @@ %{_bindir}/commhistoryd %{_datadir}/dbus-1/services/com.nokia.CommHistory.service %{_datadir}/dbus-1/services/org.freedesktop.Telepathy.Client.CommHistory.service +%{_datadir}/dbus-1/services/org.nemomobile.AccountPresence.service %{_datadir}/translations/commhistoryd.qm %{_datadir}/doc/commhistory-daemon-l10n-engineering-english/commhistoryd.ts %{_datadir}/lipstick/notificationcategories/* other changes: -------------- ++++++ commhistory-daemon-0.4.5.tar.bz2 -> commhistory-daemon-0.4.6.tar.bz2 --- .gitignore +++ .gitignore @@ -0,0 +1,27 @@ +*.o +*~ +moc_* +commhistoryd +tests/commhistorytest +Makefile +*.pro.user* +.cproject +.project +*.pyc +build-stamp +builddir/ +configure-stamp +debian/commhistory-daemon-dbg/ +debian/commhistory-daemon-l10n-engineering-english/ +debian/commhistory-daemon-tests.substvars +debian/commhistory-daemon-tests/ +debian/commhistory-daemon.substvars +debian/commhistory-daemon/ +debian/files +debian/tmp/ +src/TpExtensions/.gen/ +tests/bin/ +translations/telephony/telephony.qm +translations/messaging/messaging.qm +translations/commhistoryd.qm +translations/commhistoryd.ts --- data/data.pro +++ data/data.pro @@ -32,6 +32,7 @@ service.path = $${INSTALL_PREFIX}/share/dbus-1/services service.files = org.freedesktop.Telepathy.Client.CommHistory.service \ + org.nemomobile.AccountPresence.service \ com.nokia.CommHistory.service INSTALLS += client service --- data/org.nemomobile.AccountPresence.service +++ data/org.nemomobile.AccountPresence.service @@ -0,0 +1,3 @@ +[D-BUS Service] +Name=org.nemomobile.AccountPresence +Exec=/usr/bin/commhistoryd --- src/AccountPresenceIf.xml +++ src/AccountPresenceIf.xml @@ -0,0 +1,21 @@ +<!DOCTYPE node PUBLIC "-//freedesktop//DTD D-BUS Object Introspection 1.0//EN" "http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd"> +<node> + <interface name="org.nemomobile.AccountPresenceIf"> + <method name="setGlobalPresence"> + <arg name="state" type="i" direction="in"/> + </method> + <method name="setGlobalPresenceWithMessage"> + <arg name="state" type="i" direction="in"/> + <arg name="message" type="s" direction="in"/> + </method> + <method name="setAccountPresence"> + <arg name="accountUri" type="s" direction="in"/> + <arg name="state" type="i" direction="in"/> + </method> + <method name="setAccountPresenceWithMessage"> + <arg name="accountUri" type="s" direction="in"/> + <arg name="state" type="i" direction="in"/> + <arg name="message" type="s" direction="in"/> + </method> + </interface> +</node> --- src/accountpresenceifadaptor.cpp +++ src/accountpresenceifadaptor.cpp @@ -0,0 +1,59 @@ +/* + * This file was generated by qdbusxml2cpp version 0.7 + * Command line was: qdbusxml2cpp -c AccountPresenceIfAdaptor -a accountpresenceifadaptor AccountPresenceIf.xml + * + * qdbusxml2cpp is Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). + * + * This is an auto-generated file. + * Do not edit! All changes made to it will be lost. + */ + +#include "accountpresenceifadaptor.h" +#include <QtCore/QMetaObject> +#include <QtCore/QByteArray> +#include <QtCore/QList> +#include <QtCore/QMap> +#include <QtCore/QString> +#include <QtCore/QStringList> +#include <QtCore/QVariant> + +/* + * Implementation of adaptor class AccountPresenceIfAdaptor + */ + +AccountPresenceIfAdaptor::AccountPresenceIfAdaptor(QObject *parent) + : QDBusAbstractAdaptor(parent) +{ + // constructor + setAutoRelaySignals(true); +} + +AccountPresenceIfAdaptor::~AccountPresenceIfAdaptor() +{ + // destructor +} + +void AccountPresenceIfAdaptor::setAccountPresence(const QString &accountUri, int state) +{ + // handle method call org.nemomobile.AccountPresenceIf.setAccountPresence + QMetaObject::invokeMethod(parent(), "setAccountPresence", Q_ARG(QString, accountUri), Q_ARG(int, state)); +} + +void AccountPresenceIfAdaptor::setAccountPresenceWithMessage(const QString &accountUri, int state, const QString &message) +{ + // handle method call org.nemomobile.AccountPresenceIf.setAccountPresenceWithMessage + QMetaObject::invokeMethod(parent(), "setAccountPresenceWithMessage", Q_ARG(QString, accountUri), Q_ARG(int, state), Q_ARG(QString, message)); +} + +void AccountPresenceIfAdaptor::setGlobalPresence(int state) +{ + // handle method call org.nemomobile.AccountPresenceIf.setGlobalPresence + QMetaObject::invokeMethod(parent(), "setGlobalPresence", Q_ARG(int, state)); +} + +void AccountPresenceIfAdaptor::setGlobalPresenceWithMessage(int state, const QString &message) +{ + // handle method call org.nemomobile.AccountPresenceIf.setGlobalPresenceWithMessage + QMetaObject::invokeMethod(parent(), "setGlobalPresenceWithMessage", Q_ARG(int, state), Q_ARG(QString, message)); +} + --- src/accountpresenceifadaptor.h +++ src/accountpresenceifadaptor.h @@ -0,0 +1,64 @@ +/* + * This file was generated by qdbusxml2cpp version 0.7 + * Command line was: qdbusxml2cpp -c AccountPresenceIfAdaptor -a accountpresenceifadaptor AccountPresenceIf.xml + * + * qdbusxml2cpp is Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). + * + * This is an auto-generated file. + * This file may have been hand-edited. Look for HAND-EDIT comments + * before re-generating it. + */ + +#ifndef ACCOUNTPRESENCEIFADAPTOR_H_1362717597 +#define ACCOUNTPRESENCEIFADAPTOR_H_1362717597 + +#include <QtCore/QObject> +#include <QtDBus/QtDBus> +class QByteArray; +template<class T> class QList; +template<class Key, class Value> class QMap; +class QString; +class QStringList; +class QVariant; + +/* + * Adaptor class for interface org.nemomobile.AccountPresenceIf + */ +class AccountPresenceIfAdaptor: public QDBusAbstractAdaptor +{ + Q_OBJECT + Q_CLASSINFO("D-Bus Interface", "org.nemomobile.AccountPresenceIf") + Q_CLASSINFO("D-Bus Introspection", "" +" <interface name=\"org.nemomobile.AccountPresenceIf\">\n" +" <method name=\"setGlobalPresence\">\n" +" <arg direction=\"in\" type=\"i\" name=\"state\"/>\n" +" </method>\n" +" <method name=\"setGlobalPresenceWithMessage\">\n" +" <arg direction=\"in\" type=\"i\" name=\"state\"/>\n" +" <arg direction=\"in\" type=\"s\" name=\"message\"/>\n" +" </method>\n" +" <method name=\"setAccountPresence\">\n" +" <arg direction=\"in\" type=\"s\" name=\"accountUri\"/>\n" +" <arg direction=\"in\" type=\"i\" name=\"state\"/>\n" +" </method>\n" +" <method name=\"setAccountPresenceWithMessage\">\n" +" <arg direction=\"in\" type=\"s\" name=\"accountUri\"/>\n" +" <arg direction=\"in\" type=\"i\" name=\"state\"/>\n" +" <arg direction=\"in\" type=\"s\" name=\"message\"/>\n" +" </method>\n" +" </interface>\n" + "") +public: + AccountPresenceIfAdaptor(QObject *parent); + virtual ~AccountPresenceIfAdaptor(); + +public: // PROPERTIES +public Q_SLOTS: // METHODS + void setAccountPresence(const QString &accountUri, int state); + void setAccountPresenceWithMessage(const QString &accountUri, int state, const QString &message); + void setGlobalPresence(int state); + void setGlobalPresenceWithMessage(int state, const QString &message); +Q_SIGNALS: // SIGNALS +}; + +#endif --- src/accountpresenceservice.cpp +++ src/accountpresenceservice.cpp @@ -0,0 +1,250 @@ +/* + * Copyright (C) 2013 Jolla Mobile <[email protected]> + * + * You may use this file under the terms of the BSD license as follows: + * + * "Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Nemo Mobile nor the names of its contributors + * may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." + */ + +#include "accountpresenceservice.h" +#include "constants.h" + +#include <TelepathyQt/Account> +#include <TelepathyQt/AccountSet> +#include <TelepathyQt/PendingOperation> +#include <TelepathyQt/PendingReady> + +#include <QtDBus> + +AccountPresenceService::AccountPresenceService(Tp::AccountManagerPtr manager, QObject* parent) + : QObject(parent), + m_IsRegistered(false), + m_accountManager(manager), + m_globalUpdatePresent(false) +{ + if (!m_accountManager) { + qCritical() << "ERROR: Cannot provide service without Account Manager!"; + return; + } + + if (!QDBusConnection::sessionBus().isConnected()) { + qCritical() << "ERROR: No DBus session bus found!"; + return; + } + + if (!QDBusConnection::sessionBus().registerObject(ACCOUNT_PRESENCE_OBJECT_PATH, this)) { + qWarning() << "Object registration failed!"; + } else { + if(!QDBusConnection::sessionBus().registerService(ACCOUNT_PRESENCE_SERVICE_NAME)) { + qWarning() << "Unable to register account presence service!" + << QDBusConnection::sessionBus().lastError(); + } else { + m_IsRegistered = true; + } + } + + if (!m_accountManager->isReady()) { + // Wait for the account manager to become ready + qDebug() << "Waiting for account manager to become ready"; + Tp::PendingReady *pr = m_accountManager->becomeReady(Tp::AccountManager::FeatureCore); + Q_ASSERT(pr); + connect(pr, SIGNAL(finished(Tp::PendingOperation *)), + this, SLOT(accountManagerReady(Tp::PendingOperation *))); + } +} + +AccountPresenceService::~AccountPresenceService() +{ + QDBusConnection::sessionBus().unregisterObject(ACCOUNT_PRESENCE_OBJECT_PATH); + QDBusConnection::sessionBus().unregisterService(ACCOUNT_PRESENCE_SERVICE_NAME); +} + +namespace { + +Tp::Presence presenceValue(int state, const QString &message) +{ + switch (state) { + // Values from QtMobility QContactPresence, as exported via SeasidePerson + case 1: return Tp::Presence::available(message); + case 2: return Tp::Presence::hidden(message); + case 3: return Tp::Presence::busy(message); + case 4: return Tp::Presence::away(message); + case 5: return Tp::Presence::xa(message); + case 6: return Tp::Presence::offline(message); + default: break; + } + + return Tp::Presence(); +} + +} + +void AccountPresenceService::setGlobalPresence(int state) +{ + setGlobalPresenceWithMessage(state, QString()); +} + +void AccountPresenceService::setGlobalPresenceWithMessage(int state, const QString &message) +{ + if (m_accountManager->isReady()) { + globalPresenceUpdate(state, message); + } else { + // Defer this update - any previous deferred updates are superseded + m_globalUpdate = qMakePair(state, message); + m_globalUpdatePresent = true; + m_accountUpdate.clear(); + } +} + +void AccountPresenceService::setAccountPresence(const QString &accountUri, int state) +{ + setAccountPresenceWithMessage(accountUri, state, QString()); +} + +void AccountPresenceService::setAccountPresenceWithMessage(const QString &accountUri, int state, const QString &message) +{ + if (m_accountManager->isReady()) { + accountPresenceUpdate(accountUri, state, message); + } else { + // Defer this update - any previous deferred updates for this account are superseded + m_accountUpdate.insert(accountUri, qMakePair(state, message)); + } +} + +void AccountPresenceService::accountManagerReady(Tp::PendingOperation *) +{ + if (m_accountManager->isReady()) { + qDebug() << "Account manager is now ready"; + + // Process any updates that were previously deferred + if (m_globalUpdatePresent) { + m_globalUpdatePresent = false; + globalPresenceUpdate(m_globalUpdate.first, m_globalUpdate.second); + } + + QMap<QString, UpdateDetails>::const_iterator it = m_accountUpdate.constBegin(), end = m_accountUpdate.constEnd(); + for ( ; it != end; ++it) { + const UpdateDetails &details(it.value()); + accountPresenceUpdate(it.key(), details.first, details.second); + } + m_accountUpdate.clear(); + } else { + qCritical() << "ERROR: Cannot provide service without Account Manager readiness!"; + } +} + +bool AccountPresenceService::isRegistered() +{ + return m_IsRegistered; +} + +void AccountPresenceService::pendingOperationCompleted(Tp::PendingOperation *po) +{ + QMap<Tp::PendingOperation*, QString>::iterator it = m_operations.find(po); + if (it != m_operations.end()) { + operationCompleted(po, it.value()); + m_operations.erase(it); + } +} + +void AccountPresenceService::globalPresenceUpdate(int state, const QString &message) +{ + Tp::Presence presence = presenceValue(state, message); + if (presence.isValid()) { + // Set all enabled accounts to have the same presence information + foreach (Tp::AccountPtr account, m_accountManager->enabledAccounts()->accounts()) { + if (!presenceUpdate(account, presence)) { + qWarning() << "Unable to set global presence for account:" << account->displayName(); + } + } + } else { + qWarning() << "Unable to set global presence to invalid state:" << state; + } +} + +void AccountPresenceService::accountPresenceUpdate(const QString &accountUri, int state, const QString &message) +{ + Tp::AccountPtr account = m_accountManager->accountForPath(accountUri); + if (account && account->isValidAccount()) { + Tp::Presence presence = presenceValue(state, message); + if (presence.isValid()) { + if (!presenceUpdate(account, presence)) { + qWarning() << "Unable to set presence for account:" << account->displayName(); + } + } else { + qWarning() << "Unable to set account presence to invalid state:" << state << "for account:" << account->displayName(); + } + } else { + qWarning() << "Unable to identify account to set presence:" << accountUri; + } +} + +bool AccountPresenceService::presenceUpdate(Tp::AccountPtr account, const Tp::Presence &presence) +{ + if (account->isOnline()) { + // Ignore any error from setting the automatic presence + presenceUpdate(account, presence, false); + return presenceUpdate(account, presence, true); + } else { + // Ignore any error from setting the current presence + presenceUpdate(account, presence, true); + return presenceUpdate(account, presence, false); + } +} + +bool AccountPresenceService::presenceUpdate(Tp::AccountPtr account, const Tp::Presence &presence, bool current) +{ + Tp::PendingOperation *po = 0; + + if (current) { + po = account->setRequestedPresence(presence); + } else { + po = account->setAutomaticPresence(presence); + } + + if (!po) + return false; + + QString description(QString("set presence for account: %1").arg(account->displayName())); + + if (po->isFinished()) { + operationCompleted(po, description); + } else { + m_operations.insert(po, description); + connect(po, SIGNAL(finished(Tp::PendingOperation*)), + this, SLOT(pendingOperationCompleted(Tp::PendingOperation*))); + } + + return !po->isError(); +} + +void AccountPresenceService::operationCompleted(Tp::PendingOperation *po, const QString &description) +{ + if (po->isError()) { + qWarning() << "Unable to" << description << "error:" << QString("'%1' [%2]").arg(po->errorMessage(), po->errorName()); + } +} + --- src/accountpresenceservice.h +++ src/accountpresenceservice.h @@ -0,0 +1,83 @@ +/* + * Copyright (C) 2013 Jolla Mobile <[email protected]> + * + * You may use this file under the terms of the BSD license as follows: + * + * "Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Nemo Mobile nor the names of its contributors + * may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." + */ + +#ifndef ACCOUNTPRESENCESERVICE_H +#define ACCOUNTPRESENCESERVICE_H + +#include <TelepathyQt/AccountManager> + +#include <QObject> +#include <QMap> +#include <QPair> + +namespace Tp { class PendingOperation; } + +class AccountPresenceService : public QObject +{ + Q_OBJECT + +public: + AccountPresenceService(Tp::AccountManagerPtr manager, QObject* parent = 0); + ~AccountPresenceService(); + +public Q_SLOTS: + void setGlobalPresence(int state); + void setGlobalPresenceWithMessage(int state, const QString &message); + void setAccountPresence(const QString &accountUri, int state); + void setAccountPresenceWithMessage(const QString &accountUri, int state, const QString &message); + + void accountManagerReady(Tp::PendingOperation *po); + bool isRegistered(); + + void pendingOperationCompleted(Tp::PendingOperation *po); + +private: + void globalPresenceUpdate(int state, const QString &message); + void accountPresenceUpdate(const QString &accountUri, int state, const QString &message); + + bool presenceUpdate(Tp::AccountPtr account, const Tp::Presence &presence); + bool presenceUpdate(Tp::AccountPtr account, const Tp::Presence &presence, bool current); + + void operationCompleted(Tp::PendingOperation *po, const QString &description); + + bool m_IsRegistered; + Tp::AccountManagerPtr m_accountManager; + QMap<Tp::PendingOperation*, QString> m_operations; + + typedef QPair<int, QString> UpdateDetails; + + UpdateDetails m_globalUpdate; + bool m_globalUpdatePresent; + + QMap<QString, UpdateDetails> m_accountUpdate; +}; + +#endif // ACCOUNTPRESENCESERVICE_H --- src/constants.h +++ src/constants.h @@ -39,6 +39,10 @@ #define COMM_HISTORY_OBJECT_PATH QLatin1String("/com/nokia/CommHistory") #define COMM_HISTORY_INTERFACE QLatin1String("com.nokia.CommHistoryIf") +#define ACCOUNT_PRESENCE_SERVICE_NAME QLatin1String("org.nemomobile.AccountPresence") +#define ACCOUNT_PRESENCE_OBJECT_PATH QLatin1String("/org/nemomobile/AccountPresence") +#define ACCOUNT_PRESENCE_INTERFACE QLatin1String("org.nemomobile.AccountPresenceIf") + #define MESSAGING_SERVICE_NAME QLatin1String("org.nemomobile.qmlmessages") #define MESSAGING_INTERFACE QLatin1String("org.nemomobile.qmlmessages") #define SHOW_INBOX_METHOD QLatin1String("showGroupsWindow") --- src/main.cpp +++ src/main.cpp @@ -32,6 +32,8 @@ #include "notificationmanager.h" #include "commhistoryservice.h" #include "commhistoryifadaptor.h" +#include "accountpresenceservice.h" +#include "accountpresenceifadaptor.h" #include "messagereviver.h" #include "contactauthorizationlistener.h" #include "connectionutils.h" @@ -144,17 +146,25 @@ qDebug() << "Translation catalogs loaded"; - CommHistoryService *service = new CommHistoryService(&app); - if (!service->isRegistered()) { - qCritical() << "Service registration failed (already running or DBus not found), exiting"; + CommHistoryService *chService = new CommHistoryService(&app); + if (!chService->isRegistered()) { + qCritical() << "CommHistoryService registration failed (already running or DBus not found), exiting"; _exit(1); } - new CommHistoryIfAdaptor(service); - qDebug() << "Service created"; + new CommHistoryIfAdaptor(chService); + qDebug() << "CommHistoryService created"; ConnectionUtils *utils = new ConnectionUtils(&app); - new ContactAuthorizationListener(utils, service); + new ContactAuthorizationListener(utils, chService); + + AccountPresenceService *apService = new AccountPresenceService(utils->accountManager(), &app); + if (!apService->isRegistered()) { + qCritical() << "AccountPresenceService registration failed (already running or DBus not found), exiting"; + _exit(1); + } + new AccountPresenceIfAdaptor(apService); + qDebug() << "AccountPresenceService created"; // ids.dat might not always be restored from backup as commhistoryd // runs in the background and can overwrite it; force it to be --- src/src.pro +++ src/src.pro @@ -73,6 +73,8 @@ accountoperationsobserver.h \ accountspecificcallmodel_p.h \ accountspecificcallmodel.h \ + accountpresenceifadaptor.h \ + accountpresenceservice.h \ olddatadeleter.h \ voicemailhandler.h @@ -95,6 +97,8 @@ mwilistener.cpp \ accountoperationsobserver.cpp \ accountspecificcallmodel.cpp \ + accountpresenceifadaptor.cpp \ + accountpresenceservice.cpp \ olddatadeleter.cpp \ voicemailhandler.cpp
