1557fb9d8SNicolas Bonnefon /*
2557fb9d8SNicolas Bonnefon * Copyright (C) 2014 Nicolas Bonnefon and other contributors
3557fb9d8SNicolas Bonnefon *
4557fb9d8SNicolas Bonnefon * This file is part of glogg.
5557fb9d8SNicolas Bonnefon *
6557fb9d8SNicolas Bonnefon * glogg is free software: you can redistribute it and/or modify
7557fb9d8SNicolas Bonnefon * it under the terms of the GNU General Public License as published by
8557fb9d8SNicolas Bonnefon * the Free Software Foundation, either version 3 of the License, or
9557fb9d8SNicolas Bonnefon * (at your option) any later version.
10557fb9d8SNicolas Bonnefon *
11557fb9d8SNicolas Bonnefon * glogg is distributed in the hope that it will be useful,
12557fb9d8SNicolas Bonnefon * but WITHOUT ANY WARRANTY; without even the implied warranty of
13557fb9d8SNicolas Bonnefon * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14557fb9d8SNicolas Bonnefon * GNU General Public License for more details.
15557fb9d8SNicolas Bonnefon *
16557fb9d8SNicolas Bonnefon * You should have received a copy of the GNU General Public License
17557fb9d8SNicolas Bonnefon * along with glogg. If not, see <http://www.gnu.org/licenses/>.
18557fb9d8SNicolas Bonnefon */
19557fb9d8SNicolas Bonnefon
20557fb9d8SNicolas Bonnefon #include "dbusexternalcom.h"
21557fb9d8SNicolas Bonnefon
22557fb9d8SNicolas Bonnefon #include <QString>
23557fb9d8SNicolas Bonnefon
24557fb9d8SNicolas Bonnefon #include "log.h"
25557fb9d8SNicolas Bonnefon
26557fb9d8SNicolas Bonnefon static const char* DBUS_SERVICE_NAME = "org.bonnefon.glogg";
27557fb9d8SNicolas Bonnefon
DBusExternalCommunicator()28557fb9d8SNicolas Bonnefon DBusExternalCommunicator::DBusExternalCommunicator()
29557fb9d8SNicolas Bonnefon {
30557fb9d8SNicolas Bonnefon if (!QDBusConnection::sessionBus().isConnected()) {
31557fb9d8SNicolas Bonnefon LOG(logERROR) << "Cannot connect to the D-Bus session bus.\n"
32557fb9d8SNicolas Bonnefon << "To start it, run:\n"
33557fb9d8SNicolas Bonnefon << "\teval `dbus-launch --auto-syntax`\n";
34557fb9d8SNicolas Bonnefon throw CantCreateExternalErr();
35557fb9d8SNicolas Bonnefon }
360dadbfafSNicolas Bonnefon
370dadbfafSNicolas Bonnefon dbus_iface_object_ = std::make_shared<DBusInterfaceExternalCommunicator>();
3809aff35dSNicolas Bonnefon
3909aff35dSNicolas Bonnefon connect( dbus_iface_object_.get(), SIGNAL( signalLoadFile( const QString& ) ),
4009aff35dSNicolas Bonnefon this, SIGNAL( loadFile( const QString& ) ) );
41e07da50aSNicolas Bonnefon }
42557fb9d8SNicolas Bonnefon
43*da4beab3SNicolas Bonnefon // If listening fails (e.g. another glogg is already listening,
44*da4beab3SNicolas Bonnefon // the function will fail silently and no listening will be done.
startListening()45e07da50aSNicolas Bonnefon void DBusExternalCommunicator::startListening()
46e07da50aSNicolas Bonnefon {
47557fb9d8SNicolas Bonnefon if (!QDBusConnection::sessionBus().registerService( DBUS_SERVICE_NAME )) {
48557fb9d8SNicolas Bonnefon LOG(logERROR) << qPrintable(QDBusConnection::sessionBus().lastError().message());
49557fb9d8SNicolas Bonnefon }
50557fb9d8SNicolas Bonnefon
51e07da50aSNicolas Bonnefon if ( !QDBusConnection::sessionBus().registerObject( "/",
520dadbfafSNicolas Bonnefon dbus_iface_object_.get(), QDBusConnection::ExportAllContents ) ) {
53e07da50aSNicolas Bonnefon LOG(logERROR) << qPrintable(QDBusConnection::sessionBus().lastError().message());
54e07da50aSNicolas Bonnefon }
55557fb9d8SNicolas Bonnefon }
56557fb9d8SNicolas Bonnefon
otherInstance() const57557fb9d8SNicolas Bonnefon ExternalInstance* DBusExternalCommunicator::otherInstance() const
58557fb9d8SNicolas Bonnefon {
59557fb9d8SNicolas Bonnefon try {
60557fb9d8SNicolas Bonnefon return static_cast<ExternalInstance*>( new DBusExternalInstance() );
61557fb9d8SNicolas Bonnefon }
62557fb9d8SNicolas Bonnefon catch ( CantCreateExternalErr ) {
63557fb9d8SNicolas Bonnefon LOG(logINFO) << "Cannot find external D-Bus correspondant, we are the only glogg out there.";
64557fb9d8SNicolas Bonnefon return nullptr;
65557fb9d8SNicolas Bonnefon }
66557fb9d8SNicolas Bonnefon }
67557fb9d8SNicolas Bonnefon
version() const68e07da50aSNicolas Bonnefon qint32 DBusExternalCommunicator::version() const
69557fb9d8SNicolas Bonnefon {
700dadbfafSNicolas Bonnefon return 3;
710dadbfafSNicolas Bonnefon }
720dadbfafSNicolas Bonnefon
version() const730dadbfafSNicolas Bonnefon qint32 DBusInterfaceExternalCommunicator::version() const
740dadbfafSNicolas Bonnefon {
75e07da50aSNicolas Bonnefon return 0x010000;
76557fb9d8SNicolas Bonnefon }
77557fb9d8SNicolas Bonnefon
loadFile(const QString & file_name)780dadbfafSNicolas Bonnefon void DBusInterfaceExternalCommunicator::loadFile( const QString& file_name )
790dadbfafSNicolas Bonnefon {
800dadbfafSNicolas Bonnefon LOG(logDEBUG) << "DBusInterfaceExternalCommunicator::loadFile()";
810dadbfafSNicolas Bonnefon
820dadbfafSNicolas Bonnefon emit signalLoadFile( file_name );
830dadbfafSNicolas Bonnefon }
840dadbfafSNicolas Bonnefon
DBusExternalInstance()85557fb9d8SNicolas Bonnefon DBusExternalInstance::DBusExternalInstance()
86557fb9d8SNicolas Bonnefon {
87557fb9d8SNicolas Bonnefon dbusInterface_ = std::make_shared<QDBusInterface>(
88e07da50aSNicolas Bonnefon DBUS_SERVICE_NAME, "/", "", QDBusConnection::sessionBus() );
89557fb9d8SNicolas Bonnefon
90557fb9d8SNicolas Bonnefon if ( ! dbusInterface_->isValid() ) {
91557fb9d8SNicolas Bonnefon throw CantCreateExternalErr();
92557fb9d8SNicolas Bonnefon }
93557fb9d8SNicolas Bonnefon }
94557fb9d8SNicolas Bonnefon
loadFile(const QString & file_name) const9509aff35dSNicolas Bonnefon void DBusExternalInstance::loadFile( const QString& file_name ) const
96557fb9d8SNicolas Bonnefon {
9709aff35dSNicolas Bonnefon QDBusReply<void> reply = dbusInterface_->call( "loadFile", file_name );
98557fb9d8SNicolas Bonnefon
99557fb9d8SNicolas Bonnefon if ( ! reply.isValid() ) {
100557fb9d8SNicolas Bonnefon LOG( logWARNING ) << "Invalid reply from D-Bus call: "
101557fb9d8SNicolas Bonnefon << qPrintable( reply.error().message() );
102557fb9d8SNicolas Bonnefon }
103557fb9d8SNicolas Bonnefon }
104e07da50aSNicolas Bonnefon
getVersion() const105e07da50aSNicolas Bonnefon uint32_t DBusExternalInstance::getVersion() const
106e07da50aSNicolas Bonnefon {
107e07da50aSNicolas Bonnefon QDBusReply<qint32> reply = dbusInterface_->call( "version" );
108e07da50aSNicolas Bonnefon
109e07da50aSNicolas Bonnefon if ( ! reply.isValid() ) {
110e07da50aSNicolas Bonnefon LOG( logWARNING ) << "Invalid reply from D-Bus call: "
111e07da50aSNicolas Bonnefon << qPrintable( reply.error().message() );
112e07da50aSNicolas Bonnefon return 0;
113e07da50aSNicolas Bonnefon }
114e07da50aSNicolas Bonnefon
115e07da50aSNicolas Bonnefon return (uint32_t) reply.value();
116e07da50aSNicolas Bonnefon }
117