1 /*
2 * Copyright (C) 2014 Nicolas Bonnefon and other contributors
3 *
4 * This file is part of glogg.
5 *
6 * glogg is free software: you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation, either version 3 of the License, or
9 * (at your option) any later version.
10 *
11 * glogg is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with glogg. If not, see <http://www.gnu.org/licenses/>.
18 */
19
20 #include "dbusexternalcom.h"
21
22 #include <QString>
23
24 #include "log.h"
25
26 static const char* DBUS_SERVICE_NAME = "org.bonnefon.glogg";
27
DBusExternalCommunicator()28 DBusExternalCommunicator::DBusExternalCommunicator()
29 {
30 if (!QDBusConnection::sessionBus().isConnected()) {
31 LOG(logERROR) << "Cannot connect to the D-Bus session bus.\n"
32 << "To start it, run:\n"
33 << "\teval `dbus-launch --auto-syntax`\n";
34 throw CantCreateExternalErr();
35 }
36
37 dbus_iface_object_ = std::make_shared<DBusInterfaceExternalCommunicator>();
38
39 connect( dbus_iface_object_.get(), SIGNAL( signalLoadFile( const QString& ) ),
40 this, SIGNAL( loadFile( const QString& ) ) );
41 }
42
43 // If listening fails (e.g. another glogg is already listening,
44 // the function will fail silently and no listening will be done.
startListening()45 void DBusExternalCommunicator::startListening()
46 {
47 if (!QDBusConnection::sessionBus().registerService( DBUS_SERVICE_NAME )) {
48 LOG(logERROR) << qPrintable(QDBusConnection::sessionBus().lastError().message());
49 }
50
51 if ( !QDBusConnection::sessionBus().registerObject( "/",
52 dbus_iface_object_.get(), QDBusConnection::ExportAllContents ) ) {
53 LOG(logERROR) << qPrintable(QDBusConnection::sessionBus().lastError().message());
54 }
55 }
56
otherInstance() const57 ExternalInstance* DBusExternalCommunicator::otherInstance() const
58 {
59 try {
60 return static_cast<ExternalInstance*>( new DBusExternalInstance() );
61 }
62 catch ( CantCreateExternalErr ) {
63 LOG(logINFO) << "Cannot find external D-Bus correspondant, we are the only glogg out there.";
64 return nullptr;
65 }
66 }
67
version() const68 qint32 DBusExternalCommunicator::version() const
69 {
70 return 3;
71 }
72
version() const73 qint32 DBusInterfaceExternalCommunicator::version() const
74 {
75 return 0x010000;
76 }
77
loadFile(const QString & file_name)78 void DBusInterfaceExternalCommunicator::loadFile( const QString& file_name )
79 {
80 LOG(logDEBUG) << "DBusInterfaceExternalCommunicator::loadFile()";
81
82 emit signalLoadFile( file_name );
83 }
84
DBusExternalInstance()85 DBusExternalInstance::DBusExternalInstance()
86 {
87 dbusInterface_ = std::make_shared<QDBusInterface>(
88 DBUS_SERVICE_NAME, "/", "", QDBusConnection::sessionBus() );
89
90 if ( ! dbusInterface_->isValid() ) {
91 throw CantCreateExternalErr();
92 }
93 }
94
loadFile(const QString & file_name) const95 void DBusExternalInstance::loadFile( const QString& file_name ) const
96 {
97 QDBusReply<void> reply = dbusInterface_->call( "loadFile", file_name );
98
99 if ( ! reply.isValid() ) {
100 LOG( logWARNING ) << "Invalid reply from D-Bus call: "
101 << qPrintable( reply.error().message() );
102 }
103 }
104
getVersion() const105 uint32_t DBusExternalInstance::getVersion() const
106 {
107 QDBusReply<qint32> reply = dbusInterface_->call( "version" );
108
109 if ( ! reply.isValid() ) {
110 LOG( logWARNING ) << "Invalid reply from D-Bus call: "
111 << qPrintable( reply.error().message() );
112 return 0;
113 }
114
115 return (uint32_t) reply.value();
116 }
117