Wed, 12 Jan 2011 14:31:52 +0000
jabber: Be friendlier to servers when we have nothing to say.
Don't try to reconnect immediately, but do so when we have something
to send. Untested (I'll test it later), but I'm hoping hsitas444 will
test it first. Refs #13008.
| 7170 | 1 | /* |
| 15884 | 2 | * purple - Jabber Protocol Plugin |
| 7170 | 3 | * |
|
28322
ac8fec1d2234
Remove specific copyright lines from the XMPP prpl.
Paul Aurich <darkrain42@pidgin.im>
parents:
28206
diff
changeset
|
4 | * Purple is the legal property of its developers, whose names are too numerous |
|
ac8fec1d2234
Remove specific copyright lines from the XMPP prpl.
Paul Aurich <darkrain42@pidgin.im>
parents:
28206
diff
changeset
|
5 | * to list here. Please refer to the COPYRIGHT file distributed with this |
|
ac8fec1d2234
Remove specific copyright lines from the XMPP prpl.
Paul Aurich <darkrain42@pidgin.im>
parents:
28206
diff
changeset
|
6 | * source distribution. |
| 7170 | 7 | * |
| 8 | * This program is free software; you can redistribute it and/or modify | |
| 9 | * it under the terms of the GNU General Public License as published by | |
| 10 | * the Free Software Foundation; either version 2 of the License, or | |
| 11 | * (at your option) any later version. | |
| 12 | * | |
| 13 | * This program is distributed in the hope that it will be useful, | |
| 14 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| 15 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
| 16 | * GNU General Public License for more details. | |
| 17 | * | |
| 18 | * You should have received a copy of the GNU General Public License | |
| 19 | * along with this program; if not, write to the Free Software | |
|
19859
71d37b57eff2
The FSF changed its address a while ago; our files were out of date.
John Bailey <rekkanoryo@rekkanoryo.org>
parents:
15884
diff
changeset
|
20 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA |
| 7170 | 21 | * |
| 22 | */ | |
| 23 | #include "internal.h" | |
| 7234 | 24 | #include "debug.h" |
| 7170 | 25 | #include "ft.h" |
| 26 | #include "util.h" | |
| 27 | ||
| 28 | #include "jabber.h" | |
| 29 | #include "iq.h" | |
|
12324
caf9784f2405
[gaim-migrate @ 14628]
Richard Laager <rlaager@pidgin.im>
parents:
12323
diff
changeset
|
30 | #include "oob.h" |
| 7170 | 31 | |
| 32 | typedef struct _JabberOOBXfer { | |
| 33 | char *address; | |
| 34 | int port; | |
| 35 | char *page; | |
| 36 | ||
| 37 | GString *headers; | |
| 38 | ||
| 39 | char *iq_id; | |
| 40 | ||
| 41 | JabberStream *js; | |
| 42 | ||
|
13201
8c224ef70efa
[gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents:
12324
diff
changeset
|
43 | gchar *write_buffer; |
|
8c224ef70efa
[gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents:
12324
diff
changeset
|
44 | gsize written_len; |
|
8c224ef70efa
[gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents:
12324
diff
changeset
|
45 | guint writeh; |
|
8c224ef70efa
[gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents:
12324
diff
changeset
|
46 | |
| 7170 | 47 | } JabberOOBXfer; |
| 48 | ||
| 15884 | 49 | static void jabber_oob_xfer_init(PurpleXfer *xfer) |
| 7170 | 50 | { |
| 51 | JabberOOBXfer *jox = xfer->data; | |
| 15884 | 52 | purple_xfer_start(xfer, -1, jox->address, jox->port); |
| 7170 | 53 | } |
| 54 | ||
| 15884 | 55 | static void jabber_oob_xfer_free(PurpleXfer *xfer) |
| 7170 | 56 | { |
| 57 | JabberOOBXfer *jox = xfer->data; | |
| 7395 | 58 | jox->js->oob_file_transfers = g_list_remove(jox->js->oob_file_transfers, |
| 59 | xfer); | |
| 7170 | 60 | |
| 61 | g_string_free(jox->headers, TRUE); | |
| 62 | g_free(jox->address); | |
| 63 | g_free(jox->page); | |
| 64 | g_free(jox->iq_id); | |
|
13201
8c224ef70efa
[gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents:
12324
diff
changeset
|
65 | g_free(jox->write_buffer); |
|
8c224ef70efa
[gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents:
12324
diff
changeset
|
66 | if(jox->writeh) |
| 15884 | 67 | purple_input_remove(jox->writeh); |
| 7170 | 68 | g_free(jox); |
| 69 | ||
| 70 | xfer->data = NULL; | |
| 71 | } | |
| 72 | ||
| 15884 | 73 | static void jabber_oob_xfer_end(PurpleXfer *xfer) |
| 7170 | 74 | { |
| 75 | JabberOOBXfer *jox = xfer->data; | |
| 76 | JabberIq *iq; | |
| 77 | ||
| 78 | iq = jabber_iq_new(jox->js, JABBER_IQ_RESULT); | |
| 79 | xmlnode_set_attrib(iq->node, "to", xfer->who); | |
| 80 | jabber_iq_set_id(iq, jox->iq_id); | |
| 81 | ||
| 82 | jabber_iq_send(iq); | |
| 83 | ||
| 84 | jabber_oob_xfer_free(xfer); | |
| 85 | } | |
| 86 | ||
| 15884 | 87 | static void jabber_oob_xfer_request_send(gpointer data, gint source, PurpleInputCondition cond) { |
| 88 | PurpleXfer *xfer = data; | |
|
13201
8c224ef70efa
[gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents:
12324
diff
changeset
|
89 | JabberOOBXfer *jox = xfer->data; |
|
8c224ef70efa
[gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents:
12324
diff
changeset
|
90 | int len, total_len = strlen(jox->write_buffer); |
|
8c224ef70efa
[gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents:
12324
diff
changeset
|
91 | |
|
8c224ef70efa
[gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents:
12324
diff
changeset
|
92 | len = write(xfer->fd, jox->write_buffer + jox->written_len, |
|
8c224ef70efa
[gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents:
12324
diff
changeset
|
93 | total_len - jox->written_len); |
|
8c224ef70efa
[gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents:
12324
diff
changeset
|
94 | |
|
8c224ef70efa
[gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents:
12324
diff
changeset
|
95 | if(len < 0 && errno == EAGAIN) |
|
8c224ef70efa
[gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents:
12324
diff
changeset
|
96 | return; |
|
8c224ef70efa
[gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents:
12324
diff
changeset
|
97 | else if(len < 0) { |
|
28828
7c1855f037e7
jabber: Convert to purple_debug_* convenience functions.
Paul Aurich <darkrain42@pidgin.im>
parents:
28322
diff
changeset
|
98 | purple_debug_error("jabber", "Write error on oob xfer!\n"); |
| 15884 | 99 | purple_input_remove(jox->writeh); |
| 100 | purple_xfer_cancel_local(xfer); | |
|
13201
8c224ef70efa
[gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents:
12324
diff
changeset
|
101 | } |
|
8c224ef70efa
[gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents:
12324
diff
changeset
|
102 | jox->written_len += len; |
|
8c224ef70efa
[gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents:
12324
diff
changeset
|
103 | |
|
8c224ef70efa
[gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents:
12324
diff
changeset
|
104 | if(jox->written_len == total_len) { |
| 15884 | 105 | purple_input_remove(jox->writeh); |
|
13201
8c224ef70efa
[gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents:
12324
diff
changeset
|
106 | g_free(jox->write_buffer); |
|
8c224ef70efa
[gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents:
12324
diff
changeset
|
107 | jox->write_buffer = NULL; |
|
8c224ef70efa
[gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents:
12324
diff
changeset
|
108 | } |
|
8c224ef70efa
[gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents:
12324
diff
changeset
|
109 | } |
|
8c224ef70efa
[gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents:
12324
diff
changeset
|
110 | |
| 15884 | 111 | static void jabber_oob_xfer_start(PurpleXfer *xfer) |
| 7170 | 112 | { |
| 113 | JabberOOBXfer *jox = xfer->data; | |
| 114 | ||
|
13201
8c224ef70efa
[gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents:
12324
diff
changeset
|
115 | if(jox->write_buffer == NULL) { |
|
8c224ef70efa
[gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents:
12324
diff
changeset
|
116 | jox->write_buffer = g_strdup_printf( |
|
8c224ef70efa
[gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents:
12324
diff
changeset
|
117 | "GET /%s HTTP/1.1\r\nHost: %s\r\n\r\n", |
| 7170 | 118 | jox->page, jox->address); |
|
13201
8c224ef70efa
[gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents:
12324
diff
changeset
|
119 | jox->written_len = 0; |
|
8c224ef70efa
[gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents:
12324
diff
changeset
|
120 | } |
|
8c224ef70efa
[gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents:
12324
diff
changeset
|
121 | |
| 15884 | 122 | jox->writeh = purple_input_add(xfer->fd, PURPLE_INPUT_WRITE, |
|
13201
8c224ef70efa
[gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents:
12324
diff
changeset
|
123 | jabber_oob_xfer_request_send, xfer); |
|
8c224ef70efa
[gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents:
12324
diff
changeset
|
124 | |
| 15884 | 125 | jabber_oob_xfer_request_send(xfer, xfer->fd, PURPLE_INPUT_WRITE); |
| 7170 | 126 | } |
| 127 | ||
| 15884 | 128 | static gssize jabber_oob_xfer_read(guchar **buffer, PurpleXfer *xfer) { |
| 7170 | 129 | JabberOOBXfer *jox = xfer->data; |
|
13201
8c224ef70efa
[gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents:
12324
diff
changeset
|
130 | char test[2048]; |
|
8c224ef70efa
[gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents:
12324
diff
changeset
|
131 | char *tmp, *lenstr; |
|
8c224ef70efa
[gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents:
12324
diff
changeset
|
132 | int len; |
| 7170 | 133 | |
|
13201
8c224ef70efa
[gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents:
12324
diff
changeset
|
134 | if((len = read(xfer->fd, test, sizeof(test))) > 0) { |
|
8c224ef70efa
[gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents:
12324
diff
changeset
|
135 | jox->headers = g_string_append_len(jox->headers, test, len); |
|
8c224ef70efa
[gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents:
12324
diff
changeset
|
136 | if((tmp = strstr(jox->headers->str, "\r\n\r\n"))) { |
|
8c224ef70efa
[gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents:
12324
diff
changeset
|
137 | *tmp = '\0'; |
|
8c224ef70efa
[gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents:
12324
diff
changeset
|
138 | lenstr = strstr(jox->headers->str, "Content-Length: "); |
|
8c224ef70efa
[gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents:
12324
diff
changeset
|
139 | if(lenstr) { |
|
8c224ef70efa
[gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents:
12324
diff
changeset
|
140 | int size; |
|
8c224ef70efa
[gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents:
12324
diff
changeset
|
141 | sscanf(lenstr, "Content-Length: %d", &size); |
| 15884 | 142 | purple_xfer_set_size(xfer, size); |
| 7170 | 143 | } |
| 15884 | 144 | purple_xfer_set_read_fnc(xfer, NULL); |
|
13201
8c224ef70efa
[gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents:
12324
diff
changeset
|
145 | |
|
8c224ef70efa
[gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents:
12324
diff
changeset
|
146 | tmp += 4; |
|
8c224ef70efa
[gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents:
12324
diff
changeset
|
147 | |
|
14697
518c0fae208e
[gaim-migrate @ 17381]
Daniel Atallah <datallah@pidgin.im>
parents:
14356
diff
changeset
|
148 | *buffer = (unsigned char*) g_strdup(tmp); |
|
13201
8c224ef70efa
[gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents:
12324
diff
changeset
|
149 | return strlen(tmp); |
|
8c224ef70efa
[gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents:
12324
diff
changeset
|
150 | } |
| 7170 | 151 | return 0; |
|
13201
8c224ef70efa
[gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents:
12324
diff
changeset
|
152 | } else if (errno != EAGAIN) { |
|
28828
7c1855f037e7
jabber: Convert to purple_debug_* convenience functions.
Paul Aurich <darkrain42@pidgin.im>
parents:
28322
diff
changeset
|
153 | purple_debug_error("jabber", "Read error on oob xfer!\n"); |
| 15884 | 154 | purple_xfer_cancel_local(xfer); |
| 7170 | 155 | } |
| 7234 | 156 | |
| 7170 | 157 | return 0; |
| 158 | } | |
| 159 | ||
| 15884 | 160 | static void jabber_oob_xfer_recv_error(PurpleXfer *xfer, const char *code) { |
| 7170 | 161 | JabberOOBXfer *jox = xfer->data; |
| 162 | JabberIq *iq; | |
| 8399 | 163 | xmlnode *y, *z; |
| 7170 | 164 | |
| 165 | iq = jabber_iq_new(jox->js, JABBER_IQ_ERROR); | |
| 166 | xmlnode_set_attrib(iq->node, "to", xfer->who); | |
| 167 | jabber_iq_set_id(iq, jox->iq_id); | |
| 168 | y = xmlnode_new_child(iq->node, "error"); | |
| 8399 | 169 | xmlnode_set_attrib(y, "code", code); |
| 170 | if(!strcmp(code, "406")) { | |
| 171 | z = xmlnode_new_child(y, "not-acceptable"); | |
| 172 | xmlnode_set_attrib(y, "type", "modify"); | |
|
28984
1d84517d56eb
jabber: More namespaces! This is a good stopping point for now.
Paul Aurich <darkrain42@pidgin.im>
parents:
28828
diff
changeset
|
173 | xmlnode_set_namespace(z, NS_XMPP_STANZAS); |
| 8399 | 174 | } else if(!strcmp(code, "404")) { |
| 175 | z = xmlnode_new_child(y, "not-found"); | |
| 176 | xmlnode_set_attrib(y, "type", "cancel"); | |
|
28984
1d84517d56eb
jabber: More namespaces! This is a good stopping point for now.
Paul Aurich <darkrain42@pidgin.im>
parents:
28828
diff
changeset
|
177 | xmlnode_set_namespace(z, NS_XMPP_STANZAS); |
| 8399 | 178 | } |
| 7170 | 179 | jabber_iq_send(iq); |
| 180 | ||
| 181 | jabber_oob_xfer_free(xfer); | |
| 182 | } | |
| 183 | ||
| 15884 | 184 | static void jabber_oob_xfer_recv_denied(PurpleXfer *xfer) { |
| 8399 | 185 | jabber_oob_xfer_recv_error(xfer, "406"); |
| 186 | } | |
| 187 | ||
|
30708
535bec1e66fb
Standardize on "cancelled".
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
28984
diff
changeset
|
188 | static void jabber_oob_xfer_recv_cancelled(PurpleXfer *xfer) { |
| 8399 | 189 | jabber_oob_xfer_recv_error(xfer, "404"); |
| 190 | } | |
| 191 | ||
|
25817
09d6a40a341d
Pass IQ handlers type, from, id, and the child node
Paul Aurich <darkrain42@pidgin.im>
parents:
19859
diff
changeset
|
192 | void jabber_oob_parse(JabberStream *js, const char *from, JabberIqType type, |
|
09d6a40a341d
Pass IQ handlers type, from, id, and the child node
Paul Aurich <darkrain42@pidgin.im>
parents:
19859
diff
changeset
|
193 | const char *id, xmlnode *querynode) { |
| 7170 | 194 | JabberOOBXfer *jox; |
| 15884 | 195 | PurpleXfer *xfer; |
| 7170 | 196 | char *filename; |
| 197 | char *url; | |
|
25817
09d6a40a341d
Pass IQ handlers type, from, id, and the child node
Paul Aurich <darkrain42@pidgin.im>
parents:
19859
diff
changeset
|
198 | xmlnode *urlnode; |
| 7170 | 199 | |
|
25817
09d6a40a341d
Pass IQ handlers type, from, id, and the child node
Paul Aurich <darkrain42@pidgin.im>
parents:
19859
diff
changeset
|
200 | if(type != JABBER_IQ_SET) |
| 14356 | 201 | return; |
| 202 | ||
|
25818
d087a2754595
Avoid assertion failures on NULL 'from' attributes
Paul Aurich <darkrain42@pidgin.im>
parents:
25817
diff
changeset
|
203 | if(!from) |
| 7170 | 204 | return; |
| 205 | ||
| 206 | if(!(urlnode = xmlnode_get_child(querynode, "url"))) | |
| 207 | return; | |
| 208 | ||
| 209 | url = xmlnode_get_data(urlnode); | |
| 210 | ||
| 211 | jox = g_new0(JabberOOBXfer, 1); | |
|
28206
784ad9a14ee3
Fix crashes when filenames end up being NULL in some prpls. Fixed a minor
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
25818
diff
changeset
|
212 | if (!purple_url_parse(url, &jox->address, &jox->port, &jox->page, NULL, NULL)) { |
|
784ad9a14ee3
Fix crashes when filenames end up being NULL in some prpls. Fixed a minor
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
25818
diff
changeset
|
213 | g_free(url); |
|
784ad9a14ee3
Fix crashes when filenames end up being NULL in some prpls. Fixed a minor
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
25818
diff
changeset
|
214 | return; |
|
784ad9a14ee3
Fix crashes when filenames end up being NULL in some prpls. Fixed a minor
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
25818
diff
changeset
|
215 | } |
| 7170 | 216 | g_free(url); |
| 217 | jox->js = js; | |
| 218 | jox->headers = g_string_new(""); | |
|
25817
09d6a40a341d
Pass IQ handlers type, from, id, and the child node
Paul Aurich <darkrain42@pidgin.im>
parents:
19859
diff
changeset
|
219 | jox->iq_id = g_strdup(id); |
| 7170 | 220 | |
|
25817
09d6a40a341d
Pass IQ handlers type, from, id, and the child node
Paul Aurich <darkrain42@pidgin.im>
parents:
19859
diff
changeset
|
221 | xfer = purple_xfer_new(js->gc->account, PURPLE_XFER_RECEIVE, from); |
|
15345
797936e968ff
[gaim-migrate @ 18073]
Evan Schoenberg <evands@pidgin.im>
parents:
14697
diff
changeset
|
222 | if (xfer) |
|
797936e968ff
[gaim-migrate @ 18073]
Evan Schoenberg <evands@pidgin.im>
parents:
14697
diff
changeset
|
223 | { |
|
797936e968ff
[gaim-migrate @ 18073]
Evan Schoenberg <evands@pidgin.im>
parents:
14697
diff
changeset
|
224 | xfer->data = jox; |
| 7170 | 225 | |
|
15345
797936e968ff
[gaim-migrate @ 18073]
Evan Schoenberg <evands@pidgin.im>
parents:
14697
diff
changeset
|
226 | if(!(filename = g_strdup(g_strrstr(jox->page, "/")))) |
|
797936e968ff
[gaim-migrate @ 18073]
Evan Schoenberg <evands@pidgin.im>
parents:
14697
diff
changeset
|
227 | filename = g_strdup(jox->page); |
| 7170 | 228 | |
| 15884 | 229 | purple_xfer_set_filename(xfer, filename); |
| 7170 | 230 | |
|
15345
797936e968ff
[gaim-migrate @ 18073]
Evan Schoenberg <evands@pidgin.im>
parents:
14697
diff
changeset
|
231 | g_free(filename); |
| 7170 | 232 | |
| 15884 | 233 | purple_xfer_set_init_fnc(xfer, jabber_oob_xfer_init); |
| 234 | purple_xfer_set_end_fnc(xfer, jabber_oob_xfer_end); | |
| 235 | purple_xfer_set_request_denied_fnc(xfer, jabber_oob_xfer_recv_denied); | |
|
30708
535bec1e66fb
Standardize on "cancelled".
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
28984
diff
changeset
|
236 | purple_xfer_set_cancel_recv_fnc(xfer, jabber_oob_xfer_recv_cancelled); |
| 15884 | 237 | purple_xfer_set_read_fnc(xfer, jabber_oob_xfer_read); |
| 238 | purple_xfer_set_start_fnc(xfer, jabber_oob_xfer_start); | |
| 7170 | 239 | |
|
15345
797936e968ff
[gaim-migrate @ 18073]
Evan Schoenberg <evands@pidgin.im>
parents:
14697
diff
changeset
|
240 | js->oob_file_transfers = g_list_append(js->oob_file_transfers, xfer); |
| 7170 | 241 | |
| 15884 | 242 | purple_xfer_request(xfer); |
|
15345
797936e968ff
[gaim-migrate @ 18073]
Evan Schoenberg <evands@pidgin.im>
parents:
14697
diff
changeset
|
243 | } |
| 7170 | 244 | } |
| 245 | ||
| 246 |