Ignore:
Timestamp:
Mar 10, 2006, 2:06:40 PM (15 years ago)
Author:
Sam Hocevar
Message:
  • Handle incoming connections in network_get_event() as well as network_display() so that new clients immediately get the contents of the canvas and do not need to wait for a caca_display() call.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • libcaca/trunk/caca/driver_network.c

    r582 r584  
    3939#include "cucul_internals.h"
    4040
     41static void manage_connections(caca_t *kk);
     42static int send_data(caca_t *kk, int fd);
    4143
    4244
     
    4547    unsigned int width, height;
    4648    unsigned int port;
    47     int sockfd, new_fd;
     49    int sockfd;
    4850    struct sockaddr_in my_addr;
    4951    struct sockaddr_in remote_addr;
    5052    socklen_t sin_size;
    5153    int clilen;
    52     char buffer[256];
     54
     55    char *buffer;
     56    int size;
    5357
    5458    int client_count;
    5559    int *fd_list;
    56 
    5760};
    5861
     
    128131    printf("network ok.\n");
    129132
     133    kk->drv.p->buffer = NULL;
     134
    130135    return 0;
    131136}
     
    134139{
    135140    int i;
     141
    136142    for(i = 0; i < kk->drv.p->client_count; i++) {
    137143        close(kk->drv.p->fd_list[i]);
    138144    }
     145
    139146    return 0;
    140147}
     
    158165static void network_display(caca_t *kk)
    159166{
    160     int size, i;
    161     char *to_send = cucul_get_ansi(kk->qq, 0, &size);;
     167    int i;
     168
     169    kk->drv.p->buffer = cucul_get_ansi(kk->qq, 0, &kk->drv.p->size);;
     170
     171    for(i = 0; i < kk->drv.p->client_count; i++)
     172    {
     173        if(send_data(kk, kk->drv.p->fd_list[i]))
     174            kk->drv.p->fd_list[i] = -1;
     175    }
     176
     177    manage_connections(kk);
     178}
    162179 
     180static void network_handle_resize(caca_t *kk)
     181{
     182    /* Not handled */
     183}
     184
     185static unsigned int network_get_event(caca_t *kk)
     186{
     187    manage_connections(kk);
     188
     189    /* Not handled */
     190    return 0;
     191}
     192
     193/*
     194 * XXX: The following functions are local
     195 */
     196
     197static void manage_connections(caca_t *kk)
     198{
     199    int fd;
     200
    163201    kk->drv.p->clilen = sizeof(kk->drv.p->remote_addr);
    164     kk->drv.p->new_fd = accept(kk->drv.p->sockfd, (struct sockaddr *) &kk->drv.p->remote_addr, &kk->drv.p->clilen);
    165     if(kk->drv.p->new_fd != -1)
     202    fd = accept(kk->drv.p->sockfd, (struct sockaddr *) &kk->drv.p->remote_addr, &kk->drv.p->clilen);
     203    if(fd != -1)
     204    {
     205        if(kk->drv.p->fd_list == NULL)
    166206        {
    167 
    168             if(kk->drv.p->fd_list == NULL) {
    169                 kk->drv.p->fd_list = malloc(sizeof(int));
    170                 if(kk->drv.p->fd_list == NULL)
    171                     return;
    172                 kk->drv.p->fd_list[kk->drv.p->client_count] = kk->drv.p->new_fd;
    173             } else {
    174                 kk->drv.p->fd_list = realloc(kk->drv.p->fd_list, (kk->drv.p->client_count+1) * sizeof(int));
    175                 kk->drv.p->fd_list[kk->drv.p->client_count] = kk->drv.p->new_fd;
    176             }
    177 
     207            kk->drv.p->fd_list = malloc(sizeof(int));
     208            if(kk->drv.p->fd_list == NULL)
     209                return;
     210        }
     211        else
     212        {
     213            kk->drv.p->fd_list = realloc(kk->drv.p->fd_list, (kk->drv.p->client_count+1) * sizeof(int));
     214        }
     215
     216        if(send_data(kk, fd) == 0)
     217        {
     218            kk->drv.p->fd_list[kk->drv.p->client_count] = fd;
    178219            kk->drv.p->client_count++;
    179 
    180220        }
    181 
    182     for(i = 0; i < kk->drv.p->client_count; i++) {
    183         if(kk->drv.p->fd_list[i] == -1)
    184            continue;
    185        
    186         /* FIXME, handle >255 sizes */
    187             codes[16] = (unsigned char) kk->drv.p->width&0xff;
    188             codes[18] = (unsigned char) kk->drv.p->height&0xff;
     221    }
     222}
     223
     224static int send_data(caca_t *kk, int fd)
     225{
     226    /* No error, there's just nothing to send yet */
     227    if(!kk->drv.p->buffer)
     228        return 0;
     229
     230    if(fd < 0)
     231        return -1;
     232
     233    /* FIXME, handle >255 sizes */
     234    codes[16] = (unsigned char) kk->drv.p->width & 0xff;
     235    codes[18] = (unsigned char) kk->drv.p->height & 0xff;
    189236           
    190             /* Send basic telnet codes */
    191             if (send(kk->drv.p->fd_list[i], codes,sizeof(codes) , 0) == -1) {
    192                 kk->drv.p->fd_list[i] = -1;
    193              }
    194            
    195             /* ANSI code for move(0,0)*/
    196             if (send(kk->drv.p->fd_list[i], "\033[1,1H", 6, 0) == -1) {
    197                 kk->drv.p->fd_list[i] = -1;
    198             }
    199            
    200             if (send(kk->drv.p->fd_list[i], to_send, size, 0) == -1) {
    201                 kk->drv.p->fd_list[i] = -1;
    202             }
    203         }
     237    /* Send basic telnet codes */
     238    if (send(fd, codes,sizeof(codes) , 0) == -1)
     239        return -1;
    204240   
    205 }
    206 static void network_handle_resize(caca_t *kk)
    207 {
    208     /* Not handled */
    209 }
    210 
    211 static unsigned int network_get_event(caca_t *kk)
    212 {
    213     /* Not handled */
    214     return 0;
    215 }
    216 
     241    /* ANSI code for move(0,0)*/
     242    if (send(fd, "\033[1,1H", 6, 0) == -1)
     243        return -1;
     244   
     245    if (send(fd, kk->drv.p->buffer, kk->drv.p->size, 0) == -1)
     246        return -1;
     247
     248    return 0;
     249}
    217250
    218251/*
Note: See TracChangeset for help on using the changeset viewer.