libpurple/protocols/oscar/oft.c

Mon, 29 Aug 2011 22:55:51 +0000

author
Daniel Atallah <datallah@pidgin.im>
date
Mon, 29 Aug 2011 22:55:51 +0000
changeset 32270
028a4b3c0402
parent 32246
2305eb063660
child 32670
8b414cd2c9db
permissions
-rw-r--r--

Steps toward hiding PurpleXfer.

To convert prpls as they are now, lot of new accessors are needed (for stuff
that maybe shouldn't be exposed directly).
To convert prpls so that they don't keep re-implementing the same type of
stuff, a lot of error-prone changes are needed.

13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
1 /*
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
2 * Purple's oscar protocol plugin
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
3 * This file is the legal property of its developers.
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
4 * Please see the AUTHORS file distributed alongside this file.
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
5 *
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
6 * This library is free software; you can redistribute it and/or
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
7 * modify it under the terms of the GNU Lesser General Public
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
8 * License as published by the Free Software Foundation; either
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
9 * version 2 of the License, or (at your option) any later version.
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
10 *
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
11 * This library is distributed in the hope that it will be useful,
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
14 * Lesser General Public License for more details.
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
15 *
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
16 * You should have received a copy of the GNU Lesser General Public
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
17 * License along with this library; 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: 19856
diff changeset
18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
19 */
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
20
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
21 /*
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
22 * I feel like this is a good place to explain OFT, so I'm going to
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
23 * do just that. Each OFT packet has a header type. I guess this
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
24 * is pretty similar to the subtype of a SNAC packet. The type
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
25 * basically tells the other client the meaning of the OFT packet.
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
26 * There are two distinct types of file transfer, which I usually
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
27 * call "sendfile" and "getfile." Sendfile is when you send a file
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
28 * to another AIM user. Getfile is when you share a group of files,
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
29 * and other users request that you send them the files.
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
30 *
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
31 * A typical sendfile file transfer goes like this:
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
32 * 1) Sender sends a channel 2 ICBM telling the other user that
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
33 * we want to send them a file. At the same time, we open a
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
34 * listener socket (this should be done before sending the
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
35 * ICBM) on some port, and wait for them to connect to us.
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
36 * The ICBM we sent should contain our IP address and the port
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
37 * number that we're listening on.
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
38 * 2) The receiver connects to the sender on the given IP address
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
39 * and port. After the connection is established, the receiver
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
40 * sends an ICBM signifying that we are ready and waiting.
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
41 * 3) The sender sends an OFT PROMPT message over the OFT
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
42 * connection.
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
43 * 4) The receiver of the file sends back an exact copy of this
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
44 * OFT packet, except the cookie is filled in with the cookie
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
45 * from the ICBM. I think this might be an attempt to verify
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
46 * that the user that is connected is actually the guy that
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
47 * we sent the ICBM to. Oh, I've been calling this the ACK.
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
48 * 5) The sender starts sending raw data across the connection
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
49 * until the entire file has been sent.
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
50 * 6) The receiver knows the file is finished because the sender
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
51 * sent the file size in an earlier OFT packet. So then the
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
52 * receiver sends the DONE thingy (after filling in the
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
53 * "received" checksum and size) and closes the connection.
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
54 */
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
55
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
56 #include "oscar.h"
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
57 #include "peer.h"
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
58
14600
9d57e82d7bf9 [gaim-migrate @ 17259]
Mark Doliner <markdoliner@pidgin.im>
parents: 14464
diff changeset
59 #include "util.h"
9d57e82d7bf9 [gaim-migrate @ 17259]
Mark Doliner <markdoliner@pidgin.im>
parents: 14464
diff changeset
60
15354
52ba52a13827 [gaim-migrate @ 18083]
Mark Doliner <markdoliner@pidgin.im>
parents: 15339
diff changeset
61 #define CHECKSUM_BUFFER_SIZE 256 * 1024
52ba52a13827 [gaim-migrate @ 18083]
Mark Doliner <markdoliner@pidgin.im>
parents: 15339
diff changeset
62
52ba52a13827 [gaim-migrate @ 18083]
Mark Doliner <markdoliner@pidgin.im>
parents: 15339
diff changeset
63 struct _ChecksumData
52ba52a13827 [gaim-migrate @ 18083]
Mark Doliner <markdoliner@pidgin.im>
parents: 15339
diff changeset
64 {
52ba52a13827 [gaim-migrate @ 18083]
Mark Doliner <markdoliner@pidgin.im>
parents: 15339
diff changeset
65 PeerConnection *conn;
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
66 PurpleXfer *xfer;
15354
52ba52a13827 [gaim-migrate @ 18083]
Mark Doliner <markdoliner@pidgin.im>
parents: 15339
diff changeset
67 GSourceFunc callback;
52ba52a13827 [gaim-migrate @ 18083]
Mark Doliner <markdoliner@pidgin.im>
parents: 15339
diff changeset
68 size_t size;
52ba52a13827 [gaim-migrate @ 18083]
Mark Doliner <markdoliner@pidgin.im>
parents: 15339
diff changeset
69 guint32 checksum;
52ba52a13827 [gaim-migrate @ 18083]
Mark Doliner <markdoliner@pidgin.im>
parents: 15339
diff changeset
70 size_t total;
52ba52a13827 [gaim-migrate @ 18083]
Mark Doliner <markdoliner@pidgin.im>
parents: 15339
diff changeset
71 FILE *file;
52ba52a13827 [gaim-migrate @ 18083]
Mark Doliner <markdoliner@pidgin.im>
parents: 15339
diff changeset
72 guint8 buffer[CHECKSUM_BUFFER_SIZE];
52ba52a13827 [gaim-migrate @ 18083]
Mark Doliner <markdoliner@pidgin.im>
parents: 15339
diff changeset
73 guint timer;
52ba52a13827 [gaim-migrate @ 18083]
Mark Doliner <markdoliner@pidgin.im>
parents: 15339
diff changeset
74 };
52ba52a13827 [gaim-migrate @ 18083]
Mark Doliner <markdoliner@pidgin.im>
parents: 15339
diff changeset
75
52ba52a13827 [gaim-migrate @ 18083]
Mark Doliner <markdoliner@pidgin.im>
parents: 15339
diff changeset
76 void
52ba52a13827 [gaim-migrate @ 18083]
Mark Doliner <markdoliner@pidgin.im>
parents: 15339
diff changeset
77 peer_oft_checksum_destroy(ChecksumData *checksum_data)
52ba52a13827 [gaim-migrate @ 18083]
Mark Doliner <markdoliner@pidgin.im>
parents: 15339
diff changeset
78 {
52ba52a13827 [gaim-migrate @ 18083]
Mark Doliner <markdoliner@pidgin.im>
parents: 15339
diff changeset
79 checksum_data->conn->checksum_data = NULL;
52ba52a13827 [gaim-migrate @ 18083]
Mark Doliner <markdoliner@pidgin.im>
parents: 15339
diff changeset
80 fclose(checksum_data->file);
52ba52a13827 [gaim-migrate @ 18083]
Mark Doliner <markdoliner@pidgin.im>
parents: 15339
diff changeset
81 if (checksum_data->timer > 0)
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
82 purple_timeout_remove(checksum_data->timer);
15354
52ba52a13827 [gaim-migrate @ 18083]
Mark Doliner <markdoliner@pidgin.im>
parents: 15339
diff changeset
83 g_free(checksum_data);
52ba52a13827 [gaim-migrate @ 18083]
Mark Doliner <markdoliner@pidgin.im>
parents: 15339
diff changeset
84 }
52ba52a13827 [gaim-migrate @ 18083]
Mark Doliner <markdoliner@pidgin.im>
parents: 15339
diff changeset
85
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
86 /**
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
87 * Calculate oft checksum of buffer
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
88 *
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
89 * Prevcheck should be 0xFFFF0000 when starting a checksum of a file. The
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
90 * checksum is kind of a rolling checksum thing, so each time you get bytes
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
91 * of a file you just call this puppy and it updates the checksum. You can
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
92 * calculate the checksum of an entire file by calling this in a while or a
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
93 * for loop, or something.
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
94 *
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
95 * Thanks to Graham Booker for providing this improved checksum routine,
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
96 * which is simpler and should be more accurate than Josh Myer's original
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
97 * code. -- wtm
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
98 *
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
99 * This algorithm works every time I have tried it. The other fails
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
100 * sometimes. So, AOL who thought this up? It has got to be the weirdest
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
101 * checksum I have ever seen.
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
102 *
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
103 * @param buffer Buffer of data to checksum. Man I'd like to buff her...
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
104 * @param bufsize Size of buffer.
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
105 * @param prevchecksum Previous checksum.
15354
52ba52a13827 [gaim-migrate @ 18083]
Mark Doliner <markdoliner@pidgin.im>
parents: 15339
diff changeset
106 * @param odd Whether an odd number of bytes have been processed before this call
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
107 */
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
108 static guint32
15354
52ba52a13827 [gaim-migrate @ 18083]
Mark Doliner <markdoliner@pidgin.im>
parents: 15339
diff changeset
109 peer_oft_checksum_chunk(const guint8 *buffer, int bufferlen, guint32 prevchecksum, int odd)
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
110 {
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
111 guint32 checksum, oldchecksum;
15354
52ba52a13827 [gaim-migrate @ 18083]
Mark Doliner <markdoliner@pidgin.im>
parents: 15339
diff changeset
112 int i = 0;
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
113 unsigned short val;
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
114
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
115 checksum = (prevchecksum >> 16) & 0xffff;
15354
52ba52a13827 [gaim-migrate @ 18083]
Mark Doliner <markdoliner@pidgin.im>
parents: 15339
diff changeset
116 if (odd)
52ba52a13827 [gaim-migrate @ 18083]
Mark Doliner <markdoliner@pidgin.im>
parents: 15339
diff changeset
117 {
52ba52a13827 [gaim-migrate @ 18083]
Mark Doliner <markdoliner@pidgin.im>
parents: 15339
diff changeset
118 /*
52ba52a13827 [gaim-migrate @ 18083]
Mark Doliner <markdoliner@pidgin.im>
parents: 15339
diff changeset
119 * This is one hell of a hack, but it should always work.
52ba52a13827 [gaim-migrate @ 18083]
Mark Doliner <markdoliner@pidgin.im>
parents: 15339
diff changeset
120 * Essentially, I am reindexing the array so that index 1
52ba52a13827 [gaim-migrate @ 18083]
Mark Doliner <markdoliner@pidgin.im>
parents: 15339
diff changeset
121 * is the first element. Since the odd and even bytes are
52ba52a13827 [gaim-migrate @ 18083]
Mark Doliner <markdoliner@pidgin.im>
parents: 15339
diff changeset
122 * detected by the index number.
52ba52a13827 [gaim-migrate @ 18083]
Mark Doliner <markdoliner@pidgin.im>
parents: 15339
diff changeset
123 */
52ba52a13827 [gaim-migrate @ 18083]
Mark Doliner <markdoliner@pidgin.im>
parents: 15339
diff changeset
124 i = 1;
52ba52a13827 [gaim-migrate @ 18083]
Mark Doliner <markdoliner@pidgin.im>
parents: 15339
diff changeset
125 bufferlen++;
52ba52a13827 [gaim-migrate @ 18083]
Mark Doliner <markdoliner@pidgin.im>
parents: 15339
diff changeset
126 buffer--;
52ba52a13827 [gaim-migrate @ 18083]
Mark Doliner <markdoliner@pidgin.im>
parents: 15339
diff changeset
127 }
52ba52a13827 [gaim-migrate @ 18083]
Mark Doliner <markdoliner@pidgin.im>
parents: 15339
diff changeset
128 for (; i < bufferlen; i++)
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
129 {
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
130 oldchecksum = checksum;
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
131 if (i & 1)
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
132 val = buffer[i];
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
133 else
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
134 val = buffer[i] << 8;
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
135 checksum -= val;
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
136 /*
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
137 * The following appears to be necessary.... It happens
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
138 * every once in a while and the checksum doesn't fail.
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
139 */
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
140 if (checksum > oldchecksum)
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
141 checksum--;
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
142 }
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
143 checksum = ((checksum & 0x0000ffff) + (checksum >> 16));
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
144 checksum = ((checksum & 0x0000ffff) + (checksum >> 16));
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
145 return checksum << 16;
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
146 }
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
147
15354
52ba52a13827 [gaim-migrate @ 18083]
Mark Doliner <markdoliner@pidgin.im>
parents: 15339
diff changeset
148 static gboolean
52ba52a13827 [gaim-migrate @ 18083]
Mark Doliner <markdoliner@pidgin.im>
parents: 15339
diff changeset
149 peer_oft_checksum_file_piece(gpointer data)
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
150 {
15354
52ba52a13827 [gaim-migrate @ 18083]
Mark Doliner <markdoliner@pidgin.im>
parents: 15339
diff changeset
151 ChecksumData *checksum_data;
52ba52a13827 [gaim-migrate @ 18083]
Mark Doliner <markdoliner@pidgin.im>
parents: 15339
diff changeset
152 gboolean repeat;
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
153
15354
52ba52a13827 [gaim-migrate @ 18083]
Mark Doliner <markdoliner@pidgin.im>
parents: 15339
diff changeset
154 checksum_data = data;
52ba52a13827 [gaim-migrate @ 18083]
Mark Doliner <markdoliner@pidgin.im>
parents: 15339
diff changeset
155 repeat = FALSE;
52ba52a13827 [gaim-migrate @ 18083]
Mark Doliner <markdoliner@pidgin.im>
parents: 15339
diff changeset
156
52ba52a13827 [gaim-migrate @ 18083]
Mark Doliner <markdoliner@pidgin.im>
parents: 15339
diff changeset
157 if (checksum_data->total < checksum_data->size)
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
158 {
15354
52ba52a13827 [gaim-migrate @ 18083]
Mark Doliner <markdoliner@pidgin.im>
parents: 15339
diff changeset
159 size_t bytes = MIN(CHECKSUM_BUFFER_SIZE,
52ba52a13827 [gaim-migrate @ 18083]
Mark Doliner <markdoliner@pidgin.im>
parents: 15339
diff changeset
160 checksum_data->size - checksum_data->total);
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
161
15354
52ba52a13827 [gaim-migrate @ 18083]
Mark Doliner <markdoliner@pidgin.im>
parents: 15339
diff changeset
162 bytes = fread(checksum_data->buffer, 1, bytes, checksum_data->file);
52ba52a13827 [gaim-migrate @ 18083]
Mark Doliner <markdoliner@pidgin.im>
parents: 15339
diff changeset
163 if (bytes != 0)
52ba52a13827 [gaim-migrate @ 18083]
Mark Doliner <markdoliner@pidgin.im>
parents: 15339
diff changeset
164 {
52ba52a13827 [gaim-migrate @ 18083]
Mark Doliner <markdoliner@pidgin.im>
parents: 15339
diff changeset
165 checksum_data->checksum = peer_oft_checksum_chunk(checksum_data->buffer, bytes, checksum_data->checksum, checksum_data->total & 1);
52ba52a13827 [gaim-migrate @ 18083]
Mark Doliner <markdoliner@pidgin.im>
parents: 15339
diff changeset
166 checksum_data->total += bytes;
52ba52a13827 [gaim-migrate @ 18083]
Mark Doliner <markdoliner@pidgin.im>
parents: 15339
diff changeset
167 repeat = TRUE;
52ba52a13827 [gaim-migrate @ 18083]
Mark Doliner <markdoliner@pidgin.im>
parents: 15339
diff changeset
168 }
52ba52a13827 [gaim-migrate @ 18083]
Mark Doliner <markdoliner@pidgin.im>
parents: 15339
diff changeset
169 }
52ba52a13827 [gaim-migrate @ 18083]
Mark Doliner <markdoliner@pidgin.im>
parents: 15339
diff changeset
170
52ba52a13827 [gaim-migrate @ 18083]
Mark Doliner <markdoliner@pidgin.im>
parents: 15339
diff changeset
171 if (!repeat)
52ba52a13827 [gaim-migrate @ 18083]
Mark Doliner <markdoliner@pidgin.im>
parents: 15339
diff changeset
172 {
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
173 purple_debug_info("oscar", "Checksum of %s calculated\n",
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
174 purple_xfer_get_local_filename(checksum_data->xfer));
15354
52ba52a13827 [gaim-migrate @ 18083]
Mark Doliner <markdoliner@pidgin.im>
parents: 15339
diff changeset
175 if (checksum_data->callback != NULL)
52ba52a13827 [gaim-migrate @ 18083]
Mark Doliner <markdoliner@pidgin.im>
parents: 15339
diff changeset
176 checksum_data->callback(checksum_data);
52ba52a13827 [gaim-migrate @ 18083]
Mark Doliner <markdoliner@pidgin.im>
parents: 15339
diff changeset
177 peer_oft_checksum_destroy(checksum_data);
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
178 }
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
179
15354
52ba52a13827 [gaim-migrate @ 18083]
Mark Doliner <markdoliner@pidgin.im>
parents: 15339
diff changeset
180 return repeat;
52ba52a13827 [gaim-migrate @ 18083]
Mark Doliner <markdoliner@pidgin.im>
parents: 15339
diff changeset
181 }
52ba52a13827 [gaim-migrate @ 18083]
Mark Doliner <markdoliner@pidgin.im>
parents: 15339
diff changeset
182
52ba52a13827 [gaim-migrate @ 18083]
Mark Doliner <markdoliner@pidgin.im>
parents: 15339
diff changeset
183 /**
52ba52a13827 [gaim-migrate @ 18083]
Mark Doliner <markdoliner@pidgin.im>
parents: 15339
diff changeset
184 * Calculate oft checksum of a file in a series of calls to
52ba52a13827 [gaim-migrate @ 18083]
Mark Doliner <markdoliner@pidgin.im>
parents: 15339
diff changeset
185 * peer_oft_checksum_file_piece(). We do it this way because
52ba52a13827 [gaim-migrate @ 18083]
Mark Doliner <markdoliner@pidgin.im>
parents: 15339
diff changeset
186 * calculating the checksum on large files can take a long time,
52ba52a13827 [gaim-migrate @ 18083]
Mark Doliner <markdoliner@pidgin.im>
parents: 15339
diff changeset
187 * and we want to return control to the UI so that the application
52ba52a13827 [gaim-migrate @ 18083]
Mark Doliner <markdoliner@pidgin.im>
parents: 15339
diff changeset
188 * doesn't appear completely frozen.
52ba52a13827 [gaim-migrate @ 18083]
Mark Doliner <markdoliner@pidgin.im>
parents: 15339
diff changeset
189 *
52ba52a13827 [gaim-migrate @ 18083]
Mark Doliner <markdoliner@pidgin.im>
parents: 15339
diff changeset
190 * @param conn The connection used for this file transfer.
52ba52a13827 [gaim-migrate @ 18083]
Mark Doliner <markdoliner@pidgin.im>
parents: 15339
diff changeset
191 * @param xfer The file transfer needing this checksum.
52ba52a13827 [gaim-migrate @ 18083]
Mark Doliner <markdoliner@pidgin.im>
parents: 15339
diff changeset
192 * @param callback The function to call upon calculation of the checksum.
52ba52a13827 [gaim-migrate @ 18083]
Mark Doliner <markdoliner@pidgin.im>
parents: 15339
diff changeset
193 * @param size The maximum size to check.
52ba52a13827 [gaim-migrate @ 18083]
Mark Doliner <markdoliner@pidgin.im>
parents: 15339
diff changeset
194 */
52ba52a13827 [gaim-migrate @ 18083]
Mark Doliner <markdoliner@pidgin.im>
parents: 15339
diff changeset
195
52ba52a13827 [gaim-migrate @ 18083]
Mark Doliner <markdoliner@pidgin.im>
parents: 15339
diff changeset
196 static void
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
197 peer_oft_checksum_file(PeerConnection *conn, PurpleXfer *xfer, GSourceFunc callback, size_t size)
15354
52ba52a13827 [gaim-migrate @ 18083]
Mark Doliner <markdoliner@pidgin.im>
parents: 15339
diff changeset
198 {
52ba52a13827 [gaim-migrate @ 18083]
Mark Doliner <markdoliner@pidgin.im>
parents: 15339
diff changeset
199 ChecksumData *checksum_data;
52ba52a13827 [gaim-migrate @ 18083]
Mark Doliner <markdoliner@pidgin.im>
parents: 15339
diff changeset
200
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
201 purple_debug_info("oscar", "Calculating checksum of %s\n",
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
202 purple_xfer_get_local_filename(xfer));
15354
52ba52a13827 [gaim-migrate @ 18083]
Mark Doliner <markdoliner@pidgin.im>
parents: 15339
diff changeset
203
52ba52a13827 [gaim-migrate @ 18083]
Mark Doliner <markdoliner@pidgin.im>
parents: 15339
diff changeset
204 checksum_data = g_malloc0(sizeof(ChecksumData));
52ba52a13827 [gaim-migrate @ 18083]
Mark Doliner <markdoliner@pidgin.im>
parents: 15339
diff changeset
205 checksum_data->conn = conn;
52ba52a13827 [gaim-migrate @ 18083]
Mark Doliner <markdoliner@pidgin.im>
parents: 15339
diff changeset
206 checksum_data->xfer = xfer;
52ba52a13827 [gaim-migrate @ 18083]
Mark Doliner <markdoliner@pidgin.im>
parents: 15339
diff changeset
207 checksum_data->callback = callback;
52ba52a13827 [gaim-migrate @ 18083]
Mark Doliner <markdoliner@pidgin.im>
parents: 15339
diff changeset
208 checksum_data->size = size;
52ba52a13827 [gaim-migrate @ 18083]
Mark Doliner <markdoliner@pidgin.im>
parents: 15339
diff changeset
209 checksum_data->checksum = 0xffff0000;
30831
09c85b07b94c Use g_fopen() instead of fopen() in a few places that snuck in.
Daniel Atallah <datallah@pidgin.im>
parents: 30708
diff changeset
210 checksum_data->file = g_fopen(purple_xfer_get_local_filename(xfer), "rb");
15354
52ba52a13827 [gaim-migrate @ 18083]
Mark Doliner <markdoliner@pidgin.im>
parents: 15339
diff changeset
211
52ba52a13827 [gaim-migrate @ 18083]
Mark Doliner <markdoliner@pidgin.im>
parents: 15339
diff changeset
212 if (checksum_data->file == NULL)
52ba52a13827 [gaim-migrate @ 18083]
Mark Doliner <markdoliner@pidgin.im>
parents: 15339
diff changeset
213 {
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
214 purple_debug_error("oscar", "Unable to open %s for checksumming: %s\n",
21389
e1dd8142bb87 replace most calls to strerror with calls to g_strerror. strerror will return
Nathan Walp <nwalp@pidgin.im>
parents: 19859
diff changeset
215 purple_xfer_get_local_filename(xfer), g_strerror(errno));
15354
52ba52a13827 [gaim-migrate @ 18083]
Mark Doliner <markdoliner@pidgin.im>
parents: 15339
diff changeset
216 callback(checksum_data);
52ba52a13827 [gaim-migrate @ 18083]
Mark Doliner <markdoliner@pidgin.im>
parents: 15339
diff changeset
217 g_free(checksum_data);
52ba52a13827 [gaim-migrate @ 18083]
Mark Doliner <markdoliner@pidgin.im>
parents: 15339
diff changeset
218 }
52ba52a13827 [gaim-migrate @ 18083]
Mark Doliner <markdoliner@pidgin.im>
parents: 15339
diff changeset
219 else
52ba52a13827 [gaim-migrate @ 18083]
Mark Doliner <markdoliner@pidgin.im>
parents: 15339
diff changeset
220 {
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
221 checksum_data->timer = purple_timeout_add(10,
15354
52ba52a13827 [gaim-migrate @ 18083]
Mark Doliner <markdoliner@pidgin.im>
parents: 15339
diff changeset
222 peer_oft_checksum_file_piece, checksum_data);
52ba52a13827 [gaim-migrate @ 18083]
Mark Doliner <markdoliner@pidgin.im>
parents: 15339
diff changeset
223 conn->checksum_data = checksum_data;
52ba52a13827 [gaim-migrate @ 18083]
Mark Doliner <markdoliner@pidgin.im>
parents: 15339
diff changeset
224 }
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
225 }
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
226
15322
cd268e368bc1 [gaim-migrate @ 18050]
Mark Doliner <markdoliner@pidgin.im>
parents: 15169
diff changeset
227 static void
cd268e368bc1 [gaim-migrate @ 18050]
Mark Doliner <markdoliner@pidgin.im>
parents: 15169
diff changeset
228 peer_oft_copy_xfer_data(PeerConnection *conn, OftFrame *frame)
cd268e368bc1 [gaim-migrate @ 18050]
Mark Doliner <markdoliner@pidgin.im>
parents: 15169
diff changeset
229 {
cd268e368bc1 [gaim-migrate @ 18050]
Mark Doliner <markdoliner@pidgin.im>
parents: 15169
diff changeset
230 g_free(conn->xferdata.name);
cd268e368bc1 [gaim-migrate @ 18050]
Mark Doliner <markdoliner@pidgin.im>
parents: 15169
diff changeset
231
cd268e368bc1 [gaim-migrate @ 18050]
Mark Doliner <markdoliner@pidgin.im>
parents: 15169
diff changeset
232 memcpy(&(conn->xferdata), frame, sizeof(OftFrame));
cd268e368bc1 [gaim-migrate @ 18050]
Mark Doliner <markdoliner@pidgin.im>
parents: 15169
diff changeset
233 conn->xferdata.name = g_memdup(frame->name, frame->name_length);
cd268e368bc1 [gaim-migrate @ 18050]
Mark Doliner <markdoliner@pidgin.im>
parents: 15169
diff changeset
234 }
cd268e368bc1 [gaim-migrate @ 18050]
Mark Doliner <markdoliner@pidgin.im>
parents: 15169
diff changeset
235
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
236 /**
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
237 * Free any OFT related data.
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
238 */
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
239 void
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
240 peer_oft_close(PeerConnection *conn)
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
241 {
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
242 /*
30708
535bec1e66fb Standardize on "cancelled".
Elliott Sales de Andrade <qulogic@pidgin.im>
parents: 29967
diff changeset
243 * If cancelled by local user, and we're receiving a file, and
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
244 * we're not connected/ready then send an ICBM cancel message.
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
245 */
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
246 if ((purple_xfer_get_status(conn->xfer) == PURPLE_XFER_STATUS_CANCEL_LOCAL) &&
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
247 !conn->ready)
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
248 {
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
249 aim_im_sendch2_cancel(conn);
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
250 }
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
251
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
252 if (conn->sending_data_timer != 0)
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
253 {
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
254 purple_timeout_remove(conn->sending_data_timer);
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
255 conn->sending_data_timer = 0;
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
256 }
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
257 }
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
258
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
259 /**
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
260 * Write the given OftFrame to a ByteStream and send it out
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
261 * on the established PeerConnection.
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
262 */
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
263 static void
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
264 peer_oft_send(PeerConnection *conn, OftFrame *frame)
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
265 {
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
266 size_t length;
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
267 ByteStream bs;
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
268
19856
f5734344ab8e Change the way we handle file names when dealing with AIM file
Mark Doliner <markdoliner@pidgin.im>
parents: 17280
diff changeset
269 length = 192 + frame->name_length;
15151
bb985812fefa [gaim-migrate @ 17875]
Mark Doliner <markdoliner@pidgin.im>
parents: 14600
diff changeset
270 byte_stream_new(&bs, length);
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
271 byte_stream_putraw(&bs, conn->magic, 4);
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
272 byte_stream_put16(&bs, length);
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
273 byte_stream_put16(&bs, frame->type);
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
274 byte_stream_putraw(&bs, frame->cookie, 8);
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
275 byte_stream_put16(&bs, frame->encrypt);
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
276 byte_stream_put16(&bs, frame->compress);
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
277 byte_stream_put16(&bs, frame->totfiles);
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
278 byte_stream_put16(&bs, frame->filesleft);
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
279 byte_stream_put16(&bs, frame->totparts);
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
280 byte_stream_put16(&bs, frame->partsleft);
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
281 byte_stream_put32(&bs, frame->totsize);
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
282 byte_stream_put32(&bs, frame->size);
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
283 byte_stream_put32(&bs, frame->modtime);
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
284 byte_stream_put32(&bs, frame->checksum);
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
285 byte_stream_put32(&bs, frame->rfrcsum);
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
286 byte_stream_put32(&bs, frame->rfsize);
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
287 byte_stream_put32(&bs, frame->cretime);
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
288 byte_stream_put32(&bs, frame->rfcsum);
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
289 byte_stream_put32(&bs, frame->nrecvd);
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
290 byte_stream_put32(&bs, frame->recvcsum);
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
291 byte_stream_putraw(&bs, frame->idstring, 32);
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
292 byte_stream_put8(&bs, frame->flags);
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
293 byte_stream_put8(&bs, frame->lnameoffset);
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
294 byte_stream_put8(&bs, frame->lsizeoffset);
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
295 byte_stream_putraw(&bs, frame->dummy, 69);
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
296 byte_stream_putraw(&bs, frame->macfileinfo, 16);
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
297 byte_stream_put16(&bs, frame->nencode);
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
298 byte_stream_put16(&bs, frame->nlanguage);
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
299 /*
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
300 * The name can be more than 64 characters, but if it is less than
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
301 * 64 characters it is padded with NULLs.
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
302 */
19856
f5734344ab8e Change the way we handle file names when dealing with AIM file
Mark Doliner <markdoliner@pidgin.im>
parents: 17280
diff changeset
303 byte_stream_putraw(&bs, frame->name, frame->name_length);
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
304
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
305 peer_connection_send(conn, &bs);
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
306
22862
24f8ae1208ca Fixed the final stragglers in need of byte_stream_destroy()
Evan Schoenberg <evands@pidgin.im>
parents: 21389
diff changeset
307 byte_stream_destroy(&bs);
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
308 }
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
309
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
310 void
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
311 peer_oft_send_prompt(PeerConnection *conn)
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
312 {
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
313 conn->xferdata.type = PEER_TYPE_PROMPT;
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
314 peer_oft_send(conn, &conn->xferdata);
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
315 }
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
316
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
317 static void
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
318 peer_oft_send_ack(PeerConnection *conn)
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
319 {
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
320 conn->xferdata.type = PEER_TYPE_ACK;
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
321
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
322 /* Fill in the cookie */
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
323 memcpy(conn->xferdata.cookie, conn->cookie, 8);
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
324
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
325 peer_oft_send(conn, &conn->xferdata);
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
326 }
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
327
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
328 static void
15322
cd268e368bc1 [gaim-migrate @ 18050]
Mark Doliner <markdoliner@pidgin.im>
parents: 15169
diff changeset
329 peer_oft_send_resume_accept(PeerConnection *conn)
cd268e368bc1 [gaim-migrate @ 18050]
Mark Doliner <markdoliner@pidgin.im>
parents: 15169
diff changeset
330 {
cd268e368bc1 [gaim-migrate @ 18050]
Mark Doliner <markdoliner@pidgin.im>
parents: 15169
diff changeset
331 conn->xferdata.type = PEER_TYPE_RESUMEACCEPT;
cd268e368bc1 [gaim-migrate @ 18050]
Mark Doliner <markdoliner@pidgin.im>
parents: 15169
diff changeset
332
cd268e368bc1 [gaim-migrate @ 18050]
Mark Doliner <markdoliner@pidgin.im>
parents: 15169
diff changeset
333 /* Fill in the cookie */
cd268e368bc1 [gaim-migrate @ 18050]
Mark Doliner <markdoliner@pidgin.im>
parents: 15169
diff changeset
334 memcpy(conn->xferdata.cookie, conn->cookie, 8);
cd268e368bc1 [gaim-migrate @ 18050]
Mark Doliner <markdoliner@pidgin.im>
parents: 15169
diff changeset
335
cd268e368bc1 [gaim-migrate @ 18050]
Mark Doliner <markdoliner@pidgin.im>
parents: 15169
diff changeset
336 peer_oft_send(conn, &conn->xferdata);
cd268e368bc1 [gaim-migrate @ 18050]
Mark Doliner <markdoliner@pidgin.im>
parents: 15169
diff changeset
337 }
cd268e368bc1 [gaim-migrate @ 18050]
Mark Doliner <markdoliner@pidgin.im>
parents: 15169
diff changeset
338
cd268e368bc1 [gaim-migrate @ 18050]
Mark Doliner <markdoliner@pidgin.im>
parents: 15169
diff changeset
339 static void
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
340 peer_oft_send_done(PeerConnection *conn)
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
341 {
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
342 conn->xferdata.type = PEER_TYPE_DONE;
19856
f5734344ab8e Change the way we handle file names when dealing with AIM file
Mark Doliner <markdoliner@pidgin.im>
parents: 17280
diff changeset
343 conn->xferdata.rfrcsum = 0xffff0000;
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
344 conn->xferdata.nrecvd = purple_xfer_get_bytes_sent(conn->xfer);
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
345 peer_oft_send(conn, &conn->xferdata);
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
346 }
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
347
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
348 /**
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
349 * This function exists so that we don't remove the outgoing
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
350 * data watcher while we're still sending data. In most cases
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
351 * any data we're sending will be instantly wisked away to a TCP
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
352 * buffer maintained by our operating system... but we want to
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
353 * make sure the core doesn't start sending file data while
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
354 * we're still sending OFT frame data. That would be bad.
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
355 */
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
356 static gboolean
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
357 start_transfer_when_done_sending_data(gpointer data)
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
358 {
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
359 PeerConnection *conn;
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
360
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
361 conn = data;
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
362
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
363 if (purple_circ_buffer_get_max_read(conn->buffer_outgoing) == 0)
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
364 {
32270
028a4b3c0402 Steps toward hiding PurpleXfer.
Daniel Atallah <datallah@pidgin.im>
parents: 32246
diff changeset
365 int fd = conn->fd;
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
366 conn->sending_data_timer = 0;
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
367 conn->fd = -1;
32270
028a4b3c0402 Steps toward hiding PurpleXfer.
Daniel Atallah <datallah@pidgin.im>
parents: 32246
diff changeset
368 purple_xfer_start(conn->xfer, fd, NULL, 0);
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
369 return FALSE;
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
370 }
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
371
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
372 return TRUE;
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
373 }
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
374
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
375 /**
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
376 * This function is similar to the above function, except instead
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
377 * of starting the xfer it will destroy the connection. This is
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
378 * used when you want to send one final message across the peer
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
379 * connection, and then close everything.
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
380 */
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
381 static gboolean
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
382 destroy_connection_when_done_sending_data(gpointer data)
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
383 {
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
384 PeerConnection *conn;
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
385
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
386 conn = data;
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
387
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
388 if (purple_circ_buffer_get_max_read(conn->buffer_outgoing) == 0)
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
389 {
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
390 conn->sending_data_timer = 0;
14464
b7bca43f75b3 [gaim-migrate @ 17110]
Mark Doliner <markdoliner@pidgin.im>
parents: 14254
diff changeset
391 peer_connection_destroy(conn, conn->disconnect_reason, NULL);
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
392 return FALSE;
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
393 }
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
394
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
395 return TRUE;
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
396 }
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
397
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
398 /*
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
399 * This is called when a buddy sends us some file info. This happens when they
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
400 * are sending a file to you, and you have just established a connection to them.
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
401 * You should send them the exact same info except use the real cookie. We also
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
402 * get like totally ready to like, receive the file, kay?
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
403 */
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
404 static void
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
405 peer_oft_recv_frame_prompt(PeerConnection *conn, OftFrame *frame)
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
406 {
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
407 /* Record the file information and send an ack */
15322
cd268e368bc1 [gaim-migrate @ 18050]
Mark Doliner <markdoliner@pidgin.im>
parents: 15169
diff changeset
408 peer_oft_copy_xfer_data(conn, frame);
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
409 peer_oft_send_ack(conn);
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
410
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
411 /* Remove our watchers and use the file transfer watchers in the core */
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
412 purple_input_remove(conn->watcher_incoming);
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
413 conn->watcher_incoming = 0;
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
414 conn->sending_data_timer = purple_timeout_add(100,
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
415 start_transfer_when_done_sending_data, conn);
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
416 }
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
417
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
418 /**
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
419 * We are sending a file to someone else. They have just acknowledged our
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
420 * prompt, so we want to start sending data like there's no tomorrow.
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
421 */
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
422 static void
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
423 peer_oft_recv_frame_ack(PeerConnection *conn, OftFrame *frame)
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
424 {
15322
cd268e368bc1 [gaim-migrate @ 18050]
Mark Doliner <markdoliner@pidgin.im>
parents: 15169
diff changeset
425 if (memcmp(conn->cookie, frame->cookie, 8) != 0)
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
426 {
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
427 purple_debug_info("oscar", "Received an incorrect cookie. "
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
428 "Closing connection.\n");
14464
b7bca43f75b3 [gaim-migrate @ 17110]
Mark Doliner <markdoliner@pidgin.im>
parents: 14254
diff changeset
429 peer_connection_destroy(conn, OSCAR_DISCONNECT_INVALID_DATA, NULL);
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
430 return;
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
431 }
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
432
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
433 /* Remove our watchers and use the file transfer watchers in the core */
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
434 purple_input_remove(conn->watcher_incoming);
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
435 conn->watcher_incoming = 0;
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
436 conn->sending_data_timer = purple_timeout_add(100,
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
437 start_transfer_when_done_sending_data, conn);
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
438 }
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
439
15354
52ba52a13827 [gaim-migrate @ 18083]
Mark Doliner <markdoliner@pidgin.im>
parents: 15339
diff changeset
440 static gboolean
52ba52a13827 [gaim-migrate @ 18083]
Mark Doliner <markdoliner@pidgin.im>
parents: 15339
diff changeset
441 peer_oft_recv_frame_resume_checksum_calculated_cb(gpointer data)
52ba52a13827 [gaim-migrate @ 18083]
Mark Doliner <markdoliner@pidgin.im>
parents: 15339
diff changeset
442 {
52ba52a13827 [gaim-migrate @ 18083]
Mark Doliner <markdoliner@pidgin.im>
parents: 15339
diff changeset
443 ChecksumData *checksum_data;
52ba52a13827 [gaim-migrate @ 18083]
Mark Doliner <markdoliner@pidgin.im>
parents: 15339
diff changeset
444 PeerConnection *conn;
52ba52a13827 [gaim-migrate @ 18083]
Mark Doliner <markdoliner@pidgin.im>
parents: 15339
diff changeset
445
52ba52a13827 [gaim-migrate @ 18083]
Mark Doliner <markdoliner@pidgin.im>
parents: 15339
diff changeset
446 checksum_data = data;
52ba52a13827 [gaim-migrate @ 18083]
Mark Doliner <markdoliner@pidgin.im>
parents: 15339
diff changeset
447 conn = checksum_data->conn;
52ba52a13827 [gaim-migrate @ 18083]
Mark Doliner <markdoliner@pidgin.im>
parents: 15339
diff changeset
448
52ba52a13827 [gaim-migrate @ 18083]
Mark Doliner <markdoliner@pidgin.im>
parents: 15339
diff changeset
449 /* Check the checksums here. If not match, don't allow resume */
52ba52a13827 [gaim-migrate @ 18083]
Mark Doliner <markdoliner@pidgin.im>
parents: 15339
diff changeset
450 if (checksum_data->checksum != conn->xferdata.recvcsum || checksum_data->total != conn->xferdata.nrecvd)
52ba52a13827 [gaim-migrate @ 18083]
Mark Doliner <markdoliner@pidgin.im>
parents: 15339
diff changeset
451 {
52ba52a13827 [gaim-migrate @ 18083]
Mark Doliner <markdoliner@pidgin.im>
parents: 15339
diff changeset
452 /* Reset internal structure */
52ba52a13827 [gaim-migrate @ 18083]
Mark Doliner <markdoliner@pidgin.im>
parents: 15339
diff changeset
453 conn->xferdata.recvcsum = 0xffff0000;
52ba52a13827 [gaim-migrate @ 18083]
Mark Doliner <markdoliner@pidgin.im>
parents: 15339
diff changeset
454 conn->xferdata.rfrcsum = 0xffff0000;
52ba52a13827 [gaim-migrate @ 18083]
Mark Doliner <markdoliner@pidgin.im>
parents: 15339
diff changeset
455 conn->xferdata.nrecvd = 0;
52ba52a13827 [gaim-migrate @ 18083]
Mark Doliner <markdoliner@pidgin.im>
parents: 15339
diff changeset
456 }
52ba52a13827 [gaim-migrate @ 18083]
Mark Doliner <markdoliner@pidgin.im>
parents: 15339
diff changeset
457 else
52ba52a13827 [gaim-migrate @ 18083]
Mark Doliner <markdoliner@pidgin.im>
parents: 15339
diff changeset
458 /* Accept the change */
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
459 purple_xfer_set_bytes_sent(checksum_data->xfer, conn->xferdata.nrecvd);
15354
52ba52a13827 [gaim-migrate @ 18083]
Mark Doliner <markdoliner@pidgin.im>
parents: 15339
diff changeset
460
52ba52a13827 [gaim-migrate @ 18083]
Mark Doliner <markdoliner@pidgin.im>
parents: 15339
diff changeset
461 peer_oft_send_resume_accept(conn);
52ba52a13827 [gaim-migrate @ 18083]
Mark Doliner <markdoliner@pidgin.im>
parents: 15339
diff changeset
462
52ba52a13827 [gaim-migrate @ 18083]
Mark Doliner <markdoliner@pidgin.im>
parents: 15339
diff changeset
463 return FALSE;
52ba52a13827 [gaim-migrate @ 18083]
Mark Doliner <markdoliner@pidgin.im>
parents: 15339
diff changeset
464 }
52ba52a13827 [gaim-migrate @ 18083]
Mark Doliner <markdoliner@pidgin.im>
parents: 15339
diff changeset
465
15322
cd268e368bc1 [gaim-migrate @ 18050]
Mark Doliner <markdoliner@pidgin.im>
parents: 15169
diff changeset
466 /**
cd268e368bc1 [gaim-migrate @ 18050]
Mark Doliner <markdoliner@pidgin.im>
parents: 15169
diff changeset
467 * We are sending a file to someone else. They have just acknowledged our
cd268e368bc1 [gaim-migrate @ 18050]
Mark Doliner <markdoliner@pidgin.im>
parents: 15169
diff changeset
468 * prompt and are asking to resume, so we accept their resume and await
cd268e368bc1 [gaim-migrate @ 18050]
Mark Doliner <markdoliner@pidgin.im>
parents: 15169
diff changeset
469 * a resume ack.
cd268e368bc1 [gaim-migrate @ 18050]
Mark Doliner <markdoliner@pidgin.im>
parents: 15169
diff changeset
470 */
cd268e368bc1 [gaim-migrate @ 18050]
Mark Doliner <markdoliner@pidgin.im>
parents: 15169
diff changeset
471 static void
cd268e368bc1 [gaim-migrate @ 18050]
Mark Doliner <markdoliner@pidgin.im>
parents: 15169
diff changeset
472 peer_oft_recv_frame_resume(PeerConnection *conn, OftFrame *frame)
cd268e368bc1 [gaim-migrate @ 18050]
Mark Doliner <markdoliner@pidgin.im>
parents: 15169
diff changeset
473 {
cd268e368bc1 [gaim-migrate @ 18050]
Mark Doliner <markdoliner@pidgin.im>
parents: 15169
diff changeset
474 if (memcmp(conn->cookie, frame->cookie, 8) != 0)
cd268e368bc1 [gaim-migrate @ 18050]
Mark Doliner <markdoliner@pidgin.im>
parents: 15169
diff changeset
475 {
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
476 purple_debug_info("oscar", "Received an incorrect cookie. "
15322
cd268e368bc1 [gaim-migrate @ 18050]
Mark Doliner <markdoliner@pidgin.im>
parents: 15169
diff changeset
477 "Closing connection.\n");
cd268e368bc1 [gaim-migrate @ 18050]
Mark Doliner <markdoliner@pidgin.im>
parents: 15169
diff changeset
478 peer_connection_destroy(conn, OSCAR_DISCONNECT_INVALID_DATA, NULL);
cd268e368bc1 [gaim-migrate @ 18050]
Mark Doliner <markdoliner@pidgin.im>
parents: 15169
diff changeset
479 return;
cd268e368bc1 [gaim-migrate @ 18050]
Mark Doliner <markdoliner@pidgin.im>
parents: 15169
diff changeset
480 }
cd268e368bc1 [gaim-migrate @ 18050]
Mark Doliner <markdoliner@pidgin.im>
parents: 15169
diff changeset
481
cd268e368bc1 [gaim-migrate @ 18050]
Mark Doliner <markdoliner@pidgin.im>
parents: 15169
diff changeset
482 /* Copy resume data into internal structure */
cd268e368bc1 [gaim-migrate @ 18050]
Mark Doliner <markdoliner@pidgin.im>
parents: 15169
diff changeset
483 conn->xferdata.recvcsum = frame->recvcsum;
cd268e368bc1 [gaim-migrate @ 18050]
Mark Doliner <markdoliner@pidgin.im>
parents: 15169
diff changeset
484 conn->xferdata.rfrcsum = frame->rfrcsum;
cd268e368bc1 [gaim-migrate @ 18050]
Mark Doliner <markdoliner@pidgin.im>
parents: 15169
diff changeset
485 conn->xferdata.nrecvd = frame->nrecvd;
cd268e368bc1 [gaim-migrate @ 18050]
Mark Doliner <markdoliner@pidgin.im>
parents: 15169
diff changeset
486
15354
52ba52a13827 [gaim-migrate @ 18083]
Mark Doliner <markdoliner@pidgin.im>
parents: 15339
diff changeset
487 peer_oft_checksum_file(conn, conn->xfer,
52ba52a13827 [gaim-migrate @ 18083]
Mark Doliner <markdoliner@pidgin.im>
parents: 15339
diff changeset
488 peer_oft_recv_frame_resume_checksum_calculated_cb,
52ba52a13827 [gaim-migrate @ 18083]
Mark Doliner <markdoliner@pidgin.im>
parents: 15339
diff changeset
489 frame->nrecvd);
15322
cd268e368bc1 [gaim-migrate @ 18050]
Mark Doliner <markdoliner@pidgin.im>
parents: 15169
diff changeset
490 }
cd268e368bc1 [gaim-migrate @ 18050]
Mark Doliner <markdoliner@pidgin.im>
parents: 15169
diff changeset
491
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
492 /*
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
493 * We just sent a file to someone. They said they got it and everything,
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
494 * so we can close our direct connection and what not.
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
495 */
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
496 static void
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
497 peer_oft_recv_frame_done(PeerConnection *conn, OftFrame *frame)
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
498 {
29966
73643a016564 Set file transfers to "completed" if the other user tells us they've
Mark Doliner <markdoliner@pidgin.im>
parents: 25889
diff changeset
499 /*
73643a016564 Set file transfers to "completed" if the other user tells us they've
Mark Doliner <markdoliner@pidgin.im>
parents: 25889
diff changeset
500 * The core ft code sets the xfer to completed automatically if we've
73643a016564 Set file transfers to "completed" if the other user tells us they've
Mark Doliner <markdoliner@pidgin.im>
parents: 25889
diff changeset
501 * sent all bytes to the other user. But this function can be called
73643a016564 Set file transfers to "completed" if the other user tells us they've
Mark Doliner <markdoliner@pidgin.im>
parents: 25889
diff changeset
502 * even if we haven't sent all bytes to the other user (in the case
73643a016564 Set file transfers to "completed" if the other user tells us they've
Mark Doliner <markdoliner@pidgin.im>
parents: 25889
diff changeset
503 * where the user already has this file on their computer and the
73643a016564 Set file transfers to "completed" if the other user tells us they've
Mark Doliner <markdoliner@pidgin.im>
parents: 25889
diff changeset
504 * checksum matches).
73643a016564 Set file transfers to "completed" if the other user tells us they've
Mark Doliner <markdoliner@pidgin.im>
parents: 25889
diff changeset
505 */
29967
64ded9f326e1 A revision to my previous commit.
Mark Doliner <markdoliner@pidgin.im>
parents: 29966
diff changeset
506 if (!purple_xfer_is_completed(conn->xfer))
64ded9f326e1 A revision to my previous commit.
Mark Doliner <markdoliner@pidgin.im>
parents: 29966
diff changeset
507 purple_xfer_set_completed(conn->xfer, TRUE);
29966
73643a016564 Set file transfers to "completed" if the other user tells us they've
Mark Doliner <markdoliner@pidgin.im>
parents: 25889
diff changeset
508
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
509 purple_input_remove(conn->watcher_incoming);
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
510 conn->watcher_incoming = 0;
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
511 conn->xfer->fd = conn->fd;
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
512 conn->fd = -1;
15339
00786b59ccbd [gaim-migrate @ 18067]
Evan Schoenberg <evands@pidgin.im>
parents: 15322
diff changeset
513 conn->disconnect_reason = OSCAR_DISCONNECT_DONE;
00786b59ccbd [gaim-migrate @ 18067]
Evan Schoenberg <evands@pidgin.im>
parents: 15322
diff changeset
514 peer_connection_schedule_destroy(conn, conn->disconnect_reason, NULL);
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
515 }
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
516
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
517 /**
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
518 * Handle an incoming OftFrame. If there is a payload associated
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
519 * with this frame, then we remove the old watcher and add the
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
520 * OFT watcher to read in the payload.
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
521 */
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
522 void
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
523 peer_oft_recv_frame(PeerConnection *conn, ByteStream *bs)
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
524 {
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
525 OftFrame frame;
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
526
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
527 frame.type = byte_stream_get16(bs);
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
528 byte_stream_getrawbuf(bs, frame.cookie, 8);
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
529 frame.encrypt = byte_stream_get16(bs);
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
530 frame.compress = byte_stream_get16(bs);
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
531 frame.totfiles = byte_stream_get16(bs);
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
532 frame.filesleft = byte_stream_get16(bs);
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
533 frame.totparts = byte_stream_get16(bs);
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
534 frame.partsleft = byte_stream_get16(bs);
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
535 frame.totsize = byte_stream_get32(bs);
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
536 frame.size = byte_stream_get32(bs);
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
537 frame.modtime = byte_stream_get32(bs);
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
538 frame.checksum = byte_stream_get32(bs);
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
539 frame.rfrcsum = byte_stream_get32(bs);
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
540 frame.rfsize = byte_stream_get32(bs);
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
541 frame.cretime = byte_stream_get32(bs);
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
542 frame.rfcsum = byte_stream_get32(bs);
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
543 frame.nrecvd = byte_stream_get32(bs);
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
544 frame.recvcsum = byte_stream_get32(bs);
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
545 byte_stream_getrawbuf(bs, frame.idstring, 32);
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
546 frame.flags = byte_stream_get8(bs);
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
547 frame.lnameoffset = byte_stream_get8(bs);
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
548 frame.lsizeoffset = byte_stream_get8(bs);
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
549 byte_stream_getrawbuf(bs, frame.dummy, 69);
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
550 byte_stream_getrawbuf(bs, frame.macfileinfo, 16);
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
551 frame.nencode = byte_stream_get16(bs);
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
552 frame.nlanguage = byte_stream_get16(bs);
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
553 frame.name_length = bs->len - 186;
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
554 frame.name = byte_stream_getraw(bs, frame.name_length);
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
555
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
556 purple_debug_info("oscar", "Incoming OFT frame from %s with "
25889
26d9ca30335c Change "screen name" to "username" or "buddy name" in a whole bunch of
Mark Doliner <markdoliner@pidgin.im>
parents: 22862
diff changeset
557 "type=0x%04x\n", conn->bn, frame.type);
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
558
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
559 /* TODOFT: peer_oft_dirconvert_fromstupid(frame->name); */
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
560
15322
cd268e368bc1 [gaim-migrate @ 18050]
Mark Doliner <markdoliner@pidgin.im>
parents: 15169
diff changeset
561 switch(frame.type)
cd268e368bc1 [gaim-migrate @ 18050]
Mark Doliner <markdoliner@pidgin.im>
parents: 15169
diff changeset
562 {
cd268e368bc1 [gaim-migrate @ 18050]
Mark Doliner <markdoliner@pidgin.im>
parents: 15169
diff changeset
563 case PEER_TYPE_PROMPT:
cd268e368bc1 [gaim-migrate @ 18050]
Mark Doliner <markdoliner@pidgin.im>
parents: 15169
diff changeset
564 peer_oft_recv_frame_prompt(conn, &frame);
cd268e368bc1 [gaim-migrate @ 18050]
Mark Doliner <markdoliner@pidgin.im>
parents: 15169
diff changeset
565 break;
cd268e368bc1 [gaim-migrate @ 18050]
Mark Doliner <markdoliner@pidgin.im>
parents: 15169
diff changeset
566 case PEER_TYPE_ACK:
cd268e368bc1 [gaim-migrate @ 18050]
Mark Doliner <markdoliner@pidgin.im>
parents: 15169
diff changeset
567 case PEER_TYPE_RESUMEACK:
cd268e368bc1 [gaim-migrate @ 18050]
Mark Doliner <markdoliner@pidgin.im>
parents: 15169
diff changeset
568 peer_oft_recv_frame_ack(conn, &frame);
cd268e368bc1 [gaim-migrate @ 18050]
Mark Doliner <markdoliner@pidgin.im>
parents: 15169
diff changeset
569 break;
cd268e368bc1 [gaim-migrate @ 18050]
Mark Doliner <markdoliner@pidgin.im>
parents: 15169
diff changeset
570 case PEER_TYPE_RESUME:
cd268e368bc1 [gaim-migrate @ 18050]
Mark Doliner <markdoliner@pidgin.im>
parents: 15169
diff changeset
571 peer_oft_recv_frame_resume(conn, &frame);
cd268e368bc1 [gaim-migrate @ 18050]
Mark Doliner <markdoliner@pidgin.im>
parents: 15169
diff changeset
572 break;
cd268e368bc1 [gaim-migrate @ 18050]
Mark Doliner <markdoliner@pidgin.im>
parents: 15169
diff changeset
573 case PEER_TYPE_DONE:
cd268e368bc1 [gaim-migrate @ 18050]
Mark Doliner <markdoliner@pidgin.im>
parents: 15169
diff changeset
574 peer_oft_recv_frame_done(conn, &frame);
cd268e368bc1 [gaim-migrate @ 18050]
Mark Doliner <markdoliner@pidgin.im>
parents: 15169
diff changeset
575 break;
cd268e368bc1 [gaim-migrate @ 18050]
Mark Doliner <markdoliner@pidgin.im>
parents: 15169
diff changeset
576 default:
cd268e368bc1 [gaim-migrate @ 18050]
Mark Doliner <markdoliner@pidgin.im>
parents: 15169
diff changeset
577 break;
cd268e368bc1 [gaim-migrate @ 18050]
Mark Doliner <markdoliner@pidgin.im>
parents: 15169
diff changeset
578 }
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
579
17280
7c0472208173 Make all the oscar memory allocations and frees use the glib functions to avoid problems when mixing C runtimes.
Daniel Atallah <datallah@pidgin.im>
parents: 15884
diff changeset
580 g_free(frame.name);
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
581 }
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
582
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
583 /*******************************************************************/
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
584 /* Begin PurpleXfer callbacks for use when receiving a file */
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
585 /*******************************************************************/
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
586
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
587 void
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
588 peer_oft_recvcb_init(PurpleXfer *xfer)
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
589 {
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
590 PeerConnection *conn;
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
591
32246
2305eb063660 Convert the oscar prpl to use the new API.
Andrew Victor <andrew.victor@mxit.com>
parents: 30831
diff changeset
592 conn = purple_xfer_get_protocol_data(xfer);
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
593 conn->flags |= PEER_CONNECTION_FLAG_APPROVED;
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
594 peer_connection_trynext(conn);
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
595 }
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
596
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
597 void
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
598 peer_oft_recvcb_end(PurpleXfer *xfer)
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
599 {
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
600 PeerConnection *conn;
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
601
32246
2305eb063660 Convert the oscar prpl to use the new API.
Andrew Victor <andrew.victor@mxit.com>
parents: 30831
diff changeset
602 conn = purple_xfer_get_protocol_data(xfer);
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
603
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
604 /* Tell the other person that we've received everything */
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
605 conn->fd = conn->xfer->fd;
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
606 conn->xfer->fd = -1;
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
607 peer_oft_send_done(conn);
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
608
13609
a6fbfad454b6 [gaim-migrate @ 15994]
Mark Doliner <markdoliner@pidgin.im>
parents: 13608
diff changeset
609 conn->disconnect_reason = OSCAR_DISCONNECT_DONE;
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
610 conn->sending_data_timer = purple_timeout_add(100,
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
611 destroy_connection_when_done_sending_data, conn);
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
612 }
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
613
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
614 void
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
615 peer_oft_recvcb_ack_recv(PurpleXfer *xfer, const guchar *buffer, size_t size)
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
616 {
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
617 PeerConnection *conn;
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
618
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
619 /* Update our rolling checksum. Like Walmart, yo. */
32246
2305eb063660 Convert the oscar prpl to use the new API.
Andrew Victor <andrew.victor@mxit.com>
parents: 30831
diff changeset
620 conn = purple_xfer_get_protocol_data(xfer);
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
621 conn->xferdata.recvcsum = peer_oft_checksum_chunk(buffer,
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
622 size, conn->xferdata.recvcsum, purple_xfer_get_bytes_sent(xfer) & 1);
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
623 }
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
624
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
625 /*******************************************************************/
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
626 /* End PurpleXfer callbacks for use when receiving a file */
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
627 /*******************************************************************/
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
628
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
629 /*******************************************************************/
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
630 /* Begin PurpleXfer callbacks for use when sending a file */
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
631 /*******************************************************************/
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
632
15354
52ba52a13827 [gaim-migrate @ 18083]
Mark Doliner <markdoliner@pidgin.im>
parents: 15339
diff changeset
633 static gboolean
52ba52a13827 [gaim-migrate @ 18083]
Mark Doliner <markdoliner@pidgin.im>
parents: 15339
diff changeset
634 peer_oft_checksum_calculated_cb(gpointer data)
52ba52a13827 [gaim-migrate @ 18083]
Mark Doliner <markdoliner@pidgin.im>
parents: 15339
diff changeset
635 {
52ba52a13827 [gaim-migrate @ 18083]
Mark Doliner <markdoliner@pidgin.im>
parents: 15339
diff changeset
636 ChecksumData *checksum_data;
52ba52a13827 [gaim-migrate @ 18083]
Mark Doliner <markdoliner@pidgin.im>
parents: 15339
diff changeset
637 PeerConnection *conn;
52ba52a13827 [gaim-migrate @ 18083]
Mark Doliner <markdoliner@pidgin.im>
parents: 15339
diff changeset
638
52ba52a13827 [gaim-migrate @ 18083]
Mark Doliner <markdoliner@pidgin.im>
parents: 15339
diff changeset
639 checksum_data = data;
52ba52a13827 [gaim-migrate @ 18083]
Mark Doliner <markdoliner@pidgin.im>
parents: 15339
diff changeset
640 conn = checksum_data->conn;
52ba52a13827 [gaim-migrate @ 18083]
Mark Doliner <markdoliner@pidgin.im>
parents: 15339
diff changeset
641
52ba52a13827 [gaim-migrate @ 18083]
Mark Doliner <markdoliner@pidgin.im>
parents: 15339
diff changeset
642 conn->xferdata.checksum = checksum_data->checksum;
52ba52a13827 [gaim-migrate @ 18083]
Mark Doliner <markdoliner@pidgin.im>
parents: 15339
diff changeset
643
52ba52a13827 [gaim-migrate @ 18083]
Mark Doliner <markdoliner@pidgin.im>
parents: 15339
diff changeset
644 /* Start the connection process */
52ba52a13827 [gaim-migrate @ 18083]
Mark Doliner <markdoliner@pidgin.im>
parents: 15339
diff changeset
645 peer_connection_trynext(checksum_data->conn);
52ba52a13827 [gaim-migrate @ 18083]
Mark Doliner <markdoliner@pidgin.im>
parents: 15339
diff changeset
646
52ba52a13827 [gaim-migrate @ 18083]
Mark Doliner <markdoliner@pidgin.im>
parents: 15339
diff changeset
647 return FALSE;
52ba52a13827 [gaim-migrate @ 18083]
Mark Doliner <markdoliner@pidgin.im>
parents: 15339
diff changeset
648 }
52ba52a13827 [gaim-migrate @ 18083]
Mark Doliner <markdoliner@pidgin.im>
parents: 15339
diff changeset
649
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
650 void
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
651 peer_oft_sendcb_init(PurpleXfer *xfer)
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
652 {
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
653 PeerConnection *conn;
14600
9d57e82d7bf9 [gaim-migrate @ 17259]
Mark Doliner <markdoliner@pidgin.im>
parents: 14464
diff changeset
654 size_t size;
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
655
32246
2305eb063660 Convert the oscar prpl to use the new API.
Andrew Victor <andrew.victor@mxit.com>
parents: 30831
diff changeset
656 conn = purple_xfer_get_protocol_data(xfer);
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
657 conn->flags |= PEER_CONNECTION_FLAG_APPROVED;
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
658
14600
9d57e82d7bf9 [gaim-migrate @ 17259]
Mark Doliner <markdoliner@pidgin.im>
parents: 14464
diff changeset
659 /* Make sure the file size can be represented in 32 bits */
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
660 size = purple_xfer_get_size(xfer);
14600
9d57e82d7bf9 [gaim-migrate @ 17259]
Mark Doliner <markdoliner@pidgin.im>
parents: 14464
diff changeset
661 if (size > G_MAXUINT32)
9d57e82d7bf9 [gaim-migrate @ 17259]
Mark Doliner <markdoliner@pidgin.im>
parents: 14464
diff changeset
662 {
9d57e82d7bf9 [gaim-migrate @ 17259]
Mark Doliner <markdoliner@pidgin.im>
parents: 14464
diff changeset
663 gchar *tmp, *size1, *size2;
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
664 size1 = purple_str_size_to_units(size);
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
665 size2 = purple_str_size_to_units(G_MAXUINT32);
14600
9d57e82d7bf9 [gaim-migrate @ 17259]
Mark Doliner <markdoliner@pidgin.im>
parents: 14464
diff changeset
666 tmp = g_strdup_printf(_("File %s is %s, which is larger than "
9d57e82d7bf9 [gaim-migrate @ 17259]
Mark Doliner <markdoliner@pidgin.im>
parents: 14464
diff changeset
667 "the maximum size of %s."),
32270
028a4b3c0402 Steps toward hiding PurpleXfer.
Daniel Atallah <datallah@pidgin.im>
parents: 32246
diff changeset
668 purple_xfer_get_local_filename(xfer), size1, size2);
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
669 purple_xfer_error(purple_xfer_get_type(xfer),
32270
028a4b3c0402 Steps toward hiding PurpleXfer.
Daniel Atallah <datallah@pidgin.im>
parents: 32246
diff changeset
670 purple_xfer_get_account(xfer), purple_xfer_get_remote_user(xfer), tmp);
14600
9d57e82d7bf9 [gaim-migrate @ 17259]
Mark Doliner <markdoliner@pidgin.im>
parents: 14464
diff changeset
671 g_free(size1);
9d57e82d7bf9 [gaim-migrate @ 17259]
Mark Doliner <markdoliner@pidgin.im>
parents: 14464
diff changeset
672 g_free(size2);
9d57e82d7bf9 [gaim-migrate @ 17259]
Mark Doliner <markdoliner@pidgin.im>
parents: 14464
diff changeset
673 g_free(tmp);
9d57e82d7bf9 [gaim-migrate @ 17259]
Mark Doliner <markdoliner@pidgin.im>
parents: 14464
diff changeset
674 peer_connection_destroy(conn, OSCAR_DISCONNECT_LOCAL_CLOSED, NULL);
9d57e82d7bf9 [gaim-migrate @ 17259]
Mark Doliner <markdoliner@pidgin.im>
parents: 14464
diff changeset
675 return;
9d57e82d7bf9 [gaim-migrate @ 17259]
Mark Doliner <markdoliner@pidgin.im>
parents: 14464
diff changeset
676 }
9d57e82d7bf9 [gaim-migrate @ 17259]
Mark Doliner <markdoliner@pidgin.im>
parents: 14464
diff changeset
677
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
678 /* Keep track of file transfer info */
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
679 conn->xferdata.totfiles = 1;
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
680 conn->xferdata.filesleft = 1;
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
681 conn->xferdata.totparts = 1;
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
682 conn->xferdata.partsleft = 1;
14600
9d57e82d7bf9 [gaim-migrate @ 17259]
Mark Doliner <markdoliner@pidgin.im>
parents: 14464
diff changeset
683 conn->xferdata.totsize = size;
9d57e82d7bf9 [gaim-migrate @ 17259]
Mark Doliner <markdoliner@pidgin.im>
parents: 14464
diff changeset
684 conn->xferdata.size = size;
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
685 conn->xferdata.checksum = 0xffff0000;
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
686 conn->xferdata.rfrcsum = 0xffff0000;
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
687 conn->xferdata.rfcsum = 0xffff0000;
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
688 conn->xferdata.recvcsum = 0xffff0000;
19856
f5734344ab8e Change the way we handle file names when dealing with AIM file
Mark Doliner <markdoliner@pidgin.im>
parents: 17280
diff changeset
689 strncpy((gchar *)conn->xferdata.idstring, "Cool FileXfer", 31);
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
690 conn->xferdata.modtime = 0;
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
691 conn->xferdata.cretime = 0;
32270
028a4b3c0402 Steps toward hiding PurpleXfer.
Daniel Atallah <datallah@pidgin.im>
parents: 32246
diff changeset
692 purple_xfer_set_filename(xfer, g_path_get_basename(purple_xfer_get_local_filename(xfer)));
028a4b3c0402 Steps toward hiding PurpleXfer.
Daniel Atallah <datallah@pidgin.im>
parents: 32246
diff changeset
693 conn->xferdata.name_length = MAX(64, strlen(purple_xfer_get_filename(xfer)) + 1);
028a4b3c0402 Steps toward hiding PurpleXfer.
Daniel Atallah <datallah@pidgin.im>
parents: 32246
diff changeset
694 conn->xferdata.name = (guchar *)g_strndup(purple_xfer_get_filename(xfer), conn->xferdata.name_length - 1);
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
695
15354
52ba52a13827 [gaim-migrate @ 18083]
Mark Doliner <markdoliner@pidgin.im>
parents: 15339
diff changeset
696 peer_oft_checksum_file(conn, xfer,
52ba52a13827 [gaim-migrate @ 18083]
Mark Doliner <markdoliner@pidgin.im>
parents: 15339
diff changeset
697 peer_oft_checksum_calculated_cb, G_MAXUINT32);
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
698 }
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
699
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
700 /*
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
701 * AIM file transfers aren't really meant to be thought
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
702 * of as a transferring just a single file. The rendezvous
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
703 * establishes a connection between two computers, and then
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
704 * those computers can use the same connection for transferring
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
705 * multiple files. So we don't want the Purple core up and closing
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
706 * the socket all willy-nilly. We want to do that in the oscar
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
707 * prpl, whenever one side or the other says they're finished
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
708 * using the connection. There might be a better way to intercept
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
709 * the socket from the core...
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
710 */
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
711 void
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
712 peer_oft_sendcb_ack(PurpleXfer *xfer, const guchar *buffer, size_t size)
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
713 {
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
714 PeerConnection *conn;
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
715
32246
2305eb063660 Convert the oscar prpl to use the new API.
Andrew Victor <andrew.victor@mxit.com>
parents: 30831
diff changeset
716 conn = purple_xfer_get_protocol_data(xfer);
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
717
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
718 /*
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
719 * If we're done sending, intercept the socket from the core ft code
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
720 * and wait for the other guy to send the "done" OFT packet.
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
721 */
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
722 if (purple_xfer_get_bytes_remaining(xfer) <= 0)
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
723 {
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
724 purple_input_remove(xfer->watcher);
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
725 conn->fd = xfer->fd;
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
726 xfer->fd = -1;
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
727 conn->watcher_incoming = purple_input_add(conn->fd,
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
728 PURPLE_INPUT_READ, peer_connection_recv_cb, conn);
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
729 }
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
730 }
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
731
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
732 /*******************************************************************/
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
733 /* End PurpleXfer callbacks for use when sending a file */
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
734 /*******************************************************************/
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
735
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
736 /*******************************************************************/
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
737 /* Begin PurpleXfer callbacks for use when sending and receiving */
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
738 /*******************************************************************/
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
739
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
740 void
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
741 peer_oft_cb_generic_cancel(PurpleXfer *xfer)
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
742 {
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
743 PeerConnection *conn;
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
744
32246
2305eb063660 Convert the oscar prpl to use the new API.
Andrew Victor <andrew.victor@mxit.com>
parents: 30831
diff changeset
745 conn = purple_xfer_get_protocol_data(xfer);
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
746
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
747 if (conn == NULL)
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
748 return;
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
749
14464
b7bca43f75b3 [gaim-migrate @ 17110]
Mark Doliner <markdoliner@pidgin.im>
parents: 14254
diff changeset
750 peer_connection_destroy(conn, OSCAR_DISCONNECT_LOCAL_CLOSED, NULL);
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
751 }
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
752
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
753 /*******************************************************************/
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
754 /* End PurpleXfer callbacks for use when sending and receiving */
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
755 /*******************************************************************/
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
756
15169
5066b0eb6abf [gaim-migrate @ 17893]
Mark Doliner <markdoliner@pidgin.im>
parents: 15151
diff changeset
757 #ifdef TODOFT
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
758 /*
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
759 * This little area in oscar.c is the nexus of file transfer code,
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
760 * so I wrote a little explanation of what happens. I am such a
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
761 * ninja.
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
762 *
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
763 * The series of events for a file send is:
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
764 * -Create xfer and call purple_xfer_request (this happens in oscar_ask_sendfile)
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
765 * -User chooses a file and oscar_xfer_init is called. It establishes a
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
766 * listening socket, then asks the remote user to connect to us (and
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
767 * gives them the file name, port, IP, etc.)
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
768 * -They connect to us and we send them an PEER_TYPE_PROMPT (this happens
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
769 * in peer_oft_recv_frame_established)
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
770 * -They send us an PEER_TYPE_ACK and then we start sending data
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
771 * -When we finish, they send us an PEER_TYPE_DONE and they close the
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
772 * connection.
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
773 * -We get drunk because file transfer kicks ass.
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
774 *
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
775 * The series of events for a file receive is:
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
776 * -Create xfer and call purple_xfer request (this happens in incomingim_chan2)
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
777 * -Purple user selects file to name and location to save file to and
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
778 * oscar_xfer_init is called
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
779 * -It connects to the remote user using the IP they gave us earlier
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
780 * -After connecting, they send us an PEER_TYPE_PROMPT. In reply, we send
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
781 * them an PEER_TYPE_ACK.
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
782 * -They begin to send us lots of raw data.
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
783 * -When they finish sending data we send an PEER_TYPE_DONE and then close
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
784 * the connection.
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
785 *
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
786 * Update August 2005:
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
787 * The series of events for transfers has been seriously complicated by the addition
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
788 * of transfer redirects and proxied connections. I could throw a whole lot of words
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
789 * at trying to explain things here, but it probably wouldn't do much good. To get
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
790 * a better idea of what happens, take a look at the diagrams and documentation
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
791 * from my Summer of Code project. -- Jonathan Clark
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
792 */
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
793
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
794 /**
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
795 * Convert the directory separator from / (0x2f) to ^A (0x01)
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
796 *
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
797 * @param name The filename to convert.
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
798 */
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
799 static void
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
800 peer_oft_dirconvert_tostupid(char *name)
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
801 {
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
802 while (name[0]) {
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
803 if (name[0] == 0x01)
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
804 name[0] = G_DIR_SEPARATOR;
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
805 name++;
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
806 }
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
807 }
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
808
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
809 /**
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
810 * Convert the directory separator from ^A (0x01) to / (0x2f)
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
811 *
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
812 * @param name The filename to convert.
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
813 */
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
814 static void
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
815 peer_oft_dirconvert_fromstupid(char *name)
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
816 {
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
817 while (name[0]) {
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
818 if (name[0] == G_DIR_SEPARATOR)
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
819 name[0] = 0x01;
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
820 name++;
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
821 }
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
822 }
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
823 #endif

mercurial