From 6ce25713dbd1d610afe8c67d90aa6c29720b02d5 Mon Sep 17 00:00:00 2001 From: Zack Rusin Date: Sun, 23 Nov 2003 20:41:23 +0000 Subject: [PATCH] Coding on dbus is like christmas. Just without christmas tree, presents, santa clause, shopping, food, cookies, carrols, eggs, bunnies, trick or treating, smoking crack... I don't quite remember where I was going with this but we're getting closer. --- qt/Makefile.am | 4 +- qt/connection.cpp | 138 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ qt/connection.h | 46 +++++++++++++++--- qt/message.cpp | 2 +- qt/message.h | 6 ++- 5 files changed, 186 insertions(+), 10 deletions(-) create mode 100644 qt/connection.cpp diff --git a/qt/Makefile.am b/qt/Makefile.am index 97b67f7..eb7b161 100644 --- a/qt/Makefile.am +++ b/qt/Makefile.am @@ -5,10 +5,10 @@ dbusincludedir=$(includedir)/dbus-1.0/dbus lib_LTLIBRARIES=libdbus-qt-1.la dbusinclude_HEADERS= \ - dbus-qt.h + dbus-qt.h message.h connection.h libdbus_qt_1_la_SOURCES = \ - dbus-qthread.cpp + dbus-qthread.cpp message.cpp connection.cpp libdbus_qt_1_la_LIBADD= $(DBUS_QT_LIBS) $(top_builddir)/dbus/libdbus-1.la libdbus_qt_1_la_LDFLAGS= -version-info 1:0 diff --git a/qt/connection.cpp b/qt/connection.cpp new file mode 100644 index 0000000..8486ebb --- /dev/null +++ b/qt/connection.cpp @@ -0,0 +1,138 @@ +// -*- Mode: C++; c-basic-offset: 2; indent-tabs-mode: nil; -*- +/* connection.cpp: Qt wrapper for DBusConnection + * + * Copyright (C) 2003 Zack Rusin + * + * Licensed under the Academic Free License version 1.2 + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ +#include "connection.h" + +#include +#include + +using namespace DBusQt; + +struct QtWatch { + QtWatch(): readSocket( 0 ), writeSocket( 0 ) { } + + DBusWatch *watch; + QSocketNotifier *readSocket; + QSocketNotifier *writeSocket; +}; + +struct Connection::Private +{ + DBusConnection *connection; + int connectionSlot; + DBusError error; + QIntDict watches; +}; + +Connection::Connection( const QString& host ) +{ + d = new Private; + dbus_error_init( &d->error ); + + if ( !host.isEmpty() ) + init( host ); +} + +void Connection::init( const QString& host ) +{ + d->connection = dbus_connection_open( host.ascii(), &d->error ); + dbus_connection_allocate_data_slot( &d->connectionSlot ); + dbus_connection_set_data( d->connection, d->connectionSlot, 0, 0 ); +} + +bool Connection::isConnected() const +{ +} + +bool Connection::isAuthenticated() const +{ +} + +void Connection::open( const QString& host ) +{ + if ( host.isEmpty() ) return; + + init( host ); +} + +void Connection::close() +{ + dbus_connection_disconnect( d->connection ); +} + +void Connection::flush() +{ + dbus_connection_flush( d->connection ); +} + +void Connection::slotRead( int fd ) +{ + Q_UNUSED( fd ); + while ( dbus_connection_dispatch( d->connection ) == DBUS_DISPATCH_DATA_REMAINS ) + ; +} + +void Connection::slotWrite( int fd ) +{ + Q_UNUSED( fd ); +} + +void Connection::addWatch( DBusWatch *watch ) +{ + if ( !dbus_watch_get_enabled( watch ) ) + return; + + QtWatch *qtwatch = new QtWatch; + qtwatch->watch = watch; + + int flags = dbus_watch_get_flags( watch ); + int fd = dbus_watch_get_fd( watch ); + + if ( flags & DBUS_WATCH_READABLE ) { + qtwatch->readSocket = new QSocketNotifier( fd, QSocketNotifier::Read, this ); + QObject::connect( qtwatch->readSocket, SIGNAL(activated(int)), SLOT(slotRead(int)) ); + } + + if (flags & DBUS_WATCH_WRITABLE) { + qtwatch->writeSocket = new QSocketNotifier( fd, QSocketNotifier::Write, this ); + QObject::connect( qtwatch->writeSocket, SIGNAL(activated(int)), SLOT(slotWrite(int)) ); + } + + d->watches.insert( fd, qtwatch ); + +} + +void Connection::removeWatch( DBusWatch *watch ) +{ + int key = dbus_watch_get_fd( watch ); + + QtWatch *qtwatch = d->watches.take( key ); + + if ( qtwatch ) { + delete qtwatch->readSocket; qtwatch->readSocket = 0; + delete qtwatch->writeSocket; qtwatch->writeSocket = 0; + delete qtwatch; + } +} + + +///////////////////////////////////////////////////////// diff --git a/qt/connection.h b/qt/connection.h index d75ca55..7c0d5ba 100644 --- a/qt/connection.h +++ b/qt/connection.h @@ -24,6 +24,7 @@ #define DBUS_QT_CONNECTION_H #include +#include #include "dbus/dbus.h" @@ -33,24 +34,57 @@ namespace DBusQt { { Q_OBJECT public: - Connection(); + Connection( const QString& host = QString::null ); - bool isConnected(); - bool isAuthenticated(); + bool isConnected() const; + bool isAuthenticated() const; public slots: - bool connect( const QString& ); - bool disconnect(); + void open( const QString& ); + void close(); void flush(); + protected slots: + void slotRead( int ); + void slotWrite( int ); + protected: - virtual void* virtual_hook( int id, void* data ); + void addWatch( DBusWatch* ); + void removeWatch( DBusWatch* ); + + public: + friend dbus_bool_t dbusAddWatch( DBusWatch*, void* ); + friend dbus_bool_t dbusRemoveWatch( DBusWatch*, void* ); + friend dbus_bool_t dbusToggleWatch( DBusWatch*, void* ); + protected: + void init( const QString& host ); + virtual void* virtual_hook( int id, void* data ); private: struct Private; Private *d; }; + ////////////////////////////////////////////////////////////// + //Friends + dbus_bool_t dbusAddWatch( DBusWatch *watch, void *data ) + { + Connection *con = static_cast( data ); + con->addWatch( watch ); + } + dbus_bool_t dbusRemoveWatch( DBusWatch *watch, void *data ) + { + Connection *con = static_cast( data ); + con->removeWatch( watch ); + } + + dbus_bool_t dbusToggleWatch( DBusWatch*, void* ) + { + //I don't know how to handle this one right now +#warning "FIXME: implement" + } + ////////////////////////////////////////////////////////////// + } diff --git a/qt/message.cpp b/qt/message.cpp index ca6783b..4a6fb9e 100644 --- a/qt/message.cpp +++ b/qt/message.cpp @@ -23,7 +23,7 @@ #include "message.h" -namespace DBus { +namespace DBusQt { struct Message::iterator::IteratorData { DBusMessageIter *iter; diff --git a/qt/message.h b/qt/message.h index 5baf9e5..c9d9534 100644 --- a/qt/message.h +++ b/qt/message.h @@ -20,13 +20,15 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ +#ifndef DBUS_QT_MESSAGE_H +#define DBUS_QT_MESSAGE_H #include #include #include "dbus/dbus.h" -namespace DBus { +namespace DBusQt { class Message { @@ -121,3 +123,5 @@ namespace DBus { }; } + +#endif -- 2.7.4