X-Git-Url: https://git.cworth.org/git?p=loudgame;a=blobdiff_plain;f=lm-echo.c;h=d92188bd14510e66de361b55ad92a660bbda0667;hp=312e6fee7bf2728f2abcd5b2c452b68528b7114a;hb=b71bfe83b2d18e4142b361605511db8bbe7925d9;hpb=2ae865aff6f9f8475d7fd8683a97142000d1a797 diff --git a/lm-echo.c b/lm-echo.c index 312e6fe..d92188b 100644 --- a/lm-echo.c +++ b/lm-echo.c @@ -1,4 +1,3 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* * Copyright (C) 2003-2004 Imendio AB * @@ -27,126 +26,177 @@ #endif typedef struct { - gchar *name; - gchar *passwd; + gchar *name; + gchar *passwd; } UserInfo; + +typedef struct { + GMainLoop *main_loop; +} msg_data_t; static void free_user_info (UserInfo *info) { - g_free (info->name); - g_free (info->passwd); + g_free (info->name); + g_free (info->passwd); - g_free (info); + g_free (info); } - static void authentication_cb (LmConnection *connection, gboolean result, gpointer ud) { - g_print ("Auth: %d\n", result); - free_user_info ((UserInfo *) ud); + gchar *string; + + g_print ("Auth: %d\n", result); + free_user_info ((UserInfo *) ud); - if (result == TRUE) { - LmMessage *m; + if (result == TRUE) { + LmMessage *m; - m = lm_message_new_with_sub_type (NULL, - LM_MESSAGE_TYPE_PRESENCE, - LM_MESSAGE_SUB_TYPE_AVAILABLE); - g_print (":: %s\n", lm_message_node_to_string (m->node)); + m = lm_message_new_with_sub_type (NULL, + LM_MESSAGE_TYPE_PRESENCE, + LM_MESSAGE_SUB_TYPE_AVAILABLE); + string = lm_message_node_to_string (m->node); + g_print (":: %s\n", string); + free (string); - lm_connection_send (connection, m, NULL); - lm_message_unref (m); - } + lm_connection_send (connection, m, NULL); + lm_message_unref (m); + } } static void connection_open_cb (LmConnection *connection, gboolean result, UserInfo *info) { - g_print ("Connected callback\n"); - lm_connection_authenticate (connection, - info->name, info->passwd, "TestLM", - authentication_cb, info, FALSE, NULL); - g_print ("Sent auth message\n"); + g_print ("Connected callback\n"); + lm_connection_authenticate (connection, + info->name, info->passwd, "TestLM", + authentication_cb, info, FALSE, NULL); + g_print ("Sent auth message\n"); +} + +static void +send_reply (LmConnection *connection, + const char *peer, + const char *message) +{ + LmMessage *reply; + gboolean result; + GError *error = NULL; + + reply = lm_message_new (peer, LM_MESSAGE_TYPE_MESSAGE); + + lm_message_node_add_child (reply->node, "body", message); + + result = lm_connection_send (connection, reply, &error); + lm_message_unref (reply); + + if (! result) { + g_error ("lm_connection_send failed"); + } +} + +static void +handle_command (LmConnection *connection, + const char *peer, + const char *command, + gpointer closure) +{ + msg_data_t *data = closure; + char *error; + + if (strcmp (command, "quit") == 0) { + g_main_loop_quit (data->main_loop); + return; + } + + error = g_strdup_printf ("Unknown command: '%s'", command); + send_reply (connection, peer, error); + free (error); } static LmHandlerResult handle_messages (LmMessageHandler *handler, LmConnection *connection, LmMessage *m, - gpointer user_data) + gpointer closure) { - LmMessage *reply; - gboolean result; - GError *error = NULL; - LmMessageNode *body; - - g_print ("Incoming message from: %s\n", - lm_message_node_get_attribute (m->node, "from")); - - reply = lm_message_new (lm_message_node_get_attribute (m->node, "from"), - LM_MESSAGE_TYPE_MESSAGE); - body = lm_message_node_get_child (m->node, "body"); - lm_message_node_add_child (reply->node, "body", - lm_message_node_get_value (body)); - - result = lm_connection_send (connection, reply, &error); - lm_message_unref (reply); - - if (! result) { - g_error ("lm_connection_send failed"); - } - - return LM_HANDLER_RESULT_REMOVE_MESSAGE; + LmMessageNode *body; + const char *peer; + const char *body_str; + + peer = lm_message_node_get_attribute (m->node, "from"); + + + g_print ("Incoming message from: %s\n", peer); + + body = lm_message_node_get_child (m->node, "body"); + if (body) { + body_str = lm_message_node_get_value (body); + + if (body_str && body_str[0] == '%') + handle_command (connection, peer, body_str + 1, closure); + else + send_reply (connection, peer, body_str); + } + + return LM_HANDLER_RESULT_REMOVE_MESSAGE; } int main (int argc, char **argv) { - GMainLoop *main_loop; - LmConnection *connection; - LmMessageHandler *handler; - gboolean result; - UserInfo *info; - gchar *jid; - - if (argc < 6) { - g_print ("Usage: %s \n", argv[0]); - return 1; - } + LmConnection *connection; + LmMessageHandler *handler; + gboolean result; + UserInfo *info; + gchar *jid; + msg_data_t data; + GError *error; + + if (argc < 6) { + g_print ("Usage: %s \n", argv[0]); + return 1; + } - connection = lm_connection_new (argv[4]); + connection = lm_connection_new (argv[4]); + + jid = g_strdup_printf ("%s@%s", argv[2], argv[1]); + lm_connection_set_jid (connection, jid); + g_free (jid); - jid = g_strdup_printf ("%s@%s", argv[2], argv[1]); - lm_connection_set_jid (connection, jid); - g_free (jid); + lm_connection_set_port (connection, strtol (argv[5], (char **) NULL, 10)); - lm_connection_set_port (connection, strtol (argv[5], (char **) NULL, 10)); + data.main_loop = g_main_loop_new (NULL, FALSE); - handler = lm_message_handler_new (handle_messages, NULL, NULL); - lm_connection_register_message_handler (connection, handler, - LM_MESSAGE_TYPE_MESSAGE, - LM_HANDLER_PRIORITY_NORMAL); + handler = lm_message_handler_new (handle_messages, &data, NULL); + lm_connection_register_message_handler (connection, handler, + LM_MESSAGE_TYPE_MESSAGE, + LM_HANDLER_PRIORITY_NORMAL); - lm_message_handler_unref (handler); + lm_message_handler_unref (handler); - info = g_new0 (UserInfo, 1); - info->name = g_strdup (argv[2]); - info->passwd = g_strdup (argv[3]); + info = g_new0 (UserInfo, 1); + info->name = g_strdup (argv[2]); + info->passwd = g_strdup (argv[3]); - result = lm_connection_open (connection, - (LmResultFunction) connection_open_cb, - info, NULL, NULL); + result = lm_connection_open (connection, + (LmResultFunction) connection_open_cb, + info, NULL, NULL); - if (!result) { - g_print ("Opening connection failed: %d\n", result); - } else { - g_print ("Returned from the connection_open\n"); - } + if (!result) { + g_print ("Opening connection failed: %d\n", result); + } else { + g_print ("Returned from the connection_open\n"); + } - main_loop = g_main_loop_new (NULL, FALSE); - g_main_loop_run (main_loop); + g_main_loop_run (data.main_loop); + + g_main_loop_unref (data.main_loop); + + lm_connection_close (connection, &error); + lm_connection_unref (connection); - return 0; + return 0; } -