diff options
Diffstat (limited to 'src/libtdeobex/obexobjectmanagerImpl.cpp')
-rw-r--r-- | src/libtdeobex/obexobjectmanagerImpl.cpp | 286 |
1 files changed, 286 insertions, 0 deletions
diff --git a/src/libtdeobex/obexobjectmanagerImpl.cpp b/src/libtdeobex/obexobjectmanagerImpl.cpp new file mode 100644 index 0000000..56a8798 --- /dev/null +++ b/src/libtdeobex/obexobjectmanagerImpl.cpp @@ -0,0 +1,286 @@ +/* + * + * Object Manager implementation of bluez5 + * + * Copyright (C) 2018 Emanoil Kotsev <[email protected]> + * + * + * 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 + |