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
113
114
115
116
|
/* dcc.h */
#include <time.h> /* for time_t */
#ifndef HEXCHAT_DCC_H
#define HEXCHAT_DCC_H
#define STAT_QUEUED 0
#define STAT_ACTIVE 1
#define STAT_FAILED 2
#define STAT_DONE 3
#define STAT_CONNECTING 4
#define STAT_ABORTED 5
#define TYPE_SEND 0
#define TYPE_RECV 1
#define TYPE_CHATRECV 2
#define TYPE_CHATSEND 3
#define CPS_AVG_WINDOW 10
/* can we do 64-bit dcc? */
#if defined(G_GINT64_FORMAT) && defined(HAVE_STRTOULL)
#define USE_DCC64
/* we really get only 63 bits, since st_size is signed */
#define DCC_SIZE gint64
#define DCC_SFMT G_GINT64_FORMAT
#else
#define DCC_SIZE unsigned int
#define DCC_SFMT "u"
#endif
struct DCC
{
struct server *serv;
struct dcc_chat *dccchat;
struct proxy_state *proxy;
guint32 addr; /* the 32bit IP number, host byte order */
int fp; /* file pointer */
int sok;
int iotag; /* reading io tag */
int wiotag; /* writing/sending io tag */
int port;
int pasvid; /* mIRC's passive DCC id */
int cps;
int resume_error;
int resume_errno;
GTimeVal lastcpstv, firstcpstv;
DCC_SIZE lastcpspos;
int maxcps;
unsigned char ack_buf[4]; /* buffer for reading 4-byte ack */
int ack_pos;
DCC_SIZE size;
DCC_SIZE resumable;
DCC_SIZE ack;
DCC_SIZE pos;
time_t starttime;
time_t offertime;
time_t lasttime;
char *file; /* utf8 */
char *destfile; /* utf8 */
char *nick;
unsigned char type; /* 0 = SEND 1 = RECV 2 = CHAT */
unsigned char dccstat; /* 0 = QUEUED 1 = ACTIVE 2 = FAILED 3 = DONE */
unsigned int resume_sent:1; /* resume request sent */
unsigned int fastsend:1;
unsigned int ackoffset:1; /* is reciever sending acks as an offset from */
/* the resume point? */
unsigned int throttled:2; /* 0x1 = per send/get throttle
0x2 = global throttle */
};
#define MAX_PROXY_BUFFER 1024
struct proxy_state
{
int phase;
unsigned char buffer[MAX_PROXY_BUFFER];
int buffersize;
int bufferused;
};
struct dcc_chat
{
char linebuf[2048];
int pos;
};
struct dccstat_info
{
char *name; /* Display name */
int color; /* Display color (index into colors[] ) */
};
extern struct dccstat_info dccstat[];
gboolean is_dcc (struct DCC *dcc);
void dcc_abort (session *sess, struct DCC *dcc);
void dcc_get (struct DCC *dcc);
int dcc_resume (struct DCC *dcc);
void dcc_check_timeouts (void);
void dcc_change_nick (server *serv, char *oldnick, char *newnick);
void dcc_notify_kill (struct server *serv);
struct DCC *dcc_write_chat (char *nick, char *text);
void dcc_send (struct session *sess, char *to, char *file, int maxcps, int passive);
struct DCC *find_dcc (char *nick, char *file, int type);
void dcc_get_nick (struct session *sess, char *nick);
void dcc_chat (session *sess, char *nick, int passive);
void handle_dcc (session *sess, char *nick, char *word[], char *word_eol[]);
void dcc_show_list (session *sess);
guint32 dcc_get_my_address (void);
void dcc_get_with_destfile (struct DCC *dcc, char *utf8file);
#endif
|