File indexing completed on 2024-04-28 04:00:49

0001 /*
0002     SPDX-FileCopyrightText: 2014 Alejandro Fiestas Olivares <afiestas@kde.org>
0003 
0004     SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
0005 */
0006 
0007 #include "fdinhibition.h"
0008 #include "logindinhibitionargument.h"
0009 
0010 #include <unistd.h>
0011 
0012 #include <QCoreApplication>
0013 #include <QDBusConnection>
0014 #include <QDBusUnixFileDescriptor>
0015 #include <QDebug>
0016 #include <QVariant>
0017 
0018 using namespace Solid;
0019 
0020 FdInhibition::FdInhibition(Power::InhibitionTypes inhibitions, const QString &description, QObject *parent)
0021     : AbstractInhibition(parent)
0022     , m_state(Inhibition::Stopped)
0023     , m_description(description)
0024     , m_inhibitions(inhibitions)
0025 {
0026 }
0027 
0028 FdInhibition::~FdInhibition()
0029 {
0030     close(m_fd);
0031 }
0032 
0033 void FdInhibition::start()
0034 {
0035     QDBusMessage msg = QDBusMessage::createMethodCall(QStringLiteral("org.freedesktop.login1"),
0036                                                       QStringLiteral("/org/freedesktop/login1"),
0037                                                       QStringLiteral("org.freedesktop.login1.Manager"),
0038                                                       QStringLiteral("Inhibit"));
0039 
0040     QList<QVariant> args;
0041     args << LogindInhibitionArgument::fromPowerState(m_inhibitions) << QCoreApplication::instance()->applicationName() << m_description
0042          << QStringLiteral("block");
0043     msg.setArguments(args);
0044 
0045     QDBusConnection::systemBus().callWithCallback(msg, this, SLOT(slotDBusReply(QDBusMessage)), SLOT(slotDBusError(QDBusError)));
0046 }
0047 
0048 void FdInhibition::stop()
0049 {
0050     close(m_fd);
0051     setState(Inhibition::Stopped);
0052 }
0053 
0054 void FdInhibition::setDescription(const QString &description)
0055 {
0056     m_description = description;
0057 }
0058 
0059 void FdInhibition::slotDBusReply(const QDBusMessage &msg)
0060 {
0061     m_fd = msg.arguments().first().value<QDBusUnixFileDescriptor>().fileDescriptor();
0062     setState(Inhibition::Started);
0063 }
0064 
0065 void FdInhibition::slotDBusError(const QDBusError &error)
0066 {
0067     qDebug() << error.message();
0068 }
0069 
0070 void FdInhibition::setState(const Inhibition::State &state)
0071 {
0072     if (m_state == state) {
0073         return;
0074     }
0075 
0076     m_state = state;
0077     Q_EMIT stateChanged(m_state);
0078 }
0079 
0080 Inhibition::State FdInhibition::state() const
0081 {
0082     return m_state;
0083 }
0084 
0085 #include "moc_fdinhibition.cpp"