BiggieJozin

Untitled

Jan 28th, 2023
217
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.10 KB | None | 0 0
  1. #include <dbus/dbus.h>
  2. #include <dbus/dbus-glib.h>
  3. #include <stdbool.h>
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6.  
  7. bool init(DBusError **error, DBusConnection **connection) {
  8. *error = malloc(sizeof(struct DBusError));
  9. if(*error == NULL)
  10. return 1;
  11.  
  12. //initialise the errors
  13. dbus_error_init(*error);
  14.  
  15. //connect to the bus
  16. *connection = dbus_bus_get(DBUS_BUS_SESSION, *error);
  17.  
  18. if(*connection == NULL)
  19. return 1;
  20.  
  21. if(dbus_error_is_set(*error)){
  22. fprintf(stderr, "Connection Error (%s)\n", (*error)->message);
  23. dbus_error_free(*error);
  24. return 1;
  25. }
  26.  
  27. //request a name on the bus
  28. int result = dbus_bus_request_name(*connection, "hackerman.notifier.app", DBUS_NAME_FLAG_REPLACE_EXISTING, *error);
  29.  
  30. if(dbus_error_is_set(*error)) {
  31. fprintf(stderr, "Name Error (%s)\n", (*error)->message);
  32. dbus_error_free(*error);
  33. return 1;
  34. }
  35.  
  36. if(DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER != result)
  37. return 1;
  38.  
  39. return 0;
  40. }
  41.  
  42. void add_arg_basic(DBusMessageIter * const args,const int type, void * const data){
  43. int status_code = dbus_message_iter_append_basic(args, type, data);
  44. if(!status_code){
  45. fprintf(stderr, "Error while appending args\n");
  46. exit(1);
  47. }
  48. }
  49.  
  50. bool add_arg_fixed(DBusMessageIter * const args, DBusMessageIter ** const subargs) {
  51. *subargs = malloc(sizeof(struct DBusMessageIter));
  52. if(*subargs == NULL)
  53. return 1;
  54.  
  55. dbus_message_iter_open_container(args, DBUS_TYPE_ARRAY, "s", *subargs);
  56. //static const char *str = " ";
  57. //dbus_message_iter_append_basic(subargs, DBUS_TYPE_STRING, &str);
  58. int status_code = dbus_message_iter_close_container(args, *subargs);
  59. if(!status_code){
  60. fprintf(stderr, "Error while appending args\n");
  61. //exit(1);
  62. }
  63.  
  64. return 0;
  65. }
  66. bool add_arg_dict(DBusMessageIter *args, DBusMessageIter ** const subargs) {
  67. *subargs = malloc(sizeof(struct DBusMessageIter));
  68.  
  69. if(*subargs == NULL)
  70. return 1;
  71.  
  72. dbus_message_iter_open_container(args, DBUS_TYPE_DICT_ENTRY, NULL, *subargs);
  73.  
  74. int status_code = dbus_message_iter_close_container(args, *subargs);
  75. if(!status_code){
  76. fprintf(stderr, "Error while appending args\n");
  77. //exit(1);
  78. }
  79.  
  80. return 0;
  81. }
  82.  
  83.  
  84. bool send_message(DBusError * const error, DBusConnection * const connection) {
  85. DBusMessageIter args;
  86. DBusPendingCall *pending;
  87.  
  88. DBusMessage *message = dbus_message_new_method_call(
  89. "org.freedesktop.Notifications",
  90. "/org/freedesktop/Notifications/",
  91. "org.freedesktop.Notifications",
  92. "Notify"
  93. );
  94. char * bus_id= dbus_bus_get_id(connection, error);
  95. printf("%s", bus_id);
  96.  
  97. if(message == NULL) {
  98. fprintf(stderr, "Message Null\n");
  99. return 1;
  100. }
  101.  
  102. //append arguments to iterator
  103.  
  104. dbus_message_iter_init_append(message, &args);
  105.  
  106. char *app_name = "App Name";
  107. char *app_icon = "App Icon";
  108. char *summary = "Summary";
  109. char *body = "Body";
  110. dbus_uint32_t replaces_id = 0;
  111. dbus_int32_t expire_timeout = 0;
  112.  
  113. add_arg_basic(&args, DBUS_TYPE_STRING, &app_name);
  114. add_arg_basic(&args, DBUS_TYPE_UINT32, &replaces_id);
  115. add_arg_basic(&args, DBUS_TYPE_STRING, &app_icon);
  116. add_arg_basic(&args, DBUS_TYPE_STRING, &summary);
  117. add_arg_basic(&args, DBUS_TYPE_STRING, &body);
  118.  
  119. DBusMessageIter *subargs1, *subargs2;
  120. add_arg_fixed(&args, &subargs1);
  121. add_arg_dict(&args, &subargs2);
  122. add_arg_basic(&args, DBUS_TYPE_INT32, &expire_timeout);
  123.  
  124. if(!dbus_connection_send_with_reply(connection, message, &pending, -1))
  125. fprintf(stderr, "Message couldn't be sent\n");
  126.  
  127. if(pending == NULL)
  128. fprintf(stderr, "Pending Call Null\n");
  129.  
  130. dbus_connection_flush(connection);
  131. printf("Request Sent\n");
  132.  
  133. dbus_message_unref(message);
  134. dbus_pending_call_block(pending);
  135.  
  136. message = dbus_pending_call_steal_reply(pending);
  137. if(message == NULL)
  138. fprintf(stderr, "Null reply\n");
  139.  
  140. dbus_pending_call_unref(pending);
  141.  
  142. free(subargs1);
  143. free(subargs2);
  144.  
  145. return 0;
  146. }
  147.  
  148.  
  149. int main(int argc, char **argv) {
  150. DBusError* error;
  151. DBusConnection *connection;
  152.  
  153. if(init(&error, &connection)) {
  154. fprintf(stderr, "Init failed");
  155. return 1;
  156. }
  157.  
  158. if(send_message(error, connection)) {
  159. fprintf(stderr, "Sending message failed");
  160. return 1;
  161. }
  162.  
  163. free(error);
  164. }
  165.  
Advertisement
Add Comment
Please, Sign In to add comment