You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tdebluez/src/libtdeobex/obexobjectmanagerImpl.cpp

287 lines
8.3 KiB

/*
*
* Object Manager implementation of bluez5
*
* Copyright (C) 2018 Emanoil Kotsev <deloptes@gmail.com>
*
*
* This file is part of libtdebluez.
*
* libtdebluez 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 2 of the License, or
* (at your option) any later version.
*
* libtdebluez 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 kbluetooth; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*
*/
// QT - Header
#include <tqtimer.h>
//
// debug
#include <kdebug.h>
// declaration include
#include <tqdbusproxy.h>
#include <tqdbusmessage.h>
#include <tqdbusobjectpath.h>
#include <tqdbusdatamap.h>
#include <tqdbusdata.h>
//
#include <tqstringlist.h>
#include "obexobjectmanagerImpl.h"
#include "../libtdebluez/btuuids.h"
namespace TDEObex
{
ObexObjectManagerImpl::ObexObjectManagerImpl(const TQString& service, const TQString& path, TQObject* parent, const char* name) :
org::freedesktop::DBus::ObjectManagerProxy(service, path, parent, name)
{
kdDebug() << k_funcinfo << endl;
// init connection to dbus
initDBUS();
}
ObexObjectManagerImpl::~ObexObjectManagerImpl()
{
kdDebug() << k_funcinfo << endl;
close();
}
/*!
* This function try a reconnect to D-Bus.
* \return boolean with the result of the operation
* \retval true if successful reconnected to D-Bus
* \retval false if unsuccessful
*/
bool ObexObjectManagerImpl::reconnect()
{
kdDebug() << k_funcinfo << endl;
// close D-Bus connection
close();
// init D-Bus conntection
return (initDBUS());
}
/*!
* This function return information about connection status to the DBUS daemon.
* \return boolean with the state of the connection to D-Bus
* \retval true if connected
* \retval false if disconnected
*/
bool ObexObjectManagerImpl::isConnectedToDBUS()
{
kdDebug() << k_funcinfo << endl;
return dBusConn.isConnected();
}
/*!
* This function returns pointer to connection of the DBUS.
* \return TQT_DBusConnection* of the connection to D-Bus
* \retval TQT_DBusConnection*
*/
TQT_DBusConnection* ObexObjectManagerImpl::getConnection()
{
kdDebug() << k_funcinfo << endl;
return &dBusConn;
}
/*!
* This function close the connection to manager over the D-Bus daemon.
* \return boolean with the result of the operation
* \retval true if successful closed the connection
* \retval false if any problems
*/
bool ObexObjectManagerImpl::close()
{
kdDebug() << k_funcinfo << endl;
if (mSession)
delete mSession;
if (mFileTransfer)
delete mFileTransfer;
if (mClient)
delete mClient;
if (dBusConn.isConnected())
dBusConn.closeConnection(DBUS_CONN_NAME);
return true;
}
/*!
* This function initialise the connection to the D-Bus daemon.
* \return boolean with the result of the operation
* \retval true if successful initialised D-Bus connection
* \retval false if unsuccessful
*/
bool ObexObjectManagerImpl::initDBUS()
{
kdDebug() << k_funcinfo << endl;
dBusConn = TQT_DBusConnection::addConnection(TQT_DBusConnection::SessionBus, DBUS_CONN_NAME);
if (!dBusConn.isConnected())
{
kdError() << "Failed to open connection to system message bus: " << dBusConn.lastError().message() << endl;
TQTimer::singleShot(4000, this, TQT_SLOT(reconnect()));
return false;
}
setConnection(dBusConn);
TQT_DBusDataMap<TQT_DBusObjectPath> objects;
TQT_DBusError error;
if (!GetManagedObjects(objects, error))
{
tqDebug("GetManagedObjects(objects,error) FAILED\n");
return false;
}
TQT_DBusDataMap<TQT_DBusObjectPath>::const_iterator it = objects.begin();
for (it; it != objects.end(); ++it)
{
bool ok = false;
TQT_DBusDataMap<TQString> tqMap1 = it.data().toStringKeyMap(&ok);
if (!ok)
{
tqWarning("Failed to convert dbus data to string map: %s", it.key().latin1());
return false;
}
slotInterfacesAdded(it.key(), tqMap1);
}
connect(this, SIGNAL(InterfacesAdded(const TQT_DBusObjectPath&, const TQT_DBusDataMap< TQString >&)), this, SLOT(slotInterfacesAdded(const TQT_DBusObjectPath&, const TQT_DBusDataMap< TQString >& )));
connect(this, SIGNAL(InterfacesRemoved(const TQT_DBusObjectPath& , const TQStringList& )), this, SLOT(slotInterfacesRemoved(const TQT_DBusObjectPath& , const TQStringList& )));
return true;
}
/*!
* This function initialise the connection to the D-Bus daemon.
* \return pointer to AgentManager1
*/
org::bluez::obex::AgentManager1Proxy * ObexObjectManagerImpl::getAgentManager()
{
kdDebug() << k_funcinfo << endl;
return mAgentManager;
}
/*!
* This function initialise the connection to the D-Bus daemon.
* \return pointer to AgentManager1
*/
org::bluez::obex::Client1Proxy * ObexObjectManagerImpl::getClient()
{
kdDebug() << k_funcinfo << endl;
return mClient;
}
void ObexObjectManagerImpl::slotInterfacesAdded(const TQT_DBusObjectPath& object, const TQT_DBusDataMap<TQString>& interfaces)
{
kdDebug() << k_funcinfo << endl;
TQT_DBusDataMap<TQString>::const_iterator it1 = interfaces.begin();
for (it1; it1 != interfaces.end(); it1++)
{
TQString interface = it1.key();
if (interface == "org.bluez.obex.AgentManager1")
{
mAgentManager = new org::bluez::obex::AgentManager1Proxy("org.bluez.obex", object);
if (mAgentManager)
{
mAgentManager->setConnection(dBusConn);
}
else
{
tqDebug("org.bluez.obex.AgentManager1 initialization failed\n");
}
}
else if (interface == "org.bluez.obex.Client1")
{
mClient = new org::bluez::obex::Client1Proxy("org.bluez.obex", object);
if (mClient)
{
mClient->setConnection(dBusConn);
}
else
{
tqDebug("org.bluez.obex.Client1 initialization failed\n");
}
}
else if (interface == "org.bluez.obex.Session1")
{
mSession = new org::bluez::obex::Session1Proxy("org.bluez.obex", object);
if (mSession)
{
mSession->setConnection(dBusConn);
}
else
{
tqDebug("org.bluez.obex.Session1 initialization failed\n");
}
}
else if (interface == "org.bluez.obex.FileTransfer1")
{
mFileTransfer = new org::bluez::obex::FileTransfer1Proxy("org.bluez.obex", object);
if (mFileTransfer)
{
mFileTransfer->setConnection(dBusConn);
}
else
{
tqDebug("org.bluez.obex.FileTransfer1 initialization failed\n");
}
}
else if (interface == "org.freedesktop.DBus.Introspectable")
{
// do nothing
}
else
{
tqWarning("Interface not implemented: %s", interface.local8Bit().data());
}
}
}
void ObexObjectManagerImpl::slotInterfacesRemoved(const TQT_DBusObjectPath& object, const TQStringList& interfaces)
{
kdDebug() << k_funcinfo << endl;
// TODO: remove interface
for (TQValueListConstIterator<TQString> it = interfaces.begin();
it != interfaces.end(); ++it)
{
if ((*it) == "org.bluez.obex.AgentManager1")
{
// TODO: remove AgentManager1
}
else if ((*it) == "org.bluez.obex.Client1")
{
// TODO: remove Client1
}
else if ((*it) == "org.bluez.obex.Session1")
{
// TODO: remove Session1
}
else if ((*it) == "org.bluez.obex.FileTransfer1")
{
// TODO: remove FileTransfer1
}
else
{
tqWarning("Interface not implemented: %s", (*it).local8Bit().data());
}
}
}
};
// namespace TDEObex
#include "obexobjectmanagerImpl.moc"
// End of File