1 /*
2     This file is part of the KDE Baloo Project
3     SPDX-FileCopyrightText: 2015 Pinak Ahuja <pinak.ahuja@gmail.com>
4     SPDX-FileCopyrightText: 2015 Vishesh Handa <vhanda@kde.org>
5 
6     SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
7 */
8 
9 #include "monitorcommand.h"
10 #include "indexerstate.h"
11 
12 #include <QDBusConnection>
13 #include <QDBusServiceWatcher>
14 
15 using namespace Baloo;
16 
MonitorCommand(QObject * parent)17 MonitorCommand::MonitorCommand(QObject *parent)
18     : QObject(parent)
19     , m_out(stdout)
20     , m_err(stderr)
21     , m_indexerDBusInterface(nullptr)
22     , m_schedulerDBusInterface(nullptr)
23     , m_dbusServiceWatcher(nullptr)
24 
25 {
26     m_dbusServiceWatcher = new QDBusServiceWatcher(
27         QStringLiteral("org.kde.baloo"), QDBusConnection::sessionBus(),
28         QDBusServiceWatcher::WatchForOwnerChange, this
29     );
30     connect(m_dbusServiceWatcher, &QDBusServiceWatcher::serviceRegistered,
31             this, &MonitorCommand::balooIsAvailable);
32     connect(m_dbusServiceWatcher, &QDBusServiceWatcher::serviceUnregistered,
33             this, &MonitorCommand::balooIsNotAvailable);
34 
35     m_indexerDBusInterface = new org::kde::baloo::fileindexer(QStringLiteral("org.kde.baloo"),
36         QStringLiteral("/fileindexer"),
37         QDBusConnection::sessionBus(),
38         this
39     );
40     connect(m_indexerDBusInterface, &org::kde::baloo::fileindexer::startedIndexingFile,
41         this, &MonitorCommand::startedIndexingFile);
42     connect(m_indexerDBusInterface, &org::kde::baloo::fileindexer::finishedIndexingFile,
43         this, &MonitorCommand::finishedIndexingFile);
44 
45     m_schedulerDBusInterface = new org::kde::baloo::scheduler(QStringLiteral("org.kde.baloo"),
46         QStringLiteral("/scheduler"),
47         QDBusConnection::sessionBus(),
48         this
49     );
50     connect(m_schedulerDBusInterface, &org::kde::baloo::scheduler::stateChanged,
51         this, &MonitorCommand::stateChanged);
52 
53     if (m_indexerDBusInterface->isValid() && m_schedulerDBusInterface->isValid()) {
54         m_err << i18n("Press ctrl+c to stop monitoring\n");
55         m_err.flush();
56         balooIsAvailable();
57         stateChanged(m_schedulerDBusInterface->state());
58         const QString currentFile = m_indexerDBusInterface->currentFile();
59         if (!currentFile.isEmpty()) {
60             startedIndexingFile(currentFile);
61         }
62     } else {
63         balooIsNotAvailable();
64     }
65 }
66 
balooIsNotAvailable()67 void MonitorCommand::balooIsNotAvailable()
68 {
69     m_indexerDBusInterface->unregisterMonitor();
70     m_err << i18n("Waiting for file indexer to start\n");
71     m_err << i18n("Press Ctrl+C to stop monitoring\n");
72     m_err.flush();
73 }
74 
balooIsAvailable()75 void MonitorCommand::balooIsAvailable()
76 {
77     m_indexerDBusInterface->registerMonitor();
78     m_err << i18n("File indexer is running\n");
79     m_err.flush();
80 }
81 
exec(const QCommandLineParser & parser)82 int MonitorCommand::exec(const QCommandLineParser& parser)
83 {
84     Q_UNUSED(parser);
85     return QCoreApplication::instance()->exec();
86 }
87 
startedIndexingFile(const QString & filePath)88 void MonitorCommand::startedIndexingFile(const QString& filePath)
89 {
90     if (!m_currentFile.isEmpty()) {
91 	m_out << '\n';
92     }
93     m_currentFile = filePath;
94     m_out << i18nc("currently indexed file", "Indexing: %1", filePath);
95     m_out.flush();
96 }
97 
finishedIndexingFile(const QString & filePath)98 void MonitorCommand::finishedIndexingFile(const QString& filePath)
99 {
100     Q_UNUSED(filePath);
101 
102     m_currentFile.clear();
103     m_out << i18n(": Ok\n");
104     m_out.flush();
105 }
106 
stateChanged(int state)107 void MonitorCommand::stateChanged(int state)
108 {
109     m_out << stateString(state) << '\n';
110     m_out.flush();
111 }
112