Don't like ads? PRO users don't see any ads ;-)
Guest

Untitled

By: a guest on Aug 5th, 2012  |  syntax: None  |  size: 4.79 KB  |  hits: 9  |  expires: Never
download  |  raw  |  embed  |  report abuse  |  print
Text below is selected. Please press Ctrl+C to copy to your clipboard. (⌘+C on Mac)
  1. /* Server.c */
  2.  
  3.  
  4.  
  5. #include <stdio.h>
  6. #include <stdlib.h>
  7. #include <dbus/dbus.h>
  8.  
  9.  
  10. struct test_t {
  11.         const char * name;
  12.         const char * address;
  13.  
  14.         uid_t uid;
  15.         int gh;
  16. };
  17.  
  18. void reply_to_method_call(DBusMessage* msg, DBusConnection* conn)
  19. {
  20.    DBusMessage* reply;
  21.    DBusMessageIter args;
  22.    DBusMessageIter subItem;
  23.    int stat = 1;
  24.    dbus_uint32_t level = 21614;
  25.    dbus_uint32_t serial = 0;
  26.    char* param = "";
  27.  
  28.         struct test_t *test;
  29.         test = malloc( sizeof( struct test_t));
  30.    
  31. // read the arguments
  32.    if (!dbus_message_iter_init(msg, &args)) {
  33.       fprintf(stderr, "Message has no arguments!\n");
  34.    }
  35.    else if (DBUS_TYPE_STRING != dbus_message_iter_get_arg_type(&args)) {
  36.       fprintf(stderr, "Argument is not string!\n");
  37.    }
  38.    else {
  39.       dbus_message_iter_get_basic(&args, &param);
  40.       dbus_message_iter_next (&args);
  41.    }
  42.  
  43.  
  44.    if(DBUS_TYPE_STRUCT != dbus_message_iter_get_arg_type(&args)) {
  45.       fprintf(stderr, "Argument is not struct!\n");
  46.    }
  47.    else{
  48.         fprintf(stderr, "Argument is  struct!\n");  
  49.         fprintf(stdout,"Signature of structure : %s \n",dbus_message_iter_get_signature(&args));
  50.         dbus_message_iter_recurse(&args,&subItem);
  51.         fprintf(stdout,"Signature of first element: %s \n",dbus_message_iter_get_signature(&subItem));
  52.  
  53.    }
  54.  
  55.     if(DBUS_TYPE_STRING != dbus_message_iter_get_arg_type(&subItem)) {
  56.         printf("String 1 failed");
  57.         }
  58.     else {
  59.         dbus_message_iter_get_basic(&subItem, &test->name);
  60.         dbus_message_iter_next (&subItem);
  61.     }
  62.  
  63.    if(DBUS_TYPE_STRING != dbus_message_iter_get_arg_type(&subItem)) {
  64.         printf("String 2 failed");
  65.         }
  66.     else {
  67.         dbus_message_iter_get_basic(&subItem, &test->address);
  68.         dbus_message_iter_next (&subItem);
  69.     }
  70.      
  71.     if(DBUS_TYPE_UINT32 != dbus_message_iter_get_arg_type(&subItem)) {
  72.         printf("UID failed");
  73.         }
  74.     else {
  75.         dbus_message_iter_get_basic(&subItem, &test->uid);
  76.         dbus_message_iter_next (&subItem);
  77.     }
  78.  
  79.     if(DBUS_TYPE_UINT32 != dbus_message_iter_get_arg_type(&subItem)) {
  80.         printf("INT failed");
  81.         }
  82.     else {
  83.         dbus_message_iter_get_basic(&subItem, &test->gh);
  84.         dbus_message_iter_next (&subItem);
  85.     }
  86.  
  87.     printf("Method called with %s and \nName: %s\nAddress: %s\nUID : %d\ngh: %d\n",
  88.                         param,test->name,test->address,test->uid,test->gh);
  89.  
  90.    // create a reply from the message
  91.     reply = dbus_message_new_method_return(msg);
  92.  
  93.    // add the arguments to the reply
  94.    dbus_message_iter_init_append(reply, &args);
  95.    if (!dbus_message_iter_append_basic(&args, DBUS_TYPE_BOOLEAN, &stat)) {
  96.       fprintf(stderr, "Out Of Memory!\n");
  97.       exit(1);
  98.    }
  99.    if (!dbus_message_iter_append_basic(&args, DBUS_TYPE_UINT32, &level)) {
  100.       fprintf(stderr, "Out Of Memory!\n");
  101.       exit(1);
  102.    }
  103.  
  104.    // send the reply && flush the connection
  105.    if (!dbus_connection_send(conn, reply, &serial)) {
  106.       fprintf(stderr, "Out Of Memory!\n");
  107.       exit(1);
  108.    }
  109.    dbus_connection_flush(conn);
  110.  
  111.    // free the reply
  112.    dbus_message_unref(reply);
  113. }
  114.  
  115.  
  116.  
  117. /**
  118.  * Server that exposes a method call and waits for it to be called
  119.  */
  120. void listen()
  121. {
  122.    DBusMessage* msg;
  123.    DBusMessage* reply;
  124.    DBusMessageIter args;
  125.    DBusConnection* conn;
  126.    DBusError err;
  127.    int ret;
  128.    char* param;
  129.  
  130.    printf("Listening for method calls\n");
  131.  
  132.    // initialise the error
  133.    dbus_error_init(&err);
  134.    
  135.    // connect to the bus and check for errors
  136.    conn = dbus_bus_get(DBUS_BUS_SESSION, &err);
  137.    if (dbus_error_is_set(&err)) {
  138.       fprintf(stderr, "Connection Error (%s)\n", err.message);
  139.       dbus_error_free(&err);
  140.    }
  141.    if (NULL == conn) {
  142.       fprintf(stderr, "Connection Null\n");
  143.       exit(1);
  144.    }
  145.    
  146.    // request our name on the bus and check for errors
  147.    ret = dbus_bus_request_name(conn, "test.method.server", DBUS_NAME_FLAG_REPLACE_EXISTING , &err);
  148.  
  149.    if (dbus_error_is_set(&err)) {
  150.       fprintf(stderr, "Name Error (%s)\n", err.message);
  151.       dbus_error_free(&err);
  152.    }
  153.    if (DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER != ret) {
  154.       fprintf(stderr, "Not Primary Owner (%d)\n", ret);
  155.       exit(1);
  156.    }
  157.  
  158.    // loop, testing for new messages
  159.    while (1) {
  160.       // non blocking read of the next available message
  161.       dbus_connection_read_write(conn, 0);
  162.       msg = dbus_connection_pop_message(conn);
  163.  
  164.       // loop again if we haven't got a message
  165.       if (NULL == msg) {
  166.          sleep(1);
  167.          continue;
  168.       }
  169.      
  170.       // check this is a method call for the right interface & method
  171.       if (dbus_message_is_method_call(msg, "test.method.Type", "Method"))
  172.          reply_to_method_call(msg, conn);
  173.  
  174.       // free the message
  175.       dbus_message_unref(msg);
  176.    }
  177.  
  178.    // close the connection
  179.    dbus_connection_close(conn);
  180. }
  181.  
  182.  
  183. int main(int argc, char** argv)
  184. {
  185.    listen();
  186.  
  187.    return 0;
  188. }