/**
* This file is part of TelepathyQt
*
* @copyright Copyright (C) 2012 Collabora Ltd.
* @copyright Copyright (C) 2012 Nokia Corporation
* @license LGPL 2.1
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include
#include "TelepathyQt/_gen/dbus-service.moc.hpp"
#include "TelepathyQt/debug-internal.h"
#include
#include
#include
#include
namespace Tp
{
struct TP_QT_NO_EXPORT DBusService::Private
{
Private(DBusService *parent, const QDBusConnection &dbusConnection)
: parent(parent),
dbusObject(new DBusObject(dbusConnection, parent)),
registered(false)
{
}
DBusService *parent;
QString busName;
QString objectPath;
DBusObject *dbusObject;
bool registered;
};
/**
* \class DBusService
* \ingroup servicesideimpl
* \headerfile TelepathyQt/dbus-service.h
*
* \brief Base class for D-Bus services.
*
* This class serves as a base for all the classes that are used to implement
* D-Bus services.
*/
/**
* Construct a DBusService that uses the given \a dbusConnection.
*
* \param dbusConnection The D-Bus connection that will be used by this service.
*/
DBusService::DBusService(const QDBusConnection &dbusConnection)
: mPriv(new Private(this, dbusConnection))
{
}
/**
* Class destructor.
*/
DBusService::~DBusService()
{
delete mPriv;
}
/**
* Return the D-Bus connection associated with this service.
*
* \return the D-Bus connection associated with this service.
*/
QDBusConnection DBusService::dbusConnection() const
{
return mPriv->dbusObject->dbusConnection();
}
/**
* Return the D-Bus service name of this service.
*
* This is only valid after this service has been registered
* on the bus using registerObject().
*
* \return the D-Bus service name of this service.
*/
QString DBusService::busName() const
{
return mPriv->busName;
}
/**
* Return the D-Bus object path of this service.
*
* This is only valid after this service has been registered
* on the bus using registerObject().
*
* \return the D-Bus object path of this service.
*/
QString DBusService::objectPath() const
{
return mPriv->objectPath;
}
/**
* Return the DBusObject that is used for registering this service on the bus.
*
* The DBusObject is the object on which all the interface adaptors
* for this service are plugged.
*
* \return a pointer to the DBusObject that is used for registering
* this service on the bus.
*/
DBusObject *DBusService::dbusObject() const
{
return mPriv->dbusObject;
}
/**
* Return whether this D-Bus service has been registered on the bus or not.
*
* \return \c true if the service has been registered, or \c false otherwise.
*/
bool DBusService::isRegistered() const
{
return mPriv->registered;
}
/**
* Register this service object on the bus with the given \a busName and \a objectPath.
*
* \a error needs to be a valid pointer to a DBusError instance, where any
* possible D-Bus error will be stored.
*
* A service may only be registered once in its lifetime.
* Use isRegistered() to find out if it has already been registered or not.
*
* You normally don't need to use this method directly.
* Subclasses should provide a simplified version of it.
*
* \param busName The D-Bus service name of this object.
* \param objectPath The D-Bus object path of this object.
* \param error A pointer to a valid DBusError instance, where any
* possible D-Bus error will be stored.
* \return \c true on success or \c false otherwise.
*/
bool DBusService::registerObject(const QString &busName, const QString &objectPath,
DBusError *error)
{
if (mPriv->registered) {
return true;
}
if (!mPriv->dbusObject->dbusConnection().registerService(busName)) {
error->set(TP_QT_ERROR_INVALID_ARGUMENT,
QString(QLatin1String("Name %1 already in use by another process"))
.arg(busName));
warning() << "Unable to register service" << busName <<
"- name already registered by another process";
return false;
}
if (!mPriv->dbusObject->dbusConnection().registerObject(objectPath, mPriv->dbusObject)) {
error->set(TP_QT_ERROR_INVALID_ARGUMENT,
QString(QLatin1String("Object at path %1 already registered"))
.arg(objectPath));
warning() << "Unable to register object" << objectPath <<
"- path already registered";
return false;
}
debug() << "Registered object" << objectPath << "at bus name" << busName;
mPriv->busName = busName;
mPriv->objectPath = objectPath;
mPriv->registered = true;
return true;
}
/**
* \fn QVariantMap DBusService::immutableProperties() const
*
* Return the immutable properties of this D-Bus service object.
*
* Immutable properties cannot change after the object has been registered
* on the bus with registerObject().
*
* \return The immutable properties of this D-Bus service object.
*/
struct AbstractDBusServiceInterface::Private
{
Private(const QString &interfaceName)
: interfaceName(interfaceName),
dbusObject(0),
registered(false)
{
}
QString interfaceName;
DBusObject *dbusObject;
bool registered;
};
/**
* \class AbstractDBusServiceInterface
* \ingroup servicesideimpl
* \headerfile TelepathyQt/dbus-service.h
*
* \brief Base class for D-Bus service interfaces.
*
* This class serves as a base for all the classes that are used to implement
* interfaces that sit on top of D-Bus services.
*/
/**
* Construct an AbstractDBusServiceInterface that implements
* the interface with the given \a interfaceName.
*
* \param interfaceName The name of the interface that this class implements.
*/
AbstractDBusServiceInterface::AbstractDBusServiceInterface(const QString &interfaceName)
: mPriv(new Private(interfaceName))
{
}
/**
* Class destructor.
*/
AbstractDBusServiceInterface::~AbstractDBusServiceInterface()
{
delete mPriv;
}
/**
* Return the name of the interface that this class implements,
* as given on the constructor.
*
* \return The name of the interface that this class implements.
*/
QString AbstractDBusServiceInterface::interfaceName() const
{
return mPriv->interfaceName;
}
/**
* Return the DBusObject on which the adaptor of this interface is plugged.
*
* This is only accessible after the interface has been registered
* with registerInterface().
*
* \return a pointer to the DBusObject on which the adaptor
* of this interface is plugged.
* \sa DBusService::dbusObject()
*/
DBusObject *AbstractDBusServiceInterface::dbusObject() const
{
return mPriv->dbusObject;
}
/**
* Return whether this interface has been registered.
*
* \return \c true if the service has been registered, or \c false otherwise.
* \sa registerInterface()
*/
bool AbstractDBusServiceInterface::isRegistered() const
{
return mPriv->registered;
}
/**
* Registers this interface by plugging its adaptor
* on the given \a dbusObject.
*
* \param dbusObject The object on which to plug the adaptor.
* \return \c false if the interface has already been registered,
* or \a true otherwise.
* \sa isRegistered()
*/
bool AbstractDBusServiceInterface::registerInterface(DBusObject *dbusObject)
{
if (mPriv->registered) {
return true;
}
mPriv->dbusObject = dbusObject;
createAdaptor();
mPriv->registered = true;
return true;
}
/**
* \fn QVariantMap AbstractDBusServiceInterface::immutableProperties() const
*
* Return the immutable properties of this interface.
*
* Immutable properties cannot change after the interface has been registered
* on a service on the bus with registerInterface().
*
* \return The immutable properties of this interface.
*/
/**
* \fn void AbstractDBusServiceInterface::createAdaptor()
*
* Create the adaptor for this interface.
*
* Subclasses should reimplement this appropriately.
*/
}