/* * Copyright (C) 2014 Nicolas Bonnefon and other contributors * * This file is part of glogg. * * glogg is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * glogg is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with glogg. If not, see . */ #include "dbusexternalcom.h" #include #include "log.h" static const char* DBUS_SERVICE_NAME = "org.bonnefon.glogg"; DBusExternalCommunicator::DBusExternalCommunicator() { if (!QDBusConnection::sessionBus().isConnected()) { LOG(logERROR) << "Cannot connect to the D-Bus session bus.\n" << "To start it, run:\n" << "\teval `dbus-launch --auto-syntax`\n"; throw CantCreateExternalErr(); } dbus_iface_object_ = std::make_shared(); connect( dbus_iface_object_.get(), SIGNAL( signalLoadFile( const QString& ) ), this, SIGNAL( loadFile( const QString& ) ) ); } // If listening fails (e.g. another glogg is already listening, // the function will fail silently and no listening will be done. void DBusExternalCommunicator::startListening() { if (!QDBusConnection::sessionBus().registerService( DBUS_SERVICE_NAME )) { LOG(logERROR) << qPrintable(QDBusConnection::sessionBus().lastError().message()); } if ( !QDBusConnection::sessionBus().registerObject( "/", dbus_iface_object_.get(), QDBusConnection::ExportAllContents ) ) { LOG(logERROR) << qPrintable(QDBusConnection::sessionBus().lastError().message()); } } ExternalInstance* DBusExternalCommunicator::otherInstance() const { try { return static_cast( new DBusExternalInstance() ); } catch ( CantCreateExternalErr ) { LOG(logINFO) << "Cannot find external D-Bus correspondant, we are the only glogg out there."; return nullptr; } } qint32 DBusExternalCommunicator::version() const { return 3; } qint32 DBusInterfaceExternalCommunicator::version() const { return 0x010000; } void DBusInterfaceExternalCommunicator::loadFile( const QString& file_name ) { LOG(logDEBUG) << "DBusInterfaceExternalCommunicator::loadFile()"; emit signalLoadFile( file_name ); } DBusExternalInstance::DBusExternalInstance() { dbusInterface_ = std::make_shared( DBUS_SERVICE_NAME, "/", "", QDBusConnection::sessionBus() ); if ( ! dbusInterface_->isValid() ) { throw CantCreateExternalErr(); } } void DBusExternalInstance::loadFile( const QString& file_name ) const { QDBusReply reply = dbusInterface_->call( "loadFile", file_name ); if ( ! reply.isValid() ) { LOG( logWARNING ) << "Invalid reply from D-Bus call: " << qPrintable( reply.error().message() ); } } uint32_t DBusExternalInstance::getVersion() const { QDBusReply reply = dbusInterface_->call( "version" ); if ( ! reply.isValid() ) { LOG( logWARNING ) << "Invalid reply from D-Bus call: " << qPrintable( reply.error().message() ); return 0; } return (uint32_t) reply.value(); }