view libnnchat.h @ 322:b9c15c57dc8f

Clean up message functions, add new printMsgQ() helper function for messages that should not go into the log file. Add skeleton help function, accessible via F1 key. And other cleanups.
author Matti Hamalainen <ccr@tnsp.org>
date Sat, 11 Jun 2011 09:48:26 +0300
parents b765f15f9895
children c086345d176b
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>
#ifdef __WIN32
#include <windows.h>
#include <winsock.h>
#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)

typedef struct {
    ssize_t pos, len, size;
    char *data;
} nn_editbuf_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;

enum {
    NN_CONN_UNINIT = 0,
    NN_CONN_OPEN,
    NN_CONN_CLOSED
};

typedef struct _nn_conn_t {
    int socket;
    int port;
    struct in_addr address;
    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;
} nn_conn_t;


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

nn_conn_t * nn_conn_open(struct in_addr *addr, const int port);
void        nn_conn_close(nn_conn_t *);
BOOL        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 *);


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);


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);


#endif