summary refs log tree commit diff stats
path: root/src/common/dcc.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/common/dcc.h')
-rw-r--r--src/common/dcc.h117
1 files changed, 117 insertions, 0 deletions
diff --git a/src/common/dcc.h b/src/common/dcc.h
new file mode 100644
index 00000000..da4ce979
--- /dev/null
+++ b/src/common/dcc.h
@@ -0,0 +1,117 @@
+/* dcc.h */
+
+#include <time.h>						/* for time_t */
+
+#ifndef XCHAT_DCC_H
+#define XCHAT_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 *destfile_fs;		/* local filesystem encoding */
+	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