Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse files

Initial import

  • Loading branch information...
commit cdf51d0f8edb486da3cc06a138d17150e158b7ec 0 parents
@ereslibre authored
5 dbus-1/Makefile
@@ -0,0 +1,5 @@
+dbus: dbus-example.c
+ g++ -o dbus `pkg-config --cflags --libs dbus-1` dbus-example.c
+
+clean:
+ rm dbus
391 dbus-1/dbus-example.c
@@ -0,0 +1,391 @@
+/*
+ * Example low-level D-Bus code.
+ * Written by Matthew Johnson <dbus@matthew.ath.cx>
+ *
+ * This code has been released into the Public Domain.
+ * You may do whatever you like with it.
+ */
+#include <dbus/dbus.h>
+#include <stdbool.h>
+#include <unistd.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+/**
+ * Connect to the DBUS bus and send a broadcast signal
+ */
+void sendsignal(char* sigvalue)
+{
+ DBusMessage* msg;
+ DBusMessageIter args;
+ DBusConnection* conn;
+ DBusError err;
+ int ret;
+ dbus_uint32_t serial = 0;
+
+ printf("Sending signal with value %s\n", sigvalue);
+
+ // initialise the error value
+ dbus_error_init(&err);
+
+ // connect to the DBUS system bus, and check for errors
+ conn = dbus_bus_get(DBUS_BUS_SESSION, &err);
+ if (dbus_error_is_set(&err)) {
+ fprintf(stderr, "Connection Error (%s)\n", err.message);
+ dbus_error_free(&err);
+ }
+ if (NULL == conn) {
+ exit(1);
+ }
+
+ // register our name on the bus, and check for errors
+ ret = dbus_bus_request_name(conn, "test.signal.source", DBUS_NAME_FLAG_REPLACE_EXISTING , &err);
+ if (dbus_error_is_set(&err)) {
+ fprintf(stderr, "Name Error (%s)\n", err.message);
+ dbus_error_free(&err);
+ }
+ if (DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER != ret) {
+ exit(1);
+ }
+
+ // create a signal & check for errors
+ msg = dbus_message_new_signal("/test/signal/Object", // object name of the signal
+ "test.signal.Type", // interface name of the signal
+ "Test"); // name of the signal
+ if (NULL == msg)
+ {
+ fprintf(stderr, "Message Null\n");
+ exit(1);
+ }
+
+ // append arguments onto signal
+ dbus_message_iter_init_append(msg, &args);
+ if (!dbus_message_iter_append_basic(&args, DBUS_TYPE_STRING, &sigvalue)) {
+ fprintf(stderr, "Out Of Memory!\n");
+ exit(1);
+ }
+
+ // send the message and flush the connection
+ if (!dbus_connection_send(conn, msg, &serial)) {
+ fprintf(stderr, "Out Of Memory!\n");
+ exit(1);
+ }
+ dbus_connection_flush(conn);
+
+ printf("Signal Sent\n");
+
+ // free the message
+ dbus_message_unref(msg);
+}
+
+/**
+ * Call a method on a remote object
+ */
+void query(char* param)
+{
+ DBusMessage* msg;
+ DBusMessageIter args;
+ DBusConnection* conn;
+ DBusError err;
+ DBusPendingCall* pending;
+ int ret;
+ bool stat;
+ dbus_uint32_t level;
+
+ printf("Calling remote method with %s\n", param);
+
+ // initialiset the errors
+ dbus_error_init(&err);
+
+ // connect to the system bus and check for errors
+ conn = dbus_bus_get(DBUS_BUS_SESSION, &err);
+ if (dbus_error_is_set(&err)) {
+ fprintf(stderr, "Connection Error (%s)\n", err.message);
+ dbus_error_free(&err);
+ }
+ if (NULL == conn) {
+ exit(1);
+ }
+
+ // request our name on the bus
+ ret = dbus_bus_request_name(conn, "test.method.caller", DBUS_NAME_FLAG_REPLACE_EXISTING , &err);
+ if (dbus_error_is_set(&err)) {
+ fprintf(stderr, "Name Error (%s)\n", err.message);
+ dbus_error_free(&err);
+ }
+ if (DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER != ret) {
+ exit(1);
+ }
+
+ // create a new method call and check for errors
+ msg = dbus_message_new_method_call("test.method.server", // target for the method call
+ "/test/method/Object", // object to call on
+ "test.method.Type", // interface to call on
+ "Method"); // method name
+ if (NULL == msg) {
+ fprintf(stderr, "Message Null\n");
+ exit(1);
+ }
+
+ // append arguments
+ dbus_message_iter_init_append(msg, &args);
+ if (!dbus_message_iter_append_basic(&args, DBUS_TYPE_STRING, &param)) {
+ fprintf(stderr, "Out Of Memory!\n");
+ exit(1);
+ }
+
+ // send message and get a handle for a reply
+ if (!dbus_connection_send_with_reply (conn, msg, &pending, -1)) { // -1 is default timeout
+ fprintf(stderr, "Out Of Memory!\n");
+ exit(1);
+ }
+ if (NULL == pending) {
+ fprintf(stderr, "Pending Call Null\n");
+ exit(1);
+ }
+ dbus_connection_flush(conn);
+
+ printf("Request Sent\n");
+
+ // free message
+ dbus_message_unref(msg);
+
+ // block until we recieve a reply
+ dbus_pending_call_block(pending);
+
+ // get the reply message
+ msg = dbus_pending_call_steal_reply(pending);
+ if (NULL == msg) {
+ fprintf(stderr, "Reply Null\n");
+ exit(1);
+ }
+ // free the pending message handle
+ dbus_pending_call_unref(pending);
+
+ // read the parameters
+ if (!dbus_message_iter_init(msg, &args))
+ fprintf(stderr, "Message has no arguments!\n");
+ else if (DBUS_TYPE_BOOLEAN != dbus_message_iter_get_arg_type(&args))
+ fprintf(stderr, "Argument is not boolean!\n");
+ else
+ dbus_message_iter_get_basic(&args, &stat);
+
+ if (!dbus_message_iter_next(&args))
+ fprintf(stderr, "Message has too few arguments!\n");
+ else if (DBUS_TYPE_UINT32 != dbus_message_iter_get_arg_type(&args))
+ fprintf(stderr, "Argument is not int!\n");
+ else
+ dbus_message_iter_get_basic(&args, &level);
+
+ printf("Got Reply: %d, %d\n", stat, level);
+
+ // free reply
+ dbus_message_unref(msg);
+}
+
+void reply_to_method_call(DBusMessage* msg, DBusConnection* conn)
+{
+ DBusMessage* reply;
+ DBusMessageIter args;
+ bool stat = true;
+ dbus_uint32_t level = 21614;
+ dbus_uint32_t serial = 0;
+ char* param = "";
+
+ // read the arguments
+ if (!dbus_message_iter_init(msg, &args))
+ fprintf(stderr, "Message has no arguments!\n");
+ else if (DBUS_TYPE_STRING != dbus_message_iter_get_arg_type(&args))
+ fprintf(stderr, "Argument is not string!\n");
+ else
+ dbus_message_iter_get_basic(&args, &param);
+
+ printf("Method called with %s\n", param);
+
+ // create a reply from the message
+ reply = dbus_message_new_method_return(msg);
+
+ // add the arguments to the reply
+ dbus_message_iter_init_append(reply, &args);
+ if (!dbus_message_iter_append_basic(&args, DBUS_TYPE_BOOLEAN, &stat)) {
+ fprintf(stderr, "Out Of Memory!\n");
+ exit(1);
+ }
+ if (!dbus_message_iter_append_basic(&args, DBUS_TYPE_UINT32, &level)) {
+ fprintf(stderr, "Out Of Memory!\n");
+ exit(1);
+ }
+
+ // send the reply && flush the connection
+ if (!dbus_connection_send(conn, reply, &serial)) {
+ fprintf(stderr, "Out Of Memory!\n");
+ exit(1);
+ }
+ dbus_connection_flush(conn);
+
+ // free the reply
+ dbus_message_unref(reply);
+}
+
+/**
+ * Server that exposes a method call and waits for it to be called
+ */
+void listen()
+{
+ DBusMessage* msg;
+ DBusMessage* reply;
+ DBusMessageIter args;
+ DBusConnection* conn;
+ DBusError err;
+ int ret;
+ char* param;
+
+ printf("Listening for method calls\n");
+
+ // initialise the error
+ dbus_error_init(&err);
+
+ // connect to the bus and check for errors
+ conn = dbus_bus_get(DBUS_BUS_SESSION, &err);
+ if (dbus_error_is_set(&err)) {
+ fprintf(stderr, "Connection Error (%s)\n", err.message);
+ dbus_error_free(&err);
+ }
+ if (NULL == conn) {
+ fprintf(stderr, "Connection Null\n");
+ exit(1);
+ }
+
+ // request our name on the bus and check for errors
+ ret = dbus_bus_request_name(conn, "test.method.server", DBUS_NAME_FLAG_REPLACE_EXISTING , &err);
+ if (dbus_error_is_set(&err)) {
+ fprintf(stderr, "Name Error (%s)\n", err.message);
+ dbus_error_free(&err);
+ }
+ if (DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER != ret) {
+ fprintf(stderr, "Not Primary Owner (%d)\n", ret);
+ exit(1);
+ }
+
+ // loop, testing for new messages
+ while (true) {
+ // non blocking read of the next available message
+ dbus_connection_read_write(conn, 0);
+ msg = dbus_connection_pop_message(conn);
+
+ // loop again if we haven't got a message
+ if (NULL == msg) {
+ continue;
+ }
+
+ // check this is a method call for the right interface & method
+ if (dbus_message_is_method_call(msg, "test.method.Type", "Method"))
+ reply_to_method_call(msg, conn);
+
+ // free the message
+ dbus_message_unref(msg);
+ }
+
+}
+
+/**
+ * Listens for signals on the bus
+ */
+void receive()
+{
+ DBusMessage* msg;
+ DBusMessageIter args;
+ DBusConnection* conn;
+ DBusError err;
+ int ret;
+ char* sigvalue;
+
+ printf("Listening for signals\n");
+
+ // initialise the errors
+ dbus_error_init(&err);
+
+ // connect to the bus and check for errors
+ conn = dbus_bus_get(DBUS_BUS_SESSION, &err);
+ if (dbus_error_is_set(&err)) {
+ fprintf(stderr, "Connection Error (%s)\n", err.message);
+ dbus_error_free(&err);
+ }
+ if (NULL == conn) {
+ exit(1);
+ }
+
+ // request our name on the bus and check for errors
+ ret = dbus_bus_request_name(conn, "test.signal.sink", DBUS_NAME_FLAG_REPLACE_EXISTING , &err);
+ if (dbus_error_is_set(&err)) {
+ fprintf(stderr, "Name Error (%s)\n", err.message);
+ dbus_error_free(&err);
+ }
+ if (DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER != ret) {
+ exit(1);
+ }
+
+ // add a rule for which messages we want to see
+ dbus_bus_add_match(conn, "type='signal',interface='test.signal.Type'", &err); // see signals from the given interface
+ dbus_connection_flush(conn);
+ if (dbus_error_is_set(&err)) {
+ fprintf(stderr, "Match Error (%s)\n", err.message);
+ exit(1);
+ }
+ printf("Match rule sent\n");
+
+ // loop listening for signals being emmitted
+ while (true) {
+
+ // non blocking read of the next available message
+ dbus_connection_read_write(conn, 0);
+ msg = dbus_connection_pop_message(conn);
+
+ // loop again if we haven't read a message
+ if (NULL == msg) {
+ sleep(1);
+ continue;
+ }
+
+ // check if the message is a signal from the correct interface and with the correct name
+ if (dbus_message_is_signal(msg, "test.signal.Type", "Test")) {
+
+ // read the parameters
+ if (!dbus_message_iter_init(msg, &args))
+ fprintf(stderr, "Message Has No Parameters\n");
+ else if (DBUS_TYPE_STRING != dbus_message_iter_get_arg_type(&args))
+ fprintf(stderr, "Argument is not string!\n");
+ else
+ dbus_message_iter_get_basic(&args, &sigvalue);
+
+ printf("Got Signal with value %s\n", sigvalue);
+ }
+
+ // free the message
+ dbus_message_unref(msg);
+ }
+}
+
+int main(int argc, char** argv)
+{
+ if (2 > argc) {
+ printf ("Syntax: dbus-example [send|receive|listen|query] [<param>]\n");
+ return 1;
+ }
+ char* param = "no param";
+ if (3 >= argc && NULL != argv[2]) param = argv[2];
+ if (0 == strcmp(argv[1], "send"))
+ sendsignal(param);
+ else if (0 == strcmp(argv[1], "receive"))
+ receive();
+ else if (0 == strcmp(argv[1], "listen"))
+ listen();
+ else if (0 == strcmp(argv[1], "query"))
+ query(param);
+ else {
+ printf ("Syntax: dbus-example [send|receive|listen|query] [<param>]\n");
+ return 1;
+ }
+ return 0;
+}
10 dbus-2/Makefile
@@ -0,0 +1,10 @@
+all: server client
+
+server: server.cpp
+ g++ -o server `pkg-config --cflags --libs dbus-1` server.cpp
+
+client: client.cpp
+ g++ -o client `pkg-config --cflags --libs dbus-1` client.cpp
+
+clean:
+ rm client server
59 dbus-2/client.cpp
@@ -0,0 +1,59 @@
+/*
+ * This file is part of the Ideal Library
+ * Copyright (C) 2010 Rafael Fernández López <ereslibre@ereslibre.es>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB. If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <iostream>
+#include <dbus/dbus.h>
+
+int main(int argc, char ** argv)
+{
+ DBusError error;
+ dbus_error_init(&error);
+
+ DBusConnection *connection = dbus_bus_get(DBUS_BUS_SESSION, &error);
+ if (!connection || dbus_error_is_set(&error)) {
+ perror("Connection error.");
+ exit(1);
+ }
+
+ const int ret = dbus_bus_request_name(connection, "test.foo.caller", DBUS_NAME_FLAG_REPLACE_EXISTING, &error);
+ if (ret != DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER || dbus_error_is_set(&error)) {
+ perror("Ouch.");
+ exit(1);
+ }
+
+ DBusMessage *const msg = dbus_message_new_method_call("test.foo.bar",
+ "/test/foo/Object",
+ "test.foo.Roll",
+ "Method");
+
+ if (!msg) {
+ perror("Ouch.");
+ exit(1);
+ }
+
+ dbus_uint32_t serial = dbus_message_get_serial(msg);
+ dbus_connection_send(connection, msg, &serial);
+ dbus_connection_flush(connection);
+ dbus_message_unref(msg);
+
+ exit(0);
+}
56 dbus-2/server.cpp
@@ -0,0 +1,56 @@
+/*
+ * This file is part of the Ideal Library
+ * Copyright (C) 2010 Rafael Fernández López <ereslibre@ereslibre.es>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB. If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <iostream>
+#include <dbus/dbus.h>
+
+int main(int argc, char ** argv)
+{
+ DBusError error;
+ dbus_error_init(&error);
+
+ DBusConnection *connection = dbus_bus_get(DBUS_BUS_SESSION, &error);
+ if (!connection || dbus_error_is_set(&error)) {
+ perror("Connection error.");
+ exit(1);
+ }
+
+ const int ret = dbus_bus_request_name(connection, "test.foo.bar", DBUS_NAME_FLAG_REPLACE_EXISTING, &error);
+ if (ret != DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER || dbus_error_is_set(&error)) {
+ perror("Ouch.");
+ exit(1);
+ }
+
+ while (true) {
+ dbus_connection_read_write(connection, 0);
+ DBusMessage *const msg = dbus_connection_pop_message(connection);
+ if (!msg) {
+ continue;
+ }
+ if (dbus_message_is_method_call(msg, "test.foo.Roll", "Method")) {
+ std::cout << "Method call received" << std::endl;
+ }
+ dbus_message_unref(msg);
+ }
+
+ exit(0);
+}
Please sign in to comment.
Something went wrong with that request. Please try again.