- /* Server.c */
- #include <stdio.h>
- #include <stdlib.h>
- #include <dbus/dbus.h>
- struct test_t {
- const char * name;
- const char * address;
- uid_t uid;
- int gh;
- };
- void reply_to_method_call(DBusMessage* msg, DBusConnection* conn)
- {
- DBusMessage* reply;
- DBusMessageIter args;
- DBusMessageIter subItem;
- int stat = 1;
- dbus_uint32_t level = 21614;
- dbus_uint32_t serial = 0;
- char* param = "";
- struct test_t *test;
- test = malloc( sizeof( struct test_t));
- // 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, ¶m);
- dbus_message_iter_next (&args);
- }
- if(DBUS_TYPE_STRUCT != dbus_message_iter_get_arg_type(&args)) {
- fprintf(stderr, "Argument is not struct!\n");
- }
- else{
- fprintf(stderr, "Argument is struct!\n");
- fprintf(stdout,"Signature of structure : %s \n",dbus_message_iter_get_signature(&args));
- dbus_message_iter_recurse(&args,&subItem);
- fprintf(stdout,"Signature of first element: %s \n",dbus_message_iter_get_signature(&subItem));
- }
- if(DBUS_TYPE_STRING != dbus_message_iter_get_arg_type(&subItem)) {
- printf("String 1 failed");
- }
- else {
- dbus_message_iter_get_basic(&subItem, &test->name);
- dbus_message_iter_next (&subItem);
- }
- if(DBUS_TYPE_STRING != dbus_message_iter_get_arg_type(&subItem)) {
- printf("String 2 failed");
- }
- else {
- dbus_message_iter_get_basic(&subItem, &test->address);
- dbus_message_iter_next (&subItem);
- }
- if(DBUS_TYPE_UINT32 != dbus_message_iter_get_arg_type(&subItem)) {
- printf("UID failed");
- }
- else {
- dbus_message_iter_get_basic(&subItem, &test->uid);
- dbus_message_iter_next (&subItem);
- }
- if(DBUS_TYPE_UINT32 != dbus_message_iter_get_arg_type(&subItem)) {
- printf("INT failed");
- }
- else {
- dbus_message_iter_get_basic(&subItem, &test->gh);
- dbus_message_iter_next (&subItem);
- }
- printf("Method called with %s and \nName: %s\nAddress: %s\nUID : %d\ngh: %d\n",
- param,test->name,test->address,test->uid,test->gh);
- // 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 (1) {
- // 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) {
- sleep(1);
- 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);
- }
- // close the connection
- dbus_connection_close(conn);
- }
- int main(int argc, char** argv)
- {
- listen();
- return 0;
- }