libpurple/protocols/oscar/odc.c

Sun, 22 Nov 2009 18:56:06 +0000

author
Evan Schoenberg <evands@pidgin.im>
date
Sun, 22 Nov 2009 18:56:06 +0000
changeset 28944
16a690432828
parent 27635
0cd19038c417
child 30656
846b66ef678b
permissions
-rw-r--r--

Plucked d2a1d52b3bbf29baa53b9ddaa635d50b6332064f from im.pidgin.adium
by Zac West:
Fixed sending DIM messages' encoding. Fixes #9087.

The encoding bytes were being written in the wrong location, so the messages
were being read back as ASCII and failing conversion, ending up being empty
and not being displayed.

Plucked f5376d42261b8efc3d889314df9896bb10d3fe16 from im.pidgin.adium:
iChat sends direct IM messages with its encoding as 0x000d, which was being
forced-interpreted as ASCII. Also, added better debug logging for charset
information being received.

applied changes from 212bd3655451599364562cabe553c5b7a19134ae
through d2a1d52b3bbf29baa53b9ddaa635d50b6332064f

applied changes from d2a1d52b3bbf29baa53b9ddaa635d50b6332064f
through f5376d42261b8efc3d889314df9896bb10d3fe16

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: 18552
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 /* From the oscar PRPL */
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
22 #include "oscar.h"
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
23 #include "peer.h"
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
24
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
25 /* From Purple */
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
26 #include "conversation.h"
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
27 #include "imgstore.h"
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
28 #include "util.h"
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
29
20192
162883eb3251 applied changes from 2ab75e32c52e94c674d0b5a396d224da7e9d509e
Luke Schierer <lschiere@pidgin.im>
parents: 19859
diff changeset
30 #define DIRECTIM_MAX_FILESIZE 52428800
162883eb3251 applied changes from 2ab75e32c52e94c674d0b5a396d224da7e9d509e
Luke Schierer <lschiere@pidgin.im>
parents: 19859
diff changeset
31
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
32 /**
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
33 * Free any ODC related data and print a message to the conversation
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
34 * window based on conn->disconnect_reason.
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
35 */
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
36 void
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
37 peer_odc_close(PeerConnection *conn)
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
38 {
14464
b7bca43f75b3 [gaim-migrate @ 17110]
Mark Doliner <markdoliner@pidgin.im>
parents: 14254
diff changeset
39 gchar *tmp;
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
40
13609
a6fbfad454b6 [gaim-migrate @ 15994]
Mark Doliner <markdoliner@pidgin.im>
parents: 13601
diff changeset
41 if (conn->disconnect_reason == OSCAR_DISCONNECT_REMOTE_CLOSED)
14464
b7bca43f75b3 [gaim-migrate @ 17110]
Mark Doliner <markdoliner@pidgin.im>
parents: 14254
diff changeset
42 tmp = g_strdup(_("The remote user has closed the connection."));
13609
a6fbfad454b6 [gaim-migrate @ 15994]
Mark Doliner <markdoliner@pidgin.im>
parents: 13601
diff changeset
43 else if (conn->disconnect_reason == OSCAR_DISCONNECT_REMOTE_REFUSED)
14464
b7bca43f75b3 [gaim-migrate @ 17110]
Mark Doliner <markdoliner@pidgin.im>
parents: 14254
diff changeset
44 tmp = g_strdup(_("The remote user has declined your request."));
13609
a6fbfad454b6 [gaim-migrate @ 15994]
Mark Doliner <markdoliner@pidgin.im>
parents: 13601
diff changeset
45 else if (conn->disconnect_reason == OSCAR_DISCONNECT_LOST_CONNECTION)
14464
b7bca43f75b3 [gaim-migrate @ 17110]
Mark Doliner <markdoliner@pidgin.im>
parents: 14254
diff changeset
46 tmp = g_strdup_printf(_("Lost connection with the remote user:<br>%s"),
b7bca43f75b3 [gaim-migrate @ 17110]
Mark Doliner <markdoliner@pidgin.im>
parents: 14254
diff changeset
47 conn->error_message);
13609
a6fbfad454b6 [gaim-migrate @ 15994]
Mark Doliner <markdoliner@pidgin.im>
parents: 13601
diff changeset
48 else if (conn->disconnect_reason == OSCAR_DISCONNECT_INVALID_DATA)
14464
b7bca43f75b3 [gaim-migrate @ 17110]
Mark Doliner <markdoliner@pidgin.im>
parents: 14254
diff changeset
49 tmp = g_strdup(_("Received invalid data on connection with remote user."));
13609
a6fbfad454b6 [gaim-migrate @ 15994]
Mark Doliner <markdoliner@pidgin.im>
parents: 13601
diff changeset
50 else if (conn->disconnect_reason == OSCAR_DISCONNECT_COULD_NOT_CONNECT)
27635
0cd19038c417 More uniformity among disconnect error messages
Mark Doliner <markdoliner@pidgin.im>
parents: 25889
diff changeset
51 tmp = g_strdup(_("Unable to establish a connection with the remote user."));
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
52 else
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
53 /*
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
54 * We shouldn't print a message for some disconnect_reasons.
13609
a6fbfad454b6 [gaim-migrate @ 15994]
Mark Doliner <markdoliner@pidgin.im>
parents: 13601
diff changeset
55 * Like OSCAR_DISCONNECT_LOCAL_CLOSED.
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
56 */
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
57 tmp = NULL;
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
58
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
59 if (tmp != NULL)
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
60 {
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
61 PurpleAccount *account;
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
62 PurpleConversation *conv;
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
63
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
64 account = purple_connection_get_account(conn->od->gc);
25889
26d9ca30335c Change "screen name" to "username" or "buddy name" in a whole bunch of
Mark Doliner <markdoliner@pidgin.im>
parents: 25426
diff changeset
65 conv = purple_conversation_new(PURPLE_CONV_TYPE_IM, account, conn->bn);
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
66 purple_conversation_write(conv, NULL, tmp, PURPLE_MESSAGE_SYSTEM, time(NULL));
14464
b7bca43f75b3 [gaim-migrate @ 17110]
Mark Doliner <markdoliner@pidgin.im>
parents: 14254
diff changeset
67 g_free(tmp);
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
68 }
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
69
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
70 if (conn->frame != NULL)
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
71 {
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
72 OdcFrame *frame;
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
73 frame = conn->frame;
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
74 g_free(frame->payload.data);
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
75 g_free(frame);
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
76 }
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
77 }
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
78
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
79 /**
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
80 * Write the given OdcFrame to a ByteStream and send it out
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
81 * on the established PeerConnection.
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
82 */
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
83 static void
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
84 peer_odc_send(PeerConnection *conn, OdcFrame *frame)
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
85 {
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
86 PurpleAccount *account;
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
87 const char *username;
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
88 size_t length;
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
89 ByteStream bs;
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
90
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
91 purple_debug_info("oscar", "Outgoing ODC frame to %s with "
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
92 "type=0x%04x, flags=0x%04x, payload length=%u\n",
25889
26d9ca30335c Change "screen name" to "username" or "buddy name" in a whole bunch of
Mark Doliner <markdoliner@pidgin.im>
parents: 25426
diff changeset
93 conn->bn, frame->type, frame->flags, frame->payload.len);
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
94
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
95 account = purple_connection_get_account(conn->od->gc);
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
96 username = purple_account_get_username(account);
25889
26d9ca30335c Change "screen name" to "username" or "buddy name" in a whole bunch of
Mark Doliner <markdoliner@pidgin.im>
parents: 25426
diff changeset
97 memcpy(frame->bn, username, strlen(username));
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
98 memcpy(frame->cookie, conn->cookie, 8);
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
99
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
100 length = 76;
15151
bb985812fefa [gaim-migrate @ 17875]
Mark Doliner <markdoliner@pidgin.im>
parents: 14464
diff changeset
101 byte_stream_new(&bs, length + frame->payload.len);
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
102 byte_stream_putraw(&bs, conn->magic, 4);
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
103 byte_stream_put16(&bs, length);
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
104 byte_stream_put16(&bs, frame->type);
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
105 byte_stream_put16(&bs, frame->subtype);
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
106 byte_stream_put16(&bs, 0x0000);
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
107 byte_stream_putraw(&bs, frame->cookie, 8);
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
108 byte_stream_put16(&bs, 0x0000);
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
109 byte_stream_put16(&bs, 0x0000);
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
110 byte_stream_put16(&bs, 0x0000);
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
111 byte_stream_put16(&bs, 0x0000);
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
112 byte_stream_put32(&bs, frame->payload.len);
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
113 byte_stream_put16(&bs, frame->encoding);
28944
16a690432828 Plucked d2a1d52b3bbf29baa53b9ddaa635d50b6332064f from im.pidgin.adium
Evan Schoenberg <evands@pidgin.im>
parents: 27635
diff changeset
114 byte_stream_put16(&bs, 0x0000);
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
115 byte_stream_put16(&bs, 0x0000);
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
116 byte_stream_put16(&bs, frame->flags);
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
117 byte_stream_put16(&bs, 0x0000);
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
118 byte_stream_put16(&bs, 0x0000);
25889
26d9ca30335c Change "screen name" to "username" or "buddy name" in a whole bunch of
Mark Doliner <markdoliner@pidgin.im>
parents: 25426
diff changeset
119 byte_stream_putraw(&bs, frame->bn, 32);
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
120 byte_stream_putraw(&bs, frame->payload.data, frame->payload.len);
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
121
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
122 peer_connection_send(conn, &bs);
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
123
22862
24f8ae1208ca Fixed the final stragglers in need of byte_stream_destroy()
Evan Schoenberg <evands@pidgin.im>
parents: 21389
diff changeset
124 byte_stream_destroy(&bs);
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
125 }
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
126
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
127 /**
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
128 * Send a very basic ODC frame (which contains the cookie) so that the
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
129 * remote user can verify that we are the person they were expecting.
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
130 * If we made an outgoing connection to then remote user, then we send
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
131 * this immediately. If the remote user connected to us, then we wait
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
132 * for the other person to send this to us, then we send one to them.
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
133 */
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
134 void
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
135 peer_odc_send_cookie(PeerConnection *conn)
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 OdcFrame frame;
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
138
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
139 memset(&frame, 0, sizeof(OdcFrame));
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
140 frame.type = 0x0001;
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
141 frame.subtype = 0x0006;
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
142 frame.flags = 0x0060; /* Maybe this means "we're sending the cookie"? */
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
143
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
144 peer_odc_send(conn, &frame);
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
145 }
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 /**
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
148 * Send client-to-client typing notification over an established direct connection.
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
149 */
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
150 void
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
151 peer_odc_send_typing(PeerConnection *conn, PurpleTypingState typing)
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
152 {
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
153 OdcFrame frame;
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
154
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
155 memset(&frame, 0, sizeof(OdcFrame));
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
156 frame.type = 0x0001;
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
157 frame.subtype = 0x0006;
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
158 if (typing == PURPLE_TYPING)
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
159 frame.flags = 0x0002 | 0x0008;
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
160 else if (typing == PURPLE_TYPED)
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
161 frame.flags = 0x0002 | 0x0004;
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
162 else
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
163 frame.flags = 0x0002;
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
164
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
165 peer_odc_send(conn, &frame);
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
166 }
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
167
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
168 /**
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
169 * Send client-to-client IM over an established direct connection.
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
170 * To send a direct IM, call this just like you would aim_send_im.
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
171 *
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
172 * @param conn The already-connected ODC connection.
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
173 * @param msg Null-terminated string to send.
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
174 * @param len The length of the message to send, including binary data.
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
175 * @param encoding See the AIM_CHARSET_* defines in oscar.h
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
176 * @param autoreply TRUE if this is any auto-reply.
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
177 */
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
178 void
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
179 peer_odc_send_im(PeerConnection *conn, const char *msg, int len, int encoding, gboolean autoreply)
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
180 {
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
181 OdcFrame frame;
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
182
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
183 g_return_if_fail(msg != NULL);
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
184 g_return_if_fail(len > 0);
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
185
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
186 memset(&frame, 0, sizeof(OdcFrame));
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
187 frame.type = 0x0001;
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
188 frame.subtype = 0x0006;
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
189 frame.payload.len = len;
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
190 frame.encoding = encoding;
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
191 frame.flags = autoreply;
15151
bb985812fefa [gaim-migrate @ 17875]
Mark Doliner <markdoliner@pidgin.im>
parents: 14464
diff changeset
192 byte_stream_new(&frame.payload, len);
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
193 byte_stream_putraw(&frame.payload, (guint8 *)msg, len);
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
194
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
195 peer_odc_send(conn, &frame);
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
196
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
197 g_free(frame.payload.data);
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
198 }
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
199
13601
d22aea27e7e6 [gaim-migrate @ 15986]
Mark Doliner <markdoliner@pidgin.im>
parents: 13600
diff changeset
200 struct embedded_data
d22aea27e7e6 [gaim-migrate @ 15986]
Mark Doliner <markdoliner@pidgin.im>
parents: 13600
diff changeset
201 {
d22aea27e7e6 [gaim-migrate @ 15986]
Mark Doliner <markdoliner@pidgin.im>
parents: 13600
diff changeset
202 size_t size;
d22aea27e7e6 [gaim-migrate @ 15986]
Mark Doliner <markdoliner@pidgin.im>
parents: 13600
diff changeset
203 const guint8 *data;
d22aea27e7e6 [gaim-migrate @ 15986]
Mark Doliner <markdoliner@pidgin.im>
parents: 13600
diff changeset
204 };
d22aea27e7e6 [gaim-migrate @ 15986]
Mark Doliner <markdoliner@pidgin.im>
parents: 13600
diff changeset
205
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
206 /**
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
207 * This is called after a direct IM has been received in its entirety. This
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
208 * function is passed a long chunk of data which contains the IM with any
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
209 * data chunks (images) appended to it.
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
210 *
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
211 * This function rips out all the data chunks and creates an imgstore for
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
212 * each one. In order to do this, it first goes through the IM and takes
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
213 * out all the IMG tags. When doing so, it rewrites the original IMG tag
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
214 * with one compatible with the imgstore Purple core code. For each one, we
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
215 * then read in chunks of data from the end of the message and actually
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
216 * create the img store using the given data.
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
217 *
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
218 * For somewhat easy reference, here's a sample message
13601
d22aea27e7e6 [gaim-migrate @ 15986]
Mark Doliner <markdoliner@pidgin.im>
parents: 13600
diff changeset
219 * (with added whitespace):
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
220 *
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
221 * <HTML><BODY BGCOLOR="#ffffff">
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
222 * <FONT LANG="0">
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
223 * This is a really stupid picture:<BR>
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
224 * <IMG SRC="Sample.jpg" ID="1" WIDTH="283" HEIGHT="212" DATASIZE="9894"><BR>
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
225 * Yeah it is<BR>
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
226 * Here is another one:<BR>
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
227 * <IMG SRC="Soap Bubbles.bmp" ID="2" WIDTH="256" HEIGHT="256" DATASIZE="65978">
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
228 * </FONT>
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
229 * </BODY></HTML>
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
230 * <BINARY>
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
231 * <DATA ID="1" SIZE="9894">datadatadatadata</DATA>
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
232 * <DATA ID="2" SIZE="65978">datadatadatadata</DATA>
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
233 * </BINARY>
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
234 */
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
235 static void
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
236 peer_odc_handle_payload(PeerConnection *conn, const char *msg, size_t len, int encoding, gboolean autoreply)
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
237 {
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
238 PurpleConnection *gc;
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
239 PurpleAccount *account;
13601
d22aea27e7e6 [gaim-migrate @ 15986]
Mark Doliner <markdoliner@pidgin.im>
parents: 13600
diff changeset
240 const char *msgend, *binary_start, *dataend;
d22aea27e7e6 [gaim-migrate @ 15986]
Mark Doliner <markdoliner@pidgin.im>
parents: 13600
diff changeset
241 const char *tmp, *start, *end, *idstr, *src, *sizestr;
d22aea27e7e6 [gaim-migrate @ 15986]
Mark Doliner <markdoliner@pidgin.im>
parents: 13600
diff changeset
242 GData *attributes;
d22aea27e7e6 [gaim-migrate @ 15986]
Mark Doliner <markdoliner@pidgin.im>
parents: 13600
diff changeset
243 GHashTable *embedded_datas;
d22aea27e7e6 [gaim-migrate @ 15986]
Mark Doliner <markdoliner@pidgin.im>
parents: 13600
diff changeset
244 struct embedded_data *embedded_data;
d22aea27e7e6 [gaim-migrate @ 15986]
Mark Doliner <markdoliner@pidgin.im>
parents: 13600
diff changeset
245 GSList *images;
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
246 gchar *utf8;
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
247 GString *newmsg;
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
248 PurpleMessageFlags imflags;
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
249
13601
d22aea27e7e6 [gaim-migrate @ 15986]
Mark Doliner <markdoliner@pidgin.im>
parents: 13600
diff changeset
250 gc = conn->od->gc;
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
251 account = purple_connection_get_account(gc);
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
252
13601
d22aea27e7e6 [gaim-migrate @ 15986]
Mark Doliner <markdoliner@pidgin.im>
parents: 13600
diff changeset
253 dataend = msg + len;
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
254
13601
d22aea27e7e6 [gaim-migrate @ 15986]
Mark Doliner <markdoliner@pidgin.im>
parents: 13600
diff changeset
255 /*
d22aea27e7e6 [gaim-migrate @ 15986]
Mark Doliner <markdoliner@pidgin.im>
parents: 13600
diff changeset
256 * Create a hash table containing references to each embedded
d22aea27e7e6 [gaim-migrate @ 15986]
Mark Doliner <markdoliner@pidgin.im>
parents: 13600
diff changeset
257 * data chunk. The key is the "ID" and the value is an
d22aea27e7e6 [gaim-migrate @ 15986]
Mark Doliner <markdoliner@pidgin.im>
parents: 13600
diff changeset
258 * embedded_data struct.
d22aea27e7e6 [gaim-migrate @ 15986]
Mark Doliner <markdoliner@pidgin.im>
parents: 13600
diff changeset
259 */
d22aea27e7e6 [gaim-migrate @ 15986]
Mark Doliner <markdoliner@pidgin.im>
parents: 13600
diff changeset
260 embedded_datas = g_hash_table_new_full(g_direct_hash,
d22aea27e7e6 [gaim-migrate @ 15986]
Mark Doliner <markdoliner@pidgin.im>
parents: 13600
diff changeset
261 g_direct_equal, NULL, g_free);
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
262
13601
d22aea27e7e6 [gaim-migrate @ 15986]
Mark Doliner <markdoliner@pidgin.im>
parents: 13600
diff changeset
263 /*
d22aea27e7e6 [gaim-migrate @ 15986]
Mark Doliner <markdoliner@pidgin.im>
parents: 13600
diff changeset
264 * Create an index of any binary chunks. If we run into any
d22aea27e7e6 [gaim-migrate @ 15986]
Mark Doliner <markdoliner@pidgin.im>
parents: 13600
diff changeset
265 * problems while parsing the binary data section then we stop
d22aea27e7e6 [gaim-migrate @ 15986]
Mark Doliner <markdoliner@pidgin.im>
parents: 13600
diff changeset
266 * parsing it, and the local user will see broken image icons.
d22aea27e7e6 [gaim-migrate @ 15986]
Mark Doliner <markdoliner@pidgin.im>
parents: 13600
diff changeset
267 */
d22aea27e7e6 [gaim-migrate @ 15986]
Mark Doliner <markdoliner@pidgin.im>
parents: 13600
diff changeset
268 /* TODO: Use a length argument when looking for the <binary> tag! */
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
269 binary_start = purple_strcasestr(msg, "<binary>");
13601
d22aea27e7e6 [gaim-migrate @ 15986]
Mark Doliner <markdoliner@pidgin.im>
parents: 13600
diff changeset
270 if (binary_start == NULL)
d22aea27e7e6 [gaim-migrate @ 15986]
Mark Doliner <markdoliner@pidgin.im>
parents: 13600
diff changeset
271 msgend = dataend;
d22aea27e7e6 [gaim-migrate @ 15986]
Mark Doliner <markdoliner@pidgin.im>
parents: 13600
diff changeset
272 else
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
273 {
13601
d22aea27e7e6 [gaim-migrate @ 15986]
Mark Doliner <markdoliner@pidgin.im>
parents: 13600
diff changeset
274 msgend = binary_start;
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
275
13601
d22aea27e7e6 [gaim-migrate @ 15986]
Mark Doliner <markdoliner@pidgin.im>
parents: 13600
diff changeset
276 /* Move our pointer to immediately after the <binary> tag */
d22aea27e7e6 [gaim-migrate @ 15986]
Mark Doliner <markdoliner@pidgin.im>
parents: 13600
diff changeset
277 tmp = binary_start + 8;
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
278
13601
d22aea27e7e6 [gaim-migrate @ 15986]
Mark Doliner <markdoliner@pidgin.im>
parents: 13600
diff changeset
279 /* The embedded binary markup has a mimimum length of 29 bytes */
d22aea27e7e6 [gaim-migrate @ 15986]
Mark Doliner <markdoliner@pidgin.im>
parents: 13600
diff changeset
280 /* TODO: Use a length argument when looking for the <data> tag! */
d22aea27e7e6 [gaim-migrate @ 15986]
Mark Doliner <markdoliner@pidgin.im>
parents: 13600
diff changeset
281 while ((tmp + 29 <= dataend) &&
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
282 purple_markup_find_tag("data", tmp, &start, &tmp, &attributes))
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
283 {
13601
d22aea27e7e6 [gaim-migrate @ 15986]
Mark Doliner <markdoliner@pidgin.im>
parents: 13600
diff changeset
284 unsigned int id;
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
285 size_t size;
13601
d22aea27e7e6 [gaim-migrate @ 15986]
Mark Doliner <markdoliner@pidgin.im>
parents: 13600
diff changeset
286
d22aea27e7e6 [gaim-migrate @ 15986]
Mark Doliner <markdoliner@pidgin.im>
parents: 13600
diff changeset
287 /* Move the binary pointer from ">" to the start of the data */
d22aea27e7e6 [gaim-migrate @ 15986]
Mark Doliner <markdoliner@pidgin.im>
parents: 13600
diff changeset
288 tmp++;
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
289
13601
d22aea27e7e6 [gaim-migrate @ 15986]
Mark Doliner <markdoliner@pidgin.im>
parents: 13600
diff changeset
290 /* Get the ID */
d22aea27e7e6 [gaim-migrate @ 15986]
Mark Doliner <markdoliner@pidgin.im>
parents: 13600
diff changeset
291 idstr = g_datalist_get_data(&attributes, "id");
d22aea27e7e6 [gaim-migrate @ 15986]
Mark Doliner <markdoliner@pidgin.im>
parents: 13600
diff changeset
292 if (idstr == NULL)
d22aea27e7e6 [gaim-migrate @ 15986]
Mark Doliner <markdoliner@pidgin.im>
parents: 13600
diff changeset
293 {
d22aea27e7e6 [gaim-migrate @ 15986]
Mark Doliner <markdoliner@pidgin.im>
parents: 13600
diff changeset
294 g_datalist_clear(&attributes);
d22aea27e7e6 [gaim-migrate @ 15986]
Mark Doliner <markdoliner@pidgin.im>
parents: 13600
diff changeset
295 break;
d22aea27e7e6 [gaim-migrate @ 15986]
Mark Doliner <markdoliner@pidgin.im>
parents: 13600
diff changeset
296 }
d22aea27e7e6 [gaim-migrate @ 15986]
Mark Doliner <markdoliner@pidgin.im>
parents: 13600
diff changeset
297 id = atoi(idstr);
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
298
13601
d22aea27e7e6 [gaim-migrate @ 15986]
Mark Doliner <markdoliner@pidgin.im>
parents: 13600
diff changeset
299 /* Get the size */
d22aea27e7e6 [gaim-migrate @ 15986]
Mark Doliner <markdoliner@pidgin.im>
parents: 13600
diff changeset
300 sizestr = g_datalist_get_data(&attributes, "size");
d22aea27e7e6 [gaim-migrate @ 15986]
Mark Doliner <markdoliner@pidgin.im>
parents: 13600
diff changeset
301 if (sizestr == NULL)
d22aea27e7e6 [gaim-migrate @ 15986]
Mark Doliner <markdoliner@pidgin.im>
parents: 13600
diff changeset
302 {
d22aea27e7e6 [gaim-migrate @ 15986]
Mark Doliner <markdoliner@pidgin.im>
parents: 13600
diff changeset
303 g_datalist_clear(&attributes);
d22aea27e7e6 [gaim-migrate @ 15986]
Mark Doliner <markdoliner@pidgin.im>
parents: 13600
diff changeset
304 break;
d22aea27e7e6 [gaim-migrate @ 15986]
Mark Doliner <markdoliner@pidgin.im>
parents: 13600
diff changeset
305 }
d22aea27e7e6 [gaim-migrate @ 15986]
Mark Doliner <markdoliner@pidgin.im>
parents: 13600
diff changeset
306 size = atol(sizestr);
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
307
13601
d22aea27e7e6 [gaim-migrate @ 15986]
Mark Doliner <markdoliner@pidgin.im>
parents: 13600
diff changeset
308 g_datalist_clear(&attributes);
d22aea27e7e6 [gaim-migrate @ 15986]
Mark Doliner <markdoliner@pidgin.im>
parents: 13600
diff changeset
309
d22aea27e7e6 [gaim-migrate @ 15986]
Mark Doliner <markdoliner@pidgin.im>
parents: 13600
diff changeset
310 if ((size > 0) && (tmp + size > dataend))
d22aea27e7e6 [gaim-migrate @ 15986]
Mark Doliner <markdoliner@pidgin.im>
parents: 13600
diff changeset
311 break;
d22aea27e7e6 [gaim-migrate @ 15986]
Mark Doliner <markdoliner@pidgin.im>
parents: 13600
diff changeset
312
d22aea27e7e6 [gaim-migrate @ 15986]
Mark Doliner <markdoliner@pidgin.im>
parents: 13600
diff changeset
313 embedded_data = g_new(struct embedded_data, 1);
d22aea27e7e6 [gaim-migrate @ 15986]
Mark Doliner <markdoliner@pidgin.im>
parents: 13600
diff changeset
314 embedded_data->size = size;
d22aea27e7e6 [gaim-migrate @ 15986]
Mark Doliner <markdoliner@pidgin.im>
parents: 13600
diff changeset
315 embedded_data->data = (const guint8 *)tmp;
d22aea27e7e6 [gaim-migrate @ 15986]
Mark Doliner <markdoliner@pidgin.im>
parents: 13600
diff changeset
316 tmp += size;
d22aea27e7e6 [gaim-migrate @ 15986]
Mark Doliner <markdoliner@pidgin.im>
parents: 13600
diff changeset
317
d22aea27e7e6 [gaim-migrate @ 15986]
Mark Doliner <markdoliner@pidgin.im>
parents: 13600
diff changeset
318 /* Skip past the closing </data> tag */
18552
810a338ef085 Use the glib strcasecmp functions everywhere, as we've had reports of
Richard Laager <rlaager@pidgin.im>
parents: 17539
diff changeset
319 if (g_ascii_strncasecmp(tmp, "</data>", 7))
13600
4f436279a21c [gaim-migrate @ 15985]
Mark Doliner <markdoliner@pidgin.im>
parents: 13593
diff changeset
320 {
13601
d22aea27e7e6 [gaim-migrate @ 15986]
Mark Doliner <markdoliner@pidgin.im>
parents: 13600
diff changeset
321 g_free(embedded_data);
d22aea27e7e6 [gaim-migrate @ 15986]
Mark Doliner <markdoliner@pidgin.im>
parents: 13600
diff changeset
322 break;
13600
4f436279a21c [gaim-migrate @ 15985]
Mark Doliner <markdoliner@pidgin.im>
parents: 13593
diff changeset
323 }
13601
d22aea27e7e6 [gaim-migrate @ 15986]
Mark Doliner <markdoliner@pidgin.im>
parents: 13600
diff changeset
324 tmp += 7;
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
325
13601
d22aea27e7e6 [gaim-migrate @ 15986]
Mark Doliner <markdoliner@pidgin.im>
parents: 13600
diff changeset
326 g_hash_table_insert(embedded_datas,
d22aea27e7e6 [gaim-migrate @ 15986]
Mark Doliner <markdoliner@pidgin.im>
parents: 13600
diff changeset
327 GINT_TO_POINTER(id), embedded_data);
d22aea27e7e6 [gaim-migrate @ 15986]
Mark Doliner <markdoliner@pidgin.im>
parents: 13600
diff changeset
328 }
d22aea27e7e6 [gaim-migrate @ 15986]
Mark Doliner <markdoliner@pidgin.im>
parents: 13600
diff changeset
329 }
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
330
13601
d22aea27e7e6 [gaim-migrate @ 15986]
Mark Doliner <markdoliner@pidgin.im>
parents: 13600
diff changeset
331 /*
d22aea27e7e6 [gaim-migrate @ 15986]
Mark Doliner <markdoliner@pidgin.im>
parents: 13600
diff changeset
332 * Loop through the message, replacing OSCAR img tags with the
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
333 * equivalent Purple img tag.
13601
d22aea27e7e6 [gaim-migrate @ 15986]
Mark Doliner <markdoliner@pidgin.im>
parents: 13600
diff changeset
334 */
d22aea27e7e6 [gaim-migrate @ 15986]
Mark Doliner <markdoliner@pidgin.im>
parents: 13600
diff changeset
335 images = NULL;
d22aea27e7e6 [gaim-migrate @ 15986]
Mark Doliner <markdoliner@pidgin.im>
parents: 13600
diff changeset
336 newmsg = g_string_new("");
d22aea27e7e6 [gaim-migrate @ 15986]
Mark Doliner <markdoliner@pidgin.im>
parents: 13600
diff changeset
337 tmp = msg;
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
338 while (purple_markup_find_tag("img", tmp, &start, &end, &attributes))
13601
d22aea27e7e6 [gaim-migrate @ 15986]
Mark Doliner <markdoliner@pidgin.im>
parents: 13600
diff changeset
339 {
d22aea27e7e6 [gaim-migrate @ 15986]
Mark Doliner <markdoliner@pidgin.im>
parents: 13600
diff changeset
340 int imgid = 0;
d22aea27e7e6 [gaim-migrate @ 15986]
Mark Doliner <markdoliner@pidgin.im>
parents: 13600
diff changeset
341
d22aea27e7e6 [gaim-migrate @ 15986]
Mark Doliner <markdoliner@pidgin.im>
parents: 13600
diff changeset
342 idstr = g_datalist_get_data(&attributes, "id");
d22aea27e7e6 [gaim-migrate @ 15986]
Mark Doliner <markdoliner@pidgin.im>
parents: 13600
diff changeset
343 src = g_datalist_get_data(&attributes, "src");
d22aea27e7e6 [gaim-migrate @ 15986]
Mark Doliner <markdoliner@pidgin.im>
parents: 13600
diff changeset
344 sizestr = g_datalist_get_data(&attributes, "datasize");
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
345
13601
d22aea27e7e6 [gaim-migrate @ 15986]
Mark Doliner <markdoliner@pidgin.im>
parents: 13600
diff changeset
346 if ((idstr != NULL) && (src != NULL) && (sizestr!= NULL))
d22aea27e7e6 [gaim-migrate @ 15986]
Mark Doliner <markdoliner@pidgin.im>
parents: 13600
diff changeset
347 {
d22aea27e7e6 [gaim-migrate @ 15986]
Mark Doliner <markdoliner@pidgin.im>
parents: 13600
diff changeset
348 unsigned int id;
d22aea27e7e6 [gaim-migrate @ 15986]
Mark Doliner <markdoliner@pidgin.im>
parents: 13600
diff changeset
349 size_t size;
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
350
13601
d22aea27e7e6 [gaim-migrate @ 15986]
Mark Doliner <markdoliner@pidgin.im>
parents: 13600
diff changeset
351 id = atoi(idstr);
d22aea27e7e6 [gaim-migrate @ 15986]
Mark Doliner <markdoliner@pidgin.im>
parents: 13600
diff changeset
352 size = atol(sizestr);
d22aea27e7e6 [gaim-migrate @ 15986]
Mark Doliner <markdoliner@pidgin.im>
parents: 13600
diff changeset
353 embedded_data = g_hash_table_lookup(embedded_datas,
d22aea27e7e6 [gaim-migrate @ 15986]
Mark Doliner <markdoliner@pidgin.im>
parents: 13600
diff changeset
354 GINT_TO_POINTER(id));
d22aea27e7e6 [gaim-migrate @ 15986]
Mark Doliner <markdoliner@pidgin.im>
parents: 13600
diff changeset
355
d22aea27e7e6 [gaim-migrate @ 15986]
Mark Doliner <markdoliner@pidgin.im>
parents: 13600
diff changeset
356 if ((embedded_data != NULL) && (embedded_data->size == size))
d22aea27e7e6 [gaim-migrate @ 15986]
Mark Doliner <markdoliner@pidgin.im>
parents: 13600
diff changeset
357 {
16539
75a20ae3a527 Change the imgstore and by extension, then the buddy icon code to take over
Richard Laager <rlaager@pidgin.im>
parents: 16437
diff changeset
358 imgid = purple_imgstore_add_with_id(g_memdup(embedded_data->data, size), size, src);
13601
d22aea27e7e6 [gaim-migrate @ 15986]
Mark Doliner <markdoliner@pidgin.im>
parents: 13600
diff changeset
359
d22aea27e7e6 [gaim-migrate @ 15986]
Mark Doliner <markdoliner@pidgin.im>
parents: 13600
diff changeset
360 /* Record the image number */
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
361 images = g_slist_append(images, GINT_TO_POINTER(imgid));
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
362 }
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
363 }
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
364
13601
d22aea27e7e6 [gaim-migrate @ 15986]
Mark Doliner <markdoliner@pidgin.im>
parents: 13600
diff changeset
365 /* Delete the attribute list */
d22aea27e7e6 [gaim-migrate @ 15986]
Mark Doliner <markdoliner@pidgin.im>
parents: 13600
diff changeset
366 g_datalist_clear(&attributes);
d22aea27e7e6 [gaim-migrate @ 15986]
Mark Doliner <markdoliner@pidgin.im>
parents: 13600
diff changeset
367
d22aea27e7e6 [gaim-migrate @ 15986]
Mark Doliner <markdoliner@pidgin.im>
parents: 13600
diff changeset
368 /* Append the message up to the tag */
25889
26d9ca30335c Change "screen name" to "username" or "buddy name" in a whole bunch of
Mark Doliner <markdoliner@pidgin.im>
parents: 25426
diff changeset
369 utf8 = purple_plugin_oscar_decode_im_part(account, conn->bn,
13601
d22aea27e7e6 [gaim-migrate @ 15986]
Mark Doliner <markdoliner@pidgin.im>
parents: 13600
diff changeset
370 encoding, 0x0000, tmp, start - tmp);
d22aea27e7e6 [gaim-migrate @ 15986]
Mark Doliner <markdoliner@pidgin.im>
parents: 13600
diff changeset
371 if (utf8 != NULL) {
d22aea27e7e6 [gaim-migrate @ 15986]
Mark Doliner <markdoliner@pidgin.im>
parents: 13600
diff changeset
372 g_string_append(newmsg, utf8);
d22aea27e7e6 [gaim-migrate @ 15986]
Mark Doliner <markdoliner@pidgin.im>
parents: 13600
diff changeset
373 g_free(utf8);
d22aea27e7e6 [gaim-migrate @ 15986]
Mark Doliner <markdoliner@pidgin.im>
parents: 13600
diff changeset
374 }
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
375
13601
d22aea27e7e6 [gaim-migrate @ 15986]
Mark Doliner <markdoliner@pidgin.im>
parents: 13600
diff changeset
376 if (imgid != 0)
d22aea27e7e6 [gaim-migrate @ 15986]
Mark Doliner <markdoliner@pidgin.im>
parents: 13600
diff changeset
377 {
d22aea27e7e6 [gaim-migrate @ 15986]
Mark Doliner <markdoliner@pidgin.im>
parents: 13600
diff changeset
378 /* Write the new image tag */
d22aea27e7e6 [gaim-migrate @ 15986]
Mark Doliner <markdoliner@pidgin.im>
parents: 13600
diff changeset
379 g_string_append_printf(newmsg, "<IMG ID=\"%d\">", imgid);
d22aea27e7e6 [gaim-migrate @ 15986]
Mark Doliner <markdoliner@pidgin.im>
parents: 13600
diff changeset
380 }
d22aea27e7e6 [gaim-migrate @ 15986]
Mark Doliner <markdoliner@pidgin.im>
parents: 13600
diff changeset
381
d22aea27e7e6 [gaim-migrate @ 15986]
Mark Doliner <markdoliner@pidgin.im>
parents: 13600
diff changeset
382 /* Continue from the end of the tag */
d22aea27e7e6 [gaim-migrate @ 15986]
Mark Doliner <markdoliner@pidgin.im>
parents: 13600
diff changeset
383 tmp = end + 1;
d22aea27e7e6 [gaim-migrate @ 15986]
Mark Doliner <markdoliner@pidgin.im>
parents: 13600
diff changeset
384 }
d22aea27e7e6 [gaim-migrate @ 15986]
Mark Doliner <markdoliner@pidgin.im>
parents: 13600
diff changeset
385
d22aea27e7e6 [gaim-migrate @ 15986]
Mark Doliner <markdoliner@pidgin.im>
parents: 13600
diff changeset
386 /* Append any remaining message data */
d22aea27e7e6 [gaim-migrate @ 15986]
Mark Doliner <markdoliner@pidgin.im>
parents: 13600
diff changeset
387 if (tmp <= msgend)
d22aea27e7e6 [gaim-migrate @ 15986]
Mark Doliner <markdoliner@pidgin.im>
parents: 13600
diff changeset
388 {
25889
26d9ca30335c Change "screen name" to "username" or "buddy name" in a whole bunch of
Mark Doliner <markdoliner@pidgin.im>
parents: 25426
diff changeset
389 utf8 = purple_plugin_oscar_decode_im_part(account, conn->bn,
13601
d22aea27e7e6 [gaim-migrate @ 15986]
Mark Doliner <markdoliner@pidgin.im>
parents: 13600
diff changeset
390 encoding, 0x0000, tmp, msgend - tmp);
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
391 if (utf8 != NULL) {
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
392 g_string_append(newmsg, utf8);
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
393 g_free(utf8);
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 }
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
396
25426
71bd2a5b4eab Fixed an errant comment
Evan Schoenberg <evands@pidgin.im>
parents: 25296
diff changeset
397 /* Display the message we received */
13601
d22aea27e7e6 [gaim-migrate @ 15986]
Mark Doliner <markdoliner@pidgin.im>
parents: 13600
diff changeset
398 imflags = 0;
d22aea27e7e6 [gaim-migrate @ 15986]
Mark Doliner <markdoliner@pidgin.im>
parents: 13600
diff changeset
399 if (images != NULL)
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
400 imflags |= PURPLE_MESSAGE_IMAGES;
13601
d22aea27e7e6 [gaim-migrate @ 15986]
Mark Doliner <markdoliner@pidgin.im>
parents: 13600
diff changeset
401 if (autoreply)
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
402 imflags |= PURPLE_MESSAGE_AUTO_RESP;
25889
26d9ca30335c Change "screen name" to "username" or "buddy name" in a whole bunch of
Mark Doliner <markdoliner@pidgin.im>
parents: 25426
diff changeset
403 serv_got_im(gc, conn->bn, newmsg->str, imflags, time(NULL));
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
404 g_string_free(newmsg, TRUE);
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
405
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
406 /* unref any images we allocated */
13601
d22aea27e7e6 [gaim-migrate @ 15986]
Mark Doliner <markdoliner@pidgin.im>
parents: 13600
diff changeset
407 if (images)
d22aea27e7e6 [gaim-migrate @ 15986]
Mark Doliner <markdoliner@pidgin.im>
parents: 13600
diff changeset
408 {
d22aea27e7e6 [gaim-migrate @ 15986]
Mark Doliner <markdoliner@pidgin.im>
parents: 13600
diff changeset
409 GSList *l;
d22aea27e7e6 [gaim-migrate @ 15986]
Mark Doliner <markdoliner@pidgin.im>
parents: 13600
diff changeset
410 for (l = images; l != NULL; l = l->next)
16437
7ff7c3405ea2 Rework the buddy icon subsystem to use the imgstore subsystem, and modify the
Richard Laager <rlaager@pidgin.im>
parents: 15884
diff changeset
411 purple_imgstore_unref_by_id(GPOINTER_TO_INT(l->data));
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
412 g_slist_free(images);
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
413 }
13601
d22aea27e7e6 [gaim-migrate @ 15986]
Mark Doliner <markdoliner@pidgin.im>
parents: 13600
diff changeset
414
d22aea27e7e6 [gaim-migrate @ 15986]
Mark Doliner <markdoliner@pidgin.im>
parents: 13600
diff changeset
415 /* Delete our list of pointers to embedded images */
d22aea27e7e6 [gaim-migrate @ 15986]
Mark Doliner <markdoliner@pidgin.im>
parents: 13600
diff changeset
416 g_hash_table_destroy(embedded_datas);
13593
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 /**
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
420 * This is a purple_input_add() watcher callback function for reading
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
421 * direct IM payload data. "Payload data" is always an IM and
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
422 * maybe some embedded images or files or something. The actual
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
423 * ODC frame is read using peer_connection_recv_cb(). We temporarily
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
424 * switch to this watcher callback ONLY to read the payload, and we
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
425 * switch back once we're done.
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
426 */
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
427 static void
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
428 peer_odc_recv_cb(gpointer data, gint source, PurpleInputCondition cond)
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
429 {
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
430 PeerConnection *conn;
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
431 OdcFrame *frame;
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
432 ByteStream *bs;
23079
b887906eed60 More s/ssize_t/gssize/
Daniel Atallah <datallah@pidgin.im>
parents: 22862
diff changeset
433 gssize read;
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
434
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
435 conn = data;
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
436 frame = conn->frame;
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
437 bs = &frame->payload;
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 /* Read data into the temporary buffer until it is complete */
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
440 read = recv(conn->fd,
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
441 &bs->data[bs->offset],
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
442 bs->len - bs->offset,
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
443 0);
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
444
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
445 /* Check if the remote user closed the connection */
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
446 if (read == 0)
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
447 {
14464
b7bca43f75b3 [gaim-migrate @ 17110]
Mark Doliner <markdoliner@pidgin.im>
parents: 14254
diff changeset
448 peer_connection_destroy(conn, OSCAR_DISCONNECT_REMOTE_CLOSED, NULL);
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
449 return;
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
450 }
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
451
17539
0fd875385856 Only check for EAGAIN if send returns -1, not when it returns 0
Mark Doliner <markdoliner@pidgin.im>
parents: 16539
diff changeset
452 if (read < 0)
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
453 {
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
454 if ((errno == EAGAIN) || (errno == EWOULDBLOCK))
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
455 /* No worries */
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
456 return;
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
457
14464
b7bca43f75b3 [gaim-migrate @ 17110]
Mark Doliner <markdoliner@pidgin.im>
parents: 14254
diff changeset
458 peer_connection_destroy(conn,
21389
e1dd8142bb87 replace most calls to strerror with calls to g_strerror. strerror will return
Nathan Walp <nwalp@pidgin.im>
parents: 20192
diff changeset
459 OSCAR_DISCONNECT_LOST_CONNECTION, g_strerror(errno));
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
460 return;
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
461 }
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
462
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
463 bs->offset += read;
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
464 if (bs->offset < bs->len)
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
465 /* Waiting for more data to arrive */
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
466 return;
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
467
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
468 /* We have a complete ODC/OFT frame! Handle it and continue reading */
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
469 byte_stream_rewind(bs);
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
470 peer_odc_handle_payload(conn, (const char *)bs->data,
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
471 bs->len, frame->encoding, frame->flags & 0x0001);
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
472 g_free(bs->data);
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
473 bs->data = NULL;
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
474 g_free(frame);
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
475 conn->frame = NULL;
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
476
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
477 purple_input_remove(conn->watcher_incoming);
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
478 conn->watcher_incoming = purple_input_add(conn->fd,
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
479 PURPLE_INPUT_READ, peer_connection_recv_cb, conn);
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
480 }
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
481
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
482 /**
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
483 * Handle an incoming OdcFrame. If there is a payload associated
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
484 * with this frame, then we remove the old watcher and add the
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
485 * ODC watcher to read in the payload.
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
486 */
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
487 void
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
488 peer_odc_recv_frame(PeerConnection *conn, ByteStream *bs)
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
489 {
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
490 PurpleConnection *gc;
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
491 OdcFrame *frame;
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 gc = conn->od->gc;
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
494
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
495 frame = g_new0(OdcFrame, 1);
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
496 frame->type = byte_stream_get16(bs);
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
497 frame->subtype = byte_stream_get16(bs);
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
498 byte_stream_advance(bs, 2);
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
499 byte_stream_getrawbuf(bs, frame->cookie, 8);
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
500 byte_stream_advance(bs, 8);
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
501 frame->payload.len = byte_stream_get32(bs);
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
502 frame->encoding = byte_stream_get16(bs);
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
503 byte_stream_advance(bs, 4);
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
504 frame->flags = byte_stream_get16(bs);
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
505 byte_stream_advance(bs, 4);
25889
26d9ca30335c Change "screen name" to "username" or "buddy name" in a whole bunch of
Mark Doliner <markdoliner@pidgin.im>
parents: 25426
diff changeset
506 byte_stream_getrawbuf(bs, frame->bn, 32);
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
507
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
508 purple_debug_info("oscar", "Incoming ODC frame from %s with "
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
509 "type=0x%04x, flags=0x%04x, payload length=%u\n",
25889
26d9ca30335c Change "screen name" to "username" or "buddy name" in a whole bunch of
Mark Doliner <markdoliner@pidgin.im>
parents: 25426
diff changeset
510 frame->bn, frame->type, frame->flags, frame->payload.len);
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
511
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
512 if (!conn->ready)
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
513 {
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
514 /*
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
515 * We need to verify the cookie so that we know we are
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
516 * connected to our friend and not a malicious middle man.
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
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
519 PurpleAccount *account;
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
520 PurpleConversation *conv;
13593
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 if (conn->flags & PEER_CONNECTION_FLAG_IS_INCOMING)
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
523 {
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
524 if (memcmp(conn->cookie, frame->cookie, 8))
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
525 {
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 * Oh no! The user that connected to us did not send
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
528 * the correct cookie! They are not our friend. Go try
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
529 * to accept another connection?
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
530 */
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
531 purple_debug_info("oscar", "Received an incorrect cookie. "
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
532 "Closing connection.\n");
14464
b7bca43f75b3 [gaim-migrate @ 17110]
Mark Doliner <markdoliner@pidgin.im>
parents: 14254
diff changeset
533 peer_connection_destroy(conn,
b7bca43f75b3 [gaim-migrate @ 17110]
Mark Doliner <markdoliner@pidgin.im>
parents: 14254
diff changeset
534 OSCAR_DISCONNECT_INVALID_DATA, NULL);
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
535 g_free(frame);
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
536 return;
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
537 }
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
538
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
539 /*
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
540 * Ok, we know they are legit. Now be courteous and
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
541 * send them our cookie. Note: This doesn't seem
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
542 * to be necessary, but it also doesn't seem to hurt.
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
543 */
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
544 peer_odc_send_cookie(conn);
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
545 }
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
546
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
547 conn->ready = TRUE;
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
548
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
549 /*
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
550 * If they connected to us then close the listener socket
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
551 * and send them our cookie.
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
552 */
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
553 if (conn->listenerfd != -1)
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
554 {
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
555 close(conn->listenerfd);
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
556 conn->listenerfd = -1;
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
557 }
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 /* Tell the local user that we are connected */
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
560 account = purple_connection_get_account(gc);
25889
26d9ca30335c Change "screen name" to "username" or "buddy name" in a whole bunch of
Mark Doliner <markdoliner@pidgin.im>
parents: 25426
diff changeset
561 conv = purple_conversation_new(PURPLE_CONV_TYPE_IM, account, conn->bn);
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
562 purple_conversation_write(conv, NULL, _("Direct IM established"),
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
563 PURPLE_MESSAGE_SYSTEM, time(NULL));
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
564 }
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
565
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
566 if ((frame->type != 0x0001) && (frame->subtype != 0x0006))
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
567 {
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
568 purple_debug_info("oscar", "Unknown ODC frame type 0x%04hx, "
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
569 "subtype 0x%04hx.\n", frame->type, frame->subtype);
25296
0450df777754 Fix a leak "KuSh" discovered using "cppcheck". Fixes #7857.
Daniel Atallah <datallah@pidgin.im>
parents: 23079
diff changeset
570 g_free(frame);
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
571 return;
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
572 }
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
573
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
574 if (frame->flags & 0x0008)
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
575 {
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
576 /* I had to leave this. It's just too funny. It reminds me of my sister. */
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
577 purple_debug_info("oscar", "ohmigod! %s has started typing "
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
578 "(DirectIM). He's going to send you a message! "
25889
26d9ca30335c Change "screen name" to "username" or "buddy name" in a whole bunch of
Mark Doliner <markdoliner@pidgin.im>
parents: 25426
diff changeset
579 "*squeal*\n", conn->bn);
26d9ca30335c Change "screen name" to "username" or "buddy name" in a whole bunch of
Mark Doliner <markdoliner@pidgin.im>
parents: 25426
diff changeset
580 serv_got_typing(gc, conn->bn, 0, PURPLE_TYPING);
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 else if (frame->flags & 0x0004)
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
583 {
25889
26d9ca30335c Change "screen name" to "username" or "buddy name" in a whole bunch of
Mark Doliner <markdoliner@pidgin.im>
parents: 25426
diff changeset
584 serv_got_typing(gc, conn->bn, 0, PURPLE_TYPED);
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 else
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
587 {
25889
26d9ca30335c Change "screen name" to "username" or "buddy name" in a whole bunch of
Mark Doliner <markdoliner@pidgin.im>
parents: 25426
diff changeset
588 serv_got_typing_stopped(gc, conn->bn);
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
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
591 if (frame->payload.len > 0)
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
592 {
20192
162883eb3251 applied changes from 2ab75e32c52e94c674d0b5a396d224da7e9d509e
Luke Schierer <lschiere@pidgin.im>
parents: 19859
diff changeset
593 if (frame->payload.len > DIRECTIM_MAX_FILESIZE)
162883eb3251 applied changes from 2ab75e32c52e94c674d0b5a396d224da7e9d509e
Luke Schierer <lschiere@pidgin.im>
parents: 19859
diff changeset
594 {
162883eb3251 applied changes from 2ab75e32c52e94c674d0b5a396d224da7e9d509e
Luke Schierer <lschiere@pidgin.im>
parents: 19859
diff changeset
595 gchar *tmp, *size1, *size2;
162883eb3251 applied changes from 2ab75e32c52e94c674d0b5a396d224da7e9d509e
Luke Schierer <lschiere@pidgin.im>
parents: 19859
diff changeset
596 PurpleAccount *account;
162883eb3251 applied changes from 2ab75e32c52e94c674d0b5a396d224da7e9d509e
Luke Schierer <lschiere@pidgin.im>
parents: 19859
diff changeset
597 PurpleConversation *conv;
162883eb3251 applied changes from 2ab75e32c52e94c674d0b5a396d224da7e9d509e
Luke Schierer <lschiere@pidgin.im>
parents: 19859
diff changeset
598
162883eb3251 applied changes from 2ab75e32c52e94c674d0b5a396d224da7e9d509e
Luke Schierer <lschiere@pidgin.im>
parents: 19859
diff changeset
599 size1 = purple_str_size_to_units(frame->payload.len);
162883eb3251 applied changes from 2ab75e32c52e94c674d0b5a396d224da7e9d509e
Luke Schierer <lschiere@pidgin.im>
parents: 19859
diff changeset
600 size2 = purple_str_size_to_units(DIRECTIM_MAX_FILESIZE);
25889
26d9ca30335c Change "screen name" to "username" or "buddy name" in a whole bunch of
Mark Doliner <markdoliner@pidgin.im>
parents: 25426
diff changeset
601 tmp = g_strdup_printf(_("%s tried to send you a %s file, but we only allow files up to %s over Direct IM. Try using file transfer instead.\n"), conn->bn, size1, size2);
20192
162883eb3251 applied changes from 2ab75e32c52e94c674d0b5a396d224da7e9d509e
Luke Schierer <lschiere@pidgin.im>
parents: 19859
diff changeset
602 g_free(size1);
162883eb3251 applied changes from 2ab75e32c52e94c674d0b5a396d224da7e9d509e
Luke Schierer <lschiere@pidgin.im>
parents: 19859
diff changeset
603 g_free(size2);
162883eb3251 applied changes from 2ab75e32c52e94c674d0b5a396d224da7e9d509e
Luke Schierer <lschiere@pidgin.im>
parents: 19859
diff changeset
604
162883eb3251 applied changes from 2ab75e32c52e94c674d0b5a396d224da7e9d509e
Luke Schierer <lschiere@pidgin.im>
parents: 19859
diff changeset
605 account = purple_connection_get_account(conn->od->gc);
25889
26d9ca30335c Change "screen name" to "username" or "buddy name" in a whole bunch of
Mark Doliner <markdoliner@pidgin.im>
parents: 25426
diff changeset
606 conv = purple_conversation_new(PURPLE_CONV_TYPE_IM, account, conn->bn);
20192
162883eb3251 applied changes from 2ab75e32c52e94c674d0b5a396d224da7e9d509e
Luke Schierer <lschiere@pidgin.im>
parents: 19859
diff changeset
607 purple_conversation_write(conv, NULL, tmp, PURPLE_MESSAGE_SYSTEM, time(NULL));
162883eb3251 applied changes from 2ab75e32c52e94c674d0b5a396d224da7e9d509e
Luke Schierer <lschiere@pidgin.im>
parents: 19859
diff changeset
608 g_free(tmp);
162883eb3251 applied changes from 2ab75e32c52e94c674d0b5a396d224da7e9d509e
Luke Schierer <lschiere@pidgin.im>
parents: 19859
diff changeset
609
162883eb3251 applied changes from 2ab75e32c52e94c674d0b5a396d224da7e9d509e
Luke Schierer <lschiere@pidgin.im>
parents: 19859
diff changeset
610 peer_connection_destroy(conn, OSCAR_DISCONNECT_LOCAL_CLOSED, NULL);
25296
0450df777754 Fix a leak "KuSh" discovered using "cppcheck". Fixes #7857.
Daniel Atallah <datallah@pidgin.im>
parents: 23079
diff changeset
611 g_free(frame);
20192
162883eb3251 applied changes from 2ab75e32c52e94c674d0b5a396d224da7e9d509e
Luke Schierer <lschiere@pidgin.im>
parents: 19859
diff changeset
612 return;
162883eb3251 applied changes from 2ab75e32c52e94c674d0b5a396d224da7e9d509e
Luke Schierer <lschiere@pidgin.im>
parents: 19859
diff changeset
613 }
162883eb3251 applied changes from 2ab75e32c52e94c674d0b5a396d224da7e9d509e
Luke Schierer <lschiere@pidgin.im>
parents: 19859
diff changeset
614
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
615 /* We have payload data! Switch to the ODC watcher to read it. */
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
616 frame->payload.data = g_new(guint8, frame->payload.len);
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
617 frame->payload.offset = 0;
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
618 conn->frame = frame;
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
619 purple_input_remove(conn->watcher_incoming);
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
620 conn->watcher_incoming = purple_input_add(conn->fd,
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
621 PURPLE_INPUT_READ, peer_odc_recv_cb, conn);
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
622 return;
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 g_free(frame);
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
626 }

mercurial