diff options
Diffstat (limited to 'test/watch.c')
-rw-r--r-- | test/watch.c | 376 |
1 files changed, 0 insertions, 376 deletions
diff --git a/test/watch.c b/test/watch.c deleted file mode 100644 index bdb18306..00000000 --- a/test/watch.c +++ /dev/null @@ -1,376 +0,0 @@ -#include "watch.h" -#include <stdio.h> - -#define DBUS_COMPILATION /* cheat and use DBusList */ -#include <dbus/dbus-list.h> -#undef DBUS_COMPILATION - -#include <sys/types.h> -#include <unistd.h> - -/* Cheesy main loop used in test programs. Any real app would use the - * GLib or Qt or other non-sucky main loops. - */ - -#undef MAX -#define MAX(a, b) (((a) > (b)) ? (a) : (b)) - -static int watch_list_serial = 0; -static DBusList *watches = NULL; -static dbus_bool_t exited = FALSE; -static DBusList *connections = NULL; - -typedef enum -{ - WATCH_CONNECTION, - WATCH_SERVER -} WatchType; - -typedef struct -{ - WatchType type; - void *data; -} WatchData; - -static void -free_watch_data (void *data) -{ - WatchData *wd = data; - - if (wd->type == WATCH_CONNECTION) - dbus_connection_unref (wd->data); - else if (wd->type == WATCH_SERVER) - dbus_server_unref (wd->data); - - dbus_free (wd); -} - -static dbus_bool_t -add_connection_watch (DBusWatch *watch, - DBusConnection *connection) -{ - WatchData *wd; - - if (!_dbus_list_append (&watches, watch)) - return FALSE; - - wd = dbus_new0 (WatchData, 1); - if (wd == NULL) - { - _dbus_list_remove_last (&watches, watch); - return FALSE; - } - wd->type = WATCH_CONNECTION; - wd->data = connection; - - dbus_connection_ref (connection); - - dbus_watch_set_data (watch, wd, free_watch_data); - - watch_list_serial += 1; - -#if 0 - printf ("Added connection %swatch for fd %d\n", - dbus_watch_get_flags (watch) & DBUS_WATCH_WRITABLE ? "write " : "", - dbus_watch_get_fd (watch)); -#endif - - return TRUE; - } - -static void -remove_connection_watch (DBusWatch *watch, - DBusConnection *connection) -{ - if (!_dbus_list_remove (&watches, watch)) - _dbus_assert_not_reached ("removed nonexistent watch"); - - dbus_watch_set_data (watch, NULL, NULL); - - watch_list_serial += 1; - -#if 0 - printf ("Removed connection watch for fd %d\n", - dbus_watch_get_fd (watch)); -#endif -} - -static dbus_bool_t -add_server_watch (DBusWatch *watch, - DBusServer *server) -{ - WatchData *wd; - - if (!_dbus_list_append (&watches, watch)) - return FALSE; - - wd = dbus_new0 (WatchData, 1); - if (wd == NULL) - { - _dbus_list_remove_last (&watches, watch); - return FALSE; - } - - wd->type = WATCH_SERVER; - wd->data = server; - - dbus_server_ref (server); - - dbus_watch_set_data (watch, wd, free_watch_data); - - watch_list_serial += 1; - -#if 0 - printf ("Added server %swatch for fd %d\n", - dbus_watch_get_flags (watch) & DBUS_WATCH_WRITABLE ? "write " : "", - dbus_watch_get_fd (watch)); -#endif - - return TRUE; -} - -static void -remove_server_watch (DBusWatch *watch, - DBusServer *server) -{ - if (!_dbus_list_remove (&watches, watch)) - _dbus_assert_not_reached ("removed nonexistent server watch"); - - dbus_watch_set_data (watch, NULL, NULL); - - watch_list_serial += 1; - -#if 0 - printf ("Removed server watch for fd %d\n", - dbus_watch_get_fd (watch)); -#endif -} - -static int count = 0; - -static void -disconnect (DBusConnection *connection) -{ - fprintf (stderr, "Disconnected\n"); - - _dbus_list_remove (&connections, connection); - dbus_connection_unref (connection); - quit_mainloop (); -} - - -static void -check_messages (void) -{ - DBusList *link; - - link = _dbus_list_get_first_link (&connections); - while (link != NULL) - { - DBusList *next = _dbus_list_get_next_link (&connections, link); - DBusConnection *connection = link->data; - DBusMessage *message; - const char *name; - - while ((message = dbus_connection_pop_message (connection))) - { - DBusMessage *reply; - - name = dbus_message_get_name (message); - if (name && strcmp (name, DBUS_MESSAGE_LOCAL_DISCONNECT) == 0) - { - disconnect (connection); - } - else - { - fprintf (stderr, "Received message %d, sending reply\n", count); - - reply = dbus_message_new ("org.freedesktop.DBus.Test", "org.freedesktop.DBus.Test"); - if (!dbus_connection_send (connection, - reply, - NULL)) - fprintf (stderr, "No memory to send reply\n"); - dbus_message_unref (reply); - - dbus_message_unref (message); - - count += 1; - if (count > 100) - { - printf ("Saw %d messages, exiting\n", count); - quit_mainloop (); - } - } - } - - link = next; - } -} - -void -do_mainloop (void) -{ - /* Of course with any real app you'd use GMainLoop or - * QSocketNotifier and not have to see all this crap. - */ - while (!exited && watches != NULL) - { - fd_set read_set; - fd_set write_set; - fd_set err_set; - int max_fd; - DBusList *link; - int initial_watch_serial; - - check_messages (); - - if (exited) - break; - - FD_ZERO (&read_set); - FD_ZERO (&write_set); - FD_ZERO (&err_set); - - max_fd = -1; - - link = _dbus_list_get_first_link (&watches); - while (link != NULL) - { - DBusList *next = _dbus_list_get_next_link (&watches, link); - DBusWatch *watch; - - watch = link->data; - - if (dbus_watch_get_enabled (watch)) - { - int fd; - unsigned int flags; - - fd = dbus_watch_get_fd (watch); - flags = dbus_watch_get_flags (watch); - - max_fd = MAX (max_fd, fd); - - if (flags & DBUS_WATCH_READABLE) - FD_SET (fd, &read_set); - - if (flags & DBUS_WATCH_WRITABLE) - FD_SET (fd, &write_set); - - FD_SET (fd, &err_set); - } - - link = next; - } - - select (max_fd + 1, &read_set, &write_set, &err_set, NULL); - - initial_watch_serial = watch_list_serial; - link = _dbus_list_get_first_link (&watches); - while (link != NULL) - { - DBusList *next = _dbus_list_get_next_link (&watches, link); - DBusWatch *watch; - - if (initial_watch_serial != watch_list_serial) - { - /* Watches were added/removed, - * hosing our list; break out of here - */ - /* A more elegant solution might be to ref - * all watches, then check which have fd >= 0 - * as we iterate over them, since removed - * watches have their fd invalidated. - */ - printf ("Aborting watch iteration due to serial increment\n"); - break; - } - - watch = link->data; - - if (dbus_watch_get_enabled (watch)) - { - int fd; - unsigned int flags; - unsigned int condition; - - - fd = dbus_watch_get_fd (watch); - flags = dbus_watch_get_flags (watch); - - condition = 0; - - if ((flags & DBUS_WATCH_READABLE) && - FD_ISSET (fd, &read_set)) - condition |= DBUS_WATCH_READABLE; - - if ((flags & DBUS_WATCH_WRITABLE) && - FD_ISSET (fd, &write_set)) - condition |= DBUS_WATCH_WRITABLE; - - if (FD_ISSET (fd, &err_set)) - condition |= DBUS_WATCH_ERROR; - - if (condition != 0) - { - WatchData *wd; - - wd = dbus_watch_get_data (watch); - - if (wd->type == WATCH_CONNECTION) - { - DBusConnection *connection = wd->data; - - dbus_connection_handle_watch (connection, - watch, - condition); - } - else if (wd->type == WATCH_SERVER) - { - DBusServer *server = wd->data; - - dbus_server_handle_watch (server, - watch, - condition); - } - } - } - - link = next; - } - } -} - -void -quit_mainloop (void) -{ - exited = TRUE; -} - - -void -setup_connection (DBusConnection *connection) -{ - if (!dbus_connection_set_watch_functions (connection, - (DBusAddWatchFunction) add_connection_watch, - (DBusRemoveWatchFunction) remove_connection_watch, - NULL, - connection, - NULL)) - _dbus_assert_not_reached ("not enough memory"); - - dbus_connection_ref (connection); - _dbus_list_append (&connections, connection); -} - -void -setup_server (DBusServer *server) -{ - if (!dbus_server_set_watch_functions (server, - (DBusAddWatchFunction) add_server_watch, - (DBusRemoveWatchFunction) remove_server_watch, - NULL, - server, - NULL)) - _dbus_assert_not_reached ("not enough memory"); -} |