Fri, 28 Sep 2007 16:58:29 +0000
applied changes from 80e3a515775c28b61c4c155c4a524374ef3360ff
through 45dd8a34b6dda68660a7f026677c9478247610ad
| 7651 | 1 | /* |
| 2 | * @file yahoo_filexfer.c Yahoo Filetransfer | |
| 3 | * | |
| 15884 | 4 | * Purple is the legal property of its developers, whose names are too numerous |
| 8046 | 5 | * to list here. Please refer to the COPYRIGHT file distributed with this |
| 6 | * source distribution. | |
| 7651 | 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:
19064
diff
changeset
|
20 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA |
| 7651 | 21 | */ |
| 22 | ||
|
18273
e61c53184c52
#include reorganizations to allow compiling with glib < 2.8 using the
Stu Tomlinson <nosnilmot@pidgin.im>
parents:
15884
diff
changeset
|
23 | #include "internal.h" |
|
e61c53184c52
#include reorganizations to allow compiling with glib < 2.8 using the
Stu Tomlinson <nosnilmot@pidgin.im>
parents:
15884
diff
changeset
|
24 | |
| 7651 | 25 | #include "prpl.h" |
| 26 | #include "util.h" | |
| 27 | #include "debug.h" | |
| 28 | #include "notify.h" | |
| 29 | #include "proxy.h" | |
| 30 | #include "ft.h" | |
| 31 | #include "yahoo.h" | |
| 10392 | 32 | #include "yahoo_packet.h" |
| 7651 | 33 | #include "yahoo_filexfer.h" |
|
11475
1e222e6e52a0
[gaim-migrate @ 13717]
Gary Kramlich <grim@reaperworld.com>
parents:
11159
diff
changeset
|
34 | #include "yahoo_doodle.h" |
| 7651 | 35 | |
| 36 | struct yahoo_xfer_data { | |
| 37 | gchar *host; | |
| 38 | gchar *path; | |
| 39 | int port; | |
| 15884 | 40 | PurpleConnection *gc; |
| 7651 | 41 | long expires; |
| 42 | gboolean started; | |
|
13272
fd4f3356640f
[gaim-migrate @ 15637]
Daniel Atallah <datallah@pidgin.im>
parents:
13201
diff
changeset
|
43 | gchar *txbuf; |
|
13201
8c224ef70efa
[gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents:
13144
diff
changeset
|
44 | gsize txbuflen; |
|
8c224ef70efa
[gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents:
13144
diff
changeset
|
45 | gsize txbuf_written; |
|
8c224ef70efa
[gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents:
13144
diff
changeset
|
46 | guint tx_handler; |
| 7651 | 47 | gchar *rxqueue; |
| 48 | guint rxlen; | |
| 49 | }; | |
| 50 | ||
| 51 | static void yahoo_xfer_data_free(struct yahoo_xfer_data *xd) | |
| 52 | { | |
|
13201
8c224ef70efa
[gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents:
13144
diff
changeset
|
53 | g_free(xd->host); |
|
8c224ef70efa
[gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents:
13144
diff
changeset
|
54 | g_free(xd->path); |
|
8c224ef70efa
[gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents:
13144
diff
changeset
|
55 | g_free(xd->txbuf); |
|
8c224ef70efa
[gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents:
13144
diff
changeset
|
56 | if (xd->tx_handler) |
| 15884 | 57 | purple_input_remove(xd->tx_handler); |
| 7651 | 58 | g_free(xd); |
| 59 | } | |
| 60 | ||
| 15884 | 61 | static void yahoo_receivefile_send_cb(gpointer data, gint source, PurpleInputCondition condition) |
|
14146
4413802cb7a9
[gaim-migrate @ 16705]
Mark Doliner <markdoliner@pidgin.im>
parents:
13851
diff
changeset
|
62 | { |
| 15884 | 63 | PurpleXfer *xfer; |
|
14146
4413802cb7a9
[gaim-migrate @ 16705]
Mark Doliner <markdoliner@pidgin.im>
parents:
13851
diff
changeset
|
64 | struct yahoo_xfer_data *xd; |
|
4413802cb7a9
[gaim-migrate @ 16705]
Mark Doliner <markdoliner@pidgin.im>
parents:
13851
diff
changeset
|
65 | int remaining, written; |
|
4413802cb7a9
[gaim-migrate @ 16705]
Mark Doliner <markdoliner@pidgin.im>
parents:
13851
diff
changeset
|
66 | |
|
4413802cb7a9
[gaim-migrate @ 16705]
Mark Doliner <markdoliner@pidgin.im>
parents:
13851
diff
changeset
|
67 | xfer = data; |
|
4413802cb7a9
[gaim-migrate @ 16705]
Mark Doliner <markdoliner@pidgin.im>
parents:
13851
diff
changeset
|
68 | xd = xfer->data; |
|
4413802cb7a9
[gaim-migrate @ 16705]
Mark Doliner <markdoliner@pidgin.im>
parents:
13851
diff
changeset
|
69 | |
|
4413802cb7a9
[gaim-migrate @ 16705]
Mark Doliner <markdoliner@pidgin.im>
parents:
13851
diff
changeset
|
70 | remaining = xd->txbuflen - xd->txbuf_written; |
|
4413802cb7a9
[gaim-migrate @ 16705]
Mark Doliner <markdoliner@pidgin.im>
parents:
13851
diff
changeset
|
71 | written = write(xfer->fd, xd->txbuf + xd->txbuf_written, remaining); |
|
4413802cb7a9
[gaim-migrate @ 16705]
Mark Doliner <markdoliner@pidgin.im>
parents:
13851
diff
changeset
|
72 | |
|
4413802cb7a9
[gaim-migrate @ 16705]
Mark Doliner <markdoliner@pidgin.im>
parents:
13851
diff
changeset
|
73 | if (written < 0 && errno == EAGAIN) |
|
4413802cb7a9
[gaim-migrate @ 16705]
Mark Doliner <markdoliner@pidgin.im>
parents:
13851
diff
changeset
|
74 | written = 0; |
|
4413802cb7a9
[gaim-migrate @ 16705]
Mark Doliner <markdoliner@pidgin.im>
parents:
13851
diff
changeset
|
75 | else if (written <= 0) { |
| 15884 | 76 | purple_debug_error("yahoo", "Unable to write in order to start ft errno = %d\n", errno); |
| 77 | purple_xfer_cancel_remote(xfer); | |
|
14146
4413802cb7a9
[gaim-migrate @ 16705]
Mark Doliner <markdoliner@pidgin.im>
parents:
13851
diff
changeset
|
78 | return; |
|
4413802cb7a9
[gaim-migrate @ 16705]
Mark Doliner <markdoliner@pidgin.im>
parents:
13851
diff
changeset
|
79 | } |
|
4413802cb7a9
[gaim-migrate @ 16705]
Mark Doliner <markdoliner@pidgin.im>
parents:
13851
diff
changeset
|
80 | |
|
4413802cb7a9
[gaim-migrate @ 16705]
Mark Doliner <markdoliner@pidgin.im>
parents:
13851
diff
changeset
|
81 | if (written < remaining) { |
|
4413802cb7a9
[gaim-migrate @ 16705]
Mark Doliner <markdoliner@pidgin.im>
parents:
13851
diff
changeset
|
82 | xd->txbuf_written += written; |
|
4413802cb7a9
[gaim-migrate @ 16705]
Mark Doliner <markdoliner@pidgin.im>
parents:
13851
diff
changeset
|
83 | return; |
|
4413802cb7a9
[gaim-migrate @ 16705]
Mark Doliner <markdoliner@pidgin.im>
parents:
13851
diff
changeset
|
84 | } |
|
4413802cb7a9
[gaim-migrate @ 16705]
Mark Doliner <markdoliner@pidgin.im>
parents:
13851
diff
changeset
|
85 | |
| 15884 | 86 | purple_input_remove(xd->tx_handler); |
|
14146
4413802cb7a9
[gaim-migrate @ 16705]
Mark Doliner <markdoliner@pidgin.im>
parents:
13851
diff
changeset
|
87 | xd->tx_handler = 0; |
|
4413802cb7a9
[gaim-migrate @ 16705]
Mark Doliner <markdoliner@pidgin.im>
parents:
13851
diff
changeset
|
88 | g_free(xd->txbuf); |
|
4413802cb7a9
[gaim-migrate @ 16705]
Mark Doliner <markdoliner@pidgin.im>
parents:
13851
diff
changeset
|
89 | xd->txbuf = NULL; |
|
4413802cb7a9
[gaim-migrate @ 16705]
Mark Doliner <markdoliner@pidgin.im>
parents:
13851
diff
changeset
|
90 | xd->txbuflen = 0; |
|
4413802cb7a9
[gaim-migrate @ 16705]
Mark Doliner <markdoliner@pidgin.im>
parents:
13851
diff
changeset
|
91 | |
| 15884 | 92 | purple_xfer_start(xfer, source, NULL, 0); |
|
14146
4413802cb7a9
[gaim-migrate @ 16705]
Mark Doliner <markdoliner@pidgin.im>
parents:
13851
diff
changeset
|
93 | |
|
4413802cb7a9
[gaim-migrate @ 16705]
Mark Doliner <markdoliner@pidgin.im>
parents:
13851
diff
changeset
|
94 | } |
|
4413802cb7a9
[gaim-migrate @ 16705]
Mark Doliner <markdoliner@pidgin.im>
parents:
13851
diff
changeset
|
95 | |
|
14182
517f4531b8a0
[gaim-migrate @ 16754]
Mark Doliner <markdoliner@pidgin.im>
parents:
14170
diff
changeset
|
96 | static void yahoo_receivefile_connected(gpointer data, gint source, const gchar *error_message) |
| 7651 | 97 | { |
| 15884 | 98 | PurpleXfer *xfer; |
| 7651 | 99 | struct yahoo_xfer_data *xd; |
| 100 | ||
| 15884 | 101 | purple_debug(PURPLE_DEBUG_INFO, "yahoo", |
| 7651 | 102 | "AAA - in yahoo_receivefile_connected\n"); |
| 103 | if (!(xfer = data)) | |
| 104 | return; | |
| 105 | if (!(xd = xfer->data)) | |
| 106 | return; | |
|
13144
e8c3eafab5f8
[gaim-migrate @ 15506]
Evan Schoenberg <evands@pidgin.im>
parents:
12412
diff
changeset
|
107 | if ((source < 0) || (xd->path == NULL) || (xd->host == NULL)) { |
| 15884 | 108 | purple_xfer_error(PURPLE_XFER_RECEIVE, purple_xfer_get_account(xfer), |
|
10654
b2dd3be1b087
[gaim-migrate @ 12182]
Richard Laager <rlaager@pidgin.im>
parents:
10651
diff
changeset
|
109 | xfer->who, _("Unable to connect.")); |
| 15884 | 110 | purple_xfer_cancel_remote(xfer); |
| 7651 | 111 | return; |
| 112 | } | |
| 113 | ||
|
14146
4413802cb7a9
[gaim-migrate @ 16705]
Mark Doliner <markdoliner@pidgin.im>
parents:
13851
diff
changeset
|
114 | xfer->fd = source; |
|
4413802cb7a9
[gaim-migrate @ 16705]
Mark Doliner <markdoliner@pidgin.im>
parents:
13851
diff
changeset
|
115 | |
|
13201
8c224ef70efa
[gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents:
13144
diff
changeset
|
116 | /* The first time we get here, assemble the tx buffer */ |
|
8c224ef70efa
[gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents:
13144
diff
changeset
|
117 | if (xd->txbuflen == 0) { |
|
8c224ef70efa
[gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents:
13144
diff
changeset
|
118 | xd->txbuf = g_strdup_printf("GET /%s HTTP/1.0\r\nHost: %s\r\n\r\n", |
|
8c224ef70efa
[gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents:
13144
diff
changeset
|
119 | xd->path, xd->host); |
|
8c224ef70efa
[gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents:
13144
diff
changeset
|
120 | xd->txbuflen = strlen(xd->txbuf); |
|
8c224ef70efa
[gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents:
13144
diff
changeset
|
121 | xd->txbuf_written = 0; |
|
8c224ef70efa
[gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents:
13144
diff
changeset
|
122 | } |
|
8c224ef70efa
[gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents:
13144
diff
changeset
|
123 | |
|
14146
4413802cb7a9
[gaim-migrate @ 16705]
Mark Doliner <markdoliner@pidgin.im>
parents:
13851
diff
changeset
|
124 | if (!xd->tx_handler) |
|
4413802cb7a9
[gaim-migrate @ 16705]
Mark Doliner <markdoliner@pidgin.im>
parents:
13851
diff
changeset
|
125 | { |
| 15884 | 126 | xd->tx_handler = purple_input_add(source, PURPLE_INPUT_WRITE, |
|
14146
4413802cb7a9
[gaim-migrate @ 16705]
Mark Doliner <markdoliner@pidgin.im>
parents:
13851
diff
changeset
|
127 | yahoo_receivefile_send_cb, xfer); |
| 15884 | 128 | yahoo_receivefile_send_cb(xfer, source, PURPLE_INPUT_WRITE); |
|
14146
4413802cb7a9
[gaim-migrate @ 16705]
Mark Doliner <markdoliner@pidgin.im>
parents:
13851
diff
changeset
|
129 | } |
|
4413802cb7a9
[gaim-migrate @ 16705]
Mark Doliner <markdoliner@pidgin.im>
parents:
13851
diff
changeset
|
130 | } |
|
13201
8c224ef70efa
[gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents:
13144
diff
changeset
|
131 | |
| 15884 | 132 | static void yahoo_sendfile_send_cb(gpointer data, gint source, PurpleInputCondition condition) |
|
14146
4413802cb7a9
[gaim-migrate @ 16705]
Mark Doliner <markdoliner@pidgin.im>
parents:
13851
diff
changeset
|
133 | { |
| 15884 | 134 | PurpleXfer *xfer; |
|
14146
4413802cb7a9
[gaim-migrate @ 16705]
Mark Doliner <markdoliner@pidgin.im>
parents:
13851
diff
changeset
|
135 | struct yahoo_xfer_data *xd; |
|
4413802cb7a9
[gaim-migrate @ 16705]
Mark Doliner <markdoliner@pidgin.im>
parents:
13851
diff
changeset
|
136 | int written, remaining; |
|
13201
8c224ef70efa
[gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents:
13144
diff
changeset
|
137 | |
|
14146
4413802cb7a9
[gaim-migrate @ 16705]
Mark Doliner <markdoliner@pidgin.im>
parents:
13851
diff
changeset
|
138 | xfer = data; |
|
4413802cb7a9
[gaim-migrate @ 16705]
Mark Doliner <markdoliner@pidgin.im>
parents:
13851
diff
changeset
|
139 | xd = xfer->data; |
|
4413802cb7a9
[gaim-migrate @ 16705]
Mark Doliner <markdoliner@pidgin.im>
parents:
13851
diff
changeset
|
140 | |
|
4413802cb7a9
[gaim-migrate @ 16705]
Mark Doliner <markdoliner@pidgin.im>
parents:
13851
diff
changeset
|
141 | remaining = xd->txbuflen - xd->txbuf_written; |
|
4413802cb7a9
[gaim-migrate @ 16705]
Mark Doliner <markdoliner@pidgin.im>
parents:
13851
diff
changeset
|
142 | written = write(xfer->fd, xd->txbuf + xd->txbuf_written, remaining); |
|
13201
8c224ef70efa
[gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents:
13144
diff
changeset
|
143 | |
|
8c224ef70efa
[gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents:
13144
diff
changeset
|
144 | if (written < 0 && errno == EAGAIN) |
|
8c224ef70efa
[gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents:
13144
diff
changeset
|
145 | written = 0; |
|
8c224ef70efa
[gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents:
13144
diff
changeset
|
146 | else if (written <= 0) { |
| 15884 | 147 | purple_debug_error("yahoo", "Unable to write in order to start ft errno = %d\n", errno); |
| 148 | purple_xfer_cancel_remote(xfer); | |
|
13201
8c224ef70efa
[gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents:
13144
diff
changeset
|
149 | return; |
|
8c224ef70efa
[gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents:
13144
diff
changeset
|
150 | } |
|
8c224ef70efa
[gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents:
13144
diff
changeset
|
151 | |
|
14146
4413802cb7a9
[gaim-migrate @ 16705]
Mark Doliner <markdoliner@pidgin.im>
parents:
13851
diff
changeset
|
152 | if (written < remaining) { |
|
13201
8c224ef70efa
[gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents:
13144
diff
changeset
|
153 | xd->txbuf_written += written; |
|
8c224ef70efa
[gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents:
13144
diff
changeset
|
154 | return; |
|
8c224ef70efa
[gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents:
13144
diff
changeset
|
155 | } |
|
8c224ef70efa
[gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents:
13144
diff
changeset
|
156 | |
| 15884 | 157 | purple_input_remove(xd->tx_handler); |
|
13201
8c224ef70efa
[gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents:
13144
diff
changeset
|
158 | xd->tx_handler = 0; |
|
8c224ef70efa
[gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents:
13144
diff
changeset
|
159 | g_free(xd->txbuf); |
|
8c224ef70efa
[gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents:
13144
diff
changeset
|
160 | xd->txbuf = NULL; |
|
8c224ef70efa
[gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents:
13144
diff
changeset
|
161 | xd->txbuflen = 0; |
|
8c224ef70efa
[gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents:
13144
diff
changeset
|
162 | |
| 15884 | 163 | purple_xfer_start(xfer, source, NULL, 0); |
|
13201
8c224ef70efa
[gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents:
13144
diff
changeset
|
164 | } |
| 7651 | 165 | |
|
14182
517f4531b8a0
[gaim-migrate @ 16754]
Mark Doliner <markdoliner@pidgin.im>
parents:
14170
diff
changeset
|
166 | static void yahoo_sendfile_connected(gpointer data, gint source, const gchar *error_message) |
| 7651 | 167 | { |
| 15884 | 168 | PurpleXfer *xfer; |
| 7651 | 169 | struct yahoo_xfer_data *xd; |
|
14146
4413802cb7a9
[gaim-migrate @ 16705]
Mark Doliner <markdoliner@pidgin.im>
parents:
13851
diff
changeset
|
170 | struct yahoo_packet *pkt; |
|
4413802cb7a9
[gaim-migrate @ 16705]
Mark Doliner <markdoliner@pidgin.im>
parents:
13851
diff
changeset
|
171 | gchar *size, *filename, *encoded_filename, *header; |
|
4413802cb7a9
[gaim-migrate @ 16705]
Mark Doliner <markdoliner@pidgin.im>
parents:
13851
diff
changeset
|
172 | guchar *pkt_buf; |
|
4413802cb7a9
[gaim-migrate @ 16705]
Mark Doliner <markdoliner@pidgin.im>
parents:
13851
diff
changeset
|
173 | const char *host; |
|
4413802cb7a9
[gaim-migrate @ 16705]
Mark Doliner <markdoliner@pidgin.im>
parents:
13851
diff
changeset
|
174 | int port; |
|
4413802cb7a9
[gaim-migrate @ 16705]
Mark Doliner <markdoliner@pidgin.im>
parents:
13851
diff
changeset
|
175 | size_t content_length, header_len, pkt_buf_len; |
| 15884 | 176 | PurpleConnection *gc; |
| 177 | PurpleAccount *account; | |
|
14146
4413802cb7a9
[gaim-migrate @ 16705]
Mark Doliner <markdoliner@pidgin.im>
parents:
13851
diff
changeset
|
178 | struct yahoo_data *yd; |
| 7651 | 179 | |
| 15884 | 180 | purple_debug(PURPLE_DEBUG_INFO, "yahoo", |
| 7651 | 181 | "AAA - in yahoo_sendfile_connected\n"); |
| 182 | if (!(xfer = data)) | |
| 183 | return; | |
| 184 | if (!(xd = xfer->data)) | |
| 185 | return; | |
| 186 | ||
| 187 | if (source < 0) { | |
| 15884 | 188 | purple_xfer_error(PURPLE_XFER_RECEIVE, purple_xfer_get_account(xfer), |
|
10654
b2dd3be1b087
[gaim-migrate @ 12182]
Richard Laager <rlaager@pidgin.im>
parents:
10651
diff
changeset
|
189 | xfer->who, _("Unable to connect.")); |
| 15884 | 190 | purple_xfer_cancel_remote(xfer); |
| 7651 | 191 | return; |
| 192 | } | |
| 193 | ||
|
13201
8c224ef70efa
[gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents:
13144
diff
changeset
|
194 | xfer->fd = source; |
|
8c224ef70efa
[gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents:
13144
diff
changeset
|
195 | |
|
14146
4413802cb7a9
[gaim-migrate @ 16705]
Mark Doliner <markdoliner@pidgin.im>
parents:
13851
diff
changeset
|
196 | /* Assemble the tx buffer */ |
|
4413802cb7a9
[gaim-migrate @ 16705]
Mark Doliner <markdoliner@pidgin.im>
parents:
13851
diff
changeset
|
197 | gc = xd->gc; |
| 15884 | 198 | account = purple_connection_get_account(gc); |
|
14146
4413802cb7a9
[gaim-migrate @ 16705]
Mark Doliner <markdoliner@pidgin.im>
parents:
13851
diff
changeset
|
199 | yd = gc->proto_data; |
|
4413802cb7a9
[gaim-migrate @ 16705]
Mark Doliner <markdoliner@pidgin.im>
parents:
13851
diff
changeset
|
200 | |
|
4413802cb7a9
[gaim-migrate @ 16705]
Mark Doliner <markdoliner@pidgin.im>
parents:
13851
diff
changeset
|
201 | pkt = yahoo_packet_new(YAHOO_SERVICE_FILETRANSFER, |
|
4413802cb7a9
[gaim-migrate @ 16705]
Mark Doliner <markdoliner@pidgin.im>
parents:
13851
diff
changeset
|
202 | YAHOO_STATUS_AVAILABLE, yd->session_id); |
| 7651 | 203 | |
| 15884 | 204 | size = g_strdup_printf("%" G_GSIZE_FORMAT, purple_xfer_get_size(xfer)); |
| 205 | filename = g_path_get_basename(purple_xfer_get_local_filename(xfer)); | |
|
14146
4413802cb7a9
[gaim-migrate @ 16705]
Mark Doliner <markdoliner@pidgin.im>
parents:
13851
diff
changeset
|
206 | encoded_filename = yahoo_string_encode(gc, filename, NULL); |
|
4413802cb7a9
[gaim-migrate @ 16705]
Mark Doliner <markdoliner@pidgin.im>
parents:
13851
diff
changeset
|
207 | |
| 15884 | 208 | yahoo_packet_hash(pkt, "sssss", 0, purple_connection_get_display_name(gc), |
|
14146
4413802cb7a9
[gaim-migrate @ 16705]
Mark Doliner <markdoliner@pidgin.im>
parents:
13851
diff
changeset
|
209 | 5, xfer->who, 14, "", 27, encoded_filename, 28, size); |
|
4413802cb7a9
[gaim-migrate @ 16705]
Mark Doliner <markdoliner@pidgin.im>
parents:
13851
diff
changeset
|
210 | g_free(size); |
|
4413802cb7a9
[gaim-migrate @ 16705]
Mark Doliner <markdoliner@pidgin.im>
parents:
13851
diff
changeset
|
211 | g_free(encoded_filename); |
|
4413802cb7a9
[gaim-migrate @ 16705]
Mark Doliner <markdoliner@pidgin.im>
parents:
13851
diff
changeset
|
212 | g_free(filename); |
|
4413802cb7a9
[gaim-migrate @ 16705]
Mark Doliner <markdoliner@pidgin.im>
parents:
13851
diff
changeset
|
213 | |
|
4413802cb7a9
[gaim-migrate @ 16705]
Mark Doliner <markdoliner@pidgin.im>
parents:
13851
diff
changeset
|
214 | content_length = YAHOO_PACKET_HDRLEN + yahoo_packet_length(pkt); |
|
4413802cb7a9
[gaim-migrate @ 16705]
Mark Doliner <markdoliner@pidgin.im>
parents:
13851
diff
changeset
|
215 | |
|
14508
02d80a119d80
[gaim-migrate @ 17160]
Evan Schoenberg <evands@pidgin.im>
parents:
14254
diff
changeset
|
216 | pkt_buf_len = yahoo_packet_build(pkt, 8, FALSE, yd->jp, &pkt_buf); |
|
14146
4413802cb7a9
[gaim-migrate @ 16705]
Mark Doliner <markdoliner@pidgin.im>
parents:
13851
diff
changeset
|
217 | yahoo_packet_free(pkt); |
| 7651 | 218 | |
| 15884 | 219 | host = purple_account_get_string(account, "xfer_host", YAHOO_XFER_HOST); |
| 220 | port = purple_account_get_int(account, "xfer_port", YAHOO_XFER_PORT); | |
|
14146
4413802cb7a9
[gaim-migrate @ 16705]
Mark Doliner <markdoliner@pidgin.im>
parents:
13851
diff
changeset
|
221 | header = g_strdup_printf( |
|
4413802cb7a9
[gaim-migrate @ 16705]
Mark Doliner <markdoliner@pidgin.im>
parents:
13851
diff
changeset
|
222 | "POST http://%s:%d/notifyft HTTP/1.0\r\n" |
|
4413802cb7a9
[gaim-migrate @ 16705]
Mark Doliner <markdoliner@pidgin.im>
parents:
13851
diff
changeset
|
223 | "Content-length: %" G_GSIZE_FORMAT "\r\n" |
|
4413802cb7a9
[gaim-migrate @ 16705]
Mark Doliner <markdoliner@pidgin.im>
parents:
13851
diff
changeset
|
224 | "Host: %s:%d\r\n" |
|
4413802cb7a9
[gaim-migrate @ 16705]
Mark Doliner <markdoliner@pidgin.im>
parents:
13851
diff
changeset
|
225 | "Cookie: Y=%s; T=%s\r\n" |
|
4413802cb7a9
[gaim-migrate @ 16705]
Mark Doliner <markdoliner@pidgin.im>
parents:
13851
diff
changeset
|
226 | "\r\n", |
| 15884 | 227 | host, port, content_length + 4 + purple_xfer_get_size(xfer), |
|
14146
4413802cb7a9
[gaim-migrate @ 16705]
Mark Doliner <markdoliner@pidgin.im>
parents:
13851
diff
changeset
|
228 | host, port, yd->cookie_y, yd->cookie_t); |
|
4413802cb7a9
[gaim-migrate @ 16705]
Mark Doliner <markdoliner@pidgin.im>
parents:
13851
diff
changeset
|
229 | |
|
4413802cb7a9
[gaim-migrate @ 16705]
Mark Doliner <markdoliner@pidgin.im>
parents:
13851
diff
changeset
|
230 | header_len = strlen(header); |
|
13201
8c224ef70efa
[gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents:
13144
diff
changeset
|
231 | |
|
14146
4413802cb7a9
[gaim-migrate @ 16705]
Mark Doliner <markdoliner@pidgin.im>
parents:
13851
diff
changeset
|
232 | xd->txbuflen = header_len + pkt_buf_len + 4; |
|
4413802cb7a9
[gaim-migrate @ 16705]
Mark Doliner <markdoliner@pidgin.im>
parents:
13851
diff
changeset
|
233 | xd->txbuf = g_malloc(xd->txbuflen); |
|
4413802cb7a9
[gaim-migrate @ 16705]
Mark Doliner <markdoliner@pidgin.im>
parents:
13851
diff
changeset
|
234 | |
|
4413802cb7a9
[gaim-migrate @ 16705]
Mark Doliner <markdoliner@pidgin.im>
parents:
13851
diff
changeset
|
235 | memcpy(xd->txbuf, header, header_len); |
|
4413802cb7a9
[gaim-migrate @ 16705]
Mark Doliner <markdoliner@pidgin.im>
parents:
13851
diff
changeset
|
236 | g_free(header); |
|
4413802cb7a9
[gaim-migrate @ 16705]
Mark Doliner <markdoliner@pidgin.im>
parents:
13851
diff
changeset
|
237 | memcpy(xd->txbuf + header_len, pkt_buf, pkt_buf_len); |
|
4413802cb7a9
[gaim-migrate @ 16705]
Mark Doliner <markdoliner@pidgin.im>
parents:
13851
diff
changeset
|
238 | g_free(pkt_buf); |
|
4413802cb7a9
[gaim-migrate @ 16705]
Mark Doliner <markdoliner@pidgin.im>
parents:
13851
diff
changeset
|
239 | memcpy(xd->txbuf + header_len + pkt_buf_len, "29\xc0\x80", 4); |
|
13201
8c224ef70efa
[gaim-migrate @ 15563]
Daniel Atallah <datallah@pidgin.im>
parents:
13144
diff
changeset
|
240 | |
|
14146
4413802cb7a9
[gaim-migrate @ 16705]
Mark Doliner <markdoliner@pidgin.im>
parents:
13851
diff
changeset
|
241 | xd->txbuf_written = 0; |
|
4413802cb7a9
[gaim-migrate @ 16705]
Mark Doliner <markdoliner@pidgin.im>
parents:
13851
diff
changeset
|
242 | |
|
4413802cb7a9
[gaim-migrate @ 16705]
Mark Doliner <markdoliner@pidgin.im>
parents:
13851
diff
changeset
|
243 | if (xd->tx_handler == 0) |
|
4413802cb7a9
[gaim-migrate @ 16705]
Mark Doliner <markdoliner@pidgin.im>
parents:
13851
diff
changeset
|
244 | { |
| 15884 | 245 | xd->tx_handler = purple_input_add(source, PURPLE_INPUT_WRITE, |
|
14146
4413802cb7a9
[gaim-migrate @ 16705]
Mark Doliner <markdoliner@pidgin.im>
parents:
13851
diff
changeset
|
246 | yahoo_sendfile_send_cb, xfer); |
| 15884 | 247 | yahoo_sendfile_send_cb(xfer, source, PURPLE_INPUT_WRITE); |
|
14146
4413802cb7a9
[gaim-migrate @ 16705]
Mark Doliner <markdoliner@pidgin.im>
parents:
13851
diff
changeset
|
248 | } |
| 7651 | 249 | } |
| 250 | ||
| 15884 | 251 | static void yahoo_xfer_init(PurpleXfer *xfer) |
| 7651 | 252 | { |
| 253 | struct yahoo_xfer_data *xfer_data; | |
| 15884 | 254 | PurpleConnection *gc; |
| 255 | PurpleAccount *account; | |
| 7827 | 256 | struct yahoo_data *yd; |
| 7651 | 257 | |
| 258 | xfer_data = xfer->data; | |
| 259 | gc = xfer_data->gc; | |
| 7827 | 260 | yd = gc->proto_data; |
| 15884 | 261 | account = purple_connection_get_account(gc); |
| 7651 | 262 | |
| 15884 | 263 | if (purple_xfer_get_type(xfer) == PURPLE_XFER_SEND) { |
|
10937
1753f4709889
[gaim-migrate @ 12721]
Peter Lawler <pidgin@bleeter.id.au>
parents:
10654
diff
changeset
|
264 | if (yd->jp) { |
| 15884 | 265 | if (purple_proxy_connect(NULL, account, purple_account_get_string(account, "xferjp_host", YAHOOJP_XFER_HOST), |
| 266 | purple_account_get_int(account, "xfer_port", YAHOO_XFER_PORT), | |
|
14170
f611621bc8a0
[gaim-migrate @ 16742]
Mark Doliner <markdoliner@pidgin.im>
parents:
14151
diff
changeset
|
267 | yahoo_sendfile_connected, xfer) == NULL) |
|
10937
1753f4709889
[gaim-migrate @ 12721]
Peter Lawler <pidgin@bleeter.id.au>
parents:
10654
diff
changeset
|
268 | { |
| 15884 | 269 | purple_notify_error(gc, NULL, _("File Transfer Failed"), |
|
10937
1753f4709889
[gaim-migrate @ 12721]
Peter Lawler <pidgin@bleeter.id.au>
parents:
10654
diff
changeset
|
270 | _("Unable to establish file descriptor.")); |
| 15884 | 271 | purple_xfer_cancel_remote(xfer); |
|
10937
1753f4709889
[gaim-migrate @ 12721]
Peter Lawler <pidgin@bleeter.id.au>
parents:
10654
diff
changeset
|
272 | } |
| 8282 | 273 | } else { |
| 15884 | 274 | if (purple_proxy_connect(NULL, account, purple_account_get_string(account, "xfer_host", YAHOO_XFER_HOST), |
| 275 | purple_account_get_int(account, "xfer_port", YAHOO_XFER_PORT), | |
|
14170
f611621bc8a0
[gaim-migrate @ 16742]
Mark Doliner <markdoliner@pidgin.im>
parents:
14151
diff
changeset
|
276 | yahoo_sendfile_connected, xfer) == NULL) |
|
10937
1753f4709889
[gaim-migrate @ 12721]
Peter Lawler <pidgin@bleeter.id.au>
parents:
10654
diff
changeset
|
277 | { |
| 15884 | 278 | purple_notify_error(gc, NULL, _("File Transfer Failed"), |
|
10937
1753f4709889
[gaim-migrate @ 12721]
Peter Lawler <pidgin@bleeter.id.au>
parents:
10654
diff
changeset
|
279 | _("Unable to establish file descriptor.")); |
| 15884 | 280 | purple_xfer_cancel_remote(xfer); |
| 8282 | 281 | } |
| 7651 | 282 | } |
| 283 | } else { | |
|
20104
fdf15ac30806
applied changes from 7f71045586c32cffc40f836f3fba92c693adda57
Richard Laager <rlaager@pidgin.im>
parents:
19859
diff
changeset
|
284 | xfer->fd = -1; |
| 15884 | 285 | if (purple_proxy_connect(NULL, account, xfer_data->host, xfer_data->port, |
|
20104
fdf15ac30806
applied changes from 7f71045586c32cffc40f836f3fba92c693adda57
Richard Laager <rlaager@pidgin.im>
parents:
19859
diff
changeset
|
286 | yahoo_receivefile_connected, xfer) == NULL) { |
| 15884 | 287 | purple_notify_error(gc, NULL, _("File Transfer Failed"), |
| 7651 | 288 | _("Unable to establish file descriptor.")); |
| 15884 | 289 | purple_xfer_cancel_remote(xfer); |
| 7651 | 290 | } |
| 291 | } | |
| 292 | } | |
| 293 | ||
| 15884 | 294 | static void yahoo_xfer_start(PurpleXfer *xfer) |
| 7651 | 295 | { |
| 296 | /* We don't need to do anything here, do we? */ | |
| 297 | } | |
| 298 | ||
| 15884 | 299 | static void yahoo_xfer_end(PurpleXfer *xfer) |
| 7651 | 300 | { |
| 301 | struct yahoo_xfer_data *xfer_data; | |
| 302 | ||
| 303 | xfer_data = xfer->data; | |
| 304 | ||
| 305 | if (xfer_data) | |
| 306 | yahoo_xfer_data_free(xfer_data); | |
| 307 | xfer->data = NULL; | |
| 308 | ||
| 309 | } | |
| 310 | ||
|
11897
10853b830964
[gaim-migrate @ 14188]
Stu Tomlinson <nosnilmot@pidgin.im>
parents:
11801
diff
changeset
|
311 | static guint calculate_length(const gchar *l, size_t len) |
| 7651 | 312 | { |
| 313 | int i; | |
| 314 | ||
| 315 | for (i = 0; i < len; i++) { | |
| 316 | if (!g_ascii_isdigit(l[i])) | |
| 317 | continue; | |
| 318 | return strtol(l + i, NULL, 10); | |
| 319 | } | |
| 320 | return 0; | |
| 321 | } | |
| 322 | ||
| 15884 | 323 | static gssize yahoo_xfer_read(guchar **buffer, PurpleXfer *xfer) |
| 7651 | 324 | { |
| 7710 | 325 | gchar buf[4096]; |
|
12151
8002bb57756b
[gaim-migrate @ 14452]
Richard Laager <rlaager@pidgin.im>
parents:
12143
diff
changeset
|
326 | gssize len; |
| 7651 | 327 | gchar *start = NULL; |
| 328 | gchar *length; | |
| 329 | gchar *end; | |
| 7710 | 330 | int filelen; |
| 7651 | 331 | struct yahoo_xfer_data *xd = xfer->data; |
| 332 | ||
| 15884 | 333 | if (purple_xfer_get_type(xfer) != PURPLE_XFER_RECEIVE) { |
| 7651 | 334 | return 0; |
| 335 | } | |
| 336 | ||
| 337 | len = read(xfer->fd, buf, sizeof(buf)); | |
| 338 | ||
| 7682 | 339 | if (len <= 0) { |
| 15884 | 340 | if ((purple_xfer_get_size(xfer) > 0) && |
| 341 | (purple_xfer_get_bytes_sent(xfer) >= purple_xfer_get_size(xfer))) { | |
| 342 | purple_xfer_set_completed(xfer, TRUE); | |
| 9798 | 343 | return 0; |
| 344 | } else | |
| 345 | return -1; | |
| 7651 | 346 | } |
| 347 | ||
| 348 | if (!xd->started) { | |
| 349 | xd->rxqueue = g_realloc(xd->rxqueue, len + xd->rxlen); | |
| 350 | memcpy(xd->rxqueue + xd->rxlen, buf, len); | |
| 351 | xd->rxlen += len; | |
| 352 | ||
| 353 | length = g_strstr_len(xd->rxqueue, len, "Content-length:"); | |
|
10579
f4576b2e0956
[gaim-migrate @ 11976]
Stu Tomlinson <nosnilmot@pidgin.im>
parents:
10576
diff
changeset
|
354 | /* some proxies re-write this header, changing the capitalization :( |
|
f4576b2e0956
[gaim-migrate @ 11976]
Stu Tomlinson <nosnilmot@pidgin.im>
parents:
10576
diff
changeset
|
355 | * technically that's allowed since headers are case-insensitive |
|
f4576b2e0956
[gaim-migrate @ 11976]
Stu Tomlinson <nosnilmot@pidgin.im>
parents:
10576
diff
changeset
|
356 | * [RFC 2616, section 4.2] */ |
|
f4576b2e0956
[gaim-migrate @ 11976]
Stu Tomlinson <nosnilmot@pidgin.im>
parents:
10576
diff
changeset
|
357 | if (length == NULL) |
|
f4576b2e0956
[gaim-migrate @ 11976]
Stu Tomlinson <nosnilmot@pidgin.im>
parents:
10576
diff
changeset
|
358 | length = g_strstr_len(xd->rxqueue, len, "Content-Length:"); |
| 7651 | 359 | if (length) { |
| 360 | end = g_strstr_len(length, length - xd->rxqueue, "\r\n"); | |
| 361 | if (!end) | |
| 362 | return 0; | |
| 7710 | 363 | if ((filelen = calculate_length(length, len - (length - xd->rxqueue)))) |
| 15884 | 364 | purple_xfer_set_size(xfer, filelen); |
| 7651 | 365 | } |
| 366 | start = g_strstr_len(xd->rxqueue, len, "\r\n\r\n"); | |
| 367 | if (start) | |
| 368 | start += 4; | |
| 369 | if (!start || start > (xd->rxqueue + len)) | |
| 370 | return 0; | |
| 371 | xd->started = TRUE; | |
| 372 | ||
| 373 | len -= (start - xd->rxqueue); | |
| 374 | ||
| 375 | *buffer = g_malloc(len); | |
| 376 | memcpy(*buffer, start, len); | |
| 377 | g_free(xd->rxqueue); | |
| 378 | xd->rxqueue = NULL; | |
| 379 | xd->rxlen = 0; | |
| 380 | } else { | |
| 381 | *buffer = g_malloc(len); | |
| 382 | memcpy(*buffer, buf, len); | |
| 383 | } | |
| 384 | ||
| 385 | return len; | |
| 386 | } | |
| 387 | ||
| 15884 | 388 | static gssize yahoo_xfer_write(const guchar *buffer, size_t size, PurpleXfer *xfer) |
| 7651 | 389 | { |
|
12151
8002bb57756b
[gaim-migrate @ 14452]
Richard Laager <rlaager@pidgin.im>
parents:
12143
diff
changeset
|
390 | gssize len; |
| 7651 | 391 | struct yahoo_xfer_data *xd = xfer->data; |
| 392 | ||
| 393 | if (!xd) | |
| 9798 | 394 | return -1; |
| 7651 | 395 | |
| 15884 | 396 | if (purple_xfer_get_type(xfer) != PURPLE_XFER_SEND) { |
| 9798 | 397 | return -1; |
| 7651 | 398 | } |
| 399 | ||
| 400 | len = write(xfer->fd, buffer, size); | |
| 401 | ||
| 7710 | 402 | if (len == -1) { |
| 15884 | 403 | if (purple_xfer_get_bytes_sent(xfer) >= purple_xfer_get_size(xfer)) |
| 404 | purple_xfer_set_completed(xfer, TRUE); | |
| 7710 | 405 | if ((errno != EAGAIN) && (errno != EINTR)) |
| 9798 | 406 | return -1; |
| 7710 | 407 | return 0; |
| 408 | } | |
| 409 | ||
| 15884 | 410 | if ((purple_xfer_get_bytes_sent(xfer) + len) >= purple_xfer_get_size(xfer)) |
| 411 | purple_xfer_set_completed(xfer, TRUE); | |
| 7651 | 412 | |
| 413 | return len; | |
| 414 | } | |
| 415 | ||
| 15884 | 416 | static void yahoo_xfer_cancel_send(PurpleXfer *xfer) |
| 7651 | 417 | { |
| 418 | struct yahoo_xfer_data *xfer_data; | |
| 419 | ||
| 420 | xfer_data = xfer->data; | |
| 421 | ||
| 422 | if (xfer_data) | |
| 423 | yahoo_xfer_data_free(xfer_data); | |
| 424 | xfer->data = NULL; | |
| 425 | } | |
| 426 | ||
| 15884 | 427 | static void yahoo_xfer_cancel_recv(PurpleXfer *xfer) |
| 7651 | 428 | { |
| 429 | struct yahoo_xfer_data *xfer_data; | |
| 430 | ||
| 431 | xfer_data = xfer->data; | |
| 432 | ||
| 433 | if (xfer_data) | |
| 434 | yahoo_xfer_data_free(xfer_data); | |
| 435 | xfer->data = NULL; | |
| 436 | } | |
| 437 | ||
| 15884 | 438 | void yahoo_process_p2pfilexfer(PurpleConnection *gc, struct yahoo_packet *pkt) |
|
11475
1e222e6e52a0
[gaim-migrate @ 13717]
Gary Kramlich <grim@reaperworld.com>
parents:
11159
diff
changeset
|
439 | { |
|
11914
81ac838f3824
[gaim-migrate @ 14205]
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents:
11897
diff
changeset
|
440 | GSList *l = pkt->hash; |
|
11644
939411169d01
[gaim-migrate @ 13922]
Peter Lawler <pidgin@bleeter.id.au>
parents:
11475
diff
changeset
|
441 | |
|
11914
81ac838f3824
[gaim-migrate @ 14205]
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents:
11897
diff
changeset
|
442 | char *me = NULL; |
|
81ac838f3824
[gaim-migrate @ 14205]
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents:
11897
diff
changeset
|
443 | char *from = NULL; |
|
81ac838f3824
[gaim-migrate @ 14205]
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents:
11897
diff
changeset
|
444 | char *service = NULL; |
|
81ac838f3824
[gaim-migrate @ 14205]
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents:
11897
diff
changeset
|
445 | char *message = NULL; |
|
81ac838f3824
[gaim-migrate @ 14205]
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents:
11897
diff
changeset
|
446 | char *command = NULL; |
|
81ac838f3824
[gaim-migrate @ 14205]
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents:
11897
diff
changeset
|
447 | char *imv = NULL; |
|
81ac838f3824
[gaim-migrate @ 14205]
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents:
11897
diff
changeset
|
448 | char *unknown = NULL; |
|
11644
939411169d01
[gaim-migrate @ 13922]
Peter Lawler <pidgin@bleeter.id.au>
parents:
11475
diff
changeset
|
449 | |
|
11801
c19b37ac661b
[gaim-migrate @ 14092]
Gary Kramlich <grim@reaperworld.com>
parents:
11644
diff
changeset
|
450 | /* Get all the necessary values from this new packet */ |
|
11914
81ac838f3824
[gaim-migrate @ 14205]
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents:
11897
diff
changeset
|
451 | while(l != NULL) |
|
11475
1e222e6e52a0
[gaim-migrate @ 13717]
Gary Kramlich <grim@reaperworld.com>
parents:
11159
diff
changeset
|
452 | { |
|
1e222e6e52a0
[gaim-migrate @ 13717]
Gary Kramlich <grim@reaperworld.com>
parents:
11159
diff
changeset
|
453 | struct yahoo_pair *pair = l->data; |
|
11644
939411169d01
[gaim-migrate @ 13922]
Peter Lawler <pidgin@bleeter.id.au>
parents:
11475
diff
changeset
|
454 | |
|
20150
760aa4bea7c6
applied changes from 80e3a515775c28b61c4c155c4a524374ef3360ff
Richard Laager <rlaager@pidgin.im>
parents:
20104
diff
changeset
|
455 | switch(pair->key) { |
|
760aa4bea7c6
applied changes from 80e3a515775c28b61c4c155c4a524374ef3360ff
Richard Laager <rlaager@pidgin.im>
parents:
20104
diff
changeset
|
456 | case 5: /* Get who the packet is for */ |
|
11475
1e222e6e52a0
[gaim-migrate @ 13717]
Gary Kramlich <grim@reaperworld.com>
parents:
11159
diff
changeset
|
457 | me = pair->value; |
|
20150
760aa4bea7c6
applied changes from 80e3a515775c28b61c4c155c4a524374ef3360ff
Richard Laager <rlaager@pidgin.im>
parents:
20104
diff
changeset
|
458 | break; |
|
760aa4bea7c6
applied changes from 80e3a515775c28b61c4c155c4a524374ef3360ff
Richard Laager <rlaager@pidgin.im>
parents:
20104
diff
changeset
|
459 | case 4: /* Get who the packet is from */ |
|
11475
1e222e6e52a0
[gaim-migrate @ 13717]
Gary Kramlich <grim@reaperworld.com>
parents:
11159
diff
changeset
|
460 | from = pair->value; |
|
20150
760aa4bea7c6
applied changes from 80e3a515775c28b61c4c155c4a524374ef3360ff
Richard Laager <rlaager@pidgin.im>
parents:
20104
diff
changeset
|
461 | break; |
|
760aa4bea7c6
applied changes from 80e3a515775c28b61c4c155c4a524374ef3360ff
Richard Laager <rlaager@pidgin.im>
parents:
20104
diff
changeset
|
462 | case 49: /* Get the type of service */ |
|
11475
1e222e6e52a0
[gaim-migrate @ 13717]
Gary Kramlich <grim@reaperworld.com>
parents:
11159
diff
changeset
|
463 | service = pair->value; |
|
20150
760aa4bea7c6
applied changes from 80e3a515775c28b61c4c155c4a524374ef3360ff
Richard Laager <rlaager@pidgin.im>
parents:
20104
diff
changeset
|
464 | break; |
|
760aa4bea7c6
applied changes from 80e3a515775c28b61c4c155c4a524374ef3360ff
Richard Laager <rlaager@pidgin.im>
parents:
20104
diff
changeset
|
465 | case 14: /* Get the 'message' of the packet */ |
|
11475
1e222e6e52a0
[gaim-migrate @ 13717]
Gary Kramlich <grim@reaperworld.com>
parents:
11159
diff
changeset
|
466 | message = pair->value; |
|
20150
760aa4bea7c6
applied changes from 80e3a515775c28b61c4c155c4a524374ef3360ff
Richard Laager <rlaager@pidgin.im>
parents:
20104
diff
changeset
|
467 | break; |
|
760aa4bea7c6
applied changes from 80e3a515775c28b61c4c155c4a524374ef3360ff
Richard Laager <rlaager@pidgin.im>
parents:
20104
diff
changeset
|
468 | case 13: /* Get the command associated with this packet */ |
|
11475
1e222e6e52a0
[gaim-migrate @ 13717]
Gary Kramlich <grim@reaperworld.com>
parents:
11159
diff
changeset
|
469 | command = pair->value; |
|
20150
760aa4bea7c6
applied changes from 80e3a515775c28b61c4c155c4a524374ef3360ff
Richard Laager <rlaager@pidgin.im>
parents:
20104
diff
changeset
|
470 | break; |
|
760aa4bea7c6
applied changes from 80e3a515775c28b61c4c155c4a524374ef3360ff
Richard Laager <rlaager@pidgin.im>
parents:
20104
diff
changeset
|
471 | case 63: /* IMVironment name and version */ |
|
11475
1e222e6e52a0
[gaim-migrate @ 13717]
Gary Kramlich <grim@reaperworld.com>
parents:
11159
diff
changeset
|
472 | imv = pair->value; |
|
20150
760aa4bea7c6
applied changes from 80e3a515775c28b61c4c155c4a524374ef3360ff
Richard Laager <rlaager@pidgin.im>
parents:
20104
diff
changeset
|
473 | break; |
|
760aa4bea7c6
applied changes from 80e3a515775c28b61c4c155c4a524374ef3360ff
Richard Laager <rlaager@pidgin.im>
parents:
20104
diff
changeset
|
474 | case 64: /* Not sure, but it does vary with initialization of Doodle */ |
|
11914
81ac838f3824
[gaim-migrate @ 14205]
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents:
11897
diff
changeset
|
475 | unknown = pair->value; /* So, I'll keep it (for a little while atleast) */ |
|
20150
760aa4bea7c6
applied changes from 80e3a515775c28b61c4c155c4a524374ef3360ff
Richard Laager <rlaager@pidgin.im>
parents:
20104
diff
changeset
|
476 | break; |
|
760aa4bea7c6
applied changes from 80e3a515775c28b61c4c155c4a524374ef3360ff
Richard Laager <rlaager@pidgin.im>
parents:
20104
diff
changeset
|
477 | } |
|
11644
939411169d01
[gaim-migrate @ 13922]
Peter Lawler <pidgin@bleeter.id.au>
parents:
11475
diff
changeset
|
478 | |
|
11475
1e222e6e52a0
[gaim-migrate @ 13717]
Gary Kramlich <grim@reaperworld.com>
parents:
11159
diff
changeset
|
479 | l = l->next; |
|
1e222e6e52a0
[gaim-migrate @ 13717]
Gary Kramlich <grim@reaperworld.com>
parents:
11159
diff
changeset
|
480 | } |
|
11644
939411169d01
[gaim-migrate @ 13922]
Peter Lawler <pidgin@bleeter.id.au>
parents:
11475
diff
changeset
|
481 | |
|
11801
c19b37ac661b
[gaim-migrate @ 14092]
Gary Kramlich <grim@reaperworld.com>
parents:
11644
diff
changeset
|
482 | /* If this packet is an IMVIRONMENT, handle it accordingly */ |
|
13459
c20f00df92e5
[gaim-migrate @ 15833]
Daniel Atallah <datallah@pidgin.im>
parents:
13277
diff
changeset
|
483 | if(service != NULL && imv != NULL && !strcmp(service, "IMVIRONMENT")) |
|
11475
1e222e6e52a0
[gaim-migrate @ 13717]
Gary Kramlich <grim@reaperworld.com>
parents:
11159
diff
changeset
|
484 | { |
|
11801
c19b37ac661b
[gaim-migrate @ 14092]
Gary Kramlich <grim@reaperworld.com>
parents:
11644
diff
changeset
|
485 | /* Check for a Doodle packet and handle it accordingly */ |
|
19064
1680699bdbf4
Fix yahoo doodling to work with newer yahoo messenger clients. This breaks doodling with older Pidgin clients (trying to support both looked too painful). Fixes #1445.
Daniel Atallah <datallah@pidgin.im>
parents:
18273
diff
changeset
|
486 | if(strstr(imv, "doodle;") != NULL) |
|
20150
760aa4bea7c6
applied changes from 80e3a515775c28b61c4c155c4a524374ef3360ff
Richard Laager <rlaager@pidgin.im>
parents:
20104
diff
changeset
|
487 | yahoo_doodle_process(gc, me, from, command, message, imv); |
|
11644
939411169d01
[gaim-migrate @ 13922]
Peter Lawler <pidgin@bleeter.id.au>
parents:
11475
diff
changeset
|
488 | |
|
11801
c19b37ac661b
[gaim-migrate @ 14092]
Gary Kramlich <grim@reaperworld.com>
parents:
11644
diff
changeset
|
489 | /* If an IMVIRONMENT packet comes without a specific imviroment name */ |
|
11914
81ac838f3824
[gaim-migrate @ 14205]
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents:
11897
diff
changeset
|
490 | if(!strcmp(imv, ";0")) |
|
11475
1e222e6e52a0
[gaim-migrate @ 13717]
Gary Kramlich <grim@reaperworld.com>
parents:
11159
diff
changeset
|
491 | { |
|
11914
81ac838f3824
[gaim-migrate @ 14205]
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents:
11897
diff
changeset
|
492 | /* It is unfortunately time to close all IMVironments with the remote client */ |
|
81ac838f3824
[gaim-migrate @ 14205]
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents:
11897
diff
changeset
|
493 | yahoo_doodle_command_got_shutdown(gc, from); |
|
11475
1e222e6e52a0
[gaim-migrate @ 13717]
Gary Kramlich <grim@reaperworld.com>
parents:
11159
diff
changeset
|
494 | } |
|
1e222e6e52a0
[gaim-migrate @ 13717]
Gary Kramlich <grim@reaperworld.com>
parents:
11159
diff
changeset
|
495 | } |
|
1e222e6e52a0
[gaim-migrate @ 13717]
Gary Kramlich <grim@reaperworld.com>
parents:
11159
diff
changeset
|
496 | } |
|
1e222e6e52a0
[gaim-migrate @ 13717]
Gary Kramlich <grim@reaperworld.com>
parents:
11159
diff
changeset
|
497 | |
| 15884 | 498 | void yahoo_process_filetransfer(PurpleConnection *gc, struct yahoo_packet *pkt) |
| 7651 | 499 | { |
| 500 | char *from = NULL; | |
| 501 | char *to = NULL; | |
| 502 | char *msg = NULL; | |
| 503 | char *url = NULL; | |
|
13851
27bc39ea07f8
[gaim-migrate @ 16306]
Mark Doliner <markdoliner@pidgin.im>
parents:
13713
diff
changeset
|
504 | char *imv = NULL; |
| 7651 | 505 | long expires = 0; |
| 15884 | 506 | PurpleXfer *xfer; |
|
13851
27bc39ea07f8
[gaim-migrate @ 16306]
Mark Doliner <markdoliner@pidgin.im>
parents:
13713
diff
changeset
|
507 | struct yahoo_data *yd; |
| 7651 | 508 | struct yahoo_xfer_data *xfer_data; |
| 509 | char *service = NULL; | |
| 510 | char *filename = NULL; | |
| 511 | unsigned long filesize = 0L; | |
| 512 | GSList *l; | |
| 513 | ||
|
13851
27bc39ea07f8
[gaim-migrate @ 16306]
Mark Doliner <markdoliner@pidgin.im>
parents:
13713
diff
changeset
|
514 | yd = gc->proto_data; |
|
27bc39ea07f8
[gaim-migrate @ 16306]
Mark Doliner <markdoliner@pidgin.im>
parents:
13713
diff
changeset
|
515 | |
| 7651 | 516 | for (l = pkt->hash; l; l = l->next) { |
| 517 | struct yahoo_pair *pair = l->data; | |
| 518 | ||
|
20150
760aa4bea7c6
applied changes from 80e3a515775c28b61c4c155c4a524374ef3360ff
Richard Laager <rlaager@pidgin.im>
parents:
20104
diff
changeset
|
519 | switch (pair->key) { |
|
760aa4bea7c6
applied changes from 80e3a515775c28b61c4c155c4a524374ef3360ff
Richard Laager <rlaager@pidgin.im>
parents:
20104
diff
changeset
|
520 | case 4: |
| 7651 | 521 | from = pair->value; |
|
20150
760aa4bea7c6
applied changes from 80e3a515775c28b61c4c155c4a524374ef3360ff
Richard Laager <rlaager@pidgin.im>
parents:
20104
diff
changeset
|
522 | break; |
|
760aa4bea7c6
applied changes from 80e3a515775c28b61c4c155c4a524374ef3360ff
Richard Laager <rlaager@pidgin.im>
parents:
20104
diff
changeset
|
523 | case 5: |
| 7651 | 524 | to = pair->value; |
|
20150
760aa4bea7c6
applied changes from 80e3a515775c28b61c4c155c4a524374ef3360ff
Richard Laager <rlaager@pidgin.im>
parents:
20104
diff
changeset
|
525 | break; |
|
760aa4bea7c6
applied changes from 80e3a515775c28b61c4c155c4a524374ef3360ff
Richard Laager <rlaager@pidgin.im>
parents:
20104
diff
changeset
|
526 | case 14: |
| 7651 | 527 | msg = pair->value; |
|
20150
760aa4bea7c6
applied changes from 80e3a515775c28b61c4c155c4a524374ef3360ff
Richard Laager <rlaager@pidgin.im>
parents:
20104
diff
changeset
|
528 | break; |
|
760aa4bea7c6
applied changes from 80e3a515775c28b61c4c155c4a524374ef3360ff
Richard Laager <rlaager@pidgin.im>
parents:
20104
diff
changeset
|
529 | case 20: |
| 7651 | 530 | url = pair->value; |
|
20150
760aa4bea7c6
applied changes from 80e3a515775c28b61c4c155c4a524374ef3360ff
Richard Laager <rlaager@pidgin.im>
parents:
20104
diff
changeset
|
531 | break; |
|
760aa4bea7c6
applied changes from 80e3a515775c28b61c4c155c4a524374ef3360ff
Richard Laager <rlaager@pidgin.im>
parents:
20104
diff
changeset
|
532 | case 38: |
| 7651 | 533 | expires = strtol(pair->value, NULL, 10); |
|
20150
760aa4bea7c6
applied changes from 80e3a515775c28b61c4c155c4a524374ef3360ff
Richard Laager <rlaager@pidgin.im>
parents:
20104
diff
changeset
|
534 | break; |
|
760aa4bea7c6
applied changes from 80e3a515775c28b61c4c155c4a524374ef3360ff
Richard Laager <rlaager@pidgin.im>
parents:
20104
diff
changeset
|
535 | case 27: |
| 7651 | 536 | filename = pair->value; |
|
20150
760aa4bea7c6
applied changes from 80e3a515775c28b61c4c155c4a524374ef3360ff
Richard Laager <rlaager@pidgin.im>
parents:
20104
diff
changeset
|
537 | break; |
|
760aa4bea7c6
applied changes from 80e3a515775c28b61c4c155c4a524374ef3360ff
Richard Laager <rlaager@pidgin.im>
parents:
20104
diff
changeset
|
538 | case 28: |
| 7651 | 539 | filesize = atol(pair->value); |
|
20150
760aa4bea7c6
applied changes from 80e3a515775c28b61c4c155c4a524374ef3360ff
Richard Laager <rlaager@pidgin.im>
parents:
20104
diff
changeset
|
540 | break; |
|
760aa4bea7c6
applied changes from 80e3a515775c28b61c4c155c4a524374ef3360ff
Richard Laager <rlaager@pidgin.im>
parents:
20104
diff
changeset
|
541 | case 49: |
| 7651 | 542 | service = pair->value; |
|
20150
760aa4bea7c6
applied changes from 80e3a515775c28b61c4c155c4a524374ef3360ff
Richard Laager <rlaager@pidgin.im>
parents:
20104
diff
changeset
|
543 | break; |
|
760aa4bea7c6
applied changes from 80e3a515775c28b61c4c155c4a524374ef3360ff
Richard Laager <rlaager@pidgin.im>
parents:
20104
diff
changeset
|
544 | case 63: |
|
13851
27bc39ea07f8
[gaim-migrate @ 16306]
Mark Doliner <markdoliner@pidgin.im>
parents:
13713
diff
changeset
|
545 | imv = pair->value; |
|
20150
760aa4bea7c6
applied changes from 80e3a515775c28b61c4c155c4a524374ef3360ff
Richard Laager <rlaager@pidgin.im>
parents:
20104
diff
changeset
|
546 | break; |
|
760aa4bea7c6
applied changes from 80e3a515775c28b61c4c155c4a524374ef3360ff
Richard Laager <rlaager@pidgin.im>
parents:
20104
diff
changeset
|
547 | } |
|
13851
27bc39ea07f8
[gaim-migrate @ 16306]
Mark Doliner <markdoliner@pidgin.im>
parents:
13713
diff
changeset
|
548 | } |
|
27bc39ea07f8
[gaim-migrate @ 16306]
Mark Doliner <markdoliner@pidgin.im>
parents:
13713
diff
changeset
|
549 | |
|
27bc39ea07f8
[gaim-migrate @ 16306]
Mark Doliner <markdoliner@pidgin.im>
parents:
13713
diff
changeset
|
550 | /* |
|
27bc39ea07f8
[gaim-migrate @ 16306]
Mark Doliner <markdoliner@pidgin.im>
parents:
13713
diff
changeset
|
551 | * The remote user has changed their IMVironment. We |
|
27bc39ea07f8
[gaim-migrate @ 16306]
Mark Doliner <markdoliner@pidgin.im>
parents:
13713
diff
changeset
|
552 | * record it for later use. |
|
27bc39ea07f8
[gaim-migrate @ 16306]
Mark Doliner <markdoliner@pidgin.im>
parents:
13713
diff
changeset
|
553 | */ |
|
27bc39ea07f8
[gaim-migrate @ 16306]
Mark Doliner <markdoliner@pidgin.im>
parents:
13713
diff
changeset
|
554 | if (from && imv && service && (strcmp("IMVIRONMENT", service) == 0)) { |
|
27bc39ea07f8
[gaim-migrate @ 16306]
Mark Doliner <markdoliner@pidgin.im>
parents:
13713
diff
changeset
|
555 | g_hash_table_replace(yd->imvironments, g_strdup(from), g_strdup(imv)); |
|
27bc39ea07f8
[gaim-migrate @ 16306]
Mark Doliner <markdoliner@pidgin.im>
parents:
13713
diff
changeset
|
556 | return; |
| 7651 | 557 | } |
| 558 | ||
| 559 | if (pkt->service == YAHOO_SERVICE_P2PFILEXFER) { | |
| 10261 | 560 | if (service && (strcmp("FILEXFER", service) != 0)) { |
| 15884 | 561 | purple_debug_misc("yahoo", "unhandled service 0x%02x\n", pkt->service); |
| 7651 | 562 | return; |
| 563 | } | |
| 564 | } | |
| 565 | ||
| 566 | if (msg) { | |
| 567 | char *tmp; | |
| 568 | tmp = strchr(msg, '\006'); | |
| 569 | if (tmp) | |
| 570 | *tmp = '\0'; | |
| 571 | } | |
| 572 | ||
| 573 | if (!url || !from) | |
| 574 | return; | |
| 575 | ||
| 576 | /* Setup the Yahoo-specific file transfer data */ | |
| 577 | xfer_data = g_new0(struct yahoo_xfer_data, 1); | |
| 578 | xfer_data->gc = gc; | |
| 15884 | 579 | if (!purple_url_parse(url, &(xfer_data->host), &(xfer_data->port), &(xfer_data->path), NULL, NULL)) { |
| 7651 | 580 | g_free(xfer_data); |
| 581 | return; | |
| 582 | } | |
| 583 | ||
| 15884 | 584 | purple_debug_misc("yahoo_filexfer", "Host is %s, port is %d, path is %s, and the full url was %s.\n", |
| 7651 | 585 | xfer_data->host, xfer_data->port, xfer_data->path, url); |
| 586 | ||
| 587 | /* Build the file transfer handle. */ | |
| 15884 | 588 | xfer = purple_xfer_new(gc->account, PURPLE_XFER_RECEIVE, from); |
|
15345
797936e968ff
[gaim-migrate @ 18073]
Evan Schoenberg <evands@pidgin.im>
parents:
14899
diff
changeset
|
589 | if (xfer) |
|
797936e968ff
[gaim-migrate @ 18073]
Evan Schoenberg <evands@pidgin.im>
parents:
14899
diff
changeset
|
590 | { |
|
797936e968ff
[gaim-migrate @ 18073]
Evan Schoenberg <evands@pidgin.im>
parents:
14899
diff
changeset
|
591 | xfer->data = xfer_data; |
| 7651 | 592 | |
|
15345
797936e968ff
[gaim-migrate @ 18073]
Evan Schoenberg <evands@pidgin.im>
parents:
14899
diff
changeset
|
593 | /* Set the info about the incoming file. */ |
|
797936e968ff
[gaim-migrate @ 18073]
Evan Schoenberg <evands@pidgin.im>
parents:
14899
diff
changeset
|
594 | if (filename) { |
|
797936e968ff
[gaim-migrate @ 18073]
Evan Schoenberg <evands@pidgin.im>
parents:
14899
diff
changeset
|
595 | char *utf8_filename = yahoo_string_decode(gc, filename, TRUE); |
| 15884 | 596 | purple_xfer_set_filename(xfer, utf8_filename); |
|
10976
96153d16e808
[gaim-migrate @ 12802]
Daniel Atallah <datallah@pidgin.im>
parents:
10937
diff
changeset
|
597 | g_free(utf8_filename); |
|
15345
797936e968ff
[gaim-migrate @ 18073]
Evan Schoenberg <evands@pidgin.im>
parents:
14899
diff
changeset
|
598 | } else { |
|
797936e968ff
[gaim-migrate @ 18073]
Evan Schoenberg <evands@pidgin.im>
parents:
14899
diff
changeset
|
599 | gchar *start, *end; |
|
797936e968ff
[gaim-migrate @ 18073]
Evan Schoenberg <evands@pidgin.im>
parents:
14899
diff
changeset
|
600 | start = g_strrstr(xfer_data->path, "/"); |
|
797936e968ff
[gaim-migrate @ 18073]
Evan Schoenberg <evands@pidgin.im>
parents:
14899
diff
changeset
|
601 | if (start) |
|
797936e968ff
[gaim-migrate @ 18073]
Evan Schoenberg <evands@pidgin.im>
parents:
14899
diff
changeset
|
602 | start++; |
|
797936e968ff
[gaim-migrate @ 18073]
Evan Schoenberg <evands@pidgin.im>
parents:
14899
diff
changeset
|
603 | end = g_strrstr(xfer_data->path, "?"); |
|
797936e968ff
[gaim-migrate @ 18073]
Evan Schoenberg <evands@pidgin.im>
parents:
14899
diff
changeset
|
604 | if (start && *start && end) { |
|
797936e968ff
[gaim-migrate @ 18073]
Evan Schoenberg <evands@pidgin.im>
parents:
14899
diff
changeset
|
605 | char *utf8_filename; |
|
797936e968ff
[gaim-migrate @ 18073]
Evan Schoenberg <evands@pidgin.im>
parents:
14899
diff
changeset
|
606 | filename = g_strndup(start, end - start); |
|
797936e968ff
[gaim-migrate @ 18073]
Evan Schoenberg <evands@pidgin.im>
parents:
14899
diff
changeset
|
607 | utf8_filename = yahoo_string_decode(gc, filename, TRUE); |
|
797936e968ff
[gaim-migrate @ 18073]
Evan Schoenberg <evands@pidgin.im>
parents:
14899
diff
changeset
|
608 | g_free(filename); |
| 15884 | 609 | purple_xfer_set_filename(xfer, utf8_filename); |
|
15345
797936e968ff
[gaim-migrate @ 18073]
Evan Schoenberg <evands@pidgin.im>
parents:
14899
diff
changeset
|
610 | g_free(utf8_filename); |
|
797936e968ff
[gaim-migrate @ 18073]
Evan Schoenberg <evands@pidgin.im>
parents:
14899
diff
changeset
|
611 | filename = NULL; |
|
797936e968ff
[gaim-migrate @ 18073]
Evan Schoenberg <evands@pidgin.im>
parents:
14899
diff
changeset
|
612 | } |
| 7651 | 613 | } |
| 614 | ||
| 15884 | 615 | purple_xfer_set_size(xfer, filesize); |
| 7651 | 616 | |
|
15345
797936e968ff
[gaim-migrate @ 18073]
Evan Schoenberg <evands@pidgin.im>
parents:
14899
diff
changeset
|
617 | /* Setup our I/O op functions */ |
| 15884 | 618 | purple_xfer_set_init_fnc(xfer, yahoo_xfer_init); |
| 619 | purple_xfer_set_start_fnc(xfer, yahoo_xfer_start); | |
| 620 | purple_xfer_set_end_fnc(xfer, yahoo_xfer_end); | |
| 621 | purple_xfer_set_cancel_send_fnc(xfer, yahoo_xfer_cancel_send); | |
| 622 | purple_xfer_set_cancel_recv_fnc(xfer, yahoo_xfer_cancel_recv); | |
| 623 | purple_xfer_set_read_fnc(xfer, yahoo_xfer_read); | |
| 624 | purple_xfer_set_write_fnc(xfer, yahoo_xfer_write); | |
|
15345
797936e968ff
[gaim-migrate @ 18073]
Evan Schoenberg <evands@pidgin.im>
parents:
14899
diff
changeset
|
625 | |
|
797936e968ff
[gaim-migrate @ 18073]
Evan Schoenberg <evands@pidgin.im>
parents:
14899
diff
changeset
|
626 | /* Now perform the request */ |
| 15884 | 627 | purple_xfer_request(xfer); |
|
15345
797936e968ff
[gaim-migrate @ 18073]
Evan Schoenberg <evands@pidgin.im>
parents:
14899
diff
changeset
|
628 | } |
| 7651 | 629 | } |
| 630 | ||
| 15884 | 631 | PurpleXfer *yahoo_new_xfer(PurpleConnection *gc, const char *who) |
| 7651 | 632 | { |
| 15884 | 633 | PurpleXfer *xfer; |
| 7651 | 634 | struct yahoo_xfer_data *xfer_data; |
|
19064
1680699bdbf4
Fix yahoo doodling to work with newer yahoo messenger clients. This breaks doodling with older Pidgin clients (trying to support both looked too painful). Fixes #1445.
Daniel Atallah <datallah@pidgin.im>
parents:
18273
diff
changeset
|
635 | |
|
12143
09f216663302
[gaim-migrate @ 14444]
Evan Schoenberg <evands@pidgin.im>
parents:
11914
diff
changeset
|
636 | g_return_val_if_fail(who != NULL, NULL); |
|
19064
1680699bdbf4
Fix yahoo doodling to work with newer yahoo messenger clients. This breaks doodling with older Pidgin clients (trying to support both looked too painful). Fixes #1445.
Daniel Atallah <datallah@pidgin.im>
parents:
18273
diff
changeset
|
637 | |
| 7651 | 638 | xfer_data = g_new0(struct yahoo_xfer_data, 1); |
| 639 | xfer_data->gc = gc; | |
|
19064
1680699bdbf4
Fix yahoo doodling to work with newer yahoo messenger clients. This breaks doodling with older Pidgin clients (trying to support both looked too painful). Fixes #1445.
Daniel Atallah <datallah@pidgin.im>
parents:
18273
diff
changeset
|
640 | |
| 7651 | 641 | /* Build the file transfer handle. */ |
| 15884 | 642 | xfer = purple_xfer_new(gc->account, PURPLE_XFER_SEND, who); |
|
15345
797936e968ff
[gaim-migrate @ 18073]
Evan Schoenberg <evands@pidgin.im>
parents:
14899
diff
changeset
|
643 | if (xfer) |
|
797936e968ff
[gaim-migrate @ 18073]
Evan Schoenberg <evands@pidgin.im>
parents:
14899
diff
changeset
|
644 | { |
|
797936e968ff
[gaim-migrate @ 18073]
Evan Schoenberg <evands@pidgin.im>
parents:
14899
diff
changeset
|
645 | xfer->data = xfer_data; |
|
797936e968ff
[gaim-migrate @ 18073]
Evan Schoenberg <evands@pidgin.im>
parents:
14899
diff
changeset
|
646 | |
|
797936e968ff
[gaim-migrate @ 18073]
Evan Schoenberg <evands@pidgin.im>
parents:
14899
diff
changeset
|
647 | /* Setup our I/O op functions */ |
| 15884 | 648 | purple_xfer_set_init_fnc(xfer, yahoo_xfer_init); |
| 649 | purple_xfer_set_start_fnc(xfer, yahoo_xfer_start); | |
| 650 | purple_xfer_set_end_fnc(xfer, yahoo_xfer_end); | |
| 651 | purple_xfer_set_cancel_send_fnc(xfer, yahoo_xfer_cancel_send); | |
| 652 | purple_xfer_set_cancel_recv_fnc(xfer, yahoo_xfer_cancel_recv); | |
| 653 | purple_xfer_set_read_fnc(xfer, yahoo_xfer_read); | |
| 654 | purple_xfer_set_write_fnc(xfer, yahoo_xfer_write); | |
|
15345
797936e968ff
[gaim-migrate @ 18073]
Evan Schoenberg <evands@pidgin.im>
parents:
14899
diff
changeset
|
655 | } |
| 7651 | 656 | |
|
12143
09f216663302
[gaim-migrate @ 14444]
Evan Schoenberg <evands@pidgin.im>
parents:
11914
diff
changeset
|
657 | return xfer; |
|
09f216663302
[gaim-migrate @ 14444]
Evan Schoenberg <evands@pidgin.im>
parents:
11914
diff
changeset
|
658 | } |
|
09f216663302
[gaim-migrate @ 14444]
Evan Schoenberg <evands@pidgin.im>
parents:
11914
diff
changeset
|
659 | |
| 15884 | 660 | void yahoo_send_file(PurpleConnection *gc, const char *who, const char *file) |
|
12143
09f216663302
[gaim-migrate @ 14444]
Evan Schoenberg <evands@pidgin.im>
parents:
11914
diff
changeset
|
661 | { |
| 15884 | 662 | PurpleXfer *xfer = yahoo_new_xfer(gc, who); |
|
12143
09f216663302
[gaim-migrate @ 14444]
Evan Schoenberg <evands@pidgin.im>
parents:
11914
diff
changeset
|
663 | |
|
09f216663302
[gaim-migrate @ 14444]
Evan Schoenberg <evands@pidgin.im>
parents:
11914
diff
changeset
|
664 | g_return_if_fail(xfer != NULL); |
|
09f216663302
[gaim-migrate @ 14444]
Evan Schoenberg <evands@pidgin.im>
parents:
11914
diff
changeset
|
665 | |
| 7651 | 666 | /* Now perform the request */ |
|
11914
81ac838f3824
[gaim-migrate @ 14205]
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents:
11897
diff
changeset
|
667 | if (file) |
| 15884 | 668 | purple_xfer_request_accepted(xfer, file); |
|
9466
b6425eab60ca
[gaim-migrate @ 10291]
Daniel Atallah <datallah@pidgin.im>
parents:
9306
diff
changeset
|
669 | else |
| 15884 | 670 | purple_xfer_request(xfer); |
| 7651 | 671 | } |