/echo_calling_service.c

https://github.com/keesj/dbus_glib_pthread · C · 175 lines · 142 code · 29 blank · 4 comment · 19 complexity · 0e6cb2729a9aba807cf5621251a9accf MD5 · raw file

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <errno.h>
  4. #include <string.h>
  5. #include <dbus/dbus.h>
  6. #include <dbus/dbus-glib.h>
  7. #include <dbus/dbus-glib-bindings.h>
  8. #include <alib/log.h>
  9. #include "echo_service_client.h"
  10. struct echo_client *echo_client = NULL;
  11. gboolean echo_calling_service_call_echo(GObject * obj, char *in, int count,
  12. GError ** error)
  13. {
  14. char *retval;
  15. int i;
  16. log(LOG_NOTICE,
  17. "echo_calling_service called with (in => '%s' , count => %i) ", in,
  18. count);
  19. char *buffer = malloc(100);
  20. if (!buffer) {
  21. fprintf(stderr, "Failed to alloc data %s\n", __FUNCTION__);
  22. //TODO do the quark thing to set error ??
  23. return FALSE;
  24. }
  25. for (i = 0; i < count; i++) {
  26. sprintf(buffer, "%s + echo data %i", in, i);
  27. retval = echo_client_echo(echo_client, buffer);
  28. if (strncmp(buffer, retval, 100)) {
  29. printf("echo test failed %s %s\n", buffer, retval);
  30. fprintf(stderr, "echo test failed %s != %s\n", buffer, retval);
  31. //TODO do the quark thing to set error ??
  32. free(buffer);
  33. return FALSE;
  34. }
  35. free(retval);
  36. }
  37. free(buffer);
  38. return TRUE;
  39. }
  40. #include "echo_calling_service_binding_server.h"
  41. int verbose = 0;
  42. DBusGConnection *connection;
  43. DBusGProxy *proxy;
  44. GMainLoop *loop;
  45. GSource *timeout;
  46. int process_args(int argc, char *argv[])
  47. {
  48. int i, ret = 0;
  49. for (i = 1; i < argc; i++) {
  50. if (strcmp(argv[i], "-v") == 0) {
  51. verbose = 1;
  52. } else {
  53. fprintf(stderr, "Invalid argument: %s\n", argv[i]);
  54. ret = -1;
  55. }
  56. }
  57. return ret;
  58. }
  59. void usage(const char *progname)
  60. {
  61. fprintf(stderr,
  62. "echo_calling_service\n"
  63. "Usage: %s [ options... ]\n"
  64. " options:\n"
  65. " -v Be verbose\n", progname);
  66. }
  67. int init_glib_dbus(char *namespace, char *path,
  68. const DBusGObjectInfo * dBusGMethodInfo)
  69. {
  70. GError *error = NULL;
  71. guint32 err, ret;
  72. GObject *handle;
  73. dbus_threads_init_default();
  74. g_type_init();
  75. handle = g_object_new(G_TYPE_OBJECT, NULL);
  76. if (handle == NULL) {
  77. log(LOG_ERR, "Can't create handle\n");
  78. return -1;
  79. }
  80. connection = dbus_g_bus_get(DBUS_BUS_SYSTEM, &error);
  81. if (connection == NULL) {
  82. log(LOG_ERR, "Can't connect to system bus: %s\n", error->message);
  83. g_error_free(error);
  84. return -1;
  85. }
  86. proxy = dbus_g_proxy_new_for_name(connection, DBUS_SERVICE_DBUS,
  87. DBUS_PATH_DBUS, DBUS_INTERFACE_DBUS);
  88. if (proxy == NULL) {
  89. log(LOG_ERR, "Failed to get a proxy\n");
  90. return -1;
  91. }
  92. err = org_freedesktop_DBus_request_name(proxy, namespace,
  93. 0, &ret, &error);
  94. if (!err) {
  95. log(LOG_ERR, "Error requesting name: %s\n",
  96. error ? error->message : "?");
  97. return -1;
  98. }
  99. if (ret != DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER) {
  100. /* Someone else requested the name before us */
  101. log(LOG_ERR, "Name already requested?\n");
  102. return -1;
  103. }
  104. dbus_g_object_type_install_info(G_TYPE_OBJECT, dBusGMethodInfo);
  105. dbus_g_connection_register_g_object(connection, path,
  106. G_OBJECT(handle));
  107. return 0;
  108. }
  109. gboolean check_fct(gpointer data)
  110. {
  111. return TRUE;
  112. }
  113. int run_main_loop()
  114. {
  115. /* TODO 1 */
  116. g_timeout_add_seconds(1, check_fct, NULL);
  117. loop = g_main_loop_new(NULL, FALSE);
  118. log(LOG_NOTICE, "EchoCallingService is now running...");
  119. g_main_loop_run(loop);
  120. return 0;
  121. }
  122. int main(int argc, char *argv[])
  123. {
  124. int err;
  125. err = process_args(argc, argv);
  126. if (err < 0) {
  127. usage(argv[0]);
  128. exit(1);
  129. }
  130. init_log("echo_service", verbose);
  131. err =
  132. init_glib_dbus("com.test.EchoCallingService",
  133. "/com/test/Platform",
  134. &dbus_glib_echo_calling_service_object_info);
  135. if (err < 0) {
  136. log(LOG_ERR, "Can't initialize Dbus subsystem\n");
  137. exit(1);
  138. }
  139. echo_client = echo_client_new();
  140. err = run_main_loop();
  141. if (err < 0) {
  142. log(LOG_ERR, "Can't run main loop\n");
  143. exit(1);
  144. }
  145. return 0;
  146. }