examples/lm-send-async.c
author Owen Taylor <otaylor@redhat.com>
Mon, 25 Feb 2008 23:13:58 +0100
changeset 343 35a19649d773
parent 246 ef2e388b8412
child 482 08a9810b415b
permissions -rw-r--r--
Fixed reentrancy problem for async connections. Fixes first bit of LM-117. Patch adding reference to sockets in places where otherwise we can run into trouble where the user callback causes the socket to be freed. (Note that we actually double ref the socket in some cases ...both inside lm_socket_fail_with_error() and in the caller. This is, of course, harmless, and needed because the inner ref is necessary to handle the calls to _lm_socket_fail_with_error() from lm-proxy.c, the outer ref necessary because we reference socket after calling _lm_socket_fail_with_error()) committer: Mikael Hallendal <micke@imendio.com>
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
/*
140
103227122f45 2006-04-19 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 99
diff changeset
     3
 * Copyright (C) 2003-2006 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>
140
103227122f45 2006-04-19 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 99
diff changeset
    31
83
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
    32
#include <loudmouth/loudmouth.h>
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
    33
140
103227122f45 2006-04-19 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 99
diff changeset
    34
static GMainLoop *main_loop;
103227122f45 2006-04-19 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 99
diff changeset
    35
static gboolean   test_success = FALSE;
103227122f45 2006-04-19 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 99
diff changeset
    36
103227122f45 2006-04-19 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 99
diff changeset
    37
static gchar      expected_fingerprint[20];
103227122f45 2006-04-19 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 99
diff changeset
    38
103227122f45 2006-04-19 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 99
diff changeset
    39
static gchar     *server = NULL;
103227122f45 2006-04-19 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 99
diff changeset
    40
static gint       port = 5222;
103227122f45 2006-04-19 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 99
diff changeset
    41
static gchar     *username = NULL;
103227122f45 2006-04-19 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 99
diff changeset
    42
static gchar     *password = NULL;
103227122f45 2006-04-19 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 99
diff changeset
    43
static gchar     *resource = "lm-send-async";
103227122f45 2006-04-19 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 99
diff changeset
    44
static gchar     *recipient = NULL;
103227122f45 2006-04-19 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 99
diff changeset
    45
static gchar     *fingerprint = NULL;
103227122f45 2006-04-19 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 99
diff changeset
    46
static gchar     *message = "test asynchronous message";
83
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
    47
140
103227122f45 2006-04-19 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 99
diff changeset
    48
static GOptionEntry entries[] = 
103227122f45 2006-04-19 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 99
diff changeset
    49
{
103227122f45 2006-04-19 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 99
diff changeset
    50
  { "server", 's', 0, G_OPTION_ARG_STRING, &server, 
103227122f45 2006-04-19 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 99
diff changeset
    51
    "Server to connect to", NULL },
103227122f45 2006-04-19 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 99
diff changeset
    52
  { "port", 'P', 0, G_OPTION_ARG_INT, &port, 
103227122f45 2006-04-19 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 99
diff changeset
    53
    "Port to connect to [default=5222]", NULL },
103227122f45 2006-04-19 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 99
diff changeset
    54
  { "username", 'u', 0, G_OPTION_ARG_STRING, &username, 
103227122f45 2006-04-19 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 99
diff changeset
    55
    "Username to connect with (e.g. 'user' in user@server.org)", NULL },
103227122f45 2006-04-19 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 99
diff changeset
    56
  { "password", 'p', 0, G_OPTION_ARG_STRING, &password, 
103227122f45 2006-04-19 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 99
diff changeset
    57
    "Password to try", NULL },
103227122f45 2006-04-19 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 99
diff changeset
    58
  { "resource", 'r', 0, G_OPTION_ARG_STRING, &resource, 
103227122f45 2006-04-19 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 99
diff changeset
    59
    "Resource connect with [default=lm-send-async]", NULL },
103227122f45 2006-04-19 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 99
diff changeset
    60
  { "recipient", 'R', 0, G_OPTION_ARG_STRING, &recipient, 
103227122f45 2006-04-19 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 99
diff changeset
    61
    "Recipient to send the message to (e.g. user@server.org)", NULL },
103227122f45 2006-04-19 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 99
diff changeset
    62
  { "fingerprint", 'f', 0, G_OPTION_ARG_STRING, &fingerprint, 
103227122f45 2006-04-19 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 99
diff changeset
    63
    "SSL Fingerprint to use", NULL },
103227122f45 2006-04-19 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 99
diff changeset
    64
  { "message", 'm', 0, G_OPTION_ARG_STRING, &message, 
103227122f45 2006-04-19 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 99
diff changeset
    65
    "Message to send to recipient [default=test message]", NULL },
103227122f45 2006-04-19 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 99
diff changeset
    66
  { NULL }
103227122f45 2006-04-19 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 99
diff changeset
    67
};
83
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
    68
167
7bcccfa734e2 * examples/lm-send-async.c:
mr <mr>
parents: 140
diff changeset
    69
static gchar *
7bcccfa734e2 * examples/lm-send-async.c:
mr <mr>
parents: 140
diff changeset
    70
get_part_name (const gchar *username)
7bcccfa734e2 * examples/lm-send-async.c:
mr <mr>
parents: 140
diff changeset
    71
{
7bcccfa734e2 * examples/lm-send-async.c:
mr <mr>
parents: 140
diff changeset
    72
	const gchar *ch;
7bcccfa734e2 * examples/lm-send-async.c:
mr <mr>
parents: 140
diff changeset
    73
7bcccfa734e2 * examples/lm-send-async.c:
mr <mr>
parents: 140
diff changeset
    74
	g_return_val_if_fail (username != NULL, NULL);
7bcccfa734e2 * examples/lm-send-async.c:
mr <mr>
parents: 140
diff changeset
    75
7bcccfa734e2 * examples/lm-send-async.c:
mr <mr>
parents: 140
diff changeset
    76
	ch = strchr (username, '@');
7bcccfa734e2 * examples/lm-send-async.c:
mr <mr>
parents: 140
diff changeset
    77
	if (!ch) {
7bcccfa734e2 * examples/lm-send-async.c:
mr <mr>
parents: 140
diff changeset
    78
		return NULL;
7bcccfa734e2 * examples/lm-send-async.c:
mr <mr>
parents: 140
diff changeset
    79
	}
7bcccfa734e2 * examples/lm-send-async.c:
mr <mr>
parents: 140
diff changeset
    80
7bcccfa734e2 * examples/lm-send-async.c:
mr <mr>
parents: 140
diff changeset
    81
	return g_strndup (username, ch - username);
7bcccfa734e2 * examples/lm-send-async.c:
mr <mr>
parents: 140
diff changeset
    82
}
7bcccfa734e2 * examples/lm-send-async.c:
mr <mr>
parents: 140
diff changeset
    83
83
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
    84
static void
140
103227122f45 2006-04-19 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 99
diff changeset
    85
print_finger (const char   *fpr,
103227122f45 2006-04-19 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 99
diff changeset
    86
	      unsigned int  size)
103227122f45 2006-04-19 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 99
diff changeset
    87
{
103227122f45 2006-04-19 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 99
diff changeset
    88
	gint i;
103227122f45 2006-04-19 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 99
diff changeset
    89
	for (i = 0; i < size-1; i++) {
103227122f45 2006-04-19 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 99
diff changeset
    90
		g_printerr ("%02X:", fpr[i]);
103227122f45 2006-04-19 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 99
diff changeset
    91
	}
103227122f45 2006-04-19 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 99
diff changeset
    92
	
103227122f45 2006-04-19 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 99
diff changeset
    93
	g_printerr ("%02X", fpr[size-1]);
103227122f45 2006-04-19 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 99
diff changeset
    94
}
103227122f45 2006-04-19 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 99
diff changeset
    95
103227122f45 2006-04-19 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 99
diff changeset
    96
static LmSSLResponse
103227122f45 2006-04-19 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 99
diff changeset
    97
ssl_cb (LmSSL       *ssl, 
103227122f45 2006-04-19 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 99
diff changeset
    98
	LmSSLStatus  status, 
103227122f45 2006-04-19 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 99
diff changeset
    99
	gpointer     ud)
83
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
   100
{
140
103227122f45 2006-04-19 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 99
diff changeset
   101
	g_print ("LmSendAsync: SSL status:%d\n", status);
103227122f45 2006-04-19 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 99
diff changeset
   102
103227122f45 2006-04-19 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 99
diff changeset
   103
	switch (status) {
103227122f45 2006-04-19 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 99
diff changeset
   104
	case LM_SSL_STATUS_NO_CERT_FOUND:
103227122f45 2006-04-19 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 99
diff changeset
   105
		g_printerr ("LmSendAsync: No certificate found!\n");
103227122f45 2006-04-19 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 99
diff changeset
   106
		break;
103227122f45 2006-04-19 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 99
diff changeset
   107
	case LM_SSL_STATUS_UNTRUSTED_CERT:
103227122f45 2006-04-19 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 99
diff changeset
   108
		g_printerr ("LmSendAsync: Certificate is not trusted!\n"); 
103227122f45 2006-04-19 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 99
diff changeset
   109
		break;
103227122f45 2006-04-19 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 99
diff changeset
   110
	case LM_SSL_STATUS_CERT_EXPIRED:
103227122f45 2006-04-19 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 99
diff changeset
   111
		g_printerr ("LmSendAsync: Certificate has expired!\n"); 
103227122f45 2006-04-19 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 99
diff changeset
   112
		break;
103227122f45 2006-04-19 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 99
diff changeset
   113
	case LM_SSL_STATUS_CERT_NOT_ACTIVATED:
103227122f45 2006-04-19 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 99
diff changeset
   114
		g_printerr ("LmSendAsync: Certificate has not been activated!\n"); 
103227122f45 2006-04-19 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 99
diff changeset
   115
		break;
103227122f45 2006-04-19 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 99
diff changeset
   116
	case LM_SSL_STATUS_CERT_HOSTNAME_MISMATCH:
103227122f45 2006-04-19 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 99
diff changeset
   117
		g_printerr ("LmSendAsync: Certificate hostname does not match expected hostname!\n"); 
103227122f45 2006-04-19 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 99
diff changeset
   118
		break;
103227122f45 2006-04-19 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 99
diff changeset
   119
	case LM_SSL_STATUS_CERT_FINGERPRINT_MISMATCH: {
103227122f45 2006-04-19 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 99
diff changeset
   120
		const char *fpr = lm_ssl_get_fingerprint (ssl);
103227122f45 2006-04-19 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 99
diff changeset
   121
		g_printerr ("LmSendAsync: Certificate fingerprint does not match expected fingerprint!\n"); 
103227122f45 2006-04-19 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 99
diff changeset
   122
		g_printerr ("LmSendAsync: Remote fingerprint: ");
103227122f45 2006-04-19 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 99
diff changeset
   123
		print_finger (fpr, 16);
103227122f45 2006-04-19 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 99
diff changeset
   124
103227122f45 2006-04-19 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 99
diff changeset
   125
		g_printerr ("\n"
103227122f45 2006-04-19 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 99
diff changeset
   126
			    "LmSendAsync: Expected fingerprint: ");
103227122f45 2006-04-19 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 99
diff changeset
   127
		print_finger (expected_fingerprint, 16);
103227122f45 2006-04-19 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 99
diff changeset
   128
		g_printerr ("\n");
103227122f45 2006-04-19 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 99
diff changeset
   129
		break;
103227122f45 2006-04-19 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 99
diff changeset
   130
	}
103227122f45 2006-04-19 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 99
diff changeset
   131
	case LM_SSL_STATUS_GENERIC_ERROR:
103227122f45 2006-04-19 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 99
diff changeset
   132
		g_printerr ("LmSendAsync: Generic SSL error!\n"); 
103227122f45 2006-04-19 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 99
diff changeset
   133
		break;
103227122f45 2006-04-19 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 99
diff changeset
   134
	}
103227122f45 2006-04-19 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 99
diff changeset
   135
103227122f45 2006-04-19 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 99
diff changeset
   136
	return LM_SSL_RESPONSE_CONTINUE;
83
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
   137
}
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
   138
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
   139
static void
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
   140
connection_auth_cb (LmConnection *connection, 
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
   141
                    gboolean      success, 
140
103227122f45 2006-04-19 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 99
diff changeset
   142
                    gpointer      user_data)
83
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
   143
{
140
103227122f45 2006-04-19 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 99
diff changeset
   144
	if (success) {
103227122f45 2006-04-19 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 99
diff changeset
   145
		GError    *error = NULL;
103227122f45 2006-04-19 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 99
diff changeset
   146
		LmMessage *m;
83
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
   147
140
103227122f45 2006-04-19 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 99
diff changeset
   148
		g_print ("LmSendAsync: Authenticated successfully\n");
103227122f45 2006-04-19 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 99
diff changeset
   149
		
103227122f45 2006-04-19 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 99
diff changeset
   150
		m = lm_message_new (recipient, LM_MESSAGE_TYPE_MESSAGE);
103227122f45 2006-04-19 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 99
diff changeset
   151
		lm_message_node_add_child (m->node, "body", message);
103227122f45 2006-04-19 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 99
diff changeset
   152
		
103227122f45 2006-04-19 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 99
diff changeset
   153
		if (!lm_connection_send (connection, m, &error)) {
103227122f45 2006-04-19 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 99
diff changeset
   154
			g_printerr ("LmSendAsync: Failed to send message:'%s'\n", 
103227122f45 2006-04-19 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 99
diff changeset
   155
				 lm_message_node_to_string (m->node));
103227122f45 2006-04-19 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 99
diff changeset
   156
		} else {
103227122f45 2006-04-19 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 99
diff changeset
   157
			g_print ("LmSendAsync: Sent message:'%s'\n", 
103227122f45 2006-04-19 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 99
diff changeset
   158
				 lm_message_node_to_string (m->node));
103227122f45 2006-04-19 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 99
diff changeset
   159
			test_success = TRUE;
103227122f45 2006-04-19 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 99
diff changeset
   160
		}
103227122f45 2006-04-19 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 99
diff changeset
   161
		
103227122f45 2006-04-19 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 99
diff changeset
   162
		lm_message_unref (m);
103227122f45 2006-04-19 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 99
diff changeset
   163
	} else {
103227122f45 2006-04-19 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 99
diff changeset
   164
		g_printerr ("LmSendAsync: Failed to authenticate\n");
103227122f45 2006-04-19 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 99
diff changeset
   165
	}
83
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
   166
140
103227122f45 2006-04-19 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 99
diff changeset
   167
	lm_connection_close (connection, NULL);
103227122f45 2006-04-19 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 99
diff changeset
   168
	g_main_loop_quit (main_loop);
83
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
   169
}
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
   170
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
   171
static void
140
103227122f45 2006-04-19 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 99
diff changeset
   172
connection_open_cb (LmConnection *connection,
103227122f45 2006-04-19 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 99
diff changeset
   173
		    gboolean      success,
103227122f45 2006-04-19 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 99
diff changeset
   174
		    gpointer      user_data)
83
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
   175
{
140
103227122f45 2006-04-19 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 99
diff changeset
   176
	if (success) {
167
7bcccfa734e2 * examples/lm-send-async.c:
mr <mr>
parents: 140
diff changeset
   177
		gchar *user;
7bcccfa734e2 * examples/lm-send-async.c:
mr <mr>
parents: 140
diff changeset
   178
7bcccfa734e2 * examples/lm-send-async.c:
mr <mr>
parents: 140
diff changeset
   179
		user = get_part_name (username);
7bcccfa734e2 * examples/lm-send-async.c:
mr <mr>
parents: 140
diff changeset
   180
		if (!lm_connection_authenticate (connection, user, 
140
103227122f45 2006-04-19 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 99
diff changeset
   181
						 password, resource,
103227122f45 2006-04-19 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 99
diff changeset
   182
						 connection_auth_cb, 
103227122f45 2006-04-19 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 99
diff changeset
   183
						 NULL, FALSE,  NULL)) {
167
7bcccfa734e2 * examples/lm-send-async.c:
mr <mr>
parents: 140
diff changeset
   184
			g_free (user);
140
103227122f45 2006-04-19 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 99
diff changeset
   185
			g_printerr ("LmSendAsync: Failed to send authentication\n");
103227122f45 2006-04-19 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 99
diff changeset
   186
			g_main_loop_quit (main_loop);
103227122f45 2006-04-19 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 99
diff changeset
   187
			return;
103227122f45 2006-04-19 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 99
diff changeset
   188
		}
167
7bcccfa734e2 * examples/lm-send-async.c:
mr <mr>
parents: 140
diff changeset
   189
7bcccfa734e2 * examples/lm-send-async.c:
mr <mr>
parents: 140
diff changeset
   190
		g_free (user);
7bcccfa734e2 * examples/lm-send-async.c:
mr <mr>
parents: 140
diff changeset
   191
140
103227122f45 2006-04-19 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 99
diff changeset
   192
		g_print ("LmSendAsync: Sent authentication message\n");
103227122f45 2006-04-19 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 99
diff changeset
   193
	} else {
103227122f45 2006-04-19 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 99
diff changeset
   194
		g_printerr ("LmSendAsync: Failed to connect\n");
103227122f45 2006-04-19 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 99
diff changeset
   195
		g_main_loop_quit (main_loop);
103227122f45 2006-04-19 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 99
diff changeset
   196
	}
83
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
   197
}
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
   198
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
   199
int
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
   200
main (int argc, char **argv)
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
   201
{
140
103227122f45 2006-04-19 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 99
diff changeset
   202
	GMainContext   *main_context;
103227122f45 2006-04-19 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 99
diff changeset
   203
	GOptionContext *context;
103227122f45 2006-04-19 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 99
diff changeset
   204
        LmConnection   *connection;
103227122f45 2006-04-19 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 99
diff changeset
   205
103227122f45 2006-04-19 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 99
diff changeset
   206
	context = g_option_context_new ("- test send message asynchronously");
103227122f45 2006-04-19 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 99
diff changeset
   207
	g_option_context_add_main_entries (context, entries, NULL);
103227122f45 2006-04-19 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 99
diff changeset
   208
	g_option_context_parse (context, &argc, &argv, NULL);
103227122f45 2006-04-19 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 99
diff changeset
   209
	g_option_context_free (context);
103227122f45 2006-04-19 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 99
diff changeset
   210
	
246
ef2e388b8412 Remove the requirement to set server explicit from the examples.
Mikael Hallendal <micke@imendio.com>
parents: 167
diff changeset
   211
	if (!username || !password || !recipient) {
140
103227122f45 2006-04-19 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 99
diff changeset
   212
		g_printerr ("For usage, try %s --help\n", argv[0]);
103227122f45 2006-04-19 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 99
diff changeset
   213
		return EXIT_FAILURE;
103227122f45 2006-04-19 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 99
diff changeset
   214
	}
103227122f45 2006-04-19 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 99
diff changeset
   215
167
7bcccfa734e2 * examples/lm-send-async.c:
mr <mr>
parents: 140
diff changeset
   216
	if (username && strchr (username, '@') == NULL) {
7bcccfa734e2 * examples/lm-send-async.c:
mr <mr>
parents: 140
diff changeset
   217
		g_printerr ("LmSendAsync: Username must have an '@' included\n");
7bcccfa734e2 * examples/lm-send-async.c:
mr <mr>
parents: 140
diff changeset
   218
		return EXIT_FAILURE;
7bcccfa734e2 * examples/lm-send-async.c:
mr <mr>
parents: 140
diff changeset
   219
	}
7bcccfa734e2 * examples/lm-send-async.c:
mr <mr>
parents: 140
diff changeset
   220
140
103227122f45 2006-04-19 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 99
diff changeset
   221
	main_context = g_main_context_new ();
103227122f45 2006-04-19 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 99
diff changeset
   222
        connection = lm_connection_new_with_context (server, main_context);
103227122f45 2006-04-19 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 99
diff changeset
   223
	lm_connection_set_port (connection, port);
167
7bcccfa734e2 * examples/lm-send-async.c:
mr <mr>
parents: 140
diff changeset
   224
	lm_connection_set_jid (connection, username);
83
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
   225
140
103227122f45 2006-04-19 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 99
diff changeset
   226
	if (fingerprint) {
103227122f45 2006-04-19 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 99
diff changeset
   227
		LmSSL *ssl;
103227122f45 2006-04-19 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 99
diff changeset
   228
		char  *p;
103227122f45 2006-04-19 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 99
diff changeset
   229
		int    i;
103227122f45 2006-04-19 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 99
diff changeset
   230
		
103227122f45 2006-04-19 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 99
diff changeset
   231
		if (port == LM_CONNECTION_DEFAULT_PORT) {
103227122f45 2006-04-19 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 99
diff changeset
   232
			lm_connection_set_port (connection,
103227122f45 2006-04-19 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 99
diff changeset
   233
						LM_CONNECTION_DEFAULT_PORT_SSL);
103227122f45 2006-04-19 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 99
diff changeset
   234
		}
83
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
   235
140
103227122f45 2006-04-19 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 99
diff changeset
   236
		for (i = 0, p = fingerprint; *p && *(p+1); i++, p += 3) {
103227122f45 2006-04-19 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 99
diff changeset
   237
			expected_fingerprint[i] = (unsigned char) g_ascii_strtoull (p, NULL, 16);
103227122f45 2006-04-19 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 99
diff changeset
   238
		}
103227122f45 2006-04-19 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 99
diff changeset
   239
	
103227122f45 2006-04-19 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 99
diff changeset
   240
		ssl = lm_ssl_new (expected_fingerprint,
103227122f45 2006-04-19 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 99
diff changeset
   241
				  (LmSSLFunction) ssl_cb,
103227122f45 2006-04-19 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 99
diff changeset
   242
				  NULL, NULL);
103227122f45 2006-04-19 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 99
diff changeset
   243
	
103227122f45 2006-04-19 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 99
diff changeset
   244
		lm_connection_set_ssl (connection, ssl);
103227122f45 2006-04-19 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 99
diff changeset
   245
		lm_ssl_unref (ssl);
103227122f45 2006-04-19 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 99
diff changeset
   246
	}
103227122f45 2006-04-19 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 99
diff changeset
   247
103227122f45 2006-04-19 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 99
diff changeset
   248
	if (!lm_connection_open (connection, 
103227122f45 2006-04-19 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 99
diff changeset
   249
                                 (LmResultFunction) connection_open_cb,
103227122f45 2006-04-19 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 99
diff changeset
   250
                                 NULL, NULL, NULL)) {
103227122f45 2006-04-19 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 99
diff changeset
   251
                g_printerr ("LmSendAsync: Could not open a connection\n");
103227122f45 2006-04-19 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 99
diff changeset
   252
		return EXIT_FAILURE;
83
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
   253
        }
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
   254
140
103227122f45 2006-04-19 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 99
diff changeset
   255
        main_loop = g_main_loop_new (main_context, FALSE);
83
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
   256
        g_main_loop_run (main_loop);
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
   257
140
103227122f45 2006-04-19 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 99
diff changeset
   258
	return (test_success ? EXIT_SUCCESS : EXIT_FAILURE);
83
9c89653e79a1 added files
hallski <hallski>
parents:
diff changeset
   259
}