annotate src/protocols/irc/dcc_send.c @ 10654:f2e86683cafc

[gaim-migrate @ 12182] sf patch #1152664, from Richard Laager This patches does three things: First, it uses aliases in file transfer messages whenever possible. Second, it fixes the case where file transfer completion messages are not showing for MSN. Third, it makes the wording more consistent: Canceled is used to describe cases when the file transfer was actively canceled by either party. Failed is used otherwise. Aborted is no longer used at all. Previously, aborted was used in some places while failed was used under the same circumstances in other places. Also, in the file transfer box, canceled was used in one place for remotely or locally canceled files while in another place in the same box canceled was only used for locally canceled files (failed was used for remotely canceled files). committer: Tailor Script <tailor@pidgin.im>
author Mark Doliner <mark@kingant.net>
date Sun, 06 Mar 2005 00:23:54 +0000
parents 761822c6f7ca
children bd8ac1d4b2f2
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
8351
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
1 /**
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
2 * @file dcc_send.c Functions used in sending files with DCC SEND
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
3 *
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
4 * gaim
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
5 *
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
6 * Copyright (C) 2004, Timothy T Ringenbach <omarvo@hotmail.com>
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
7 * Copyright (C) 2003, Robbert Haarman <gaim@inglorion.net>
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
8 *
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
9 * This program is free software; you can redistribute it and/or modify
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
10 * it under the terms of the GNU General Public License as published by
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
11 * the Free Software Foundation; either version 2 of the License, or
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
12 * (at your option) any later version.
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
13 *
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
14 * This program is distributed in the hope that it will be useful,
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
17 * GNU General Public License for more details.
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
18 *
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
19 * You should have received a copy of the GNU General Public License
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
20 * along with this program; if not, write to the Free Software
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
21 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
22 */
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
23
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
24 #include "internal.h"
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
25 #include "irc.h"
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
26 #include "debug.h"
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
27 #include "ft.h"
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
28 #include "notify.h"
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
29 #include "network.h"
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
30
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
31 /***************************************************************************
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
32 * Functions related to receiving files via DCC SEND
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
33 ***************************************************************************/
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
34
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
35 struct irc_xfer_rx_data {
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
36 gchar *ip;
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
37 };
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
38
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
39 static void irc_dccsend_recv_destroy(GaimXfer *xfer)
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
40 {
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
41 struct irc_xfer_rx_data *xd = xfer->data;
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
42
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
43 if (xd->ip != NULL)
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
44 g_free(xd->ip);
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
45
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
46 g_free(xd);
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
47 }
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
48
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
49 /*
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
50 * This function is called whenever data is received.
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
51 * It sends the acknowledgement (in the form of a total byte count as an
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
52 * unsigned 4 byte integer in network byte order)
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
53 */
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
54 static void irc_dccsend_recv_ack(GaimXfer *xfer, const char *data, size_t size) {
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
55 unsigned long l;
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
56
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
57 l = htonl(xfer->bytes_sent);
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
58 write(xfer->fd, &l, sizeof(l));
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
59 }
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
60
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
61 static void irc_dccsend_recv_init(GaimXfer *xfer) {
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
62 struct irc_xfer_rx_data *xd = xfer->data;
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
63
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
64 gaim_xfer_start(xfer, -1, xd->ip, xfer->remote_port);
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
65 g_free(xd->ip);
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
66 xd->ip = NULL;
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
67 }
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
68
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
69 /* This function makes the necessary arrangements for receiving files */
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
70 void irc_dccsend_recv(struct irc_conn *irc, const char *from, const char *msg) {
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
71 GaimXfer *xfer;
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
72 struct irc_xfer_rx_data *xd;
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
73 gchar **token;
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
74 struct in_addr addr;
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
75 GString *filename;
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
76 int i = 0;
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
77 guint32 nip;
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
78
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
79 token = g_strsplit(msg, " ", 0);
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
80 if (!token[0] || !token[1] || !token[2]) {
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
81 g_strfreev(token);
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
82 return;
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
83 }
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
84
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
85 filename = g_string_new("");
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
86 if (token[0][0] == '"') {
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
87 if (!strchr(&(token[0][1]), '"')) {
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
88 g_string_append(filename, &(token[0][1]));
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
89 for (i = 1; token[i]; i++)
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
90 if (!strchr(token[i], '"')) {
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
91 g_string_append_printf(filename, " %s", token[i]);
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
92 } else {
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
93 g_string_append_len(filename, token[i], strlen(token[i]) - 1);
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
94 break;
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
95 }
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
96 } else {
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
97 g_string_append_len(filename, &(token[0][1]), strlen(&(token[0][1])) - 1);
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
98 }
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
99 } else {
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
100 g_string_append(filename, token[0]);
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
101 }
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
102
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
103 if (!token[i] || !token[i+1] || !token[i+2]) {
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
104 g_strfreev(token);
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
105 g_string_free(filename, TRUE);
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
106 return;
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
107 }
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
108 i++;
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
109
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
110 xfer = gaim_xfer_new(irc->account, GAIM_XFER_RECEIVE, from);
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
111 xd = g_new0(struct irc_xfer_rx_data, 1);
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
112 xfer->data = xd;
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
113
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
114 gaim_xfer_set_filename(xfer, filename->str);
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
115 xfer->remote_port = atoi(token[i+1]);
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
116
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
117 nip = strtoul(token[i], NULL, 10);
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
118 if (nip) {
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
119 addr.s_addr = htonl(nip);
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
120 xd->ip = g_strdup(inet_ntoa(addr));
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
121 } else {
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
122 xd->ip = g_strdup(token[i]);
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
123 }
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
124 gaim_debug(GAIM_DEBUG_INFO, "irc", "Receiving file from %s\n",
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
125 xd->ip);
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
126 gaim_xfer_set_size(xfer, token[i+2] ? atoi(token[i+2]) : 0);
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
127
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
128 gaim_xfer_set_init_fnc(xfer, irc_dccsend_recv_init);
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
129 gaim_xfer_set_ack_fnc(xfer, irc_dccsend_recv_ack);
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
130
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
131 gaim_xfer_set_end_fnc(xfer, irc_dccsend_recv_destroy);
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
132 gaim_xfer_set_request_denied_fnc(xfer, irc_dccsend_recv_destroy);
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
133 gaim_xfer_set_cancel_send_fnc(xfer, irc_dccsend_recv_destroy);
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
134
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
135 gaim_xfer_request(xfer);
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
136 g_strfreev(token);
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
137 g_string_free(filename, TRUE);
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
138 }
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
139
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
140 /*******************************************************************
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
141 * Functions related to sending files via DCC SEND
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
142 *******************************************************************/
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
143
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
144 struct irc_xfer_send_data {
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
145 gint inpa;
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
146 int fd;
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
147 guchar *rxqueue;
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
148 guint rxlen;
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
149 };
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
150
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
151 static void irc_dccsend_send_destroy(GaimXfer *xfer)
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
152 {
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
153 struct irc_xfer_send_data *xd = xfer->data;
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
154
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
155 if (xd == NULL)
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
156 return;
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
157
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
158 if (xd->inpa > 0)
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
159 gaim_input_remove(xd->inpa);
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
160 if (xd->fd != -1)
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
161 close(xd->fd);
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
162
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
163 if (xd->rxqueue)
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
164 g_free(xd->rxqueue);
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
165
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
166 g_free(xd);
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
167 }
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
168
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
169 /* just in case you were wondering, this is why DCC is gay */
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
170 static void irc_dccsend_send_read(gpointer data, int source, GaimInputCondition cond)
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
171 {
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
172 GaimXfer *xfer = data;
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
173 struct irc_xfer_send_data *xd = xfer->data;
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
174 char *buffer[16];
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
175 int len;
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
176
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
177 if ((len = read(source, buffer, sizeof(buffer))) <= 0) {
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
178 gaim_input_remove(xd->inpa);
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
179 xd->inpa = 0;
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
180 return;
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
181 }
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
182
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
183 xd->rxqueue = g_realloc(xd->rxqueue, len + xd->rxlen);
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
184 memcpy(xd->rxqueue + xd->rxlen, buffer, len);
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
185 xd->rxlen += len;
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
186
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
187 while (1) {
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
188 int acked;
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
189
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
190 if (xd->rxlen < 4)
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
191 break;
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
192
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
193 acked = ntohl(*((gint32 *)xd->rxqueue));
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
194
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
195 xd->rxlen -= 4;
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
196 if (xd->rxlen) {
10388
088633feb846 [gaim-migrate @ 11615]
Nathan Walp <nwalp@pidgin.im>
parents: 10112
diff changeset
197 unsigned char *tmp = g_memdup(xd->rxqueue + 4, xd->rxlen);
8351
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
198 g_free(xd->rxqueue);
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
199 xd->rxqueue = tmp;
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
200 } else {
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
201 g_free(xd->rxqueue);
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
202 xd->rxqueue = NULL;
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
203 }
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
204
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
205 if (acked >= gaim_xfer_get_size(xfer)) {
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
206 gaim_input_remove(xd->inpa);
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
207 xd->inpa = 0;
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
208 gaim_xfer_set_completed(xfer, TRUE);
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
209 gaim_xfer_end(xfer);
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
210 return;
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
211 }
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
212
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
213
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
214 }
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
215 }
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
216
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
217 ssize_t irc_dccsend_send_write(const char *buffer, size_t size, GaimXfer *xfer)
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
218 {
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
219 ssize_t s;
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
220
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
221 s = MIN(gaim_xfer_get_bytes_remaining(xfer), size);
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
222 if (!s)
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
223 return 0;
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
224
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
225 return write(xfer->fd, buffer, s);
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
226 }
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
227
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
228 static void irc_dccsend_send_connected(gpointer data, int source, GaimInputCondition cond) {
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
229 GaimXfer *xfer = (GaimXfer *) data;
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
230 struct irc_xfer_send_data *xd = xfer->data;
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
231 int conn;
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
232
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
233 conn = accept(xd->fd, NULL, 0);
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
234 if (conn == -1) {
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
235 /* Accepting the connection failed. This could just be related
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
236 * to the nonblocking nature of the listening socket, so we'll
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
237 * just try again next time */
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
238 /* Let's print an error message anyway */
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
239 gaim_debug_warning("irc", "accept: %s\n", strerror(errno));
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
240 return;
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
241 }
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
242
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
243 gaim_input_remove(xfer->watcher);
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
244 xfer->watcher = 0;
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
245 close(xd->fd);
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
246 xd->fd = -1;
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
247
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
248 xd->inpa = gaim_input_add(conn, GAIM_INPUT_READ, irc_dccsend_send_read, xfer);
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
249 /* Start the transfer */
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
250 gaim_xfer_start(xfer, conn, NULL, 0);
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
251 }
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
252
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
253 /*
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
254 * This function is called after the user has selected a file to send.
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
255 */
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
256 static void irc_dccsend_send_init(GaimXfer *xfer) {
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
257 struct irc_xfer_send_data *xd = xfer->data;
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
258 GaimConnection *gc = gaim_account_get_connection(gaim_xfer_get_account(xfer));
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
259 struct irc_conn *irc = gc->proto_data;
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
260 int sock;
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
261 const char *arg[2];
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
262 char *tmp;
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
263 struct in_addr addr;
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
264 unsigned short int port;
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
265
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
266 xfer->filename = g_path_get_basename(xfer->local_filename);
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
267
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
268 /* Create a listening socket */
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
269 sock = gaim_network_listen_range(0, 0);
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
270
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
271 if (sock < 0) {
10654
f2e86683cafc [gaim-migrate @ 12182]
Mark Doliner <mark@kingant.net>
parents: 10555
diff changeset
272 gaim_notify_error(gc, NULL, _("File Transfer Failed"),
8351
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
273 _("Gaim could not open a listening port."));
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
274 gaim_xfer_cancel_local(xfer);
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
275 return;
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
276 }
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
277
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
278 xd->fd = sock;
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
279
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
280 port = gaim_network_get_port_from_fd(sock);
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
281 gaim_debug_misc("irc", "port is %hu\n", port);
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
282 /* Monitor the listening socket */
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
283 xfer->watcher = gaim_input_add(sock, GAIM_INPUT_READ,
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
284 irc_dccsend_send_connected, xfer);
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
285
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
286 /* Send the intended recipient the DCC request */
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
287 arg[0] = xfer->who;
8838
518455386538 [gaim-migrate @ 9604]
Mark Doliner <mark@kingant.net>
parents: 8351
diff changeset
288 inet_aton(gaim_network_get_my_ip(irc->fd), &addr);
10112
1a91e814e9d8 [gaim-migrate @ 11145]
Nathan Walp <nwalp@pidgin.im>
parents: 9466
diff changeset
289 arg[1] = tmp = g_strdup_printf("\001DCC SEND \"%s\" %u %hu %zu\001",
8351
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
290 xfer->filename, ntohl(addr.s_addr),
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
291 port, xfer->size);
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
292
10555
761822c6f7ca [gaim-migrate @ 11932]
Nathan Walp <nwalp@pidgin.im>
parents: 10388
diff changeset
293 irc_cmd_privmsg(gc->proto_data, "msg", NULL, arg);
8351
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
294 g_free(tmp);
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
295 }
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
296
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
297 /**
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
298 * Gaim calls this function when the user selects Send File from the
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
299 * buddy menu
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
300 * It sets up the GaimXfer struct and tells Gaim to go ahead
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
301 */
9466
d27156c9c876 [gaim-migrate @ 10291]
Luke Schierer <lschiere@pidgin.im>
parents: 8838
diff changeset
302 void irc_dccsend_send_file(GaimConnection *gc, const char *who, const char *file) {
8351
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
303 GaimXfer *xfer;
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
304 struct irc_xfer_send_data *xd;
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
305
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
306 /* Build the file transfer handle */
9466
d27156c9c876 [gaim-migrate @ 10291]
Luke Schierer <lschiere@pidgin.im>
parents: 8838
diff changeset
307 xfer = gaim_xfer_new(gaim_connection_get_account(gc), GAIM_XFER_SEND, who);
8351
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
308
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
309
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
310 xd = g_new0(struct irc_xfer_send_data, 1);
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
311 xd->fd = -1;
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
312 xfer->data = xd;
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
313
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
314 /* Setup our I/O op functions */
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
315 gaim_xfer_set_init_fnc(xfer, irc_dccsend_send_init);
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
316 gaim_xfer_set_write_fnc(xfer, irc_dccsend_send_write);
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
317 gaim_xfer_set_end_fnc(xfer, irc_dccsend_send_destroy);
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
318 gaim_xfer_set_request_denied_fnc(xfer, irc_dccsend_send_destroy);
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
319 gaim_xfer_set_cancel_send_fnc(xfer, irc_dccsend_send_destroy);
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
320 /* Now perform the request */
9466
d27156c9c876 [gaim-migrate @ 10291]
Luke Schierer <lschiere@pidgin.im>
parents: 8838
diff changeset
321 if (file)
d27156c9c876 [gaim-migrate @ 10291]
Luke Schierer <lschiere@pidgin.im>
parents: 8838
diff changeset
322 gaim_xfer_request_accepted(xfer, file);
d27156c9c876 [gaim-migrate @ 10291]
Luke Schierer <lschiere@pidgin.im>
parents: 8838
diff changeset
323 else
d27156c9c876 [gaim-migrate @ 10291]
Luke Schierer <lschiere@pidgin.im>
parents: 8838
diff changeset
324 gaim_xfer_request(xfer);
8351
ffa642240fc1 [gaim-migrate @ 9075]
Nathan Walp <nwalp@pidgin.im>
parents:
diff changeset
325 }