summaryrefslogtreecommitdiff
path: root/src/plugins/irc/irc-dcc.h
blob: cfa89be537a714e15fa0c4d78b8856455df92a5f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
/*
 * Copyright (c) 2003-2007 by FlashCode <flashcode@flashtux.org>
 * See README for License detail, AUTHORS for developers list.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */


#ifndef __WEECHAT_IRC_DCC_H
#define __WEECHAT_IRC_DCC_H 1

/* DCC types */

#define IRC_DCC_CHAT_RECV        0  /* receiving DCC chat                    */
#define IRC_DCC_CHAT_SEND        1  /* sending DCC chat                      */
#define IRC_DCC_FILE_RECV        2  /* incoming DCC file                     */
#define IRC_DCC_FILE_SEND        3  /* sending DCC file                      */

/* DCC status */

#define IRC_DCC_WAITING          0  /* waiting for host answer               */
#define IRC_DCC_CONNECTING       1  /* connecting to host                    */
#define IRC_DCC_ACTIVE           2  /* sending/receiving data                */
#define IRC_DCC_DONE             3  /* transfer done                         */
#define IRC_DCC_FAILED           4  /* DCC failed                            */
#define IRC_DCC_ABORTED          5  /* DCC aborted by user                   */

/* DCC blocksize (for file) */

#define IRC_DCC_MIN_BLOCKSIZE   1024  /* min DCC block size when sending file*/
#define IRC_DCC_MAX_BLOCKSIZE 102400  /* max DCC block size when sending file*/

/* DCC errors (for file) */

#define IRC_DCC_NO_ERROR             0  /* no error to report, all ok!       */
#define IRC_DCC_ERROR_READ_LOCAL     1  /* unable to read local file         */
#define IRC_DCC_ERROR_SEND_BLOCK     2  /* unable to send block to receiver  */
#define IRC_DCC_ERROR_READ_ACK       3  /* unable to read ACK from receiver  */
#define IRC_DCC_ERROR_CONNECT_SENDER 4  /* unable to connect to sender       */
#define IRC_DCC_ERROR_RECV_BLOCK     5  /* unable to recv block from sender  */
#define IRC_DCC_ERROR_WRITE_LOCAL    6  /* unable to write to local file     */

/* DCC macros for type */

#define IRC_DCC_IS_CHAT(type) ((type == IRC_DCC_CHAT_RECV) || \
                               (type == IRC_DCC_CHAT_SEND))
#define IRC_DCC_IS_FILE(type) ((type == IRC_DCC_FILE_RECV) || \
                               (type == IRC_DCC_FILE_SEND))
#define IRC_DCC_IS_RECV(type) ((type == IRC_DCC_CHAT_RECV) || \
                               (type == IRC_DCC_FILE_RECV))
#define IRC_DCC_IS_SEND(type) ((type == IRC_DCC_CHAT_SEND) || \
                               (type == IRC_DCC_FILE_SEND))

/* DCC macro for status */

#define IRC_DCC_ENDED(status) ((status == IRC_DCC_DONE) || \
                               (status == IRC_DCC_FAILED) || \
                               (status == IRC_DCC_ABORTED))

typedef struct t_irc_dcc t_irc_dcc;

struct t_irc_dcc
{
    t_irc_server *server;           /* irc server                            */
    t_irc_channel *channel;         /* irc channel (for DCC chat only)       */
    int type;                       /* DCC type (file/chat, send/receive)    */
    int status;                     /* DCC status (waiting, sending, ..)     */
    time_t start_time;              /* the time when DCC started             */
    time_t start_transfer;          /* the time when DCC transfer started    */
    unsigned long addr;             /* IP address                            */
    int port;                       /* port                                  */
    char *nick;                     /* remote nick                           */
    int sock;                       /* socket for connection                 */
    pid_t child_pid;                /* pid of child process (sending/recving)*/
    int child_read;                 /* to read into child pipe               */
    int child_write;                /* to write into child pipe              */
    char *unterminated_message;     /* beginning of a message in input buf   */
    int fast_send;                  /* fase send for files: does not wait ACK*/
    int file;                       /* local file (for reading or writing)   */
    char *filename;                 /* filename (given by sender)            */
    char *local_filename;           /* local filename (with path)            */
    int filename_suffix;            /* suffix (.1 for ex) if renaming file   */
    int blocksize;                  /* block size for sending file           */
    unsigned long size;             /* file size                             */
    unsigned long pos;              /* number of bytes received/sent         */
    unsigned long ack;              /* number of bytes received OK           */
    unsigned long start_resume;     /* start of resume (in bytes)            */
    time_t last_check_time;         /* last time we looked at bytes sent/recv*/
    unsigned long last_check_pos;   /* bytes sent/recv at last check         */
    time_t last_activity;           /* time of last byte received/sent       */
    unsigned long bytes_per_sec;    /* bytes per second                      */
    unsigned long eta;              /* estimated time of arrival             */
    t_irc_dcc *prev_dcc;            /* link to previous dcc file/chat        */
    t_irc_dcc *next_dcc;            /* link to next dcc file/chat            */
};

extern t_irc_dcc *irc_dcc_list;
extern t_irc_dcc *irc_last_dcc;
extern char *irc_dcc_status_string[6];

#endif /* irc-dcc.h */