diff options
| -rw-r--r-- | qt/Makefile.am | 4 | ||||
| -rw-r--r-- | qt/connection.cpp | 138 | ||||
| -rw-r--r-- | qt/connection.h | 46 | ||||
| -rw-r--r-- | qt/message.cpp | 2 | ||||
| -rw-r--r-- | qt/message.h | 6 | 
5 files changed, 186 insertions, 10 deletions
diff --git a/qt/Makefile.am b/qt/Makefile.am index 97b67f7b..eb7b1617 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 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; +  } +} + + +///////////////////////////////////////////////////////// diff --git a/qt/connection.h b/qt/connection.h index d75ca55b..7c0d5bac 100644 --- a/qt/connection.h +++ b/qt/connection.h @@ -24,6 +24,7 @@  #define DBUS_QT_CONNECTION_H  #include <qobject.h> +#include <qstring.h>  #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<Connection*>( data ); +    con->addWatch( watch ); +  } +  dbus_bool_t dbusRemoveWatch( DBusWatch *watch, void *data ) +  { +    Connection *con = static_cast<Connection*>( 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 ca6783b0..4a6fb9ec 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 5baf9e59..c9d9534b 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 <qvariant.h>  #include <qstring.h>  #include "dbus/dbus.h" -namespace DBus { +namespace DBusQt {    class Message    { @@ -121,3 +123,5 @@ namespace DBus {    };  } + +#endif  | 
