File indexing completed on 2024-04-28 15:17:55

0001 /*
0002  * BluezQt - Asynchronous Bluez wrapper library
0003  *
0004  * SPDX-FileCopyrightText: 2014 David Rosca <nowrep@gmail.com>
0005  *
0006  * SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
0007  */
0008 
0009 #include "obexmanager.h"
0010 #include "debug.h"
0011 #include "initobexmanagerjob.h"
0012 #include "obexagent.h"
0013 #include "obexagentadaptor.h"
0014 #include "obexmanager_p.h"
0015 #include "pendingcall.h"
0016 #include "utils.h"
0017 
0018 #include <QDBusServiceWatcher>
0019 
0020 namespace BluezQt
0021 {
0022 ObexManager::ObexManager(QObject *parent)
0023     : QObject(parent)
0024     , d(new ObexManagerPrivate(this))
0025 {
0026     Instance::setObexManager(this);
0027 }
0028 
0029 ObexManager::~ObexManager()
0030 {
0031     delete d;
0032 }
0033 
0034 InitObexManagerJob *ObexManager::init()
0035 {
0036     return new InitObexManagerJob(this);
0037 }
0038 
0039 bool ObexManager::isInitialized() const
0040 {
0041     return d->m_initialized;
0042 }
0043 
0044 bool ObexManager::isOperational() const
0045 {
0046     return d->m_initialized && d->m_obexRunning && d->m_loaded;
0047 }
0048 
0049 QList<ObexSessionPtr> ObexManager::sessions() const
0050 {
0051     return d->m_sessions.values();
0052 }
0053 
0054 ObexSessionPtr ObexManager::sessionForPath(const QDBusObjectPath &path) const
0055 {
0056     for (ObexSessionPtr session : std::as_const(d->m_sessions)) {
0057         if (path.path().startsWith(session->objectPath().path())) {
0058             return session;
0059         }
0060     }
0061 
0062     return ObexSessionPtr();
0063 }
0064 
0065 PendingCall *ObexManager::startService()
0066 {
0067     QDBusMessage msg = QDBusMessage::createMethodCall(Strings::orgFreedesktopDBus(),
0068                                                       QStringLiteral("/org/freedesktop/DBus"),
0069                                                       Strings::orgFreedesktopDBus(),
0070                                                       QStringLiteral("StartServiceByName"));
0071     msg << Strings::orgBluezObex();
0072     msg << quint32(0);
0073 
0074     return new PendingCall(DBusConnection::orgBluezObex().asyncCall(msg), PendingCall::ReturnUint32);
0075 }
0076 
0077 PendingCall *ObexManager::registerAgent(ObexAgent *agent)
0078 {
0079     Q_ASSERT(agent);
0080 
0081     if (!d->m_obexAgentManager) {
0082         return new PendingCall(PendingCall::InternalError, QStringLiteral("ObexManager not operational!"));
0083     }
0084 
0085     new ObexAgentAdaptor(agent, this);
0086 
0087     if (!DBusConnection::orgBluezObex().registerObject(agent->objectPath().path(), agent)) {
0088         qCDebug(BLUEZQT) << "Cannot register object" << agent->objectPath().path();
0089     }
0090 
0091     return new PendingCall(d->m_obexAgentManager->RegisterAgent(agent->objectPath()), PendingCall::ReturnVoid, this);
0092 }
0093 
0094 PendingCall *ObexManager::unregisterAgent(ObexAgent *agent)
0095 {
0096     Q_ASSERT(agent);
0097 
0098     if (!d->m_obexAgentManager) {
0099         return new PendingCall(PendingCall::InternalError, QStringLiteral("ObexManager not operational!"));
0100     }
0101 
0102     DBusConnection::orgBluezObex().unregisterObject(agent->objectPath().path());
0103 
0104     return new PendingCall(d->m_obexAgentManager->UnregisterAgent(agent->objectPath()), PendingCall::ReturnVoid, this);
0105 }
0106 
0107 PendingCall *ObexManager::createSession(const QString &destination, const QVariantMap &args)
0108 {
0109     if (!d->m_obexClient) {
0110         return new PendingCall(PendingCall::InternalError, QStringLiteral("ObexManager not operational!"));
0111     }
0112 
0113     return new PendingCall(d->m_obexClient->CreateSession(destination, args), PendingCall::ReturnObjectPath, this);
0114 }
0115 
0116 PendingCall *ObexManager::removeSession(const QDBusObjectPath &session)
0117 {
0118     if (!d->m_obexClient) {
0119         return new PendingCall(PendingCall::InternalError, QStringLiteral("ObexManager not operational!"));
0120     }
0121 
0122     return new PendingCall(d->m_obexClient->RemoveSession(session), PendingCall::ReturnVoid, this);
0123 }
0124 
0125 } // namespace BluezQt
0126 
0127 #include "moc_obexmanager.cpp"