diff options
Diffstat (limited to 'qt/connection.cpp')
-rw-r--r-- | qt/connection.cpp | 138 |
1 files changed, 138 insertions, 0 deletions
diff --git a/qt/connection.cpp b/qt/connection.cpp new file mode 100644 index 00000000..8486ebb2 --- /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 <zack@kde.org> + * + * 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 <qsocketnotifier.h> +#include <qintdict.h> + +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<QtWatch> 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; + } +} + + +///////////////////////////////////////////////////////// |