summaryrefslogtreecommitdiff
path: root/libdbus-qeventloop/dbusconnectioneventloop.h
blob: 6f8d8e78cdb37250218a0c8683c076cdbbc47b84 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
#ifndef DBUSCONNECTIONEVENTLOOP_H
#define DBUSCONNECTIONEVENTLOOP_H

#include <QObject>
#include <QList>
#include <QMultiHash>
#include <QHash>

#include <dbus/dbus.h>

//#define _DISPLAY_DEBUG_

#ifdef _DISPLAY_DEBUG_
	#include <stdlib.h>

	#define MYDEBUG()		MyDebug deb(__FUNCTION__)
	#define MYDEBUGC(...)	qDebug(__VA_ARGS__)

	class MyDebug
	{
	public:
		MyDebug(const char* func)
		{
			funcName = strdup(func);
			qDebug("--> Entering: %s() ...", funcName);
		}
		~MyDebug()
		{
			qDebug("<-- Leaving: %s() ...", funcName);
			free(funcName);
		}

	private:
		char* funcName;
	};
#else
	#define MYDEBUG()
	#define MYDEBUGC(...)
#endif

class QSocketNotifier;
class QTimerEvent;

class DBUSConnectionEventLoop : public QObject
{
	Q_OBJECT
private:
	Q_DISABLE_COPY(DBUSConnectionEventLoop)

public:
    DBUSConnectionEventLoop();
    virtual ~DBUSConnectionEventLoop();

public:
	bool initConnection(DBusConnection* conn);

    class Watcher
    {
    public:
        Watcher() : watch(0), read(0), write(0) {}

        DBusWatch* 			watch;
        QSocketNotifier*	read;
        QSocketNotifier*	write;
    };

    typedef QMultiHash<int, Watcher> 	Watchers;
    typedef QHash<int, DBusTimeout*> 	Timeouts;
    typedef QList<DBusConnection*>		Connections;

    Watchers 	watchers;
    Timeouts 	timeouts;
    Connections	connections;

public slots:
    void readSocket(int fd);
    void writeSocket(int fd);
    void dispatch();

protected:
    void timerEvent(QTimerEvent *e);

    static dbus_bool_t addWatch(DBusWatch *watch, void *data);
    static void removeWatch(DBusWatch *watch, void *data);
    static void toggleWatch(DBusWatch *watch, void *data);
    static dbus_bool_t addTimeout(DBusTimeout *timeout, void *data);
    static void removeTimeout(DBusTimeout *timeout, void *data);
    static void toggleTimeout(DBusTimeout *timeout, void *data);
    static void wakeupMain(void *data);
};

#endif // DBUSCONNECTIONEVENTLOOP_H