File indexing completed on 2024-05-05 04:57:30

0001 /*
0002     This file is part of Choqok, the KDE micro-blogging client
0003 
0004     SPDX-FileCopyrightText: 2010-2012 Andrey Esin <gmlastik@gmail.com>
0005 
0006     SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
0007 */
0008 
0009 #include "imqdbus.h"
0010 
0011 #include <QDBusConnectionInterface>
0012 #include <QDBusMessage>
0013 #include <QDBusReply>
0014 #include <QDebug>
0015 
0016 #ifdef TELEPATHY_FOUND
0017 #include <TelepathyQt/Account>
0018 #include <TelepathyQt/AccountManager>
0019 #include <TelepathyQt/AccountSet>
0020 #include <TelepathyQt/PendingOperation>
0021 #include <TelepathyQt/PendingReady>
0022 #endif
0023 
0024 const QString IM_KOPETE = QLatin1String("Kopete");
0025 const QString IM_PSI = QLatin1String("Psi");
0026 const QString IM_SKYPE = QLatin1String("Skype");
0027 const QString IM_PIDGIN = QLatin1String("Pidgin");
0028 const QString IM_TELEPATHY = QLatin1String("Telepathy");
0029 
0030 IMQDBus::IMQDBus(QObject *parent) : QObject(parent)
0031 {
0032     /*
0033     TODO:
0034     - qutIM (>0.3)
0035     - gajim ( doesn't want work :( )
0036     */
0037 #ifdef TELEPATHY_FOUND
0038     m_accountManager =  Tp::AccountManager::create(Tp::AccountFactory::create(QDBusConnection::sessionBus(), Tp::Account::FeatureCore));
0039     connect(m_accountManager->becomeReady(), &Tp::PendingOperation::finished,
0040             this, &IMQDBus::slotFinished);;
0041 
0042     Tp::registerTypes();
0043 #endif
0044 }
0045 
0046 void IMQDBus::updateStatusMessage(const QString &im, const QString &statusMessage)
0047 {
0048     if (im == IM_KOPETE) {
0049         useKopete(statusMessage);
0050     }
0051     if (im == IM_PSI) {
0052         usePsi(statusMessage);
0053     }
0054     if (im == IM_SKYPE) {
0055         useSkype(statusMessage);
0056     }
0057     if (im == IM_PIDGIN) {
0058         usePidgin(statusMessage);
0059     }
0060 #ifdef TELEPATHY_FOUND
0061     if (im == IM_TELEPATHY) {
0062         useTelepathy(statusMessage);
0063     }
0064 #endif
0065 }
0066 
0067 void IMQDBus::useKopete(const QString &statusMessage)
0068 {
0069     QDBusMessage msg = QDBusMessage::createMethodCall(QLatin1String("org.kde.kopete"), QLatin1String("/Kopete"), QLatin1String("org.kde.Kopete"), QLatin1String("setStatusMessage"));
0070     QList<QVariant> args;
0071     args.append(QVariant(statusMessage));
0072     msg.setArguments(args);
0073     QDBusMessage rep = QDBusConnection::sessionBus().call(msg);
0074     if (rep.type() == QDBusMessage::ErrorMessage) {
0075         qWarning() <<  "Failed with error:" << rep.errorMessage();
0076         return;
0077     }
0078 }
0079 
0080 void IMQDBus::usePsi(const QString &statusMessage)
0081 {
0082     QDBusMessage msg = QDBusMessage::createMethodCall(QLatin1String("org.psi-im.Psi"), QLatin1String("/Main"), QLatin1String("org.psi_im.Psi.Main"), QLatin1String("setStatus"));
0083     QList<QVariant> args;
0084     args.append(QVariant(QLatin1String("online")));
0085     args.append(QVariant(statusMessage));
0086     msg.setArguments(args);
0087     QDBusMessage rep = QDBusConnection::sessionBus().call(msg);
0088     if (rep.type() == QDBusMessage::ErrorMessage) {
0089         qWarning() <<  "Failed with error:" << rep.errorMessage();
0090         return;
0091     }
0092 }
0093 
0094 void IMQDBus::useSkype(const QString &statusMessage)
0095 {
0096     QDBusMessage msg = QDBusMessage::createMethodCall(QLatin1String("com.Skype.API"), QLatin1String("/com/Skype"), QLatin1String("com.Skype.API"), QLatin1String("Invoke"));
0097     QList<QVariant> args;
0098     args.append(QVariant(QLatin1String("NAME Choqok")));
0099     msg.setArguments(args);
0100     QDBusMessage rep = QDBusConnection::sessionBus().call(msg);
0101     if (rep.type() == QDBusMessage::ErrorMessage) {
0102         qWarning() <<  "Failed with error:" << rep.errorMessage();
0103         return;
0104     }
0105 
0106     args.clear();
0107     args.append(QVariant(QLatin1String("PROTOCOL 7")));
0108     msg.setArguments(args);
0109     rep = QDBusConnection::sessionBus().call(msg);
0110     if (rep.type() == QDBusMessage::ErrorMessage) {
0111         qWarning() <<  "Failed with error:" << rep.errorMessage();
0112         return;
0113     }
0114 
0115     args.clear();
0116     args.append(QVariant(QStringLiteral("SET PROFILE MOOD_TEXT %1").arg(statusMessage)));
0117     msg.setArguments(args);
0118     rep = QDBusConnection::sessionBus().call(msg);
0119     if (rep.type() == QDBusMessage::ErrorMessage) {
0120         qWarning() <<  "Failed with error:" << rep.errorMessage();
0121         return;
0122     }
0123 }
0124 
0125 void IMQDBus::usePidgin(const QString &statusMessage)
0126 {
0127     QDBusMessage msg = QDBusMessage::createMethodCall(QLatin1String("im.pidgin.purple.PurpleService"), QLatin1String("/im/pidgin/purple/PurpleObject"), QLatin1String("im.pidgin.purple.PurpleInterface"), QLatin1String("PurpleSavedstatusGetCurrent"));
0128     QDBusReply<int> repUInt = QDBusConnection::sessionBus().call(msg);
0129     if (repUInt.error().isValid()) {
0130         qWarning() <<  "Failed with error:" << repUInt.error().message();
0131         return;
0132     }
0133     int IDCurrentStatus = repUInt.value();
0134     msg = QDBusMessage::createMethodCall(QLatin1String("im.pidgin.purple.PurpleService"), QLatin1String("/im/pidgin/purple/PurpleObject"), QLatin1String("im.pidgin.purple.PurpleInterface"), QLatin1String("PurpleSavedstatusGetType"));
0135     QList<QVariant> args;
0136     args.append(QVariant(IDCurrentStatus));
0137     msg.setArguments(args);
0138     repUInt = QDBusConnection::sessionBus().call(msg);
0139     if (repUInt.error().isValid()) {
0140         qWarning() <<  "Failed with error:" << repUInt.error().message();
0141         return;
0142     }
0143     int currentStatusType = repUInt.value();
0144 
0145     msg = QDBusMessage::createMethodCall(QLatin1String("im.pidgin.purple.PurpleService"), QLatin1String("/im/pidgin/purple/PurpleObject"), QLatin1String("im.pidgin.purple.PurpleInterface"), QLatin1String("PurpleSavedstatusNew"));
0146     args.clear();
0147     args.append(QVariant(QString()));
0148     args.append(QVariant(currentStatusType));
0149     msg.setArguments(args);
0150     repUInt = QDBusConnection::sessionBus().call(msg);
0151     if (repUInt.error().isValid()) {
0152         qWarning() <<  "Failed with error:" << repUInt.error().message();
0153         return;
0154     }
0155     IDCurrentStatus = repUInt.value(); //ID of new status
0156 
0157     msg = QDBusMessage::createMethodCall(QLatin1String("im.pidgin.purple.PurpleService"), QLatin1String("/im/pidgin/purple/PurpleObject"), QLatin1String("im.pidgin.purple.PurpleInterface"), QLatin1String("PurpleSavedstatusSetMessage"));
0158     args.clear();
0159     args.append(QVariant(IDCurrentStatus));
0160     args.append(QVariant(statusMessage));
0161     msg.setArguments(args);
0162     QDBusReply<void> repStr = QDBusConnection::sessionBus().call(msg);
0163     if (repStr.error().isValid()) {
0164         qWarning() <<  "Failed with error:" << repStr.error().message();
0165         return;
0166     }
0167 
0168     msg = QDBusMessage::createMethodCall(QLatin1String("im.pidgin.purple.PurpleService"), QLatin1String("/im/pidgin/purple/PurpleObject"), QLatin1String("im.pidgin.purple.PurpleInterface"), QLatin1String("PurpleSavedstatusActivate"));
0169     args.clear();
0170     args.append(QVariant(IDCurrentStatus));
0171     msg.setArguments(args);
0172     repStr = QDBusConnection::sessionBus().call(msg);
0173     if (repStr.error().isValid()) {
0174         qWarning() <<  "Failed with error:" << repStr.error().message();
0175         return;
0176     }
0177 }
0178 
0179 #ifdef TELEPATHY_FOUND
0180 void IMQDBus::useTelepathy(const QString &statusMessage)
0181 {
0182     if (m_accountManager->isReady()) {
0183         Tp::AccountSetPtr validAccountsPtr = m_accountManager->enabledAccounts();
0184 
0185         QList<Tp::AccountPtr> accountsList = validAccountsPtr->accounts();
0186 
0187         for (const Tp::AccountPtr &account: accountsList) {
0188             if (account->isOnline() && account->isReady()) {
0189                 Tp::Presence currentPresence = account->currentPresence();
0190                 currentPresence.setStatusMessage(statusMessage);
0191                 account->setRequestedPresence(currentPresence);
0192             }
0193         }
0194     }
0195 }
0196 
0197 void IMQDBus::slotFinished(Tp::PendingOperation *po)
0198 {
0199     if (po->isError()) {
0200         qCritical() << "Telepathy AccountManager failed to get ready:" << po->errorMessage();
0201     }
0202 }
0203 
0204 #endif
0205 
0206 IMQDBus::~IMQDBus()
0207 {}
0208 
0209 QStringList IMQDBus::scanForIMs()
0210 {
0211     QStringList ims;
0212     if (QDBusConnection::sessionBus().interface()->isServiceRegistered(QLatin1String("com.Skype.API")).value()) {
0213         ims << IM_SKYPE;
0214     }
0215     if (QDBusConnection::sessionBus().interface()->isServiceRegistered(QLatin1String("org.psi-im.Psi")).value()) {
0216         ims << IM_PSI;
0217     }
0218     if (QDBusConnection::sessionBus().interface()->isServiceRegistered(QLatin1String("org.kde.kopete")).value()) {
0219         ims << IM_KOPETE;
0220     }
0221     if (QDBusConnection::sessionBus().interface()->isServiceRegistered(QLatin1String("im.pidgin.purple.PurpleService")).value()) {
0222         ims << IM_PIDGIN;
0223     }
0224 #ifdef TELEPATHY_FOUND
0225     if (QDBusConnection::sessionBus().interface()->isServiceRegistered(QLatin1String("org.freedesktop.Telepathy.AccountManager")).value()) {
0226         ims << IM_TELEPATHY;
0227     }
0228 #endif
0229 
0230     ims.sort();
0231     return ims;
0232 }
0233 
0234 #include "moc_imqdbus.cpp"