view libnnchat.h @ 377:9ad157feb99a

Sync th-libs.
author Matti Hamalainen <ccr@tnsp.org>
date Mon, 03 Oct 2011 00:04:33 +0300
parents ebbe97f2a2a5
children acea18a741e3
line wrap: on
line source

/*
 * NNChat - Custom chat client for NewbieNudes.com chatrooms
 * Written by Matti 'ccr' Hämäläinen
 * (C) Copyright 2008-2011 Tecnic Software productions (TNSP)
 */
#ifndef LIBNNCHAT_H
#define LIBNNCHAT_H

#include <stdio.h>
#include <unistd.h>
#include "th_types.h"
#ifdef __WIN32
#include <windows.h>
#include <winsock.h>
typedef uint16_t in_port_t;
typedef uint32_t in_addr_t;
#else
#include <sys/select.h>
#include <sys/socket.h>
#ifdef HAVE_NETINET_IN_H
#include <netinet/in.h>
#endif
#include <arpa/inet.h>
#include <netdb.h>
#endif
#include <sys/types.h>
#include <time.h>
#include <errno.h>
#include "th_string.h"

#define NN_TMPBUF_SIZE    (4096)
#define NN_ALLOC_SIZE     (128)
#define NN_CONNBUF_SIZE   (64 * 1024)
#define NN_NUM_BUCKETS    (256)
#define NN_DELAY_USEC     (15 * 1000)
#define NN_BACKBUF_LEN    (512)       /* Backbuffer size (in lines) */

enum {
    NN_CONN_UNINIT = 0,
    NN_CONN_PROXY_NEG,
    NN_CONN_OPEN,
    NN_CONN_CLOSED
};

enum {
    NN_PROXY_NONE = 0,
    NN_PROXY_SOCKS4,
    NN_PROXY_SOCKS4A,
    
    NN_PROXY_LAST
};

enum {
    SOCKS_CMD_CONNECT = 1,
    SOCKS_CMD_BIND = 2
};

struct nn_socks_t {
    uint8_t version;
    uint8_t command;
    in_port_t port;
    in_addr_t addr;
} __attribute__((__packed__));

struct nn_socks_res_t {
    uint8_t nb;
    uint8_t result;
    in_port_t port;
    in_addr_t addr;
} __attribute__((__packed__));

typedef struct _nn_conn_t {
    struct {
        char *host;
        struct hostent *hst;
        int type;
        int port;
        struct in_addr addr;
    } proxy;

    char *host;
    struct hostent *hst;
    int port;

    int socket;
    struct in_addr addr;
    fd_set sockfds;

    void (*errfunc)(struct _nn_conn_t *conn, const char *fmt, va_list ap);
    void (*msgfunc)(struct _nn_conn_t *conn, const char *fmt, va_list ap);

    int err;
    int status;
    
    char buf[NN_CONNBUF_SIZE + 16];
    char *ptr;
    ssize_t got, total;
} nn_conn_t;


const char *nn_get_errstr(int err);
BOOL        nn_network_init();
void        nn_network_close(void);

struct hostent *nn_resolve_host(nn_conn_t *conn, const char *name);
nn_conn_t * nn_conn_new(
        void (*errfunc)(nn_conn_t *conn, const char *fmt, va_list ap),
        void (*msgfunc)(nn_conn_t *conn, const char *fmt, va_list ap));

int         nn_conn_set_proxy(nn_conn_t *conn, int type, int port, const char *host);
int         nn_conn_open(nn_conn_t *conn, const int port, const char *host);
void        nn_conn_close(nn_conn_t *);
void        nn_conn_reset(nn_conn_t *);
int         nn_conn_pull(nn_conn_t *);
BOOL        nn_conn_send_buf(nn_conn_t *, const char *buf, const size_t len);
BOOL        nn_conn_send_msg(nn_conn_t *, const char *user, const char *fmt, ...);
BOOL        nn_conn_check(nn_conn_t *);


typedef struct _nn_user_t {
    char *name;
    time_t lastspoke, joined;
    struct _nn_user_t *next;
} nn_user_t;

typedef struct {
    nn_user_t *buckets[NN_NUM_BUCKETS];
} nn_userhash_t;

nn_userhash_t *nn_userhash_new(void);
nn_user_t * nn_userhash_foreach(const nn_userhash_t *, int (*func)(const nn_user_t *));
nn_user_t * nn_user_match(const nn_userhash_t *list, const char *str, const char *current, BOOL again);
int         nn_userhash_insert(nn_userhash_t *, const char *name);
int         nn_userhash_delete(nn_userhash_t *, const char *name);
void        nn_userhash_free(nn_userhash_t *);
void        nn_user_free(nn_user_t *);
void        nn_user_free_list(nn_user_t *);
nn_user_t * nn_user_copy(const nn_user_t *src);
nn_user_t * nn_user_find(const nn_userhash_t *list, const char *name);


char *      nn_encode_str1(const char *str);
char *      nn_decode_str1(const char *str);
char *      nn_encode_str2(const char *str);
char *      nn_decode_str2(const char *str);
char *      nn_strip_tags(const char *str);
char *      nn_dbldecode_str(const char *str);
char *      nn_dblencode_str(const char *str);

char *      nn_username_encode(char *str);
char *      nn_username_decode(char *str);


typedef struct {
    ssize_t pos, len, size;
    char *data;
} nn_editbuf_t;

int         nn_editbuf_write(nn_editbuf_t *buf, ssize_t pos, int ch);
int         nn_editbuf_insert(nn_editbuf_t *buf, ssize_t pos, int ch);
int         nn_editbuf_delete(nn_editbuf_t *buf, ssize_t pos);
void        nn_editbuf_clear(nn_editbuf_t *buf);
nn_editbuf_t * nn_editbuf_new(ssize_t n);
void        nn_editbuf_free(nn_editbuf_t *buf);
nn_editbuf_t * nn_editbuf_copy(nn_editbuf_t *src);
void        nn_editbuf_setpos(nn_editbuf_t *buf, ssize_t pos);
char *      nn_editbuf_get_string(nn_editbuf_t *buf, ssize_t start, ssize_t end);


typedef struct {
    qringbuf_t *data;   /* "Backbuffer" data for this window */
    int pos;            /* Current position in the window, 0 = real time */
    BOOL dirty;

    char *id;           /* Chatter ID, NULL = main window */
    int num;		/* Window number */
    
    char *buf;
    size_t len, bufsize;
    size_t chlen;
} nn_window_t;

nn_window_t *nn_window_new(const char *);
void        nn_window_free(nn_window_t *);


typedef struct {
    size_t len;
    char *str;
} nn_strtuple_t;


nn_strtuple_t *nn_strtuple_new(size_t, char *);
void nn_strtuple_free(nn_strtuple_t *);

#endif