libpurple/protocols/oscar/odc.c

Wed, 03 Jul 2013 22:18:55 +0530

author
Ankit Vani <a@nevitus.org>
date
Wed, 03 Jul 2013 22:18:55 +0530
branch
soc.2013.gobjectification
changeset 34699
09b2c9219b57
parent 34670
9bd5bd903dc7
child 35265
77664079d0f0
permissions
-rw-r--r--

Renamed PurpleBlistNode to PurpleBListNode

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

mercurial