src/protocols/yahoo/yahoo_filexfer.c

Fri, 23 Dec 2005 19:26:04 +0000

author
Sadrul Habib Chowdhury <sadrul@pidgin.im>
date
Fri, 23 Dec 2005 19:26:04 +0000
changeset 12645
a907ba243930
parent 12412
8abe3226695e
child 13144
e8c3eafab5f8
permissions
-rw-r--r--

[gaim-migrate @ 14983]
SF Patch #1314512 from Sadrul (who has a patch for everything)

"This patch introduces a flag for protocol plugins that
support offline messages (like Y!M and ICQ). This was
encouraged by the following conversation:

<sadrul> should offline buddies be listed/enabled in
the send-to menu?

<rekkanoryo> i would think only for protocols that
support offline messaging, if it's indicated that the
buddy is offline

-- <snip> --

<Bleeter> sadrul: personally, I'd like to see a
'supports offline' flag of some description

<Bleeter> one could then redirect (via plugins) through
email or alternative methods

<Bleeter> just a thought

<Paco-Paco> yeah, that sounds like a reasonble thing to have

This patch uses this flag to disable the buddies in the
send-to menu who are offline and the protocol doesn't
support offline messages."

I made this make the label insensitive instead of the whole menuitem. This
should address SimGuy's concerns about inconsistency (i.e. you could create a
conversation with someone via the buddy list that you couldn't create via the
Send To menu). I also hacked up some voodoo to show the label as sensitive when
moused-over, as that looks better (given the label-insensitive thing is itself a
hack). I think this works quite well.

BUG NOTE:
This makes more obvious an existing bug. The Send To menu isn't updated when
buddies sign on or off or change status (at least under some circumstances).
We need to fix that anyway, so I'm not going to let it hold up this commit.
Switching tabs will clear it up. I'm thinking we just might want to build the
contents of that menu when it is selected. That would save us a mess of
inefficient signal callbacks that update the Send To menus in open windows all
the time.

AIM NOTE:
This assumes that AIM can't offline message. That's not strictly true. You can
message invisible users on AIM. However, by design, we can't tell when a user
is invisible without resorting to dirty hackery. In practice, this isn't a
problem, as you can still select the AIM user from the menu. And really, how
often will you be choosing the Invisible contact, rather than the user going
Invisible in the middle of a conversation or IMing you while they're Invisible?

JABBER NOTE:
This assumes that Jabber can always offline message. This isn't strictly true.
Sadrul said:

I have updated Jabber according to this link which seems to
talk about how to determine the existence offline-message
support in a server:
http://www.jabber.org/jeps/jep-0013.html#discover

However, jabber.org doesn't seem to send the required
info. So I am not sure about it.

He later said:

I talked to Nathan and he said offline message support is
mostly assumed for most jabber servers. GTalk doesn't yet
support it, but they are working on it. So I have made
jabber to always return TRUE.

If there is truly no way to detect offline messaging capability, then this is
an acceptable solution. We could special case Google Talk because of its
popularity, and remove that later. It's probably not worth it though.

MSN NOTE:
This assumes that MSN can never offline message. That's effectively true, but
to be technically correct, MSN can offline message if there's already a
switchboard conversation open with a user. We could write an offline_message
function in the MSN prpl to detect that, but it'd be of limited usefulness,
especially given that under most circumstances (where this might matter), the
switchboard connection will be closed almost immediately.


CVS NOTE:
I'm writing to share a tragic little story.

I have a PC that I use for Gaim development. One day, I was writing a commit
message on it, when all of a suddent it went berserk. The screen started
flashing, and the whole commit message just disappeared. All of it. And it was
a good commit message! I had to cram and rewrite it really quickly. Needless to
say, my rushed commit message wasn't nearly as good, and I blame the PC for that.

Seriously, though, what kind of version control system loses your commit
message on a broken connection to the server? Stupid!

committer: Richard Laager <rlaager@pidgin.im>

7651
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
1 /*
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
2 * @file yahoo_filexfer.c Yahoo Filetransfer
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
3 *
8046
c581b20a47d6 [gaim-migrate @ 8730]
Sean Egan <seanegan@pidgin.im>
parents: 7827
diff changeset
4 * Gaim is the legal property of its developers, whose names are too numerous
c581b20a47d6 [gaim-migrate @ 8730]
Sean Egan <seanegan@pidgin.im>
parents: 7827
diff changeset
5 * to list here. Please refer to the COPYRIGHT file distributed with this
c581b20a47d6 [gaim-migrate @ 8730]
Sean Egan <seanegan@pidgin.im>
parents: 7827
diff changeset
6 * source distribution.
7651
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
7 *
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
8 * This program is free software; you can redistribute it and/or modify
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
9 * it under the terms of the GNU General Public License as published by
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
10 * the Free Software Foundation; either version 2 of the License, or
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
11 * (at your option) any later version.
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
12 *
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
13 * This program is distributed in the hope that it will be useful,
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
16 * GNU General Public License for more details.
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
17 *
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
18 * You should have received a copy of the GNU General Public License
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
19 * along with this program; if not, write to the Free Software
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
20 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
21 */
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
22
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
23 #include "prpl.h"
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
24 #include "internal.h"
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
25 #include "util.h"
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
26 #include "debug.h"
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
27 #include "notify.h"
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
28 #include "proxy.h"
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
29 #include "ft.h"
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
30 #include "yahoo.h"
10392
6a9728e72c11 [gaim-migrate @ 11620]
Tim Ringenbach <marv@pidgin.im>
parents: 10361
diff changeset
31 #include "yahoo_packet.h"
7651
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
32 #include "yahoo_filexfer.h"
11475
1e222e6e52a0 [gaim-migrate @ 13717]
Gary Kramlich <grim@reaperworld.com>
parents: 11159
diff changeset
33 #include "yahoo_doodle.h"
7651
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
34
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
35 struct yahoo_xfer_data {
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
36 gchar *host;
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
37 gchar *path;
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
38 int port;
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
39 GaimConnection *gc;
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
40 long expires;
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
41 gboolean started;
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
42 gchar *rxqueue;
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
43 guint rxlen;
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
44 };
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
45
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
46 static void yahoo_xfer_data_free(struct yahoo_xfer_data *xd)
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
47 {
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
48 if (xd->host)
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
49 g_free(xd->host);
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
50 if (xd->path)
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
51 g_free(xd->path);
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
52 g_free(xd);
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
53 }
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
54
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
55 static void yahoo_receivefile_connected(gpointer data, gint source, GaimInputCondition condition)
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
56 {
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
57 GaimXfer *xfer;
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
58 struct yahoo_xfer_data *xd;
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
59 gchar *buf;
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
60
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
61 gaim_debug(GAIM_DEBUG_INFO, "yahoo",
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
62 "AAA - in yahoo_receivefile_connected\n");
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
63 if (!(xfer = data))
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
64 return;
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
65 if (!(xd = xfer->data))
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
66 return;
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
67 if (source < 0) {
10654
b2dd3be1b087 [gaim-migrate @ 12182]
Richard Laager <rlaager@pidgin.im>
parents: 10651
diff changeset
68 gaim_xfer_error(GAIM_XFER_RECEIVE, gaim_xfer_get_account(xfer),
b2dd3be1b087 [gaim-migrate @ 12182]
Richard Laager <rlaager@pidgin.im>
parents: 10651
diff changeset
69 xfer->who, _("Unable to connect."));
7805
6045c467441e [gaim-migrate @ 8452]
Tim Ringenbach <marv@pidgin.im>
parents: 7710
diff changeset
70 gaim_xfer_cancel_remote(xfer);
7651
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
71 return;
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
72 }
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
73
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
74 xfer->fd = source;
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
75 gaim_xfer_start(xfer, source, NULL, 0);
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
76
10651
b99174539d15 [gaim-migrate @ 12176]
Tim Ringenbach <marv@pidgin.im>
parents: 10579
diff changeset
77 buf = g_strdup_printf("GET /%s HTTP/1.0\r\nHost: %s\r\n\r\n",
b99174539d15 [gaim-migrate @ 12176]
Tim Ringenbach <marv@pidgin.im>
parents: 10579
diff changeset
78 xd->path, xd->host);
7651
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
79 write(xfer->fd, buf, strlen(buf));
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
80 g_free(buf);
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
81
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
82 return;
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
83 }
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
84
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
85 static void yahoo_sendfile_connected(gpointer data, gint source, GaimInputCondition condition)
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
86 {
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
87 GaimXfer *xfer;
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
88 struct yahoo_xfer_data *xd;
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
89 struct yahoo_packet *pkt;
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
90 gchar *size, *post, *buf;
10576
ce7a6c585bc6 [gaim-migrate @ 11970]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 10575
diff changeset
91 const char *host;
10575
f360d2dc8a1c [gaim-migrate @ 11968]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 10394
diff changeset
92 int content_length, port;
7651
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
93 GaimConnection *gc;
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
94 GaimAccount *account;
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
95 struct yahoo_data *yd;
10976
96153d16e808 [gaim-migrate @ 12802]
Daniel Atallah <datallah@pidgin.im>
parents: 10937
diff changeset
96 char *filename, *encoded_filename;
7651
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
97
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
98 gaim_debug(GAIM_DEBUG_INFO, "yahoo",
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
99 "AAA - in yahoo_sendfile_connected\n");
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
100 if (!(xfer = data))
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
101 return;
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
102 if (!(xd = xfer->data))
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
103 return;
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
104
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
105 gc = xd->gc;
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
106 account = gaim_connection_get_account(gc);
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
107 yd = gc->proto_data;
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
108
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
109 if (source < 0) {
10654
b2dd3be1b087 [gaim-migrate @ 12182]
Richard Laager <rlaager@pidgin.im>
parents: 10651
diff changeset
110 gaim_xfer_error(GAIM_XFER_RECEIVE, gaim_xfer_get_account(xfer),
b2dd3be1b087 [gaim-migrate @ 12182]
Richard Laager <rlaager@pidgin.im>
parents: 10651
diff changeset
111 xfer->who, _("Unable to connect."));
7805
6045c467441e [gaim-migrate @ 8452]
Tim Ringenbach <marv@pidgin.im>
parents: 7710
diff changeset
112 gaim_xfer_cancel_remote(xfer);
7651
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
113 return;
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
114 }
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
115
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
116 xfer->fd = source;
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
117 gaim_xfer_start(xfer, source, NULL, 0);
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
118
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
119 pkt = yahoo_packet_new(YAHOO_SERVICE_FILETRANSFER, YAHOO_STATUS_AVAILABLE, yd->session_id);
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
120
10111
61dd88113afc [gaim-migrate @ 11144]
Nathan Walp <nwalp@pidgin.im>
parents: 9798
diff changeset
121 size = g_strdup_printf("%" G_GSIZE_FORMAT, gaim_xfer_get_size(xfer));
7805
6045c467441e [gaim-migrate @ 8452]
Tim Ringenbach <marv@pidgin.im>
parents: 7710
diff changeset
122 filename = g_path_get_basename(gaim_xfer_get_local_filename(xfer));
10976
96153d16e808 [gaim-migrate @ 12802]
Daniel Atallah <datallah@pidgin.im>
parents: 10937
diff changeset
123 encoded_filename = yahoo_string_encode(gc, filename, NULL);
11644
939411169d01 [gaim-migrate @ 13922]
Peter Lawler <pidgin@bleeter.id.au>
parents: 11475
diff changeset
124
10394
ad8f7dfef0cb [gaim-migrate @ 11623]
Tim Ringenbach <marv@pidgin.im>
parents: 10392
diff changeset
125 yahoo_packet_hash(pkt, "sssss", 0, gaim_connection_get_display_name(gc),
10976
96153d16e808 [gaim-migrate @ 12802]
Daniel Atallah <datallah@pidgin.im>
parents: 10937
diff changeset
126 5, xfer->who, 14, "", 27, encoded_filename, 28, size);
7651
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
127
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
128 content_length = YAHOO_PACKET_HDRLEN + yahoo_packet_length(pkt);
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
129
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
130 buf = g_strdup_printf("Y=%s; T=%s", yd->cookie_y, yd->cookie_t);
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
131
10576
ce7a6c585bc6 [gaim-migrate @ 11970]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 10575
diff changeset
132 host = gaim_account_get_string(account, "xfer_host", YAHOO_XFER_HOST);
10575
f360d2dc8a1c [gaim-migrate @ 11968]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 10394
diff changeset
133 port = gaim_account_get_int(account, "xfer_port", YAHOO_XFER_PORT);
f360d2dc8a1c [gaim-migrate @ 11968]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 10394
diff changeset
134 post = g_strdup_printf("POST http://%s:%d/notifyft HTTP/1.0\r\n"
10111
61dd88113afc [gaim-migrate @ 11144]
Nathan Walp <nwalp@pidgin.im>
parents: 9798
diff changeset
135 "Content-length: %" G_GSIZE_FORMAT "\r\n"
7651
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
136 "Host: %s:%d\r\n"
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
137 "Cookie: %s\r\n"
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
138 "\r\n",
11644
939411169d01 [gaim-migrate @ 13922]
Peter Lawler <pidgin@bleeter.id.au>
parents: 11475
diff changeset
139 host, port, content_length + 4 + gaim_xfer_get_size(xfer),
939411169d01 [gaim-migrate @ 13922]
Peter Lawler <pidgin@bleeter.id.au>
parents: 11475
diff changeset
140 host, port, buf);
7651
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
141 write(xfer->fd, post, strlen(post));
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
142
10392
6a9728e72c11 [gaim-migrate @ 11620]
Tim Ringenbach <marv@pidgin.im>
parents: 10361
diff changeset
143 yahoo_packet_send_special(pkt, xfer->fd, 8);
7651
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
144 yahoo_packet_free(pkt);
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
145
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
146 write(xfer->fd, "29\xc0\x80", 4);
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
147
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
148 g_free(size);
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
149 g_free(post);
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
150 g_free(buf);
10976
96153d16e808 [gaim-migrate @ 12802]
Daniel Atallah <datallah@pidgin.im>
parents: 10937
diff changeset
151 g_free(encoded_filename);
7805
6045c467441e [gaim-migrate @ 8452]
Tim Ringenbach <marv@pidgin.im>
parents: 7710
diff changeset
152 g_free(filename);
7651
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
153 }
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
154
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
155 static void yahoo_xfer_init(GaimXfer *xfer)
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
156 {
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
157 struct yahoo_xfer_data *xfer_data;
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
158 GaimConnection *gc;
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
159 GaimAccount *account;
7827
080c98045e12 [gaim-migrate @ 8479]
Ethan Blanton <elb@pidgin.im>
parents: 7805
diff changeset
160 struct yahoo_data *yd;
7651
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
161
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
162 xfer_data = xfer->data;
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
163 gc = xfer_data->gc;
7827
080c98045e12 [gaim-migrate @ 8479]
Ethan Blanton <elb@pidgin.im>
parents: 7805
diff changeset
164 yd = gc->proto_data;
7651
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
165 account = gaim_connection_get_account(gc);
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
166
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
167 if (gaim_xfer_get_type(xfer) == GAIM_XFER_SEND) {
10937
1753f4709889 [gaim-migrate @ 12721]
Peter Lawler <pidgin@bleeter.id.au>
parents: 10654
diff changeset
168 if (yd->jp) {
1753f4709889 [gaim-migrate @ 12721]
Peter Lawler <pidgin@bleeter.id.au>
parents: 10654
diff changeset
169 if (gaim_proxy_connect(account, gaim_account_get_string(account, "xferjp_host", YAHOOJP_XFER_HOST),
1753f4709889 [gaim-migrate @ 12721]
Peter Lawler <pidgin@bleeter.id.au>
parents: 10654
diff changeset
170 gaim_account_get_int(account, "xfer_port", YAHOO_XFER_PORT),
1753f4709889 [gaim-migrate @ 12721]
Peter Lawler <pidgin@bleeter.id.au>
parents: 10654
diff changeset
171 yahoo_sendfile_connected, xfer) == -1)
1753f4709889 [gaim-migrate @ 12721]
Peter Lawler <pidgin@bleeter.id.au>
parents: 10654
diff changeset
172 {
1753f4709889 [gaim-migrate @ 12721]
Peter Lawler <pidgin@bleeter.id.au>
parents: 10654
diff changeset
173 gaim_notify_error(gc, NULL, _("File Transfer Failed"),
1753f4709889 [gaim-migrate @ 12721]
Peter Lawler <pidgin@bleeter.id.au>
parents: 10654
diff changeset
174 _("Unable to establish file descriptor."));
1753f4709889 [gaim-migrate @ 12721]
Peter Lawler <pidgin@bleeter.id.au>
parents: 10654
diff changeset
175 gaim_xfer_cancel_remote(xfer);
1753f4709889 [gaim-migrate @ 12721]
Peter Lawler <pidgin@bleeter.id.au>
parents: 10654
diff changeset
176 }
8282
2c6d8739141a [gaim-migrate @ 9006]
Tim Ringenbach <marv@pidgin.im>
parents: 8231
diff changeset
177 } else {
10937
1753f4709889 [gaim-migrate @ 12721]
Peter Lawler <pidgin@bleeter.id.au>
parents: 10654
diff changeset
178 if (gaim_proxy_connect(account, gaim_account_get_string(account, "xfer_host", YAHOO_XFER_HOST),
1753f4709889 [gaim-migrate @ 12721]
Peter Lawler <pidgin@bleeter.id.au>
parents: 10654
diff changeset
179 gaim_account_get_int(account, "xfer_port", YAHOO_XFER_PORT),
1753f4709889 [gaim-migrate @ 12721]
Peter Lawler <pidgin@bleeter.id.au>
parents: 10654
diff changeset
180 yahoo_sendfile_connected, xfer) == -1)
1753f4709889 [gaim-migrate @ 12721]
Peter Lawler <pidgin@bleeter.id.au>
parents: 10654
diff changeset
181 {
1753f4709889 [gaim-migrate @ 12721]
Peter Lawler <pidgin@bleeter.id.au>
parents: 10654
diff changeset
182 gaim_notify_error(gc, NULL, _("File Transfer Failed"),
1753f4709889 [gaim-migrate @ 12721]
Peter Lawler <pidgin@bleeter.id.au>
parents: 10654
diff changeset
183 _("Unable to establish file descriptor."));
1753f4709889 [gaim-migrate @ 12721]
Peter Lawler <pidgin@bleeter.id.au>
parents: 10654
diff changeset
184 gaim_xfer_cancel_remote(xfer);
8282
2c6d8739141a [gaim-migrate @ 9006]
Tim Ringenbach <marv@pidgin.im>
parents: 8231
diff changeset
185 }
7651
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
186 }
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
187 } else {
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
188 xfer->fd = gaim_proxy_connect(account, xfer_data->host, xfer_data->port,
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
189 yahoo_receivefile_connected, xfer);
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
190 if (xfer->fd == -1) {
10654
b2dd3be1b087 [gaim-migrate @ 12182]
Richard Laager <rlaager@pidgin.im>
parents: 10651
diff changeset
191 gaim_notify_error(gc, NULL, _("File Transfer Failed"),
7651
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
192 _("Unable to establish file descriptor."));
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
193 gaim_xfer_cancel_remote(xfer);
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
194 }
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
195 }
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
196 }
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
197
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
198 static void yahoo_xfer_start(GaimXfer *xfer)
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
199 {
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
200 /* We don't need to do anything here, do we? */
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
201 }
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
202
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
203 static void yahoo_xfer_end(GaimXfer *xfer)
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
204 {
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
205 GaimAccount *account;
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
206 struct yahoo_xfer_data *xfer_data;
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
207
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
208 account = gaim_xfer_get_account(xfer);
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
209 xfer_data = xfer->data;
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
210
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
211 if (xfer_data)
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
212 yahoo_xfer_data_free(xfer_data);
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
213 xfer->data = NULL;
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
214
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
215 }
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
216
11897
10853b830964 [gaim-migrate @ 14188]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 11801
diff changeset
217 static guint calculate_length(const gchar *l, size_t len)
7651
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
218 {
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
219 int i;
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
220
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
221 for (i = 0; i < len; i++) {
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
222 if (!g_ascii_isdigit(l[i]))
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
223 continue;
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
224 return strtol(l + i, NULL, 10);
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
225 }
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
226 return 0;
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
227 }
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
228
12412
8abe3226695e [gaim-migrate @ 14719]
Richard Laager <rlaager@pidgin.im>
parents: 12151
diff changeset
229 static gssize yahoo_xfer_read(guchar **buffer, GaimXfer *xfer)
7651
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
230 {
7710
9e0642837d83 [gaim-migrate @ 8355]
Tim Ringenbach <marv@pidgin.im>
parents: 7682
diff changeset
231 gchar buf[4096];
12151
8002bb57756b [gaim-migrate @ 14452]
Richard Laager <rlaager@pidgin.im>
parents: 12143
diff changeset
232 gssize len;
7651
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
233 gchar *start = NULL;
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
234 gchar *length;
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
235 gchar *end;
7710
9e0642837d83 [gaim-migrate @ 8355]
Tim Ringenbach <marv@pidgin.im>
parents: 7682
diff changeset
236 int filelen;
7651
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
237 struct yahoo_xfer_data *xd = xfer->data;
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
238
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
239 if (gaim_xfer_get_type(xfer) != GAIM_XFER_RECEIVE) {
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
240 return 0;
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
241 }
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
242
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
243 len = read(xfer->fd, buf, sizeof(buf));
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
244
7682
2f232f1f2584 [gaim-migrate @ 8326]
Kevin Stange <kstange@pidgin.im>
parents: 7651
diff changeset
245 if (len <= 0) {
7710
9e0642837d83 [gaim-migrate @ 8355]
Tim Ringenbach <marv@pidgin.im>
parents: 7682
diff changeset
246 if ((gaim_xfer_get_size(xfer) > 0) &&
9798
9da203982089 [gaim-migrate @ 10666]
Joe Shaw <joe@joeshaw.org>
parents: 9466
diff changeset
247 (gaim_xfer_get_bytes_sent(xfer) >= gaim_xfer_get_size(xfer))) {
7682
2f232f1f2584 [gaim-migrate @ 8326]
Kevin Stange <kstange@pidgin.im>
parents: 7651
diff changeset
248 gaim_xfer_set_completed(xfer, TRUE);
9798
9da203982089 [gaim-migrate @ 10666]
Joe Shaw <joe@joeshaw.org>
parents: 9466
diff changeset
249 return 0;
9da203982089 [gaim-migrate @ 10666]
Joe Shaw <joe@joeshaw.org>
parents: 9466
diff changeset
250 } else
9da203982089 [gaim-migrate @ 10666]
Joe Shaw <joe@joeshaw.org>
parents: 9466
diff changeset
251 return -1;
7651
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
252 }
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
253
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
254 if (!xd->started) {
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
255 xd->rxqueue = g_realloc(xd->rxqueue, len + xd->rxlen);
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
256 memcpy(xd->rxqueue + xd->rxlen, buf, len);
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
257 xd->rxlen += len;
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
258
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
259 length = g_strstr_len(xd->rxqueue, len, "Content-length:");
10579
f4576b2e0956 [gaim-migrate @ 11976]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 10576
diff changeset
260 /* some proxies re-write this header, changing the capitalization :(
f4576b2e0956 [gaim-migrate @ 11976]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 10576
diff changeset
261 * technically that's allowed since headers are case-insensitive
f4576b2e0956 [gaim-migrate @ 11976]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 10576
diff changeset
262 * [RFC 2616, section 4.2] */
f4576b2e0956 [gaim-migrate @ 11976]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 10576
diff changeset
263 if (length == NULL)
f4576b2e0956 [gaim-migrate @ 11976]
Stu Tomlinson <nosnilmot@pidgin.im>
parents: 10576
diff changeset
264 length = g_strstr_len(xd->rxqueue, len, "Content-Length:");
7651
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
265 if (length) {
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
266 end = g_strstr_len(length, length - xd->rxqueue, "\r\n");
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
267 if (!end)
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
268 return 0;
7710
9e0642837d83 [gaim-migrate @ 8355]
Tim Ringenbach <marv@pidgin.im>
parents: 7682
diff changeset
269 if ((filelen = calculate_length(length, len - (length - xd->rxqueue))))
9e0642837d83 [gaim-migrate @ 8355]
Tim Ringenbach <marv@pidgin.im>
parents: 7682
diff changeset
270 gaim_xfer_set_size(xfer, filelen);
7651
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
271 }
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
272 start = g_strstr_len(xd->rxqueue, len, "\r\n\r\n");
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
273 if (start)
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
274 start += 4;
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
275 if (!start || start > (xd->rxqueue + len))
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
276 return 0;
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
277 xd->started = TRUE;
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
278
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
279 len -= (start - xd->rxqueue);
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
280
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
281 *buffer = g_malloc(len);
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
282 memcpy(*buffer, start, len);
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
283 g_free(xd->rxqueue);
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
284 xd->rxqueue = NULL;
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
285 xd->rxlen = 0;
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
286 } else {
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
287 *buffer = g_malloc(len);
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
288 memcpy(*buffer, buf, len);
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
289 }
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
290
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
291 return len;
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
292 }
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
293
12412
8abe3226695e [gaim-migrate @ 14719]
Richard Laager <rlaager@pidgin.im>
parents: 12151
diff changeset
294 static gssize yahoo_xfer_write(const guchar *buffer, size_t size, GaimXfer *xfer)
7651
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
295 {
12151
8002bb57756b [gaim-migrate @ 14452]
Richard Laager <rlaager@pidgin.im>
parents: 12143
diff changeset
296 gssize len;
7651
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
297 struct yahoo_xfer_data *xd = xfer->data;
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
298
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
299 if (!xd)
9798
9da203982089 [gaim-migrate @ 10666]
Joe Shaw <joe@joeshaw.org>
parents: 9466
diff changeset
300 return -1;
7651
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
301
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
302 if (gaim_xfer_get_type(xfer) != GAIM_XFER_SEND) {
9798
9da203982089 [gaim-migrate @ 10666]
Joe Shaw <joe@joeshaw.org>
parents: 9466
diff changeset
303 return -1;
7651
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
304 }
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
305
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
306 len = write(xfer->fd, buffer, size);
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
307
7710
9e0642837d83 [gaim-migrate @ 8355]
Tim Ringenbach <marv@pidgin.im>
parents: 7682
diff changeset
308 if (len == -1) {
9e0642837d83 [gaim-migrate @ 8355]
Tim Ringenbach <marv@pidgin.im>
parents: 7682
diff changeset
309 if (gaim_xfer_get_bytes_sent(xfer) >= gaim_xfer_get_size(xfer))
9e0642837d83 [gaim-migrate @ 8355]
Tim Ringenbach <marv@pidgin.im>
parents: 7682
diff changeset
310 gaim_xfer_set_completed(xfer, TRUE);
9e0642837d83 [gaim-migrate @ 8355]
Tim Ringenbach <marv@pidgin.im>
parents: 7682
diff changeset
311 if ((errno != EAGAIN) && (errno != EINTR))
9798
9da203982089 [gaim-migrate @ 10666]
Joe Shaw <joe@joeshaw.org>
parents: 9466
diff changeset
312 return -1;
7710
9e0642837d83 [gaim-migrate @ 8355]
Tim Ringenbach <marv@pidgin.im>
parents: 7682
diff changeset
313 return 0;
9e0642837d83 [gaim-migrate @ 8355]
Tim Ringenbach <marv@pidgin.im>
parents: 7682
diff changeset
314 }
9e0642837d83 [gaim-migrate @ 8355]
Tim Ringenbach <marv@pidgin.im>
parents: 7682
diff changeset
315
9e0642837d83 [gaim-migrate @ 8355]
Tim Ringenbach <marv@pidgin.im>
parents: 7682
diff changeset
316 if ((gaim_xfer_get_bytes_sent(xfer) + len) >= gaim_xfer_get_size(xfer))
7651
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
317 gaim_xfer_set_completed(xfer, TRUE);
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
318
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
319 return len;
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
320 }
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
321
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
322 static void yahoo_xfer_cancel_send(GaimXfer *xfer)
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
323 {
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
324 GaimAccount *account;
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
325 struct yahoo_xfer_data *xfer_data;
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
326
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
327 xfer_data = xfer->data;
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
328 account = gaim_xfer_get_account(xfer);
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
329
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
330 if (xfer_data)
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
331 yahoo_xfer_data_free(xfer_data);
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
332 xfer->data = NULL;
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
333 }
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
334
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
335 static void yahoo_xfer_cancel_recv(GaimXfer *xfer)
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
336 {
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
337 GaimAccount *account;
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
338 struct yahoo_xfer_data *xfer_data;
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
339
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
340 account = gaim_xfer_get_account(xfer);
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
341 xfer_data = xfer->data;
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
342
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
343 if (xfer_data)
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
344 yahoo_xfer_data_free(xfer_data);
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
345 xfer->data = NULL;
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
346 }
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
347
11914
81ac838f3824 [gaim-migrate @ 14205]
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 11897
diff changeset
348 void yahoo_process_p2pfilexfer(GaimConnection *gc, struct yahoo_packet *pkt)
11475
1e222e6e52a0 [gaim-migrate @ 13717]
Gary Kramlich <grim@reaperworld.com>
parents: 11159
diff changeset
349 {
11914
81ac838f3824 [gaim-migrate @ 14205]
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 11897
diff changeset
350 GSList *l = pkt->hash;
11644
939411169d01 [gaim-migrate @ 13922]
Peter Lawler <pidgin@bleeter.id.au>
parents: 11475
diff changeset
351
11914
81ac838f3824 [gaim-migrate @ 14205]
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 11897
diff changeset
352 char *me = NULL;
81ac838f3824 [gaim-migrate @ 14205]
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 11897
diff changeset
353 char *from = NULL;
81ac838f3824 [gaim-migrate @ 14205]
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 11897
diff changeset
354 char *service = NULL;
81ac838f3824 [gaim-migrate @ 14205]
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 11897
diff changeset
355 char *message = NULL;
81ac838f3824 [gaim-migrate @ 14205]
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 11897
diff changeset
356 char *command = NULL;
81ac838f3824 [gaim-migrate @ 14205]
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 11897
diff changeset
357 char *imv = NULL;
81ac838f3824 [gaim-migrate @ 14205]
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 11897
diff changeset
358 char *unknown = NULL;
11644
939411169d01 [gaim-migrate @ 13922]
Peter Lawler <pidgin@bleeter.id.au>
parents: 11475
diff changeset
359
11801
c19b37ac661b [gaim-migrate @ 14092]
Gary Kramlich <grim@reaperworld.com>
parents: 11644
diff changeset
360 /* Get all the necessary values from this new packet */
11914
81ac838f3824 [gaim-migrate @ 14205]
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 11897
diff changeset
361 while(l != NULL)
11475
1e222e6e52a0 [gaim-migrate @ 13717]
Gary Kramlich <grim@reaperworld.com>
parents: 11159
diff changeset
362 {
1e222e6e52a0 [gaim-migrate @ 13717]
Gary Kramlich <grim@reaperworld.com>
parents: 11159
diff changeset
363 struct yahoo_pair *pair = l->data;
11644
939411169d01 [gaim-migrate @ 13922]
Peter Lawler <pidgin@bleeter.id.au>
parents: 11475
diff changeset
364
11914
81ac838f3824 [gaim-migrate @ 14205]
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 11897
diff changeset
365 if(pair->key == 5) /* Get who the packet is for */
11475
1e222e6e52a0 [gaim-migrate @ 13717]
Gary Kramlich <grim@reaperworld.com>
parents: 11159
diff changeset
366 me = pair->value;
11644
939411169d01 [gaim-migrate @ 13922]
Peter Lawler <pidgin@bleeter.id.au>
parents: 11475
diff changeset
367
11914
81ac838f3824 [gaim-migrate @ 14205]
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 11897
diff changeset
368 if(pair->key == 4) /* Get who the packet is from */
11475
1e222e6e52a0 [gaim-migrate @ 13717]
Gary Kramlich <grim@reaperworld.com>
parents: 11159
diff changeset
369 from = pair->value;
11644
939411169d01 [gaim-migrate @ 13922]
Peter Lawler <pidgin@bleeter.id.au>
parents: 11475
diff changeset
370
11914
81ac838f3824 [gaim-migrate @ 14205]
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 11897
diff changeset
371 if(pair->key == 49) /* Get the type of service */
11475
1e222e6e52a0 [gaim-migrate @ 13717]
Gary Kramlich <grim@reaperworld.com>
parents: 11159
diff changeset
372 service = pair->value;
11644
939411169d01 [gaim-migrate @ 13922]
Peter Lawler <pidgin@bleeter.id.au>
parents: 11475
diff changeset
373
11914
81ac838f3824 [gaim-migrate @ 14205]
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 11897
diff changeset
374 if(pair->key == 14) /* Get the 'message' of the packet */
11475
1e222e6e52a0 [gaim-migrate @ 13717]
Gary Kramlich <grim@reaperworld.com>
parents: 11159
diff changeset
375 message = pair->value;
11644
939411169d01 [gaim-migrate @ 13922]
Peter Lawler <pidgin@bleeter.id.au>
parents: 11475
diff changeset
376
11914
81ac838f3824 [gaim-migrate @ 14205]
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 11897
diff changeset
377 if(pair->key == 13) /* Get the command associated with this packet */
11475
1e222e6e52a0 [gaim-migrate @ 13717]
Gary Kramlich <grim@reaperworld.com>
parents: 11159
diff changeset
378 command = pair->value;
11644
939411169d01 [gaim-migrate @ 13922]
Peter Lawler <pidgin@bleeter.id.au>
parents: 11475
diff changeset
379
11914
81ac838f3824 [gaim-migrate @ 14205]
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 11897
diff changeset
380 if(pair->key == 63) /* IMVironment name and version */
11475
1e222e6e52a0 [gaim-migrate @ 13717]
Gary Kramlich <grim@reaperworld.com>
parents: 11159
diff changeset
381 imv = pair->value;
1e222e6e52a0 [gaim-migrate @ 13717]
Gary Kramlich <grim@reaperworld.com>
parents: 11159
diff changeset
382
11914
81ac838f3824 [gaim-migrate @ 14205]
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 11897
diff changeset
383 if(pair->key == 64) /* Not sure, but it does vary with initialization of Doodle */
81ac838f3824 [gaim-migrate @ 14205]
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 11897
diff changeset
384 unknown = pair->value; /* So, I'll keep it (for a little while atleast) */
11644
939411169d01 [gaim-migrate @ 13922]
Peter Lawler <pidgin@bleeter.id.au>
parents: 11475
diff changeset
385
11475
1e222e6e52a0 [gaim-migrate @ 13717]
Gary Kramlich <grim@reaperworld.com>
parents: 11159
diff changeset
386 l = l->next;
1e222e6e52a0 [gaim-migrate @ 13717]
Gary Kramlich <grim@reaperworld.com>
parents: 11159
diff changeset
387 }
11644
939411169d01 [gaim-migrate @ 13922]
Peter Lawler <pidgin@bleeter.id.au>
parents: 11475
diff changeset
388
11801
c19b37ac661b [gaim-migrate @ 14092]
Gary Kramlich <grim@reaperworld.com>
parents: 11644
diff changeset
389 /* If this packet is an IMVIRONMENT, handle it accordingly */
11914
81ac838f3824 [gaim-migrate @ 14205]
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 11897
diff changeset
390 if(!strcmp(service, "IMVIRONMENT"))
11475
1e222e6e52a0 [gaim-migrate @ 13717]
Gary Kramlich <grim@reaperworld.com>
parents: 11159
diff changeset
391 {
11801
c19b37ac661b [gaim-migrate @ 14092]
Gary Kramlich <grim@reaperworld.com>
parents: 11644
diff changeset
392 /* Check for a Doodle packet and handle it accordingly */
11914
81ac838f3824 [gaim-migrate @ 14205]
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 11897
diff changeset
393 if(!strcmp(imv, "doodle;11"))
81ac838f3824 [gaim-migrate @ 14205]
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 11897
diff changeset
394 yahoo_doodle_process(gc, me, from, command, message);
11644
939411169d01 [gaim-migrate @ 13922]
Peter Lawler <pidgin@bleeter.id.au>
parents: 11475
diff changeset
395
11801
c19b37ac661b [gaim-migrate @ 14092]
Gary Kramlich <grim@reaperworld.com>
parents: 11644
diff changeset
396 /* 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
397 if(!strcmp(imv, ";0"))
11475
1e222e6e52a0 [gaim-migrate @ 13717]
Gary Kramlich <grim@reaperworld.com>
parents: 11159
diff changeset
398 {
11914
81ac838f3824 [gaim-migrate @ 14205]
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 11897
diff changeset
399 /* 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
400 yahoo_doodle_command_got_shutdown(gc, from);
11475
1e222e6e52a0 [gaim-migrate @ 13717]
Gary Kramlich <grim@reaperworld.com>
parents: 11159
diff changeset
401 }
1e222e6e52a0 [gaim-migrate @ 13717]
Gary Kramlich <grim@reaperworld.com>
parents: 11159
diff changeset
402 }
1e222e6e52a0 [gaim-migrate @ 13717]
Gary Kramlich <grim@reaperworld.com>
parents: 11159
diff changeset
403 }
1e222e6e52a0 [gaim-migrate @ 13717]
Gary Kramlich <grim@reaperworld.com>
parents: 11159
diff changeset
404
7651
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
405 void yahoo_process_filetransfer(GaimConnection *gc, struct yahoo_packet *pkt)
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
406 {
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
407 char *from = NULL;
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
408 char *to = NULL;
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
409 char *msg = NULL;
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
410 char *url = NULL;
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
411 long expires = 0;
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
412 GaimXfer *xfer;
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
413 struct yahoo_xfer_data *xfer_data;
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
414 char *service = NULL;
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
415 char *filename = NULL;
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
416 unsigned long filesize = 0L;
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
417 GSList *l;
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
418
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
419 for (l = pkt->hash; l; l = l->next) {
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
420 struct yahoo_pair *pair = l->data;
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
421
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
422 if (pair->key == 4)
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
423 from = pair->value;
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
424 if (pair->key == 5)
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
425 to = pair->value;
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
426 if (pair->key == 14)
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
427 msg = pair->value;
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
428 if (pair->key == 20)
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
429 url = pair->value;
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
430 if (pair->key == 38)
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
431 expires = strtol(pair->value, NULL, 10);
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
432 if (pair->key == 27)
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
433 filename = pair->value;
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
434 if (pair->key == 28)
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
435 filesize = atol(pair->value);
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
436 if (pair->key == 49)
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
437 service = pair->value;
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
438 }
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
439
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
440 if (pkt->service == YAHOO_SERVICE_P2PFILEXFER) {
10261
fdea752a175c [gaim-migrate @ 11405]
Tim Ringenbach <marv@pidgin.im>
parents: 10111
diff changeset
441 if (service && (strcmp("FILEXFER", service) != 0)) {
7651
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
442 gaim_debug_misc("yahoo", "unhandled service 0x%02x", pkt->service);
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
443 return;
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
444 }
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
445 }
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
446
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
447 if (msg) {
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
448 char *tmp;
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
449 tmp = strchr(msg, '\006');
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
450 if (tmp)
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
451 *tmp = '\0';
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
452 }
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
453
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
454 if (!url || !from)
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
455 return;
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
456
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
457 /* Setup the Yahoo-specific file transfer data */
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
458 xfer_data = g_new0(struct yahoo_xfer_data, 1);
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
459 xfer_data->gc = gc;
9227
95c28297b72c [gaim-migrate @ 10023]
Don Seiler <rizzo@gentoo.org>
parents: 9164
diff changeset
460 if (!gaim_url_parse(url, &(xfer_data->host), &(xfer_data->port), &(xfer_data->path), NULL, NULL)) {
7651
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
461 g_free(xfer_data);
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
462 return;
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
463 }
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
464
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
465 gaim_debug_misc("yahoo_filexfer", "Host is %s, port is %d, path is %s, and the full url was %s.\n",
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
466 xfer_data->host, xfer_data->port, xfer_data->path, url);
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
467
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
468 /* Build the file transfer handle. */
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
469 xfer = gaim_xfer_new(gc->account, GAIM_XFER_RECEIVE, from);
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
470 xfer->data = xfer_data;
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
471
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
472 /* Set the info about the incoming file. */
10976
96153d16e808 [gaim-migrate @ 12802]
Daniel Atallah <datallah@pidgin.im>
parents: 10937
diff changeset
473 if (filename) {
96153d16e808 [gaim-migrate @ 12802]
Daniel Atallah <datallah@pidgin.im>
parents: 10937
diff changeset
474 char *utf8_filename = yahoo_string_decode(gc, filename, TRUE);
96153d16e808 [gaim-migrate @ 12802]
Daniel Atallah <datallah@pidgin.im>
parents: 10937
diff changeset
475 gaim_xfer_set_filename(xfer, utf8_filename);
96153d16e808 [gaim-migrate @ 12802]
Daniel Atallah <datallah@pidgin.im>
parents: 10937
diff changeset
476 g_free(utf8_filename);
96153d16e808 [gaim-migrate @ 12802]
Daniel Atallah <datallah@pidgin.im>
parents: 10937
diff changeset
477 } else {
7651
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
478 gchar *start, *end;
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
479 start = g_strrstr(xfer_data->path, "/");
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
480 if (start)
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
481 start++;
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
482 end = g_strrstr(xfer_data->path, "?");
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
483 if (start && *start && end) {
10976
96153d16e808 [gaim-migrate @ 12802]
Daniel Atallah <datallah@pidgin.im>
parents: 10937
diff changeset
484 char *utf8_filename;
7651
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
485 filename = g_strndup(start, end - start);
10976
96153d16e808 [gaim-migrate @ 12802]
Daniel Atallah <datallah@pidgin.im>
parents: 10937
diff changeset
486 utf8_filename = yahoo_string_decode(gc, filename, TRUE);
7651
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
487 g_free(filename);
10976
96153d16e808 [gaim-migrate @ 12802]
Daniel Atallah <datallah@pidgin.im>
parents: 10937
diff changeset
488 gaim_xfer_set_filename(xfer, utf8_filename);
96153d16e808 [gaim-migrate @ 12802]
Daniel Atallah <datallah@pidgin.im>
parents: 10937
diff changeset
489 g_free(utf8_filename);
7651
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
490 filename = NULL;
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
491 }
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
492 }
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
493
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
494 gaim_xfer_set_size(xfer, filesize);
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
495
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
496 /* Setup our I/O op functions */
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
497 gaim_xfer_set_init_fnc(xfer, yahoo_xfer_init);
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
498 gaim_xfer_set_start_fnc(xfer, yahoo_xfer_start);
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
499 gaim_xfer_set_end_fnc(xfer, yahoo_xfer_end);
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
500 gaim_xfer_set_cancel_send_fnc(xfer, yahoo_xfer_cancel_send);
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
501 gaim_xfer_set_cancel_recv_fnc(xfer, yahoo_xfer_cancel_recv);
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
502 gaim_xfer_set_read_fnc(xfer, yahoo_xfer_read);
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
503 gaim_xfer_set_write_fnc(xfer, yahoo_xfer_write);
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
504
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
505 /* Now perform the request */
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
506 gaim_xfer_request(xfer);
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
507 }
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
508
12143
09f216663302 [gaim-migrate @ 14444]
Evan Schoenberg <evands@pidgin.im>
parents: 11914
diff changeset
509 GaimXfer *yahoo_new_xfer(GaimConnection *gc, const char *who)
7651
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
510 {
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
511 GaimXfer *xfer;
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
512 struct yahoo_xfer_data *xfer_data;
12143
09f216663302 [gaim-migrate @ 14444]
Evan Schoenberg <evands@pidgin.im>
parents: 11914
diff changeset
513
09f216663302 [gaim-migrate @ 14444]
Evan Schoenberg <evands@pidgin.im>
parents: 11914
diff changeset
514 g_return_val_if_fail(who != NULL, NULL);
09f216663302 [gaim-migrate @ 14444]
Evan Schoenberg <evands@pidgin.im>
parents: 11914
diff changeset
515
7651
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
516 xfer_data = g_new0(struct yahoo_xfer_data, 1);
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
517 xfer_data->gc = gc;
12143
09f216663302 [gaim-migrate @ 14444]
Evan Schoenberg <evands@pidgin.im>
parents: 11914
diff changeset
518
7651
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
519 /* Build the file transfer handle. */
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
520 xfer = gaim_xfer_new(gc->account, GAIM_XFER_SEND, who);
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
521 xfer->data = xfer_data;
12143
09f216663302 [gaim-migrate @ 14444]
Evan Schoenberg <evands@pidgin.im>
parents: 11914
diff changeset
522
7651
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
523 /* Setup our I/O op functions */
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
524 gaim_xfer_set_init_fnc(xfer, yahoo_xfer_init);
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
525 gaim_xfer_set_start_fnc(xfer, yahoo_xfer_start);
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
526 gaim_xfer_set_end_fnc(xfer, yahoo_xfer_end);
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
527 gaim_xfer_set_cancel_send_fnc(xfer, yahoo_xfer_cancel_send);
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
528 gaim_xfer_set_cancel_recv_fnc(xfer, yahoo_xfer_cancel_recv);
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
529 gaim_xfer_set_read_fnc(xfer, yahoo_xfer_read);
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
530 gaim_xfer_set_write_fnc(xfer, yahoo_xfer_write);
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
531
12143
09f216663302 [gaim-migrate @ 14444]
Evan Schoenberg <evands@pidgin.im>
parents: 11914
diff changeset
532 return xfer;
09f216663302 [gaim-migrate @ 14444]
Evan Schoenberg <evands@pidgin.im>
parents: 11914
diff changeset
533 }
09f216663302 [gaim-migrate @ 14444]
Evan Schoenberg <evands@pidgin.im>
parents: 11914
diff changeset
534
09f216663302 [gaim-migrate @ 14444]
Evan Schoenberg <evands@pidgin.im>
parents: 11914
diff changeset
535 void yahoo_send_file(GaimConnection *gc, const char *who, const char *file)
09f216663302 [gaim-migrate @ 14444]
Evan Schoenberg <evands@pidgin.im>
parents: 11914
diff changeset
536 {
09f216663302 [gaim-migrate @ 14444]
Evan Schoenberg <evands@pidgin.im>
parents: 11914
diff changeset
537 GaimXfer *xfer = yahoo_new_xfer(gc, who);
09f216663302 [gaim-migrate @ 14444]
Evan Schoenberg <evands@pidgin.im>
parents: 11914
diff changeset
538
09f216663302 [gaim-migrate @ 14444]
Evan Schoenberg <evands@pidgin.im>
parents: 11914
diff changeset
539 g_return_if_fail(xfer != NULL);
09f216663302 [gaim-migrate @ 14444]
Evan Schoenberg <evands@pidgin.im>
parents: 11914
diff changeset
540
7651
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
541 /* Now perform the request */
11914
81ac838f3824 [gaim-migrate @ 14205]
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 11897
diff changeset
542 if (file)
9466
b6425eab60ca [gaim-migrate @ 10291]
Daniel Atallah <datallah@pidgin.im>
parents: 9306
diff changeset
543 gaim_xfer_request_accepted(xfer, file);
b6425eab60ca [gaim-migrate @ 10291]
Daniel Atallah <datallah@pidgin.im>
parents: 9306
diff changeset
544 else
b6425eab60ca [gaim-migrate @ 10291]
Daniel Atallah <datallah@pidgin.im>
parents: 9306
diff changeset
545 gaim_xfer_request(xfer);
7651
43663aa7ef68 [gaim-migrate @ 8295]
Tim Ringenbach <marv@pidgin.im>
parents:
diff changeset
546 }

mercurial