X-Git-Url: https://git.cworth.org/git?p=loudgame;a=blobdiff_plain;f=lg-echo.c;fp=lg-echo.c;h=661949e2771ff425b1175e12ffa4e10581a9be5a;hp=0000000000000000000000000000000000000000;hb=b6068be315bea676faf0c8248068dda6b96c697f;hpb=e995240ce8748861317919d3ac98efece67076da diff --git a/lg-echo.c b/lg-echo.c new file mode 100644 index 0000000..661949e --- /dev/null +++ b/lg-echo.c @@ -0,0 +1,209 @@ +/* + * Copyright (C) 2003-2004 Imendio AB + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#include +#include +#include +#include +#ifdef __WIN32__ +#include +#endif + +typedef struct _loudgame { + gchar *server; + gchar *name; + gchar *passwd; + LmConnection *connection; + GMainLoop *main_loop; + int return_value; +} loudgame_t; + +static void +loudgame_quit (loudgame_t *lg, int return_value) +{ + GError *error; + + lg->return_value = return_value; + + if (! lm_connection_close (lg->connection, &error)) + g_print ("An error occurred during lm_connection_close: %s\n", + error->message); + + lm_connection_unref (lg->connection); + + g_main_loop_quit (lg->main_loop); +} + +static void +authentication_cb (LmConnection *connection, gboolean result, gpointer closure) +{ + LmMessage *m; + loudgame_t *lg = closure; + + if (! result) { + g_print ("Authentication for %s failed\n", lg->name); + loudgame_quit (lg, 1); + return; + } + + m = lm_message_new_with_sub_type (NULL, + LM_MESSAGE_TYPE_PRESENCE, + LM_MESSAGE_SUB_TYPE_AVAILABLE); + + lm_connection_send (connection, m, NULL); + lm_message_unref (m); +} + +static void +connection_open_cb (LmConnection *connection, gboolean result, loudgame_t *lg) +{ + lm_connection_authenticate (connection, + lg->name, lg->passwd, "TestLM", + authentication_cb, lg, FALSE, NULL); +} + +static void +send_reply (LmConnection *connection, + const char *peer, + const char *message, + loudgame_t *lg) +{ + 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: error->message"); + loudgame_quit (lg, 1); + } +} + +static void +handle_command (LmConnection *connection, + const char *peer, + const char *command, + loudgame_t *lg) +{ + char *error; + + if (strcmp (command, "quit") == 0) { + loudgame_quit (lg, 0); + return; + } + + error = g_strdup_printf ("Unknown command: '%s'", command); + send_reply (connection, peer, error, lg); + free (error); +} + +static LmHandlerResult +handle_messages (LmMessageHandler *handler, + LmConnection *connection, + LmMessage *m, + gpointer closure) +{ + loudgame_t *lg = closure; + LmMessageNode *body; + const char *peer; + const char *body_str; + + peer = lm_message_node_get_attribute (m->node, "from"); + + 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, lg); + else + send_reply (connection, peer, body_str, lg); + } + + return LM_HANDLER_RESULT_REMOVE_MESSAGE; +} + +static gboolean +make_connection (gpointer closure) +{ + loudgame_t *lg; + LmMessageHandler *handler; + gchar *jid; + GError *error; + + lg = closure; + + lg->connection = lm_connection_new (lg->server); + + jid = g_strdup_printf ("%s@%s", lg->name, lg->server); + lm_connection_set_jid (lg->connection, jid); + g_free (jid); + + handler = lm_message_handler_new (handle_messages, lg, NULL); + lm_connection_register_message_handler (lg->connection, + handler, + LM_MESSAGE_TYPE_MESSAGE, + LM_HANDLER_PRIORITY_NORMAL); + + lm_message_handler_unref (handler); + + if (! lm_connection_open (lg->connection, + (LmResultFunction) connection_open_cb, + lg, NULL, &error)) + { + g_print ("Opening connection failed: %s\n", error->message); + loudgame_quit (lg, 1); + } + + /* Return false to not schedule another call. */ + return 0; +} + +int +main (int argc, char **argv) +{ + loudgame_t lg; + + if (argc != 4) { + g_print ("Usage: %s \n", argv[0]); + return 1; + } + + lg.server = argv[1]; + lg.name = argv[2]; + lg.passwd = argv[3]; + + lg.connection = NULL; + + lg.main_loop = g_main_loop_new (NULL, FALSE); + + g_idle_add (make_connection, &lg); + + g_main_loop_run (lg.main_loop); + + g_main_loop_unref (lg.main_loop); + + return lg.return_value; +}