loudmouth/lm-message-handler.c
author hallski <hallski>
Mon, 19 May 2003 18:27:00 +0000
changeset 1 50e230cf7818
child 3 5c632650c603
permissions -rw-r--r--
Initial revision
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
/*
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
     3
 * Copyright (C) 2003 Mikael Hallendal <micke@codefactory.se>
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
     4
 * Copyright (C) 2003 CodeFactory AB. 
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
     5
 *
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
     6
 * This program is free software; you can redistribute it and/or
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
     7
 * modify it under the terms of the GNU Lesser General Public License as
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
     8
 * published by the Free Software Foundation; either version 2 of the
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
     9
 * License, or (at your option) any later version.
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    10
 *
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    11
 * This program is distributed in the hope that it will be useful,
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    12
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    13
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    14
 * Lesser General Public License for more details.
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    15
 *
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    16
 * You should have received a copy of the GNU Lesser General Public
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    17
 * License along with this program; if not, write to the
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    18
 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    19
 * Boston, MA 02111-1307, USA.
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    20
 */
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    21
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    22
#include "lm-internals.h"
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    23
#include "lm-message-handler.h"
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    24
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    25
struct LmMessageHandler {
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    26
        gint                    ref_count;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    27
        LmHandleMessageFunction function;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    28
        gpointer                user_data;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    29
        GDestroyNotify          notify;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    30
};
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    31
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    32
LmHandlerResult 
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    33
_lm_message_handler_handle_message (LmMessageHandler *handler,
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    34
                                    LmConnection     *connection,
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    35
                                    LmMessage        *message)
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    36
{
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    37
        g_return_val_if_fail (handler != NULL, 
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    38
                          LM_HANDLER_RESULT_ALLOW_MORE_HANDLERS);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    39
        
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    40
        if (handler->function) {
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    41
                return (* handler->function) (handler, connection, 
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    42
                                              message, handler->user_data);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    43
        }
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    44
        
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    45
        return LM_HANDLER_RESULT_ALLOW_MORE_HANDLERS;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    46
}
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    47
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    48
/**
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    49
 * lm_message_handler_new:
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    50
 * @function: a callback
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    51
 * @user_data: user data passed to function
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    52
 * @notify: function called when the message handler is freed
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    53
 * 
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    54
 * Creates a new message handler. This can be set to handle incoming messages
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    55
 * and when a message of the type the handler is registered to handle is
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    56
 * received @function will be called and @user_data will be passed to it.
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    57
 * @notify is called when the message handler is freed, that way any memory
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    58
 * allocated by @user_data can be freed.
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    59
 * 
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    60
 * Return value: a newly created message handler
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    61
 **/
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    62
LmMessageHandler *
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    63
lm_message_handler_new (LmHandleMessageFunction function,
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    64
                        gpointer                user_data,
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    65
                        GDestroyNotify          notify)
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    66
{
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    67
        LmMessageHandler *handler;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    68
        
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    69
        handler = g_new0 (LmMessageHandler, 1);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    70
        
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    71
        if (handler == NULL) {
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    72
                return NULL;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    73
        }
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    74
        
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    75
        handler->ref_count = 1;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    76
        handler->function  = function;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    77
        handler->user_data = user_data;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    78
        handler->notify    = notify;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    79
        
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    80
        return handler;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    81
}
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    82
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    83
/**
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    84
 * lm_message_handler_ref:
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    85
 * @handler: an #LmMessageHandler
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    86
 * 
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    87
 * Adds a reference to @node.
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    88
 * 
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    89
 * Return value: the message handler
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    90
 **/
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    91
LmMessageHandler *
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    92
lm_message_handler_ref (LmMessageHandler *handler)
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    93
{
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    94
        g_return_val_if_fail (handler != NULL, NULL);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    95
        
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    96
        handler->ref_count++;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    97
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    98
        return handler;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    99
}
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   100
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   101
/**
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   102
 * lm_message_handler_unref:
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   103
 * @handler: an #LmMessagHandler
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   104
 * 
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   105
 * Removes a reference from @handler. When no more references are present the 
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   106
 * handler is freed.
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   107
 **/
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   108
void
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   109
lm_message_handler_unref (LmMessageHandler *handler)
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   110
{
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   111
        g_return_if_fail (handler != NULL);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   112
        
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   113
        handler->ref_count --;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   114
        
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   115
        if (handler->ref_count == 0) {
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   116
                if (handler->notify) {
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   117
                        (* handler->notify) (handler->user_data);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   118
                }
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   119
                g_free (handler);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   120
        }
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   121
}
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   122