loudmouth/lm-message-handler.c
author Senko Rasic <senko.rasic@collabora.co.uk>
Sun, 30 Nov 2008 10:20:08 +0100
changeset 575 daad23d59b56
parent 168 ac1affcd5d22
child 417 364c17252e5f
permissions -rw-r--r--
Don't check for sync dns problems when using asyncns [#33] lm_socket_create() checks for sync DNS failure, but the check is executed even if Loudmouth is using asyncns, in which case Loudmouth crashes. committer: Mikael Hallendal <micke@imendio.com>
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
     1
/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
     2
/*
99
81e9d035de02 2004-10-05 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 84
diff changeset
     3
 * Copyright (C) 2003 Imendio AB
1
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
     4
 *
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
     5
 * This program is free software; you can redistribute it and/or
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
     6
 * modify it under the terms of the GNU Lesser General Public License as
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
     7
 * published by the Free Software Foundation; either version 2 of the
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
     8
 * License, or (at your option) any later version.
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
     9
 *
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    10
 * This program is distributed in the hope that it will be useful,
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    11
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    12
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    13
 * Lesser General Public License for more details.
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    14
 *
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    15
 * You should have received a copy of the GNU Lesser General Public
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    16
 * License along with this program; if not, write to the
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    17
 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    18
 * Boston, MA 02111-1307, USA.
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    19
 */
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    20
66
577d5059b718 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 57
diff changeset
    21
#include <config.h>
577d5059b718 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 57
diff changeset
    22
1
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    23
#include "lm-internals.h"
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    24
#include "lm-message-handler.h"
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    25
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    26
struct LmMessageHandler {
19
bb3195f74ac7 2003-07-17 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 7
diff changeset
    27
	gboolean                valid;
1
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    28
        gint                    ref_count;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    29
        LmHandleMessageFunction function;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    30
        gpointer                user_data;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    31
        GDestroyNotify          notify;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    32
};
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    33
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    34
LmHandlerResult 
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    35
_lm_message_handler_handle_message (LmMessageHandler *handler,
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    36
                                    LmConnection     *connection,
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    37
                                    LmMessage        *message)
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    38
{
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    39
        g_return_val_if_fail (handler != NULL, 
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    40
                          LM_HANDLER_RESULT_ALLOW_MORE_HANDLERS);
19
bb3195f74ac7 2003-07-17 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 7
diff changeset
    41
bb3195f74ac7 2003-07-17 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 7
diff changeset
    42
	if (!handler->valid) {
bb3195f74ac7 2003-07-17 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 7
diff changeset
    43
		return LM_HANDLER_RESULT_ALLOW_MORE_HANDLERS;
bb3195f74ac7 2003-07-17 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 7
diff changeset
    44
	}
1
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    45
        
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    46
        if (handler->function) {
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    47
                return (* handler->function) (handler, connection, 
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    48
                                              message, handler->user_data);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    49
        }
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    50
        
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    51
        return LM_HANDLER_RESULT_ALLOW_MORE_HANDLERS;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    52
}
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    53
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    54
/**
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    55
 * lm_message_handler_new:
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    56
 * @function: a callback
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    57
 * @user_data: user data passed to function
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    58
 * @notify: function called when the message handler is freed
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    59
 * 
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    60
 * Creates a new message handler. This can be set to handle incoming messages
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    61
 * and when a message of the type the handler is registered to handle is
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    62
 * received @function will be called and @user_data will be passed to it.
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    63
 * @notify is called when the message handler is freed, that way any memory
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    64
 * allocated by @user_data can be freed.
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    65
 * 
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    66
 * Return value: a newly created message handler
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    67
 **/
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    68
LmMessageHandler *
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    69
lm_message_handler_new (LmHandleMessageFunction function,
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    70
                        gpointer                user_data,
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    71
                        GDestroyNotify          notify)
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    72
{
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    73
        LmMessageHandler *handler;
168
ac1affcd5d22 2006-09-01 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 99
diff changeset
    74
ac1affcd5d22 2006-09-01 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 99
diff changeset
    75
	g_return_val_if_fail (function != NULL, NULL);
1
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    76
        
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    77
        handler = g_new0 (LmMessageHandler, 1);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    78
        
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    79
        if (handler == NULL) {
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    80
                return NULL;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    81
        }
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    82
        
19
bb3195f74ac7 2003-07-17 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 7
diff changeset
    83
	handler->valid     = TRUE;	
1
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    84
        handler->ref_count = 1;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    85
        handler->function  = function;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    86
        handler->user_data = user_data;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    87
        handler->notify    = notify;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    88
        
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    89
        return handler;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    90
}
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    91
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    92
/**
19
bb3195f74ac7 2003-07-17 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 7
diff changeset
    93
 * lm_message_handler_invalidate
bb3195f74ac7 2003-07-17 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 7
diff changeset
    94
 * @handler: an #LmMessageHandler
bb3195f74ac7 2003-07-17 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 7
diff changeset
    95
 *
bb3195f74ac7 2003-07-17 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 7
diff changeset
    96
 * Invalidates the handler. Useful if you need to cancel a reply
bb3195f74ac7 2003-07-17 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 7
diff changeset
    97
 **/
bb3195f74ac7 2003-07-17 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 7
diff changeset
    98
void
bb3195f74ac7 2003-07-17 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 7
diff changeset
    99
lm_message_handler_invalidate (LmMessageHandler *handler)
bb3195f74ac7 2003-07-17 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 7
diff changeset
   100
{
bb3195f74ac7 2003-07-17 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 7
diff changeset
   101
	handler->valid = FALSE;
bb3195f74ac7 2003-07-17 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 7
diff changeset
   102
}
bb3195f74ac7 2003-07-17 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 7
diff changeset
   103
bb3195f74ac7 2003-07-17 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 7
diff changeset
   104
/**
bb3195f74ac7 2003-07-17 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 7
diff changeset
   105
 * lm_message_handler_is_valid
bb3195f74ac7 2003-07-17 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 7
diff changeset
   106
 * @handler: an #LmMessageHandler
bb3195f74ac7 2003-07-17 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 7
diff changeset
   107
 *
bb3195f74ac7 2003-07-17 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 7
diff changeset
   108
 * Fetches whether the handler is valid or not.
bb3195f74ac7 2003-07-17 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 7
diff changeset
   109
 *
bb3195f74ac7 2003-07-17 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 7
diff changeset
   110
 * Return value: #TRUE if @handler is valid, otherwise #FALSE
bb3195f74ac7 2003-07-17 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 7
diff changeset
   111
 **/
bb3195f74ac7 2003-07-17 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 7
diff changeset
   112
gboolean
bb3195f74ac7 2003-07-17 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 7
diff changeset
   113
lm_message_handler_is_valid (LmMessageHandler *handler)
bb3195f74ac7 2003-07-17 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 7
diff changeset
   114
{
168
ac1affcd5d22 2006-09-01 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 99
diff changeset
   115
	g_return_val_if_fail (handler != NULL, FALSE);
ac1affcd5d22 2006-09-01 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 99
diff changeset
   116
19
bb3195f74ac7 2003-07-17 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 7
diff changeset
   117
	return handler->valid;
bb3195f74ac7 2003-07-17 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 7
diff changeset
   118
}
bb3195f74ac7 2003-07-17 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 7
diff changeset
   119
bb3195f74ac7 2003-07-17 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 7
diff changeset
   120
/**
1
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   121
 * lm_message_handler_ref:
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   122
 * @handler: an #LmMessageHandler
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   123
 * 
66
577d5059b718 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 57
diff changeset
   124
 * Adds a reference to @handler.
1
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   125
 * 
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   126
 * Return value: the message handler
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   127
 **/
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   128
LmMessageHandler *
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   129
lm_message_handler_ref (LmMessageHandler *handler)
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   130
{
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   131
        g_return_val_if_fail (handler != NULL, NULL);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   132
        
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   133
        handler->ref_count++;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   134
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   135
        return handler;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   136
}
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   137
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   138
/**
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   139
 * lm_message_handler_unref:
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   140
 * @handler: an #LmMessagHandler
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   141
 * 
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   142
 * Removes a reference from @handler. When no more references are present the 
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   143
 * handler is freed.
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   144
 **/
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   145
void
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   146
lm_message_handler_unref (LmMessageHandler *handler)
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   147
{
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   148
        g_return_if_fail (handler != NULL);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   149
        
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   150
        handler->ref_count --;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   151
        
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   152
        if (handler->ref_count == 0) {
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   153
                if (handler->notify) {
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   154
                        (* handler->notify) (handler->user_data);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   155
                }
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   156
                g_free (handler);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   157
        }
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   158
}
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   159