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

Reply via email to