X-Git-Url: http://git.cascardo.eti.br/?a=blobdiff_plain;f=message.c;h=2074549a8228c12fc11d6a0048c0052ca9cfc905;hb=2ce1e48602de964b8a12747b4a329fc082da7523;hp=7c730064490fb83b07f149d2ea9b5a34b51dad4b;hpb=d3c08160a68a7a38468ddbe4cffafb98de177823;p=cascardo%2Ff2fchat.git diff --git a/message.c b/message.c index 7c73006..2074549 100644 --- a/message.c +++ b/message.c @@ -18,6 +18,7 @@ #include "message.h" #include "friend.h" +#include "menu.h" #include #include @@ -26,15 +27,19 @@ gboolean ping_timeout(gpointer data) { struct friend *friend = data; + friend_timeout(friend); return G_SOURCE_REMOVE; } static GIOChannel *uchannel; static GSocket *gusock; -static void command(char *buffer, size_t len) +static void command(char *buffer, size_t len, GSocketAddress *address) { - printf("message from loopback: %d %.*s\n", len, len, buffer); + gchar **args; + args = g_strsplit(buffer, " ", -1); + menu_run(args, address); + g_strfreev(args); } gboolean message_incoming(GIOChannel *channel, GIOCondition cond, gpointer data) @@ -47,27 +52,50 @@ gboolean message_incoming(GIOChannel *channel, GIOCondition cond, gpointer data) gusock = g_socket_new_from_fd(g_io_channel_unix_get_fd(channel), NULL); } len = g_socket_get_available_bytes(gusock); + if (len <= 0) { + goto out; + } buffer = g_malloc(len); len = g_socket_receive_from(gusock, &address, buffer, len, NULL, NULL); iaddress = g_inet_socket_address_get_address(G_INET_SOCKET_ADDRESS(address)); if (g_inet_address_get_is_loopback(iaddress)) { - command(buffer, len); + command(buffer, len, address); + } else { + struct friend *friend; + uint16_t port = g_inet_socket_address_get_port(G_INET_SOCKET_ADDRESS(address)); + friend = friend_get_by_address(iaddress, port); + if (friend) { + printf("got message from %s\n", friend_get_name(friend)); + friend_got_message(friend, buffer, len); + } else { + printf("could not find friend from address %s\n", g_inet_address_to_string(iaddress)); + } } g_object_unref(address); g_free(buffer); +out: return TRUE; } -int message_init(int sock) +int message_init(GSocket *sock) { - uchannel = g_io_channel_unix_new(sock); + uchannel = g_io_channel_unix_new(g_socket_get_fd(sock)); g_io_add_watch(uchannel, G_IO_IN, message_incoming, NULL); return 0; } int ping(struct friend *friend) { + int err; char ping[5] = "PING"; - friend_send_message(friend, ping, 4); - g_timeout_add(2000, ping_timeout, friend); + err = friend_send_message(friend, ping, 4); + if (!err) + g_timeout_add(2000, ping_timeout, friend); + return err; +} + +int pong(struct friend *friend) +{ + char pong[5] = "PONG"; + return friend_send_message(friend, pong, 4); }