src/irc_client.c
changeset 53 12d806823775
child 55 6f7f6ae729d0
equal deleted inserted replaced
52:97604efda1ce 53:12d806823775
       
     1 #include "irc_client.h"
       
     2 #include "log.h"
       
     3 
       
     4 #include <stdlib.h>
       
     5 #include <string.h>
       
     6 
       
     7 err_t irc_client_create (struct irc_client **client_ptr, struct error_info *err)
       
     8 {
       
     9     struct irc_client *client;
       
    10 
       
    11     // allocate
       
    12     if ((client = calloc(1, sizeof(*client))) == NULL)
       
    13         return SET_ERROR(err, ERR_CALLOC);
       
    14 
       
    15     // init
       
    16     TAILQ_INIT(&client->networks);
       
    17 
       
    18     // ok
       
    19     *client_ptr = client;
       
    20 
       
    21     return SUCCESS;
       
    22 }
       
    23 
       
    24 void irc_client_destroy (struct irc_client *client)
       
    25 {
       
    26     struct irc_net *next = TAILQ_FIRST(&client->networks), *net;
       
    27 
       
    28     // our networks
       
    29     while (next) {
       
    30         net = next;
       
    31         next = TAILQ_NEXT(net, client_networks);
       
    32 
       
    33         irc_net_destroy(net);
       
    34     }
       
    35 
       
    36     // ourselves
       
    37     free(client);
       
    38 }
       
    39 
       
    40 err_t irc_client_add_net (struct irc_client *client, struct irc_net **net_ptr, struct irc_net_info *net_info)
       
    41 {
       
    42     struct irc_net *net;
       
    43     struct error_info err;
       
    44 
       
    45     // create the new irc_chan struct
       
    46     if (irc_net_create(&net, net_info, &err))
       
    47         return ERROR_CODE(&err);
       
    48     
       
    49     // add to network list
       
    50     TAILQ_INSERT_TAIL(&client->networks, net, client_networks);
       
    51     
       
    52     // ok
       
    53     *net_ptr = net;
       
    54 
       
    55     return SUCCESS;
       
    56 }
       
    57 
       
    58 struct irc_net* irc_client_get_net (struct irc_client *client, const char *network)
       
    59 {
       
    60     struct irc_net *net = NULL;
       
    61 
       
    62     // look for it...
       
    63     TAILQ_FOREACH(net, &client->networks, client_networks) {
       
    64         if (strcasecmp(net->info.network, network) == 0)
       
    65             // found it
       
    66             return net;
       
    67     }
       
    68 
       
    69     // no such network
       
    70     return NULL;
       
    71 }
       
    72 
       
    73 err_t irc_client_quit (struct irc_client *client, const char *message)
       
    74 {
       
    75     struct irc_net *net;
       
    76     err_t err;
       
    77 
       
    78     // quit each network
       
    79     TAILQ_FOREACH(net, &client->networks, client_networks) {
       
    80         if ((err = irc_net_quit(net, message))) {
       
    81             log_err(err, "irc_net_quit: %s [%s]", net->info.network, message);
       
    82             
       
    83             // XXX: destroy it?
       
    84         }
       
    85     }
       
    86 
       
    87     // state
       
    88     client->quitting = true;
       
    89 
       
    90     // ok
       
    91     return SUCCESS;
       
    92 }