dbus/qt integrator.cpp,NONE,1.1 integrator.h,NONE,1.1 Makefile.am,1.3,1.4 connection.cpp,1.1,1.2 connection.h,1.2,1.3
Zack Rusin
zack@pdx.freedesktop.org
Sun, 23 Nov 2003 21:21:14 -0800
Update of /cvs/dbus/dbus/qt
In directory pdx:/tmp/cvs-serv12444
Modified Files:
Makefile.am connection.cpp connection.h
Added Files:
integrator.cpp integrator.h
Log Message:
Seperating integration with D-BUS from Connection to the internal Integrator
class. I simply hated the interfaces in the public Connection when it
had to contain a bunch of friends and protected members that were never
really meant to be seen.
--- NEW FILE: integrator.cpp ---
// -*- Mode: C++; c-basic-offset: 2; indent-tabs-mode: nil; -*-
/* integrator.h: integrates D-BUS into Qt event loop
*
* 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 "integrator.h"
#include "connection.h"
#include <qtimer.h>
#include <qsocketnotifier.h>
#include <qintdict.h>
#include <qptrlist.h>
namespace DBusQt
{
namespace Internal {
struct QtWatch {
QtWatch(): readSocket( 0 ), writeSocket( 0 ) { }
DBusWatch *watch;
QSocketNotifier *readSocket;
QSocketNotifier *writeSocket;
};
struct DBusQtTimeout {
DBusQtTimeout(): timer( 0 ), timeout( 0 ) { }
~DBusQtTimeout() {
delete timer;
}
QTimer *timer;
DBusTimeout *timeout;
};
void dbusWakeupMain( void* )
{
}
Integrator::Integrator( Connection *parent )
: QObject( parent ), m_parent( parent )
{
dbus_connection_set_watch_functions( m_parent->connection(),
dbusAddWatch,
dbusRemoveWatch,
dbusToggleWatch,
this, 0 );
dbus_connection_set_timeout_functions( m_parent->connection(),
dbusAddTimeout,
dbusRemoveTimeout,
dbusToggleTimeout,
this, 0 );
dbus_connection_set_wakeup_main_function( m_parent->connection(),
dbusWakeupMain,
this, 0 );
}
void Integrator::slotRead( int fd )
{
Q_UNUSED( fd );
emit readReady();
}
void Integrator::slotWrite( int fd )
{
Q_UNUSED( fd );
}
void Integrator::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)) );
}
m_watches.insert( fd, qtwatch );
}
void Integrator::removeWatch( DBusWatch *watch )
{
int key = dbus_watch_get_fd( watch );
QtWatch *qtwatch = m_watches.take( key );
if ( qtwatch ) {
delete qtwatch->readSocket; qtwatch->readSocket = 0;
delete qtwatch->writeSocket; qtwatch->writeSocket = 0;
delete qtwatch;
}
}
}//end namespace Internal
}//end namespace DBusQt
#include "integrator.moc"
--- NEW FILE: integrator.h ---
// -*- Mode: C++; c-basic-offset: 2; indent-tabs-mode: nil; -*-
/* integrator.h: integrates D-BUS into Qt event loop
*
* 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
*
*/
#ifndef DBUS_QT_INTEGRATOR_H
#define DBUS_QT_INTEGRATOR_H
#include <qobject.h>
#include <qintdict.h>
#include <qptrlist.h>
#include "dbus/dbus.h"
namespace DBusQt
{
class Connection;
namespace Internal
{
struct QtWatch;
struct DBusQtTimeout;
class Integrator : public QObject
{
Q_OBJECT
public:
Integrator( Connection* parent );
signals:
void readReady();
protected slots:
void slotRead( int );
void slotWrite( int );
protected:
void addWatch( DBusWatch* );
void removeWatch( DBusWatch* );
void addTimeout( DBusTimeout* );
void removeTimeout( DBusTimeout* );
private:
QIntDict<QtWatch> m_watches;
QPtrList<DBusQtTimeout> m_timeouts;
Connection* m_parent;
private:
friend dbus_bool_t dbusAddWatch( DBusWatch*, void* );
friend void dbusRemoveWatch( DBusWatch*, void* );
friend void dbusToggleWatch( DBusWatch*, void* );
friend dbus_bool_t dbusAddTimeout( DBusTimeout*, void* );
friend void dbusRemoveTimeout( DBusTimeout*, void* );
friend void dbusToggleTimeout( DBusTimeout*, void* );
};
//////////////////////////////////////////////////////////////
//Friends
dbus_bool_t dbusAddWatch( DBusWatch *watch, void *data )
{
Integrator *con = static_cast<Integrator*>( data );
con->addWatch( watch );
return true;
}
void dbusRemoveWatch( DBusWatch *watch, void *data )
{
Integrator *con = static_cast<Integrator*>( data );
con->removeWatch( watch );
}
void dbusToggleWatch( DBusWatch*, void* )
{
//I don't know how to handle this one right now
//#warning "FIXME: implement"
}
dbus_bool_t dbusAddTimeout( DBusTimeout *timeout, void *data )
{
Integrator *con = static_cast<Integrator*>( data );
con->addTimeout( timeout );
return true;
}
void dbusRemoveTimeout( DBusTimeout *timeout, void *data )
{
Integrator *con = static_cast<Integrator*>( data );
}
void dbusToggleTimeout( DBusTimeout *timeout, void *data )
{
Integrator *con = static_cast<Integrator*>( data );
}
/////////////////////////////////////////////////////////////
}
}
#endif
Index: Makefile.am
===================================================================
RCS file: /cvs/dbus/dbus/qt/Makefile.am,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -d -r1.3 -r1.4
--- Makefile.am 23 Nov 2003 20:41:23 -0000 1.3
+++ Makefile.am 24 Nov 2003 05:21:12 -0000 1.4
@@ -8,7 +8,8 @@
dbus-qt.h message.h connection.h
libdbus_qt_1_la_SOURCES = \
- dbus-qthread.cpp message.cpp connection.cpp
+ dbus-qthread.cpp message.cpp connection.cpp \
+ integrator.cpp
libdbus_qt_1_la_LIBADD= $(DBUS_QT_LIBS) $(top_builddir)/dbus/libdbus-1.la
libdbus_qt_1_la_LDFLAGS= -version-info 1:0
Index: connection.cpp
===================================================================
RCS file: /cvs/dbus/dbus/qt/connection.cpp,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -d -r1.1 -r1.2
--- connection.cpp 23 Nov 2003 20:41:23 -0000 1.1
+++ connection.cpp 24 Nov 2003 05:21:12 -0000 1.2
@@ -22,41 +22,43 @@
*/
#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;
-};
+#include "integrator.h"
+using Internal::Integrator;
struct Connection::Private
{
DBusConnection *connection;
int connectionSlot;
DBusError error;
- QIntDict<QtWatch> watches;
+ Integrator *integrator;
};
Connection::Connection( const QString& host )
{
d = new Private;
- dbus_error_init( &d->error );
+ d->integrator = new Integrator( this );
+ connect( d->integrator, SIGNAL(readReady()),
+ SLOT(dispatchRead()) );
+
+ initDbus();
if ( !host.isEmpty() )
init( host );
}
+void Connection::initDbus()
+{
+}
+
void Connection::init( const QString& host )
{
+ dbus_error_init( &d->error );
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 );
+ //dbus_connection_allocate_data_slot( &d->connectionSlot );
+ //dbus_connection_set_data( d->connection, d->connectionSlot, 0, 0 );
+ initDbus();
}
bool Connection::isConnected() const
@@ -84,55 +86,17 @@
dbus_connection_flush( d->connection );
}
-void Connection::slotRead( int fd )
+void Connection::dispatchRead()
{
- 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 )
+DBusConnection* Connection::connection() const
{
- 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;
- }
+ return d->connection;
}
-
/////////////////////////////////////////////////////////
+
+#include "connection.moc"
Index: connection.h
===================================================================
RCS file: /cvs/dbus/dbus/qt/connection.h,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -d -r1.2 -r1.3
--- connection.h 23 Nov 2003 20:41:23 -0000 1.2
+++ connection.h 24 Nov 2003 05:21:12 -0000 1.3
@@ -23,12 +23,17 @@
#ifndef DBUS_QT_CONNECTION_H
#define DBUS_QT_CONNECTION_H
+#include "message.h"
+
#include <qobject.h>
#include <qstring.h>
#include "dbus/dbus.h"
namespace DBusQt {
+ namespace Internal {
+ class Integrator;
+ }
class Connection : public QObject
{
@@ -39,52 +44,33 @@
bool isConnected() const;
bool isAuthenticated() const;
+ Message borrowMessage();
+ Message popMessage();
+ void stealBorrowMessage( const Message& );
+
public slots:
void open( const QString& );
void close();
void flush();
+ void send( const Message& );
+ void sendWithReply( const Message& );
+ void sendWithReplyAndBlock( const Message& );
protected slots:
- void slotRead( int );
- void slotWrite( int );
-
- protected:
- 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* );
+ void dispatchRead();
protected:
void init( const QString& host );
+ void initDbus();
virtual void* virtual_hook( int id, void* data );
private:
+ friend class Internal::Integrator;
+ DBusConnection* connection() const;
+ 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"
- }
- //////////////////////////////////////////////////////////////
-
}