File indexing completed on 2024-04-28 03:52:05

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