summaryrefslogtreecommitdiffstats
path: root/tqdbusproxy.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'tqdbusproxy.cpp')
-rw-r--r--tqdbusproxy.cpp209
1 files changed, 209 insertions, 0 deletions
diff --git a/tqdbusproxy.cpp b/tqdbusproxy.cpp
new file mode 100644
index 0000000..605481e
--- /dev/null
+++ b/tqdbusproxy.cpp
@@ -0,0 +1,209 @@
+/* qdbusproxy.cpp DBUS Object proxy
+ *
+ * Copyright (C) 2005 Kevin Krammer <kevin.krammer@gmx.at>
+ *
+ * Licensed under the Academic Free License version 2.1
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ *
+ */
+
+#include "tqdbuserror.h"
+#include "tqdbusconnection.h"
+#include "tqdbusmessage.h"
+#include "tqdbusproxy.h"
+
+class TQT_DBusProxy::Private
+{
+public:
+ Private() : canSend(false) {}
+ ~Private() {}
+
+ void checkCanSend()
+ {
+ canSend = !path.isEmpty() && !service.isEmpty() && !interface.isEmpty();
+ }
+
+public:
+ TQT_DBusConnection connection;
+
+ TQString service;
+ TQString path;
+ TQString interface;
+ bool canSend;
+
+ TQT_DBusError error;
+};
+
+TQT_DBusProxy::TQT_DBusProxy(TQObject* tqparent, const char* name)
+ : TQObject(tqparent, (name ? name : "TQT_DBusProxy")),
+ d(new Private())
+{
+}
+
+TQT_DBusProxy::TQT_DBusProxy(const TQT_DBusConnection& connection,
+ TQObject* tqparent, const char* name)
+ : TQObject(tqparent, (name ? name : "TQT_DBusProxy")),
+ d(new Private())
+{
+ setConnection(connection);
+}
+
+TQT_DBusProxy::TQT_DBusProxy(const TQString& service, const TQString& path,
+ const TQString& interface, const TQT_DBusConnection& connection,
+ TQObject* tqparent, const char* name)
+ : TQObject(tqparent, (name ? name : "TQT_DBusProxy")),
+ d(new Private())
+{
+ setConnection(connection);
+
+ d->service = service;
+ d->path = path;
+ d->interface = interface;
+ d->checkCanSend();
+}
+
+TQT_DBusProxy::~TQT_DBusProxy()
+{
+ delete d;
+}
+
+bool TQT_DBusProxy::setConnection(const TQT_DBusConnection& connection)
+{
+ d->connection.disconnect(this, TQT_SLOT(handleDBusSignal(const TQT_DBusMessage&)));
+
+ d->connection = connection;
+
+ return d->connection.connect(this, TQT_SLOT(handleDBusSignal(const TQT_DBusMessage&)));
+}
+
+const TQT_DBusConnection& TQT_DBusProxy::connection() const
+{
+ return d->connection;
+}
+
+void TQT_DBusProxy::setService(const TQString& service)
+{
+ d->service = service;
+ d->checkCanSend();
+}
+
+TQString TQT_DBusProxy::service() const
+{
+ return d->service;
+}
+
+void TQT_DBusProxy::setPath(const TQString& path)
+{
+ d->path = path;
+ d->checkCanSend();
+}
+
+TQString TQT_DBusProxy::path() const
+{
+ return d->path;
+}
+
+void TQT_DBusProxy::setInterface(const TQString& interface)
+{
+ d->interface = interface;
+ d->checkCanSend();
+}
+
+TQString TQT_DBusProxy::interface() const
+{
+ return d->interface;
+}
+
+bool TQT_DBusProxy::canSend() const
+{
+ return d->canSend && d->connection.isConnected();
+}
+
+bool TQT_DBusProxy::send(const TQString& method, const TQValueList<TQT_DBusData>& params) const
+{
+ if (!d->canSend || method.isEmpty() || !d->connection.isConnected())
+ return false;
+
+ TQT_DBusMessage message = TQT_DBusMessage::methodCall(d->service, d->path,
+ d->interface, method);
+ message += params;
+
+ return d->connection.send(message);
+}
+
+TQT_DBusMessage TQT_DBusProxy::sendWithReply(const TQString& method,
+ const TQValueList<TQT_DBusData>& params,
+ TQT_DBusError* error) const
+{
+ if (!d->canSend || method.isEmpty() || !d->connection.isConnected())
+ return TQT_DBusMessage();
+
+ TQT_DBusMessage message = TQT_DBusMessage::methodCall(d->service, d->path,
+ d->interface, method);
+ message += params;
+
+ TQT_DBusMessage reply = d->connection.sendWithReply(message, &d->error);
+
+ if (error)
+ *error = d->error;
+
+ return reply;
+}
+
+int TQT_DBusProxy::sendWithAsyncReply(const TQString& method, const TQValueList<TQT_DBusData>& params)
+{
+ if (!d->canSend || method.isEmpty() || !d->connection.isConnected())
+ return 0;
+
+ TQT_DBusMessage message = TQT_DBusMessage::methodCall(d->service, d->path,
+ d->interface, method);
+ message += params;
+
+ return d->connection.sendWithAsyncReply(message, this,
+ TQT_SLOT(handleAsyncReply(const TQT_DBusMessage&)));
+}
+
+TQT_DBusError TQT_DBusProxy::lastError() const
+{
+ return d->error;
+}
+
+void TQT_DBusProxy::handleDBusSignal(const TQT_DBusMessage& message)
+{
+ if (!d->path.isEmpty() && d->path != message.path())
+ return;
+
+ // only filter by service name if the name is a unique name
+ // because signals are always coming from a connection's unique name
+ // and filtering by a generic name would reject all signals
+ if (d->service.startsWith(":") && d->service != message.sender())
+ return;
+
+ if (!d->interface.isEmpty() && d->interface != message.interface())
+ return;
+
+ emit dbusSignal(message);
+}
+
+void TQT_DBusProxy::handleAsyncReply(const TQT_DBusMessage& message)
+{
+ d->error = message.error();
+
+ emit asyncReply(message.replySerialNumber(), message);
+}
+
+#include "tqdbusproxy.moc"