X-Git-Url: https://git.cworth.org/git?p=loudgame;a=blobdiff_plain;f=lg-echo.c;h=c153472bb84f78ce8e1613086d0f90f0f3dcbaa9;hp=61729ad3481820fa979a2321a2d97bb9114c66bf;hb=76ee71f47307291d8d2457204fc7c44b93729bb9;hpb=dff431f2d28cb1da0769422062daba60ffe420d7 diff --git a/lg-echo.c b/lg-echo.c index 61729ad..c153472 100644 --- a/lg-echo.c +++ b/lg-echo.c @@ -1,213 +1,50 @@ /* - * Copyright (C) 2003-2004 Imendio AB * Copyright (C) 2008 Carl Worth * - * 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 free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 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. + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU 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. + * You should have received a copy of the GNU General Public License + * along with this program. If not, see http://www.gnu.org/licenses/ . * - * Authors: Imendio AB - * Carl Worth + * Author: Carl Worth */ - -#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); +#include "loudgame.h" - if (! result) { - g_error ("lm_connection_send failed: error->message"); - loudgame_quit (lg, 1); - } -} +#include +#include 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) +echo_handle_message (loudgame_t *lg, + const char *peer, + const char *message) { - 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; + loudgame_send (lg, peer, message); } int main (int argc, char **argv) { loudgame_t lg; + int err; - 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; + err = loudgame_init (&lg, argc, argv); + if (err) + return err; - lg.main_loop = g_main_loop_new (NULL, FALSE); + lg.handle_message = echo_handle_message; - g_idle_add (make_connection, &lg); + err = loudgame_run (&lg); + if (err) + return err; - g_main_loop_run (lg.main_loop); - - g_main_loop_unref (lg.main_loop); - - return lg.return_value; + return 0; }