libpurple/protocols/oscar/odc.c

Mon, 18 Feb 2013 20:44:20 -0800

author
Mark Doliner <mark@kingant.net>
date
Mon, 18 Feb 2013 20:44:20 -0800
changeset 33768
20d5c960d48f
parent 33661
2ebcb105e606
child 34622
753f46dd000f
permissions
-rw-r--r--

Use an escaped basename as the filename for incoming IM images

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

mercurial