HI,
The attached patch makes decibel daemon to work with an external
telepathy account manager. I tried to keep the original functionality of
the account management functions of the daemon intact while doing the
modifications. and this the initial patch. so any review + suggestions
are welcome :)
Regards,
Siraj Razick
Index: decibel/src/server/accountmanager.cpp
===================================================================
--- decibel/src/server/accountmanager.cpp (revision 953285)
+++ decibel/src/server/accountmanager.cpp (working copy)
@@ -35,6 +35,40 @@
#include <QtCore/QPointer>
#include <QtCore/QDebug>
+
+#if defined(EXTERNAL_ACCOUNT_MANAGER)
+#include <QDBusInterface>
+#include <QDBusMessage>
+#define TELEPATHY_ACCOUNT_MANAGER_SERVICE "org.freedesktop.Telepathy.AccountManager"
+#define TELEPATHY_ACCOUNT_MANAGER_PATH "/org/freedesktop/Telepathy/AccountManager"
+#define TELEPATHY_ACCOUNT_MANAGER_INTERFACE "org.freedesktop.Telepathy.AccountManager"
+#define TELEPATHY_ACCOUNT_MANAGER_PROPERTIES "org.freedesktop.DBus.Properties"
+struct SimplePresence
+{
+ uint type;
+ QString status;
+ QString statusMessage;
+};
+Q_DECLARE_METATYPE(SimplePresence)
+
+const QDBusArgument& operator>>(const QDBusArgument& arg, SimplePresence& val)
+{
+ arg.beginStructure();
+ arg >> val.type >> val.status >> val.statusMessage;
+ arg.endStructure();
+ return arg;
+}
+
+QDBusArgument& operator<<(QDBusArgument& arg, const SimplePresence& val)
+{
+ arg.beginStructure();
+ arg << val.type << val.status << val.statusMessage;
+ arg.endStructure();
+ return arg;
+}
+#endif
+
+
namespace
{
static const QString accountmanager_group("AccountManager");
@@ -59,6 +93,10 @@
AccountManagerPrivate(ConnectionFacade * conn_mgr, AccountConnectorBase * connector) :
m_connectionFacade(conn_mgr),
m_blockReconnects(false),
+#if defined(EXTERNAL_ACCOUNT_MANAGER)
+ m_currentHandler(2),
+ m_accountManagerInterface(0),
+#endif
m_connector(connector),
m_data_is_available(false)
{
@@ -73,7 +111,62 @@
{ }
// Helper functions:
+#if defined(EXTERNAL_ACCOUNT_MANAGER)
+ QtTapioca::PresenceState toTapiocaAPI(const SimplePresence &state)
+ {
+ QtTapioca::PresenceState tstate;
+ switch (state.type) {
+ case 1: return QtTapioca::PresenceState(state.status,
+ QtTapioca::PresenceState::OfflineType);
+ case 2: return QtTapioca::PresenceState(state.status,
+ QtTapioca::PresenceState::AvailableType);
+ case 3: return QtTapioca::PresenceState(state.status,
+ QtTapioca::PresenceState::AwayType);
+ case 4: return QtTapioca::PresenceState(state.status,
+ QtTapioca::PresenceState::ExtendedAwayType);
+ case 5: return QtTapioca::PresenceState(state.status,
+ QtTapioca::PresenceState::HiddenType);
+ case 6: return QtTapioca::PresenceState(state.status,
+ QtTapioca::PresenceState::BusyType);
+ case 0:
+ case 7:
+ default: return QtTapioca::PresenceState(state.status,
+ QtTapioca::PresenceState::UnsetType);
+ }
+ }
+ SimplePresence fromTapiocaAPI(const QtTapioca::PresenceState &state)
+ {
+ SimplePresence tstate;
+
+ switch (state.type()) {
+ case QtTapioca::PresenceState::OfflineType: tstate.type = 1;
+ tstate.status = "offline";
+ break;
+ case QtTapioca::PresenceState::AvailableType: tstate.type = 2;
+ tstate.status = "available";
+ break;
+ case QtTapioca::PresenceState::AwayType: tstate.type = 3;
+ tstate.status = "away";
+ break;
+ case QtTapioca::PresenceState::ExtendedAwayType: tstate.type = 4;
+ tstate.status = "away";
+ break;
+ case QtTapioca::PresenceState::HiddenType: tstate.type = 5;
+ tstate.status = "xa";
+ break;
+ case QtTapioca::PresenceState::BusyType: tstate.type = 6;
+ tstate.status = "dnd";
+ break;
+ case QtTapioca::PresenceState::UnsetType:
+ default : tstate.type = 0;
+ tstate.status = "";
+ }
+
+ tstate.statusMessage = "";
+ return tstate;
+ }
+#endif
/**
* @brief Create an account in the accounts database.
* @param nv_pairs The account data.
@@ -84,6 +177,39 @@
*/
uint createAccount(const QVariantMap & nv_pairs)
{
+#if defined(EXTERNAL_ACCOUNT_MANAGER)
+ if (m_accountManagerInterface)
+ delete m_accountManagerInterface;
+
+ m_accountManagerInterface = new QDBusInterface(TELEPATHY_ACCOUNT_MANAGER_SERVICE,
+ TELEPATHY_ACCOUNT_MANAGER_PATH,
+ TELEPATHY_ACCOUNT_MANAGER_INTERFACE,
+ QDBusConnection::sessionBus(),
+ m_connector);
+ if (m_accountManagerInterface->isValid()) {
+
+ //port number should be a uint
+ QVariantMap data = nv_pairs;
+ uint port = nv_pairs["port"].toUInt();
+ data["port"] = port;
+ QString cm ("gabble");
+ QString protocol ("jabber");
+
+ if (data.contains("connection_manager")) {
+ cm = data["connection_manager"].toString();
+ }
+
+ if (data.contains("protocol")) {
+ protocol = data["jabber"].toString();
+ }
+
+ m_accountManagerInterface->call("CreateAccount", cm,
+ protocol,
+ "", data);
+ return m_currentHandler++;
+ }
+ return true;
+#elif
Q_ASSERT(nv_pairs.contains(Decibel::name_display_name));
Q_ASSERT(nv_pairs.contains(Decibel::name_protocol));
Q_ASSERT(nv_pairs.contains(Decibel::name_presence));
@@ -96,11 +222,131 @@
{
qDebug() << "Key:" << key << "value:" << nv_pairs[key];
}
-
return m_connector->storeAccount(nv_pairs);
+#endif
}
+ /**
+ *...@brief ListAccounts from an External Account Manager
+ *...@return List of Accuont Id's
+ */
+ QMap<uint, QDBusObjectPath> getValidAccounts()
+ {
+ if (m_accountManagerInterface) {
+ delete m_accountManagerInterface;
+ }
+ m_handleMap.clear();
+ m_accountManagerInterface = new QDBusInterface(TELEPATHY_ACCOUNT_MANAGER_SERVICE,
+ TELEPATHY_ACCOUNT_MANAGER_PATH,
+ TELEPATHY_ACCOUNT_MANAGER_PROPERTIES,
+ QDBusConnection::sessionBus(),
+ m_connector);
- /**
+ if (m_accountManagerInterface->isValid()) {
+ QDBusMessage accountList = m_accountManagerInterface->call("Get",
+ "org.freedesktop.Telepathy.AccountManager",
+ "ValidAccounts");
+ foreach (QVariant arg, accountList.arguments())
+ {
+ QDBusArgument argument = qvariant_cast<QDBusVariant>(arg).variant().value<QDBusArgument>();
+ argument.beginArray();
+ QDBusObjectPath objectPath;
+ int count = 1;
+ while (!argument.atEnd()) {
+ argument >> objectPath;
+ m_handleMap[count++] = objectPath;
+ }
+ argument.endArray();
+ }
+ }
+ return m_handleMap;
+ }
+
+#if defined(EXTERNAL_ACCOUNT_MANAGER)
+ /*...@brief Removes an Account with a matching handle
+ *...@param handle The account identifier of the account to be deleted
+ *...@return true if the account was deleted, false otherwise
+ * */
+ bool deleteAccount(uint handle)
+ {
+ if (!hasAccount(handle)) {
+ return false;
+ }
+
+ if (m_accountManagerInterface) {
+ delete m_accountManagerInterface;
+ }
+
+ QDBusObjectPath objectPath = m_handleMap[handle];
+
+ m_accountManagerInterface = new QDBusInterface(TELEPATHY_ACCOUNT_MANAGER_SERVICE,
+ objectPath.path(),
+ "org.freedesktop.Telepathy.Account",
+ QDBusConnection::sessionBus(),
+ m_connector);
+ m_accountManagerInterface->call("Remove");
+ return true;
+ }
+
+ bool setPresence(uint handle, const QDBusArgument& arg)
+ {
+ if (!hasAccount(handle)) {
+ return false;
+ }
+
+ if (m_accountManagerInterface) {
+ delete m_accountManagerInterface;
+ }
+ SimplePresence crap;
+
+ QDBusObjectPath objectPath = m_handleMap[handle];
+
+ m_accountManagerInterface = new QDBusInterface(TELEPATHY_ACCOUNT_MANAGER_SERVICE,
+ objectPath.path(),
+ TELEPATHY_ACCOUNT_MANAGER_PROPERTIES,
+ QDBusConnection::sessionBus(),
+ m_connector);
+
+ qDBusRegisterMetaType<SimplePresence>();
+
+ qDebug()<<m_accountManagerInterface->call("Set","org.freedesktop.Telepathy.Account",
+ "RequestedPresence", QVariant::fromValue(QDBusVariant(QVariant::fromValue(arg))));
+ return true;
+ }
+
+
+ bool updateAccount(uint handle, const QVariantMap &nv_pairs)
+ {
+ if (!hasAccount(handle)) {
+ return false;
+ }
+
+ if (!m_accountManagerInterface) {
+ delete m_accountManagerInterface;
+ }
+
+ QDBusObjectPath objectPath = m_handleMap[handle];
+ m_accountManagerInterface = new QDBusInterface(TELEPATHY_ACCOUNT_MANAGER_SERVICE,
+ objectPath.path(),
+ "org.freedesktop.Telepathy.Account",
+ QDBusConnection::sessionBus(),
+ m_connector);
+
+ QDBusMessage reply = m_accountManagerInterface->call("UpdateParameters", nv_pairs, QStringList());
+ return true;
+
+ }
+
+ bool hasAccount(uint account_handle)
+ {
+ if (!getValidAccounts().contains(account_handle)) {
+ return false;
+ }
+
+ return true;
+ }
+#endif
+
+ /**
* @brief Make sure a account has the required presence information.
* @param nv_pairs The account data.
* @returns A new set of account data.
@@ -181,8 +427,31 @@
}
QVariantMap getAccount(const uint account_handle)
- { return sanityCheck(m_connector->getAccount(account_handle)); }
+ {
+#if defined(EXTERNAL_ACCOUNT_MANAGER)
+ if (!hasAccount(account_handle)) {
+ return QVariantMap();
+ }
+ if (m_accountManagerInterface) {
+ delete m_accountManagerInterface;
+ }
+
+ QDBusObjectPath objectPath = m_handleMap[account_handle];
+ m_accountManagerInterface = new QDBusInterface(TELEPATHY_ACCOUNT_MANAGER_SERVICE,
+ objectPath.path(),
+ TELEPATHY_ACCOUNT_MANAGER_PROPERTIES,
+ QDBusConnection::sessionBus(),
+ m_connector);
+ if (m_accountManagerInterface->isValid()) {
+ QDBusReply<QVariantMap> accountProps = m_accountManagerInterface->call("GetAll",
+ "org.freedesktop.Telepathy.Account");
+ return accountProps.value();
+ }
+#endif
+ return sanityCheck(m_connector->getAccount(account_handle));
+ }
+
/**
* @brief Manage presence information on a connection.
* @param account_handle A handle to an account.
@@ -370,6 +639,11 @@
bool m_data_is_available;
friend class AccountManager;
+#if defined(EXTERNAL_ACCOUNT_MANAGER)
+ QDBusInterface * m_accountManagerInterface;
+ int m_currentHandler;
+ QMap<uint, QDBusObjectPath> m_handleMap;
+#endif
};
/// @endcond
@@ -448,14 +722,25 @@
{ return d->m_connector->protocol(account_handle); }
bool AccountManager::gotAccount(const uint account_handle) const
-{ return d->m_connector->hasAccount(account_handle); }
+{
+#ifdef EXTERNAL_ACCOUNT_MANAGER
+ return d->hasAccount(account_handle);
+#endif
+ return d->m_connector->hasAccount(account_handle);
+}
QtTapioca::Connection *
AccountManager::connectionOf(const uint account_handle) const
{ return d->connectionOf(account_handle); }
QList<uint> AccountManager::listAccounts() const
-{ return d->m_connector->accountIds(); }
+{
+#if defined(EXTERNAL_ACCOUNT_MANAGER)
+ return d->getValidAccounts().keys();
+#else
+ return d->m_connector->accountIds();
+#endif
+}
QVariantMap AccountManager::queryAccount(const uint account_handle) const
{
@@ -470,6 +755,9 @@
uint AccountManager::addAccount(const QVariantMap & nv_pairs)
{
+#ifdef EXTERNAL_ACCOUNT_MANAGER
+ return d->createAccount(nv_pairs);
+#elif
QList<uint> matching_accounts = findAccounts(nv_pairs);
if (!matching_accounts.isEmpty())
{
@@ -495,11 +783,18 @@
}
return account_handle;
+#endif
}
void AccountManager::updateAccount(const uint account_handle,
const QVariantMap & nv_pairs)
{
+#if defined (EXTERNAL_ACCOUNT_MANAGER)
+ d->updateAccount(account_handle,nv_pairs);
+ //TODO:signal only if update worked
+ emit accountUpdated(account_handle);
+ return;
+#endif
if (!d->m_connector->hasAccount(account_handle))
{
sendErrorReply(Decibel::ErrorNoSuchAccount,
@@ -552,6 +847,10 @@
void AccountManager::deleteAccount(const uint account_handle)
{
+#if defined EXTERNAL_ACCOUNT_MANAGER
+ if (d->deleteAccount(account_handle))
+ { emit accountDeleted(account_handle); }
+#endif
if (d->m_connector->deleteAccount(account_handle))
{ emit accountDeleted(account_handle); }
}
@@ -564,7 +863,13 @@
{
qDebug() << "Req: setPresence: handle="<< account_handle
<< "state=" << presence_state.name();
-
+#if defined (EXTERNAL_ACCOUNT_MANAGER)
+ SimplePresence rp = d->fromTapiocaAPI(presence_state);
+ QDBusArgument arg;
+ arg << rp;
+ d->setPresence(account_handle, arg);
+ return currentPresence(account_handle);
+#endif
// Check the presence state requested for the account is valid. If it isn't,
// send an error reply and return.
if (presence_state.name().isEmpty()) // FIXME: is checking the name all that is necessary?
@@ -609,7 +914,11 @@
{
qDebug() << "AccountManager::presence():"
<< "Calling m_connector->hasAccount().";
+#if defined(EXTERNAL_ACCOUNT_MANAGER)
+ if (!d->hasAccount(account_handle))
+#elif
if (!d->m_connector->hasAccount(account_handle))
+#endif
{
sendErrorReply(Decibel::ErrorNoSuchAccount,
tr("Account %1 not found.", "1: account_handle").
@@ -618,7 +927,13 @@
}
QVariantMap account_data = d->getAccount(account_handle);
+#if defined(EXTERNAL_ACCOUNT_MANAGER)
+ QVariant arg = account_data["AutomaticPresence"];
+ SimplePresence presence = qdbus_cast<SimplePresence>(arg);
+ QtTapioca::PresenceState result = d->toTapiocaAPI(presence);
+#elif
QtTapioca::PresenceState result = account_data[Decibel::name_presence].value<QtTapioca::PresenceState>();
+#endif
//Q_ASSERT(!result.isEmpty());
// FIXME: Should we check for UnsetType?
@@ -628,7 +943,11 @@
QtTapioca::PresenceState AccountManager::currentPresence(const uint account_handle)
{
+#if defined(EXTERNAL_ACCOUNT_MANAGER)
+ if (!d->hasAccount(account_handle))
+#elif
if (!d->m_connector->hasAccount(account_handle))
+#endif
{
sendErrorReply(Decibel::ErrorNoSuchAccount,
tr("Account %1 not found.", "1: account_handle").
@@ -637,8 +956,13 @@
}
QVariantMap account_data = d->getAccount(account_handle);
- QtTapioca::PresenceState result = account_data[Decibel::name_current_presence].value<QtTapioca::PresenceState>();
-
+#if defined(EXTERNAL_ACCOUNT_MANAGER)
+ QVariant arg = account_data["CurrentPresence"];
+ SimplePresence presence = qdbus_cast<SimplePresence>(arg);
+ QtTapioca::PresenceState result = d->toTapiocaAPI(presence);
+#elif
+ QtTapioca::PresenceState result = account_data["currentPresence"].value<QtTapioca::PresenceState>();
+#endif
//Q_ASSERT(!result.isEmpty()); // FIXME: PresenceState
return result;
@@ -732,8 +1056,12 @@
QString AccountManager::objectPath(const uint account_handle) const
{
+#if defined(EXTERNAL_ACCOUNT_MANAGER)
+ d->getValidAccounts()[account_handle].path();
+#elif
if (d->connectionOf(account_handle) == 0) { return QString(); }
return d->connectionOf(account_handle)->objectPath();
+#endif
}
void AccountManager::onOwnPresenceUpdated(QtTapioca::Connection * connection,
Index: decibel/demos/accounthandling/setpresence.cpp
===================================================================
--- decibel/demos/accounthandling/setpresence.cpp (revision 953285)
+++ decibel/demos/accounthandling/setpresence.cpp (working copy)
@@ -75,8 +75,13 @@
QDBusConnection::sessionBus(), &app);
QDBusReply<QtTapioca::PresenceState> reply;
+// reply = account_mgr.presence(1);
+// qDebug() << "Returned value was" << reply.value().name();
+/// return 0;
if (presence_message.isEmpty())
- { reply = account_mgr.setPresence(account_handle, presence_state); }
+ { reply = account_mgr.setPresence(account_handle, presence_state);
+ qDebug()<<"reply of set prsennce"<<reply.value().name()<<endl;
+ }
else
{
reply = account_mgr.setPresenceAndMessage(account_handle,
@@ -92,7 +97,7 @@
<< error.message();
return 3;
}
- qDebug() << "Returned value was" << reply.value().name();
+ qDebug() << "Returned value was" << reply.value().name();
return 0;
}
_______________________________________________
Decibel mailing list
[email protected]
https://mail.kde.org/mailman/listinfo/decibel