src/irc_chan.h
author Tero Marttila <terom@fixme.fi>
Thu, 12 Mar 2009 18:35:05 +0200
changeset 38 0c2e0cb46c3a
parent 37 4fe4a3c4496e
child 45 71e65564afd2
permissions -rw-r--r--
implement irc_chan_callbacks, and add on_msg
26
aec062af155d add irc_chan module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     1
#ifndef IRC_CHAN_H
aec062af155d add irc_chan module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     2
#define IRC_CHAN_H
aec062af155d add irc_chan module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     3
aec062af155d add irc_chan module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     4
/**
aec062af155d add irc_chan module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     5
 * @file
aec062af155d add irc_chan module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     6
 *
aec062af155d add irc_chan module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     7
 * Support for IRC channels, including tracking their state and actions on them.
aec062af155d add irc_chan module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     8
 */
aec062af155d add irc_chan module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     9
struct irc_chan_info;
aec062af155d add irc_chan module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    10
struct irc_chan;
aec062af155d add irc_chan module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    11
aec062af155d add irc_chan module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    12
#include "irc_net.h"
37
4fe4a3c4496e change irc_chan.state into bool fields, move irc_cmd implementation from irc_conn.c into irc_cmd.c, remove irc_conn arg from irc_cmd_handler, add irc_conn.nickname tracking, and handle irc_chan JOINs
Tero Marttila <terom@fixme.fi>
parents: 26
diff changeset
    13
#include "irc_cmd.h"
26
aec062af155d add irc_chan module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    14
#include "error.h"
aec062af155d add irc_chan module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    15
#include <sys/queue.h>
aec062af155d add irc_chan module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    16
aec062af155d add irc_chan module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    17
/**
aec062af155d add irc_chan module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    18
 * IRC channel info, as required to create an irc_chan
aec062af155d add irc_chan module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    19
 */
aec062af155d add irc_chan module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    20
struct irc_chan_info {
aec062af155d add irc_chan module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    21
    /** Channel name, with the [#&!] prefix */
aec062af155d add irc_chan module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    22
    const char *channel;
aec062af155d add irc_chan module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    23
aec062af155d add irc_chan module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    24
};
aec062af155d add irc_chan module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    25
aec062af155d add irc_chan module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    26
/**
37
4fe4a3c4496e change irc_chan.state into bool fields, move irc_cmd implementation from irc_conn.c into irc_cmd.c, remove irc_conn arg from irc_cmd_handler, add irc_conn.nickname tracking, and handle irc_chan JOINs
Tero Marttila <terom@fixme.fi>
parents: 26
diff changeset
    27
 * Semantic IRC channel callbacks
26
aec062af155d add irc_chan module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    28
 */
37
4fe4a3c4496e change irc_chan.state into bool fields, move irc_cmd implementation from irc_conn.c into irc_cmd.c, remove irc_conn arg from irc_cmd_handler, add irc_conn.nickname tracking, and handle irc_chan JOINs
Tero Marttila <terom@fixme.fi>
parents: 26
diff changeset
    29
struct irc_chan_callbacks {
4fe4a3c4496e change irc_chan.state into bool fields, move irc_cmd implementation from irc_conn.c into irc_cmd.c, remove irc_conn arg from irc_cmd_handler, add irc_conn.nickname tracking, and handle irc_chan JOINs
Tero Marttila <terom@fixme.fi>
parents: 26
diff changeset
    30
    /** Joined the channel */
4fe4a3c4496e change irc_chan.state into bool fields, move irc_cmd implementation from irc_conn.c into irc_cmd.c, remove irc_conn arg from irc_cmd_handler, add irc_conn.nickname tracking, and handle irc_chan JOINs
Tero Marttila <terom@fixme.fi>
parents: 26
diff changeset
    31
    void (*on_self_join) (struct irc_chan *chan, void *arg);
38
0c2e0cb46c3a implement irc_chan_callbacks, and add on_msg
Tero Marttila <terom@fixme.fi>
parents: 37
diff changeset
    32
0c2e0cb46c3a implement irc_chan_callbacks, and add on_msg
Tero Marttila <terom@fixme.fi>
parents: 37
diff changeset
    33
    /** Someone sent a message to the channel */
0c2e0cb46c3a implement irc_chan_callbacks, and add on_msg
Tero Marttila <terom@fixme.fi>
parents: 37
diff changeset
    34
    void (*on_msg) (struct irc_chan *chan, const char *prefix, const char *msg, void *arg);
26
aec062af155d add irc_chan module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    35
};
aec062af155d add irc_chan module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    36
aec062af155d add irc_chan module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    37
/**
38
0c2e0cb46c3a implement irc_chan_callbacks, and add on_msg
Tero Marttila <terom@fixme.fi>
parents: 37
diff changeset
    38
 * Invoke the given callback with the given args
0c2e0cb46c3a implement irc_chan_callbacks, and add on_msg
Tero Marttila <terom@fixme.fi>
parents: 37
diff changeset
    39
 */
0c2e0cb46c3a implement irc_chan_callbacks, and add on_msg
Tero Marttila <terom@fixme.fi>
parents: 37
diff changeset
    40
#define IRC_CHAN_INVOKE_CALLBACK(chan, _cb_name_, ...)          \
0c2e0cb46c3a implement irc_chan_callbacks, and add on_msg
Tero Marttila <terom@fixme.fi>
parents: 37
diff changeset
    41
    do {                                                        \
0c2e0cb46c3a implement irc_chan_callbacks, and add on_msg
Tero Marttila <terom@fixme.fi>
parents: 37
diff changeset
    42
        struct chain_head *head;                                \
0c2e0cb46c3a implement irc_chan_callbacks, and add on_msg
Tero Marttila <terom@fixme.fi>
parents: 37
diff changeset
    43
                                                                \
0c2e0cb46c3a implement irc_chan_callbacks, and add on_msg
Tero Marttila <terom@fixme.fi>
parents: 37
diff changeset
    44
        CHAIN_FOREACH(&(chan)->callbacks, head) {               \
0c2e0cb46c3a implement irc_chan_callbacks, and add on_msg
Tero Marttila <terom@fixme.fi>
parents: 37
diff changeset
    45
            const struct irc_chan_callbacks *callbacks = head->chain;       \
0c2e0cb46c3a implement irc_chan_callbacks, and add on_msg
Tero Marttila <terom@fixme.fi>
parents: 37
diff changeset
    46
                                                                \
0c2e0cb46c3a implement irc_chan_callbacks, and add on_msg
Tero Marttila <terom@fixme.fi>
parents: 37
diff changeset
    47
            if (callbacks->_cb_name_)                           \
0c2e0cb46c3a implement irc_chan_callbacks, and add on_msg
Tero Marttila <terom@fixme.fi>
parents: 37
diff changeset
    48
                callbacks->_cb_name_((chan), ## __VA_ARGS__, head->arg);    \
0c2e0cb46c3a implement irc_chan_callbacks, and add on_msg
Tero Marttila <terom@fixme.fi>
parents: 37
diff changeset
    49
        }                                                       \
0c2e0cb46c3a implement irc_chan_callbacks, and add on_msg
Tero Marttila <terom@fixme.fi>
parents: 37
diff changeset
    50
    } while (0);
0c2e0cb46c3a implement irc_chan_callbacks, and add on_msg
Tero Marttila <terom@fixme.fi>
parents: 37
diff changeset
    51
0c2e0cb46c3a implement irc_chan_callbacks, and add on_msg
Tero Marttila <terom@fixme.fi>
parents: 37
diff changeset
    52
/**
26
aec062af155d add irc_chan module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    53
 * IRC channel state
aec062af155d add irc_chan module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    54
 */
aec062af155d add irc_chan module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    55
struct irc_chan {
aec062af155d add irc_chan module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    56
    /** The irc_net.channels list */
aec062af155d add irc_chan module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    57
    TAILQ_ENTRY(irc_chan) node;
aec062af155d add irc_chan module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    58
aec062af155d add irc_chan module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    59
    /* The network we're on */
aec062af155d add irc_chan module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    60
    struct irc_net *net;
aec062af155d add irc_chan module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    61
aec062af155d add irc_chan module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    62
    /** Our identifying info */
aec062af155d add irc_chan module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    63
    struct irc_chan_info info;
aec062af155d add irc_chan module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    64
    
37
4fe4a3c4496e change irc_chan.state into bool fields, move irc_cmd implementation from irc_conn.c into irc_cmd.c, remove irc_conn arg from irc_cmd_handler, add irc_conn.nickname tracking, and handle irc_chan JOINs
Tero Marttila <terom@fixme.fi>
parents: 26
diff changeset
    65
    /** State flags */
4fe4a3c4496e change irc_chan.state into bool fields, move irc_cmd implementation from irc_conn.c into irc_cmd.c, remove irc_conn arg from irc_cmd_handler, add irc_conn.nickname tracking, and handle irc_chan JOINs
Tero Marttila <terom@fixme.fi>
parents: 26
diff changeset
    66
    struct {
4fe4a3c4496e change irc_chan.state into bool fields, move irc_cmd implementation from irc_conn.c into irc_cmd.c, remove irc_conn arg from irc_cmd_handler, add irc_conn.nickname tracking, and handle irc_chan JOINs
Tero Marttila <terom@fixme.fi>
parents: 26
diff changeset
    67
        /** JOIN request sent, waiting for reply */
4fe4a3c4496e change irc_chan.state into bool fields, move irc_cmd implementation from irc_conn.c into irc_cmd.c, remove irc_conn arg from irc_cmd_handler, add irc_conn.nickname tracking, and handle irc_chan JOINs
Tero Marttila <terom@fixme.fi>
parents: 26
diff changeset
    68
        bool joining;
4fe4a3c4496e change irc_chan.state into bool fields, move irc_cmd implementation from irc_conn.c into irc_cmd.c, remove irc_conn arg from irc_cmd_handler, add irc_conn.nickname tracking, and handle irc_chan JOINs
Tero Marttila <terom@fixme.fi>
parents: 26
diff changeset
    69
4fe4a3c4496e change irc_chan.state into bool fields, move irc_cmd implementation from irc_conn.c into irc_cmd.c, remove irc_conn arg from irc_cmd_handler, add irc_conn.nickname tracking, and handle irc_chan JOINs
Tero Marttila <terom@fixme.fi>
parents: 26
diff changeset
    70
        /** Currently joined to channel */
4fe4a3c4496e change irc_chan.state into bool fields, move irc_cmd implementation from irc_conn.c into irc_cmd.c, remove irc_conn arg from irc_cmd_handler, add irc_conn.nickname tracking, and handle irc_chan JOINs
Tero Marttila <terom@fixme.fi>
parents: 26
diff changeset
    71
        bool joined;
4fe4a3c4496e change irc_chan.state into bool fields, move irc_cmd implementation from irc_conn.c into irc_cmd.c, remove irc_conn arg from irc_cmd_handler, add irc_conn.nickname tracking, and handle irc_chan JOINs
Tero Marttila <terom@fixme.fi>
parents: 26
diff changeset
    72
4fe4a3c4496e change irc_chan.state into bool fields, move irc_cmd implementation from irc_conn.c into irc_cmd.c, remove irc_conn arg from irc_cmd_handler, add irc_conn.nickname tracking, and handle irc_chan JOINs
Tero Marttila <terom@fixme.fi>
parents: 26
diff changeset
    73
    } state;
4fe4a3c4496e change irc_chan.state into bool fields, move irc_cmd implementation from irc_conn.c into irc_cmd.c, remove irc_conn arg from irc_cmd_handler, add irc_conn.nickname tracking, and handle irc_chan JOINs
Tero Marttila <terom@fixme.fi>
parents: 26
diff changeset
    74
4fe4a3c4496e change irc_chan.state into bool fields, move irc_cmd implementation from irc_conn.c into irc_cmd.c, remove irc_conn arg from irc_cmd_handler, add irc_conn.nickname tracking, and handle irc_chan JOINs
Tero Marttila <terom@fixme.fi>
parents: 26
diff changeset
    75
    /** General command handlers */
4fe4a3c4496e change irc_chan.state into bool fields, move irc_cmd implementation from irc_conn.c into irc_cmd.c, remove irc_conn arg from irc_cmd_handler, add irc_conn.nickname tracking, and handle irc_chan JOINs
Tero Marttila <terom@fixme.fi>
parents: 26
diff changeset
    76
    irc_cmd_handlers_t handlers;
38
0c2e0cb46c3a implement irc_chan_callbacks, and add on_msg
Tero Marttila <terom@fixme.fi>
parents: 37
diff changeset
    77
0c2e0cb46c3a implement irc_chan_callbacks, and add on_msg
Tero Marttila <terom@fixme.fi>
parents: 37
diff changeset
    78
    /** High-level user callbacks */
0c2e0cb46c3a implement irc_chan_callbacks, and add on_msg
Tero Marttila <terom@fixme.fi>
parents: 37
diff changeset
    79
    struct chain_list callbacks;
26
aec062af155d add irc_chan module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    80
};
aec062af155d add irc_chan module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    81
aec062af155d add irc_chan module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    82
/**
aec062af155d add irc_chan module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    83
 * Return the channel's name
aec062af155d add irc_chan module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    84
 */
aec062af155d add irc_chan module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    85
const char* irc_chan_name (struct irc_chan *chan);
aec062af155d add irc_chan module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    86
aec062af155d add irc_chan module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    87
/**
aec062af155d add irc_chan module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    88
 * Build/initialize a new irc_chan struct. This does not have any external side-effects.
aec062af155d add irc_chan module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    89
 *
aec062af155d add irc_chan module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    90
 * The channel will be in the IRC_CHAN_INIT state after this.
aec062af155d add irc_chan module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    91
 *
aec062af155d add irc_chan module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    92
 * @param chan_ptr the new irc_chan is returned via this pointer
aec062af155d add irc_chan module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    93
 * @param net the irc_net this channel is on
aec062af155d add irc_chan module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    94
 * @param info the channel's identifying information
aec062af155d add irc_chan module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    95
 * @param err error codes are returned via this
aec062af155d add irc_chan module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    96
 */
aec062af155d add irc_chan module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    97
err_t irc_chan_create (struct irc_chan **chan_ptr, struct irc_net *net, const struct irc_chan_info *info, struct error_info *err);
aec062af155d add irc_chan module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    98
aec062af155d add irc_chan module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    99
/**
37
4fe4a3c4496e change irc_chan.state into bool fields, move irc_cmd implementation from irc_conn.c into irc_cmd.c, remove irc_conn arg from irc_cmd_handler, add irc_conn.nickname tracking, and handle irc_chan JOINs
Tero Marttila <terom@fixme.fi>
parents: 26
diff changeset
   100
 * Destroy irc_chan state, without doing anything to the network
4fe4a3c4496e change irc_chan.state into bool fields, move irc_cmd implementation from irc_conn.c into irc_cmd.c, remove irc_conn arg from irc_cmd_handler, add irc_conn.nickname tracking, and handle irc_chan JOINs
Tero Marttila <terom@fixme.fi>
parents: 26
diff changeset
   101
 */
4fe4a3c4496e change irc_chan.state into bool fields, move irc_cmd implementation from irc_conn.c into irc_cmd.c, remove irc_conn arg from irc_cmd_handler, add irc_conn.nickname tracking, and handle irc_chan JOINs
Tero Marttila <terom@fixme.fi>
parents: 26
diff changeset
   102
void irc_chan_destroy (struct irc_chan *chan);
4fe4a3c4496e change irc_chan.state into bool fields, move irc_cmd implementation from irc_conn.c into irc_cmd.c, remove irc_conn arg from irc_cmd_handler, add irc_conn.nickname tracking, and handle irc_chan JOINs
Tero Marttila <terom@fixme.fi>
parents: 26
diff changeset
   103
4fe4a3c4496e change irc_chan.state into bool fields, move irc_cmd implementation from irc_conn.c into irc_cmd.c, remove irc_conn arg from irc_cmd_handler, add irc_conn.nickname tracking, and handle irc_chan JOINs
Tero Marttila <terom@fixme.fi>
parents: 26
diff changeset
   104
/**
38
0c2e0cb46c3a implement irc_chan_callbacks, and add on_msg
Tero Marttila <terom@fixme.fi>
parents: 37
diff changeset
   105
 * Add high-level irc_chan callbacks
0c2e0cb46c3a implement irc_chan_callbacks, and add on_msg
Tero Marttila <terom@fixme.fi>
parents: 37
diff changeset
   106
 */
0c2e0cb46c3a implement irc_chan_callbacks, and add on_msg
Tero Marttila <terom@fixme.fi>
parents: 37
diff changeset
   107
err_t irc_chan_add_callbacks (struct irc_chan *chan, const struct irc_chan_callbacks *callbacks, void *arg);
0c2e0cb46c3a implement irc_chan_callbacks, and add on_msg
Tero Marttila <terom@fixme.fi>
parents: 37
diff changeset
   108
0c2e0cb46c3a implement irc_chan_callbacks, and add on_msg
Tero Marttila <terom@fixme.fi>
parents: 37
diff changeset
   109
/**
26
aec062af155d add irc_chan module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   110
 * Send the initial JOIN message.
aec062af155d add irc_chan module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   111
 *
aec062af155d add irc_chan module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   112
 * The channel must be in the IRC_CHAN_INIT state, and will transition to the IRC_CHAN_JOINING state.
aec062af155d add irc_chan module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   113
 *
aec062af155d add irc_chan module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   114
 * @param chan the channel to JOIN
aec062af155d add irc_chan module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   115
 */
aec062af155d add irc_chan module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   116
err_t irc_chan_join (struct irc_chan *chan);
aec062af155d add irc_chan module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   117
37
4fe4a3c4496e change irc_chan.state into bool fields, move irc_cmd implementation from irc_conn.c into irc_cmd.c, remove irc_conn arg from irc_cmd_handler, add irc_conn.nickname tracking, and handle irc_chan JOINs
Tero Marttila <terom@fixme.fi>
parents: 26
diff changeset
   118
26
aec062af155d add irc_chan module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   119
#endif