examples/lm-send-async.c
author hallski <hallski>
Sun, 10 Sep 2006 22:09:45 +0000
changeset 175 5e665ffe3e9c
parent 99 81e9d035de02
child 140 103227122f45
permissions -rw-r--r--
2006-09-11 Mikael Hallendal <micke@imendio.com> * Release 1.0.5
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
83
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
     1
/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
     2
/*
99
81e9d035de02 2004-10-05 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 83
diff changeset
     3
 * Copyright (C) 2003 Imendio AB
83
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
     4
 *
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
     5
 * This library is free software; you can redistribute it and/or
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
     6
 * modify it under the terms of the GNU Library General Public
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
     7
 * License as published by the Free Software Foundation; either
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
     8
 * version 2 of the License, or (at your option) any later version.
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
     9
 *
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
    10
 * This library is distributed in the hope that it will be useful,
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
    11
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
    12
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
    13
 * Library General Public License for more details.
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
    14
 *
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
    15
 * You should have received a copy of the GNU Library General Public
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
    16
 * License along with this library; if not, write to the
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
    17
 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
    18
 * Boston, MA 02111-1307, USA.
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
    19
 */
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
    20
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
    21
/*
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
    22
 * Description:
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
    23
 * A little program that let you send jabber messages to another person.
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
    24
 * 
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
    25
 * Build instructions:
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
    26
 * gcc -o lm-send-async `pkg-config --cflags --libs loudmouth-1.0` lm-send-async.c
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
    27
 */
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
    28
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
    29
#include <stdlib.h>
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
    30
#include <string.h>
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
    31
#include <loudmouth/loudmouth.h>
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
    32
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
    33
typedef struct {
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
    34
        const gchar *recipient;
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
    35
        const gchar *message;
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
    36
} MessageData;
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
    37
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
    38
typedef struct {
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
    39
        const gchar *username;
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
    40
        const gchar *password;
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
    41
        const gchar *resource;
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
    42
        MessageData *msg_data;
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
    43
} ConnectData;
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
    44
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
    45
static GMainLoop *main_loop;
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
    46
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
    47
static void
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
    48
print_usage (const gchar *exec_name) 
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
    49
{
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
    50
        g_print ("Usage: %s -s <server> -u <username> -p <password> -m <message> -t <recipient> [--port <port>] [-r <resource>]\n", exec_name);
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
    51
}
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
    52
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
    53
static void
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
    54
connection_auth_cb (LmConnection *connection, 
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
    55
                    gboolean      success, 
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
    56
                    MessageData  *data)
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
    57
{
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
    58
        LmMessage *m;
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
    59
        gboolean   result;
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
    60
        GError    *error = NULL;
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
    61
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
    62
        if (!success) {
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
    63
                g_error ("Authentication failed");
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
    64
        }
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
    65
        
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
    66
        m = lm_message_new (data->recipient, LM_MESSAGE_TYPE_MESSAGE);
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
    67
        lm_message_node_add_child (m->node, "body", data->message);
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
    68
        
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
    69
        result = lm_connection_send (connection, m, &error);
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
    70
        lm_message_unref (m);
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
    71
        
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
    72
        if (!result) {
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
    73
                g_error ("lm_connection_send failed");
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
    74
        }
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
    75
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
    76
        lm_connection_close (connection, NULL);
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
    77
        
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
    78
        g_main_loop_quit (main_loop);
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
    79
}
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
    80
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
    81
static void
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
    82
connection_open_result_cb (LmConnection *connection,
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
    83
                           gboolean      success,
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
    84
                           ConnectData  *data)
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
    85
{
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
    86
        GError *error = NULL;
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
    87
        
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
    88
        if (!success) {
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
    89
                g_error ("Connection failed");
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
    90
        }
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
    91
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
    92
        if (!lm_connection_authenticate (connection, data->username,
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
    93
                                         data->password, data->resource,
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
    94
                                         (LmResultFunction) connection_auth_cb,
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
    95
                                         data->msg_data,
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
    96
                                         g_free,
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
    97
                                         &error)) {
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
    98
                g_error ("lm_connection_authenticate failed");
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
    99
        }
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
   100
}
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
   101
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
   102
int
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
   103
main (int argc, char **argv)
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
   104
{
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
   105
        LmConnection *connection;
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
   106
	GMainContext *context;
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
   107
        const gchar  *server = NULL;
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
   108
        const gchar  *resource = "jabber-send";
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
   109
        const gchar  *recipient = NULL;
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
   110
        const gchar  *message = NULL;
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
   111
        const gchar  *username = NULL;
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
   112
        const gchar  *password = NULL;
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
   113
        guint         port = LM_CONNECTION_DEFAULT_PORT;
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
   114
        MessageData  *msg_data;
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
   115
        ConnectData  *connect_data;
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
   116
        GError       *error = NULL;
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
   117
        gint          i;
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
   118
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
   119
        for (i = 1; i < argc - 1; ++i) {
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
   120
                gboolean arg = FALSE;
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
   121
                
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
   122
                if (strcmp ("-s", argv[i]) == 0) {
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
   123
                        server = argv[i+1];
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
   124
                        arg = TRUE;
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
   125
                }
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
   126
                else if (strcmp ("--port", argv[i]) == 0) {
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
   127
                        port = atoi (argv[i+1]);
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
   128
                        arg = TRUE;
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
   129
                }
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
   130
                else if (strcmp ("-m", argv[i]) == 0) {
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
   131
                        message = argv[i+1];
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
   132
                        arg = TRUE;
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
   133
                }
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
   134
                else if (strcmp ("-r", argv[i]) == 0) {
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
   135
                        resource = argv[i+1];
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
   136
                        arg = TRUE;
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
   137
                }
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
   138
                else if (strcmp ("-t", argv[i]) == 0) {
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
   139
                        recipient = argv[i+1];
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
   140
                        arg = TRUE;
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
   141
                }
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
   142
                else if (strcmp ("-u", argv[i]) == 0) {
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
   143
                        username = argv[i+1];
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
   144
                        arg = TRUE;
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
   145
                }
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
   146
                else if (strcmp ("-p", argv[i]) == 0) {
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
   147
                        password = argv[i+1];
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
   148
                        arg = TRUE;
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
   149
                }
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
   150
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
   151
                if (arg) {
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
   152
                        ++i;
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
   153
                }
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
   154
        }
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
   155
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
   156
        if (!server || !message || !recipient || !username || !password) {
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
   157
                print_usage (argv[0]);
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
   158
                return -1;
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
   159
        }
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
   160
        
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
   161
	context = g_main_context_new ();
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
   162
        connection = lm_connection_new_with_context (server, context);
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
   163
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
   164
        msg_data = g_new0 (MessageData, 1);
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
   165
        msg_data->recipient = recipient;
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
   166
        msg_data->message = message;
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
   167
       
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
   168
        connect_data = g_new0 (ConnectData, 1);
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
   169
        connect_data->username = username;
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
   170
        connect_data->password = password;
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
   171
        connect_data->resource = resource;
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
   172
        connect_data->msg_data = msg_data;
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
   173
        
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
   174
        if (!lm_connection_open (connection, 
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
   175
                                 (LmResultFunction) connection_open_result_cb,
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
   176
                                 connect_data,
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
   177
                                 g_free,
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
   178
                                 &error)) {
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
   179
                g_error ("lm_connection_open failed");
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
   180
        }
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
   181
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
   182
        main_loop = g_main_loop_new (context, FALSE);
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
   183
        g_main_loop_run (main_loop);
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
   184
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
   185
        return 0;
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
   186
}