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"