libpurple/protocols/oscar/odc.c

Mon, 12 May 2008 02:27:08 +0000

author
Daniel Atallah <datallah@pidgin.im>
date
Mon, 12 May 2008 02:27:08 +0000
changeset 23079
b887906eed60
parent 22862
24f8ae1208ca
child 25296
0450df777754
permissions
-rw-r--r--

More s/ssize_t/gssize/

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

mercurial