My Project
async-dbus-proxy.h
1/*
2 * This file is part of signon
3 *
4 * Copyright (C) 2009-2010 Nokia Corporation.
5 * Copyright (C) 2013-2016 Canonical Ltd.
6 *
7 * Contact: Alberto Mardegan <alberto.mardegan@canonical.com>
8 *
9 * This library is free software; you can redistribute it and/or
10 * modify it under the terms of the GNU Lesser General Public License
11 * version 2.1 as published by the Free Software Foundation.
12 *
13 * This library is distributed in the hope that it will be useful, but
14 * WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * Lesser General Public License for more details.
17 *
18 * You should have received a copy of the GNU Lesser General Public
19 * License along with this library; if not, write to the Free Software
20 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
21 * 02110-1301 USA
22 */
23
24#ifndef SIGNON_ASYNC_DBUS_PROXY_H
25#define SIGNON_ASYNC_DBUS_PROXY_H
26
27#include <QDBusError>
28#include <QObject>
29#include <QQueue>
30#include <QVariant>
31
32class QDBusAbstractInterface;
33class QDBusConnection;
34class QDBusObjectPath;
35class QDBusPendingCallWatcher;
36
37/*
38 * @cond IMPL
39 */
40namespace SignOn {
41
42class AsyncDBusProxy;
43class Connection;
44class DBusInterface;
45
46class PendingCall: public QObject
47{
48 Q_OBJECT
49
50public:
51 ~PendingCall();
52
53 bool cancel();
54
55Q_SIGNALS:
56 void finished(QDBusPendingCallWatcher *watcher);
57 void success(QDBusPendingCallWatcher *watcher);
58 void error(const QDBusError &error);
59 void requeueRequested();
60
61private Q_SLOTS:
62 void onFinished(QDBusPendingCallWatcher *watcher);
63 void onInterfaceDestroyed();
64 void fail(const QDBusError &error);
65
66private:
67 friend class AsyncDBusProxy;
68 PendingCall(const QString &method,
69 const QList<QVariant> &args,
70 QObject *parent = 0);
71 void doCall(QDBusAbstractInterface *interface);
72
73private:
74 QString m_method;
75 QList<QVariant> m_args;
76 QDBusPendingCallWatcher *m_watcher;
77 bool m_interfaceWasDestroyed;
78};
79
80class AsyncDBusProxy: public QObject
81{
82 Q_OBJECT
83
84public:
85 AsyncDBusProxy(const QString &service,
86 const char *interface,
87 QObject *clientObject);
88 ~AsyncDBusProxy();
89
90 void setObjectPath(const QDBusObjectPath &objectPath);
91 void setError(const QDBusError &error);
92
93 PendingCall *queueCall(const QString &method,
94 const QList<QVariant> &args,
95 const char *replySlot = 0,
96 const char *errorSlot = 0);
97 PendingCall *queueCall(const QString &method,
98 const QList<QVariant> &args,
99 QObject *receiver,
100 const char *replySlot,
101 const char *errorSlot);
102 bool connect(const char *name, QObject *receiver, const char *slot);
103
104public Q_SLOTS:
105 void setConnection(const QDBusConnection &connection);
106 void setDisconnected();
107
108Q_SIGNALS:
109 void connectionNeeded();
110 void objectPathNeeded();
111
112private:
113 enum Status {
114 Incomplete,
115 Ready,
116 Invalid
117 };
118 void setStatus(Status status);
119 void update();
120 void enqueue(PendingCall *call);
121
122private Q_SLOTS:
123 void onCallFinished(QDBusPendingCallWatcher *watcher);
124 void onRequeueRequested();
125
126private:
127 QString m_serviceName;
128 const char *m_interfaceName;
129 QString m_path;
130 QDBusConnection *m_connection;
131 QObject *m_clientObject;
132 QQueue<PendingCall *> m_operationsQueue;
133 QQueue<Connection *> m_connectionsQueue;
134 DBusInterface *m_interface;
135 Status m_status;
136 QDBusError m_lastError;
137};
138
139class SignondAsyncDBusProxy: public AsyncDBusProxy
140{
141 Q_OBJECT
142public:
143 SignondAsyncDBusProxy(const char *interface,
144 QObject *clientObject);
145 ~SignondAsyncDBusProxy();
146
147private:
148 void setupConnection();
149};
150
151} //SignOn
152
153/*
154 * @endcond IMPL
155 */
156
157#endif // SIGNON_ASYNC_DBUS_PROXY_H