annotate src/protocols/oscar/im.c @ 4230:9f729d6d88a6

[gaim-migrate @ 4475] This is 128KB of raw kickassyness. AKA ICQ SSI. I've rewritten all the important parts of ssi.c. Things should be better. One thing I like a lot is that gaim will store the alias you assign to buddies in your server list for both AIM and ICQ. WinICQ supports this, but WinAIM doesn't. However, it doesn't seem to interfere with WinAIM, and Gaim can still use it. I dunno, I just think it's neat. Anyway, go nuts. Let me know if something doesn't work, because that's bad. committer: Tailor Script <tailor@pidgin.im>
author Mark Doliner <mark@kingant.net>
date Tue, 07 Jan 2003 21:19:05 +0000
parents b66f960bfe60
children 858979ab3867
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
2086
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
1 /*
3595
1e60a05c7482 [gaim-migrate @ 3697]
Mark Doliner <mark@kingant.net>
parents: 3255
diff changeset
2 * Family 0x0004 - Routines for sending/receiving Instant Messages.
2086
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
3 *
2167
edf8c5a70e5b [gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2122
diff changeset
4 * Note the term ICBM (Inter-Client Basic Message) which blankets
edf8c5a70e5b [gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2122
diff changeset
5 * all types of genericly routed through-server messages. Within
edf8c5a70e5b [gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2122
diff changeset
6 * the ICBM types (family 4), a channel is defined. Each channel
edf8c5a70e5b [gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2122
diff changeset
7 * represents a different type of message. Channel 1 is used for
edf8c5a70e5b [gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2122
diff changeset
8 * what would commonly be called an "instant message". Channel 2
edf8c5a70e5b [gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2122
diff changeset
9 * is used for negotiating "rendezvous". These transactions end in
edf8c5a70e5b [gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2122
diff changeset
10 * something more complex happening, such as a chat invitation, or
3952
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
11 * a file transfer. Channel 3 is used for chat messages (not in
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
12 * the same family as these channels). Channel 4 is used for
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
13 * various ICQ messages. Examples are normal messages, URLs, and
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
14 * old-style authorization.
2167
edf8c5a70e5b [gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2122
diff changeset
15 *
edf8c5a70e5b [gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2122
diff changeset
16 * In addition to the channel, every ICBM contains a cookie. For
edf8c5a70e5b [gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2122
diff changeset
17 * standard IMs, these are only used for error messages. However,
edf8c5a70e5b [gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2122
diff changeset
18 * the more complex rendezvous messages make suitably more complex
edf8c5a70e5b [gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2122
diff changeset
19 * use of this field.
edf8c5a70e5b [gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2122
diff changeset
20 *
2086
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
21 */
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
22
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
23 #define FAIM_INTERNAL
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
24 #include <aim.h>
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
25
3630
9682c0e022c6 [gaim-migrate @ 3753]
Rob Flynn <gaim@robflynn.com>
parents: 3595
diff changeset
26 #ifdef _WIN32
9682c0e022c6 [gaim-migrate @ 3753]
Rob Flynn <gaim@robflynn.com>
parents: 3595
diff changeset
27 #include "win32dep.h"
9682c0e022c6 [gaim-migrate @ 3753]
Rob Flynn <gaim@robflynn.com>
parents: 3595
diff changeset
28 #endif
9682c0e022c6 [gaim-migrate @ 3753]
Rob Flynn <gaim@robflynn.com>
parents: 3595
diff changeset
29
2086
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
30 /*
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
31 * Takes a msghdr (and a length) and returns a client type
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
32 * code. Note that this is *only a guess* and has a low likelihood
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
33 * of actually being accurate.
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
34 *
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
35 * Its based on experimental data, with the help of Eric Warmenhoven
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
36 * who seems to have collected a wide variety of different AIM clients.
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
37 *
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
38 *
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
39 * Heres the current collection:
4102
c5ce82228a2f [gaim-migrate @ 4317]
Mark Doliner <mark@kingant.net>
parents: 4076
diff changeset
40 * 0501 0003 0101 0101 01 AOL Mobile Communicator, WinAIM 1.0.414
c5ce82228a2f [gaim-migrate @ 4317]
Mark Doliner <mark@kingant.net>
parents: 4076
diff changeset
41 * 0501 0003 0101 0201 01 WinAIM 2.0.847, 2.1.1187, 3.0.1464,
c5ce82228a2f [gaim-migrate @ 4317]
Mark Doliner <mark@kingant.net>
parents: 4076
diff changeset
42 * 4.3.2229, 4.4.2286
c5ce82228a2f [gaim-migrate @ 4317]
Mark Doliner <mark@kingant.net>
parents: 4076
diff changeset
43 * 0501 0004 0101 0102 0101 WinAIM 4.1.2010, libfaim (right here)
c5ce82228a2f [gaim-migrate @ 4317]
Mark Doliner <mark@kingant.net>
parents: 4076
diff changeset
44 * 0501 0003 0101 02 WinAIM 5
c5ce82228a2f [gaim-migrate @ 4317]
Mark Doliner <mark@kingant.net>
parents: 4076
diff changeset
45 * 0501 0001 01 iChat x.x
c5ce82228a2f [gaim-migrate @ 4317]
Mark Doliner <mark@kingant.net>
parents: 4076
diff changeset
46 * 0501 0001 0101 01 AOL v6.0, CompuServe 2000 v6.0, any
c5ce82228a2f [gaim-migrate @ 4317]
Mark Doliner <mark@kingant.net>
parents: 4076
diff changeset
47 * TOC client
c5ce82228a2f [gaim-migrate @ 4317]
Mark Doliner <mark@kingant.net>
parents: 4076
diff changeset
48 * 0501 0002 0106 WinICQ 5.45.1.3777.85
2246
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
49 *
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
50 * Note that in this function, only the feature bytes are tested, since
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
51 * the rest will always be the same.
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
52 *
2086
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
53 */
2246
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
54 faim_export fu16_t aim_fingerprintclient(fu8_t *msghdr, int len)
2086
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
55 {
2167
edf8c5a70e5b [gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2122
diff changeset
56 static const struct {
2246
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
57 fu16_t clientid;
2167
edf8c5a70e5b [gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2122
diff changeset
58 int len;
2246
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
59 fu8_t data[10];
2167
edf8c5a70e5b [gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2122
diff changeset
60 } fingerprints[] = {
edf8c5a70e5b [gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2122
diff changeset
61 /* AOL Mobile Communicator, WinAIM 1.0.414 */
edf8c5a70e5b [gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2122
diff changeset
62 { AIM_CLIENTTYPE_MC,
2246
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
63 3, {0x01, 0x01, 0x01}},
2086
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
64
2167
edf8c5a70e5b [gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2122
diff changeset
65 /* WinAIM 2.0.847, 2.1.1187, 3.0.1464, 4.3.2229, 4.4.2286 */
edf8c5a70e5b [gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2122
diff changeset
66 { AIM_CLIENTTYPE_WINAIM,
2246
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
67 3, {0x01, 0x01, 0x02}},
2086
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
68
2167
edf8c5a70e5b [gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2122
diff changeset
69 /* WinAIM 4.1.2010, libfaim */
edf8c5a70e5b [gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2122
diff changeset
70 { AIM_CLIENTTYPE_WINAIM41,
2246
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
71 4, {0x01, 0x01, 0x01, 0x02}},
2086
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
72
2167
edf8c5a70e5b [gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2122
diff changeset
73 /* AOL v6.0, CompuServe 2000 v6.0, any TOC client */
edf8c5a70e5b [gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2122
diff changeset
74 { AIM_CLIENTTYPE_AOL_TOC,
2246
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
75 1, {0x01}},
2086
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
76
2167
edf8c5a70e5b [gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2122
diff changeset
77 { 0, 0}
edf8c5a70e5b [gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2122
diff changeset
78 };
edf8c5a70e5b [gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2122
diff changeset
79 int i;
2086
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
80
2167
edf8c5a70e5b [gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2122
diff changeset
81 if (!msghdr || (len <= 0))
edf8c5a70e5b [gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2122
diff changeset
82 return AIM_CLIENTTYPE_UNKNOWN;
2086
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
83
2167
edf8c5a70e5b [gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2122
diff changeset
84 for (i = 0; fingerprints[i].len; i++) {
edf8c5a70e5b [gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2122
diff changeset
85 if (fingerprints[i].len != len)
edf8c5a70e5b [gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2122
diff changeset
86 continue;
edf8c5a70e5b [gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2122
diff changeset
87 if (memcmp(fingerprints[i].data, msghdr, fingerprints[i].len) == 0)
edf8c5a70e5b [gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2122
diff changeset
88 return fingerprints[i].clientid;
edf8c5a70e5b [gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2122
diff changeset
89 }
2086
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
90
2167
edf8c5a70e5b [gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2122
diff changeset
91 return AIM_CLIENTTYPE_UNKNOWN;
2086
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
92 }
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
93
3952
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
94 /*
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
95 * Subtype 0x0002
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
96 *
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
97 * I definitly recommend sending this. If you don't, you'll be stuck
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
98 * with the rather unreasonable defaults. You don't want those. Send this.
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
99 *
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
100 */
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
101 faim_export int aim_seticbmparam(aim_session_t *sess, struct aim_icbmparameters *params)
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
102 {
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
103 aim_conn_t *conn;
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
104 aim_frame_t *fr;
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
105 aim_snacid_t snacid;
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
106
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
107 if (!sess || !(conn = aim_conn_findbygroup(sess, 0x0004)))
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
108 return -EINVAL;
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
109
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
110 if (!params)
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
111 return -EINVAL;
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
112
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
113 if (!(fr = aim_tx_new(sess, conn, AIM_FRAMETYPE_FLAP, 0x02, 10+16)))
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
114 return -ENOMEM;
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
115
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
116 snacid = aim_cachesnac(sess, 0x0004, 0x0002, 0x0000, NULL, 0);
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
117 aim_putsnac(&fr->data, 0x0004, 0x0002, 0x0000, snacid);
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
118
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
119 /* This is read-only (see Parameter Reply). Must be set to zero here. */
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
120 aimbs_put16(&fr->data, 0x0000);
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
121
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
122 /* These are all read-write */
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
123 aimbs_put32(&fr->data, params->flags);
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
124 aimbs_put16(&fr->data, params->maxmsglen);
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
125 aimbs_put16(&fr->data, params->maxsenderwarn);
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
126 aimbs_put16(&fr->data, params->maxrecverwarn);
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
127 aimbs_put32(&fr->data, params->minmsginterval);
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
128
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
129 aim_tx_enqueue(sess, fr);
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
130
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
131 return 0;
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
132 }
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
133
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
134 /* Subtype 0x0004 - Request ICBM parameter information. */
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
135 faim_export int aim_reqicbmparams(aim_session_t *sess)
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
136 {
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
137 aim_conn_t *conn;
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
138
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
139 if (!sess || !(conn = aim_conn_findbygroup(sess, 0x0004)))
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
140 return -EINVAL;
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
141
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
142 return aim_genericreq_n(sess, conn, 0x0004, 0x0004);
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
143 }
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
144
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
145 /* Subtype 0x0005 */
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
146 static int paraminfo(aim_session_t *sess, aim_module_t *mod, aim_frame_t *rx, aim_modsnac_t *snac, aim_bstream_t *bs)
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
147 {
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
148 struct aim_icbmparameters params;
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
149 aim_rxcallback_t userfunc;
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
150
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
151 params.maxchan = aimbs_get16(bs);
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
152 params.flags = aimbs_get32(bs);
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
153 params.maxmsglen = aimbs_get16(bs);
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
154 params.maxsenderwarn = aimbs_get16(bs);
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
155 params.maxrecverwarn = aimbs_get16(bs);
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
156 params.minmsginterval = aimbs_get32(bs);
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
157
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
158 if ((userfunc = aim_callhandler(sess, rx->conn, snac->family, snac->subtype)))
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
159 return userfunc(sess, rx, &params);
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
160
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
161 return 0;
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
162 }
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
163
2086
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
164 /* This should be endian-safe now... but who knows... */
2626
93f9bbd62630 [gaim-migrate @ 2639]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2507
diff changeset
165 faim_export fu16_t aim_iconsum(const fu8_t *buf, int buflen)
2086
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
166 {
2246
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
167 fu32_t sum;
2167
edf8c5a70e5b [gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2122
diff changeset
168 int i;
2086
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
169
2639
4d6a767133e1 [gaim-migrate @ 2652]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2626
diff changeset
170 for (i = 0, sum = 0; i + 1 < buflen; i += 2)
2167
edf8c5a70e5b [gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2122
diff changeset
171 sum += (buf[i+1] << 8) + buf[i];
2639
4d6a767133e1 [gaim-migrate @ 2652]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2626
diff changeset
172 if (i < buflen)
4d6a767133e1 [gaim-migrate @ 2652]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2626
diff changeset
173 sum += buf[i];
2086
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
174
2167
edf8c5a70e5b [gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2122
diff changeset
175 sum = ((sum & 0xffff0000) >> 16) + (sum & 0x0000ffff);
2086
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
176
2626
93f9bbd62630 [gaim-migrate @ 2639]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2507
diff changeset
177 return (fu16_t)sum;
2086
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
178 }
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
179
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
180 /*
3952
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
181 * Subtype 0x0006 - Send an ICBM (instant message).
2086
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
182 *
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
183 *
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
184 * Possible flags:
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
185 * AIM_IMFLAGS_AWAY -- Marks the message as an autoresponse
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
186 * AIM_IMFLAGS_ACK -- Requests that the server send an ack
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
187 * when the message is received (of type 0x0004/0x000c)
2703
441b84ab7f4e [gaim-migrate @ 2716]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2673
diff changeset
188 * AIM_IMFLAGS_OFFLINE--If destination is offline, store it until they are
441b84ab7f4e [gaim-migrate @ 2716]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2673
diff changeset
189 * online (probably ICQ only).
2086
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
190 * AIM_IMFLAGS_UNICODE--Instead of ASCII7, the passed message is
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
191 * made up of UNICODE duples. If you set
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
192 * this, you'd better be damn sure you know
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
193 * what you're doing.
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
194 * AIM_IMFLAGS_ISO_8859_1 -- The message contains the ASCII8 subset
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
195 * known as ISO-8859-1.
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
196 *
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
197 * Generally, you should use the lowest encoding possible to send
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
198 * your message. If you only use basic punctuation and the generic
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
199 * Latin alphabet, use ASCII7 (no flags). If you happen to use non-ASCII7
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
200 * characters, but they are all clearly defined in ISO-8859-1, then
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
201 * use that. Keep in mind that not all characters in the PC ASCII8
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
202 * character set are defined in the ISO standard. For those cases (most
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
203 * notably when the (r) symbol is used), you must use the full UNICODE
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
204 * encoding for your message. In UNICODE mode, _all_ characters must
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
205 * occupy 16bits, including ones that are not special. (Remember that
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
206 * the first 128 UNICODE symbols are equivelent to ASCII7, however they
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
207 * must be prefixed with a zero high order byte.)
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
208 *
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
209 * I strongly discourage the use of UNICODE mode, mainly because none
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
210 * of the clients I use can parse those messages (and besides that,
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
211 * wchars are difficult and non-portable to handle in most UNIX environments).
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
212 * If you really need to include special characters, use the HTML UNICODE
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
213 * entities. These are of the form &#2026; where 2026 is the hex
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
214 * representation of the UNICODE index (in this case, UNICODE
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
215 * "Horizontal Ellipsis", or 133 in in ASCII8).
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
216 *
2246
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
217 * Implementation note: Since this is one of the most-used functions
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
218 * in all of libfaim, it is written with performance in mind. As such,
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
219 * it is not as clear as it could be in respect to how this message is
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
220 * supposed to be layed out. Most obviously, tlvlists should be used
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
221 * instead of writing out the bytes manually.
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
222 *
2270
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
223 * XXX more precise verification that we never send SNACs larger than 8192
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
224 * XXX check SNAC size for multipart
2246
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
225 *
2086
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
226 */
2673
81d658e6ac1e [gaim-migrate @ 2686]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2672
diff changeset
227 faim_export int aim_send_im_ext(aim_session_t *sess, struct aim_sendimext_args *args)
2086
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
228 {
2246
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
229 static const fu8_t deffeatures[] = {
2315
7ec21662ffc2 [gaim-migrate @ 2325]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2270
diff changeset
230 0x01, 0x01, 0x01, 0x02
2246
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
231 };
2673
81d658e6ac1e [gaim-migrate @ 2686]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2672
diff changeset
232 aim_conn_t *conn;
2246
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
233 int i, msgtlvlen;
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
234 aim_frame_t *fr;
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
235 aim_snacid_t snacid;
2086
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
236
2673
81d658e6ac1e [gaim-migrate @ 2686]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2672
diff changeset
237 if (!sess || !(conn = aim_conn_findbygroup(sess, 0x0004)))
81d658e6ac1e [gaim-migrate @ 2686]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2672
diff changeset
238 return -EINVAL;
81d658e6ac1e [gaim-migrate @ 2686]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2672
diff changeset
239
81d658e6ac1e [gaim-migrate @ 2686]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2672
diff changeset
240 if (!args)
2246
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
241 return -EINVAL;
2086
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
242
2270
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
243 if (args->flags & AIM_IMFLAGS_MULTIPART) {
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
244 if (args->mpmsg->numparts <= 0)
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
245 return -EINVAL;
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
246 } else {
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
247 if (!args->msg || (args->msglen <= 0))
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
248 return -EINVAL;
2086
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
249
2270
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
250 if (args->msglen >= MAXMSGLEN)
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
251 return -E2BIG;
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
252 }
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
253
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
254 /* Painfully calculate the size of the message TLV */
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
255 msgtlvlen = 1 + 1; /* 0501 */
2086
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
256
2246
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
257 if (args->flags & AIM_IMFLAGS_CUSTOMFEATURES)
2270
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
258 msgtlvlen += 2 + args->featureslen;
2246
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
259 else
2270
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
260 msgtlvlen += 2 + sizeof(deffeatures);
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
261
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
262 if (args->flags & AIM_IMFLAGS_MULTIPART) {
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
263 aim_mpmsg_section_t *sec;
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
264
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
265 for (sec = args->mpmsg->parts; sec; sec = sec->next) {
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
266 msgtlvlen += 2 /* 0101 */ + 2 /* block len */;
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
267 msgtlvlen += 4 /* charset */ + sec->datalen;
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
268 }
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
269
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
270 } else {
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
271 msgtlvlen += 2 /* 0101 */ + 2 /* block len */;
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
272 msgtlvlen += 4 /* charset */ + args->msglen;
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
273 }
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
274
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
275 if (!(fr = aim_tx_new(sess, conn, AIM_FRAMETYPE_FLAP, 0x02, msgtlvlen+128)))
2122
c99c781e5931 [gaim-migrate @ 2132]
Adam Fritzler <mid@auk.cx>
parents: 2086
diff changeset
276 return -ENOMEM;
2086
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
277
2246
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
278 /* XXX should be optional */
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
279 snacid = aim_cachesnac(sess, 0x0004, 0x0006, 0x0000, args->destsn, strlen(args->destsn)+1);
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
280 aim_putsnac(&fr->data, 0x0004, 0x0006, 0x0000, snacid);
2086
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
281
2122
c99c781e5931 [gaim-migrate @ 2132]
Adam Fritzler <mid@auk.cx>
parents: 2086
diff changeset
282 /*
c99c781e5931 [gaim-migrate @ 2132]
Adam Fritzler <mid@auk.cx>
parents: 2086
diff changeset
283 * Generate a random message cookie
c99c781e5931 [gaim-migrate @ 2132]
Adam Fritzler <mid@auk.cx>
parents: 2086
diff changeset
284 *
c99c781e5931 [gaim-migrate @ 2132]
Adam Fritzler <mid@auk.cx>
parents: 2086
diff changeset
285 * We could cache these like we do SNAC IDs. (In fact, it
c99c781e5931 [gaim-migrate @ 2132]
Adam Fritzler <mid@auk.cx>
parents: 2086
diff changeset
286 * might be a good idea.) In the message error functions,
c99c781e5931 [gaim-migrate @ 2132]
Adam Fritzler <mid@auk.cx>
parents: 2086
diff changeset
287 * the 8byte message cookie is returned as well as the
c99c781e5931 [gaim-migrate @ 2132]
Adam Fritzler <mid@auk.cx>
parents: 2086
diff changeset
288 * SNAC ID.
c99c781e5931 [gaim-migrate @ 2132]
Adam Fritzler <mid@auk.cx>
parents: 2086
diff changeset
289 *
c99c781e5931 [gaim-migrate @ 2132]
Adam Fritzler <mid@auk.cx>
parents: 2086
diff changeset
290 */
2246
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
291 for (i = 0; i < 8; i++)
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
292 aimbs_put8(&fr->data, (fu8_t) rand());
2086
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
293
2122
c99c781e5931 [gaim-migrate @ 2132]
Adam Fritzler <mid@auk.cx>
parents: 2086
diff changeset
294 /*
c99c781e5931 [gaim-migrate @ 2132]
Adam Fritzler <mid@auk.cx>
parents: 2086
diff changeset
295 * Channel ID
c99c781e5931 [gaim-migrate @ 2132]
Adam Fritzler <mid@auk.cx>
parents: 2086
diff changeset
296 */
2246
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
297 aimbs_put16(&fr->data, 0x0001);
2086
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
298
2122
c99c781e5931 [gaim-migrate @ 2132]
Adam Fritzler <mid@auk.cx>
parents: 2086
diff changeset
299 /*
c99c781e5931 [gaim-migrate @ 2132]
Adam Fritzler <mid@auk.cx>
parents: 2086
diff changeset
300 * Destination SN (prepended with byte length)
c99c781e5931 [gaim-migrate @ 2132]
Adam Fritzler <mid@auk.cx>
parents: 2086
diff changeset
301 */
2246
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
302 aimbs_put8(&fr->data, strlen(args->destsn));
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
303 aimbs_putraw(&fr->data, args->destsn, strlen(args->destsn));
2086
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
304
2122
c99c781e5931 [gaim-migrate @ 2132]
Adam Fritzler <mid@auk.cx>
parents: 2086
diff changeset
305 /*
2751
b715593f0d21 [gaim-migrate @ 2764]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2717
diff changeset
306 * Message TLV (type 2).
2122
c99c781e5931 [gaim-migrate @ 2132]
Adam Fritzler <mid@auk.cx>
parents: 2086
diff changeset
307 */
2246
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
308 aimbs_put16(&fr->data, 0x0002);
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
309 aimbs_put16(&fr->data, msgtlvlen);
2086
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
310
2122
c99c781e5931 [gaim-migrate @ 2132]
Adam Fritzler <mid@auk.cx>
parents: 2086
diff changeset
311 /*
2246
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
312 * Features
2122
c99c781e5931 [gaim-migrate @ 2132]
Adam Fritzler <mid@auk.cx>
parents: 2086
diff changeset
313 *
c99c781e5931 [gaim-migrate @ 2132]
Adam Fritzler <mid@auk.cx>
parents: 2086
diff changeset
314 */
2246
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
315 aimbs_put8(&fr->data, 0x05);
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
316 aimbs_put8(&fr->data, 0x01);
2086
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
317
2246
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
318 if (args->flags & AIM_IMFLAGS_CUSTOMFEATURES) {
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
319 aimbs_put16(&fr->data, args->featureslen);
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
320 aimbs_putraw(&fr->data, args->features, args->featureslen);
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
321 } else {
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
322 aimbs_put16(&fr->data, sizeof(deffeatures));
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
323 aimbs_putraw(&fr->data, deffeatures, sizeof(deffeatures));
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
324 }
2086
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
325
2270
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
326 if (args->flags & AIM_IMFLAGS_MULTIPART) {
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
327 aim_mpmsg_section_t *sec;
2086
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
328
2270
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
329 for (sec = args->mpmsg->parts; sec; sec = sec->next) {
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
330 aimbs_put16(&fr->data, 0x0101);
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
331 aimbs_put16(&fr->data, sec->datalen + 4);
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
332 aimbs_put16(&fr->data, sec->charset);
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
333 aimbs_put16(&fr->data, sec->charsubset);
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
334 aimbs_putraw(&fr->data, sec->data, sec->datalen);
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
335 }
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
336
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
337 } else {
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
338
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
339 aimbs_put16(&fr->data, 0x0101);
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
340
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
341 /*
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
342 * Message block length.
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
343 */
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
344 aimbs_put16(&fr->data, args->msglen + 0x04);
2086
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
345
2270
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
346 /*
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
347 * Character set.
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
348 */
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
349 if (args->flags & AIM_IMFLAGS_CUSTOMCHARSET) {
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
350
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
351 aimbs_put16(&fr->data, args->charset);
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
352 aimbs_put16(&fr->data, args->charsubset);
2086
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
353
2270
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
354 } else {
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
355 if (args->flags & AIM_IMFLAGS_UNICODE)
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
356 aimbs_put16(&fr->data, 0x0002);
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
357 else if (args->flags & AIM_IMFLAGS_ISO_8859_1)
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
358 aimbs_put16(&fr->data, 0x0003);
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
359 else
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
360 aimbs_put16(&fr->data, 0x0000);
2086
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
361
2270
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
362 aimbs_put16(&fr->data, 0x0000);
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
363 }
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
364
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
365 /*
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
366 * Message. Not terminated.
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
367 */
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
368 aimbs_putraw(&fr->data, args->msg, args->msglen);
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
369 }
2086
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
370
2122
c99c781e5931 [gaim-migrate @ 2132]
Adam Fritzler <mid@auk.cx>
parents: 2086
diff changeset
371 /*
c99c781e5931 [gaim-migrate @ 2132]
Adam Fritzler <mid@auk.cx>
parents: 2086
diff changeset
372 * Set the Request Acknowledge flag.
c99c781e5931 [gaim-migrate @ 2132]
Adam Fritzler <mid@auk.cx>
parents: 2086
diff changeset
373 */
c99c781e5931 [gaim-migrate @ 2132]
Adam Fritzler <mid@auk.cx>
parents: 2086
diff changeset
374 if (args->flags & AIM_IMFLAGS_ACK) {
2246
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
375 aimbs_put16(&fr->data, 0x0003);
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
376 aimbs_put16(&fr->data, 0x0000);
2122
c99c781e5931 [gaim-migrate @ 2132]
Adam Fritzler <mid@auk.cx>
parents: 2086
diff changeset
377 }
2246
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
378
2122
c99c781e5931 [gaim-migrate @ 2132]
Adam Fritzler <mid@auk.cx>
parents: 2086
diff changeset
379 /*
c99c781e5931 [gaim-migrate @ 2132]
Adam Fritzler <mid@auk.cx>
parents: 2086
diff changeset
380 * Set the Autoresponse flag.
c99c781e5931 [gaim-migrate @ 2132]
Adam Fritzler <mid@auk.cx>
parents: 2086
diff changeset
381 */
c99c781e5931 [gaim-migrate @ 2132]
Adam Fritzler <mid@auk.cx>
parents: 2086
diff changeset
382 if (args->flags & AIM_IMFLAGS_AWAY) {
2246
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
383 aimbs_put16(&fr->data, 0x0004);
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
384 aimbs_put16(&fr->data, 0x0000);
2122
c99c781e5931 [gaim-migrate @ 2132]
Adam Fritzler <mid@auk.cx>
parents: 2086
diff changeset
385 }
c99c781e5931 [gaim-migrate @ 2132]
Adam Fritzler <mid@auk.cx>
parents: 2086
diff changeset
386
2703
441b84ab7f4e [gaim-migrate @ 2716]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2673
diff changeset
387 if (args->flags & AIM_IMFLAGS_OFFLINE) {
441b84ab7f4e [gaim-migrate @ 2716]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2673
diff changeset
388 aimbs_put16(&fr->data, 0x0006);
2246
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
389 aimbs_put16(&fr->data, 0x0000);
2122
c99c781e5931 [gaim-migrate @ 2132]
Adam Fritzler <mid@auk.cx>
parents: 2086
diff changeset
390 }
2086
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
391
2122
c99c781e5931 [gaim-migrate @ 2132]
Adam Fritzler <mid@auk.cx>
parents: 2086
diff changeset
392 /*
2246
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
393 * Set the I HAVE A REALLY PURTY ICON flag.
3595
1e60a05c7482 [gaim-migrate @ 3697]
Mark Doliner <mark@kingant.net>
parents: 3255
diff changeset
394 * XXX - This should really only be sent on initial
1e60a05c7482 [gaim-migrate @ 3697]
Mark Doliner <mark@kingant.net>
parents: 3255
diff changeset
395 * IMs and when you change your icon.
2122
c99c781e5931 [gaim-migrate @ 2132]
Adam Fritzler <mid@auk.cx>
parents: 2086
diff changeset
396 */
c99c781e5931 [gaim-migrate @ 2132]
Adam Fritzler <mid@auk.cx>
parents: 2086
diff changeset
397 if (args->flags & AIM_IMFLAGS_HASICON) {
2246
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
398 aimbs_put16(&fr->data, 0x0008);
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
399 aimbs_put16(&fr->data, 0x000c);
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
400 aimbs_put32(&fr->data, args->iconlen);
2626
93f9bbd62630 [gaim-migrate @ 2639]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2507
diff changeset
401 aimbs_put16(&fr->data, 0x0001);
93f9bbd62630 [gaim-migrate @ 2639]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2507
diff changeset
402 aimbs_put16(&fr->data, args->iconsum);
2246
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
403 aimbs_put32(&fr->data, args->iconstamp);
2122
c99c781e5931 [gaim-migrate @ 2132]
Adam Fritzler <mid@auk.cx>
parents: 2086
diff changeset
404 }
2086
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
405
2703
441b84ab7f4e [gaim-migrate @ 2716]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2673
diff changeset
406 /*
441b84ab7f4e [gaim-migrate @ 2716]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2673
diff changeset
407 * Set the Buddy Icon Requested flag.
3595
1e60a05c7482 [gaim-migrate @ 3697]
Mark Doliner <mark@kingant.net>
parents: 3255
diff changeset
408 * XXX - Everytime? Surely not...
2703
441b84ab7f4e [gaim-migrate @ 2716]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2673
diff changeset
409 */
441b84ab7f4e [gaim-migrate @ 2716]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2673
diff changeset
410 if (args->flags & AIM_IMFLAGS_BUDDYREQ) {
441b84ab7f4e [gaim-migrate @ 2716]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2673
diff changeset
411 aimbs_put16(&fr->data, 0x0009);
441b84ab7f4e [gaim-migrate @ 2716]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2673
diff changeset
412 aimbs_put16(&fr->data, 0x0000);
441b84ab7f4e [gaim-migrate @ 2716]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2673
diff changeset
413 }
441b84ab7f4e [gaim-migrate @ 2716]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2673
diff changeset
414
2246
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
415 aim_tx_enqueue(sess, fr);
2086
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
416
2751
b715593f0d21 [gaim-migrate @ 2764]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2717
diff changeset
417 if (!(sess->flags & AIM_SESS_FLAGS_DONTTIMEOUTONICBM))
b715593f0d21 [gaim-migrate @ 2764]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2717
diff changeset
418 aim_cleansnacs(sess, 60); /* clean out SNACs over 60sec old */
2086
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
419
2122
c99c781e5931 [gaim-migrate @ 2132]
Adam Fritzler <mid@auk.cx>
parents: 2086
diff changeset
420 return 0;
2086
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
421 }
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
422
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
423 /*
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
424 * Simple wrapper for aim_send_im_ext()
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
425 *
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
426 * You cannot use aim_send_im if you need the HASICON flag. You must
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
427 * use aim_send_im_ext directly for that.
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
428 *
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
429 * aim_send_im also cannot be used if you require UNICODE messages, because
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
430 * that requires an explicit message length. Use aim_send_im_ext().
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
431 *
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
432 */
2673
81d658e6ac1e [gaim-migrate @ 2686]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2672
diff changeset
433 faim_export int aim_send_im(aim_session_t *sess, const char *destsn, fu16_t flags, const char *msg)
2086
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
434 {
2122
c99c781e5931 [gaim-migrate @ 2132]
Adam Fritzler <mid@auk.cx>
parents: 2086
diff changeset
435 struct aim_sendimext_args args;
2086
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
436
2122
c99c781e5931 [gaim-migrate @ 2132]
Adam Fritzler <mid@auk.cx>
parents: 2086
diff changeset
437 args.destsn = destsn;
c99c781e5931 [gaim-migrate @ 2132]
Adam Fritzler <mid@auk.cx>
parents: 2086
diff changeset
438 args.flags = flags;
c99c781e5931 [gaim-migrate @ 2132]
Adam Fritzler <mid@auk.cx>
parents: 2086
diff changeset
439 args.msg = msg;
c99c781e5931 [gaim-migrate @ 2132]
Adam Fritzler <mid@auk.cx>
parents: 2086
diff changeset
440 args.msglen = strlen(msg);
2086
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
441
2246
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
442 /* Make these don't get set by accident -- they need aim_send_im_ext */
2270
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
443 args.flags &= ~(AIM_IMFLAGS_CUSTOMFEATURES | AIM_IMFLAGS_HASICON | AIM_IMFLAGS_MULTIPART);
2246
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
444
2673
81d658e6ac1e [gaim-migrate @ 2686]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2672
diff changeset
445 return aim_send_im_ext(sess, &args);
2086
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
446 }
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
447
2246
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
448 /*
3952
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
449 * Subtype 0x0006
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
450 *
2270
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
451 * This is also performance sensitive. (If you can believe it...)
2246
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
452 *
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
453 */
2673
81d658e6ac1e [gaim-migrate @ 2686]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2672
diff changeset
454 faim_export int aim_send_icon(aim_session_t *sess, const char *sn, const fu8_t *icon, int iconlen, time_t stamp, fu16_t iconsum)
2086
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
455 {
2673
81d658e6ac1e [gaim-migrate @ 2686]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2672
diff changeset
456 aim_conn_t *conn;
2246
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
457 int i;
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
458 fu8_t ck[8];
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
459 aim_frame_t *fr;
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
460 aim_snacid_t snacid;
2086
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
461
2673
81d658e6ac1e [gaim-migrate @ 2686]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2672
diff changeset
462 if (!sess || !(conn = aim_conn_findbygroup(sess, 0x0004)))
2246
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
463 return -EINVAL;
2086
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
464
2673
81d658e6ac1e [gaim-migrate @ 2686]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2672
diff changeset
465 if (!sn || !icon || (iconlen <= 0) || (iconlen >= MAXICONLEN))
2167
edf8c5a70e5b [gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2122
diff changeset
466 return -EINVAL;
2086
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
467
2246
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
468 for (i = 0; i < 8; i++)
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
469 aimutil_put8(ck+i, (fu8_t) rand());
2086
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
470
2246
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
471 if (!(fr = aim_tx_new(sess, conn, AIM_FRAMETYPE_FLAP, 0x02, 10+8+2+1+strlen(sn)+2+2+2+8+16+2+2+2+2+2+2+2+4+4+4+iconlen+strlen(AIM_ICONIDENT)+2+2)))
2167
edf8c5a70e5b [gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2122
diff changeset
472 return -ENOMEM;
2086
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
473
2246
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
474 snacid = aim_cachesnac(sess, 0x0004, 0x0006, 0x0000, NULL, 0);
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
475 aim_putsnac(&fr->data, 0x0004, 0x0006, 0x0000, snacid);
2086
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
476
2167
edf8c5a70e5b [gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2122
diff changeset
477 /*
edf8c5a70e5b [gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2122
diff changeset
478 * Cookie
edf8c5a70e5b [gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2122
diff changeset
479 */
2246
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
480 aimbs_putraw(&fr->data, ck, 8);
2086
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
481
2167
edf8c5a70e5b [gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2122
diff changeset
482 /*
edf8c5a70e5b [gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2122
diff changeset
483 * Channel (2)
edf8c5a70e5b [gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2122
diff changeset
484 */
2246
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
485 aimbs_put16(&fr->data, 0x0002);
2086
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
486
2167
edf8c5a70e5b [gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2122
diff changeset
487 /*
edf8c5a70e5b [gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2122
diff changeset
488 * Dest sn
edf8c5a70e5b [gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2122
diff changeset
489 */
2246
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
490 aimbs_put8(&fr->data, strlen(sn));
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
491 aimbs_putraw(&fr->data, sn, strlen(sn));
2086
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
492
2167
edf8c5a70e5b [gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2122
diff changeset
493 /*
edf8c5a70e5b [gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2122
diff changeset
494 * TLV t(0005)
2246
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
495 *
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
496 * Encompasses everything below.
2167
edf8c5a70e5b [gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2122
diff changeset
497 */
2246
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
498 aimbs_put16(&fr->data, 0x0005);
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
499 aimbs_put16(&fr->data, 2+8+16+6+4+4+iconlen+4+4+4+strlen(AIM_ICONIDENT));
2086
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
500
2246
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
501 aimbs_put16(&fr->data, 0x0000);
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
502 aimbs_putraw(&fr->data, ck, 8);
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
503 aim_putcap(&fr->data, AIM_CAPS_BUDDYICON);
2086
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
504
2167
edf8c5a70e5b [gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2122
diff changeset
505 /* TLV t(000a) */
2246
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
506 aimbs_put16(&fr->data, 0x000a);
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
507 aimbs_put16(&fr->data, 0x0002);
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
508 aimbs_put16(&fr->data, 0x0001);
2086
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
509
2167
edf8c5a70e5b [gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2122
diff changeset
510 /* TLV t(000f) */
2246
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
511 aimbs_put16(&fr->data, 0x000f);
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
512 aimbs_put16(&fr->data, 0x0000);
2086
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
513
2167
edf8c5a70e5b [gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2122
diff changeset
514 /* TLV t(2711) */
2246
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
515 aimbs_put16(&fr->data, 0x2711);
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
516 aimbs_put16(&fr->data, 4+4+4+iconlen+strlen(AIM_ICONIDENT));
2626
93f9bbd62630 [gaim-migrate @ 2639]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2507
diff changeset
517 aimbs_put16(&fr->data, 0x0000);
93f9bbd62630 [gaim-migrate @ 2639]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2507
diff changeset
518 aimbs_put16(&fr->data, iconsum);
2246
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
519 aimbs_put32(&fr->data, iconlen);
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
520 aimbs_put32(&fr->data, stamp);
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
521 aimbs_putraw(&fr->data, icon, iconlen);
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
522 aimbs_putraw(&fr->data, AIM_ICONIDENT, strlen(AIM_ICONIDENT));
2086
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
523
2167
edf8c5a70e5b [gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2122
diff changeset
524 /* TLV t(0003) */
2246
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
525 aimbs_put16(&fr->data, 0x0003);
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
526 aimbs_put16(&fr->data, 0x0000);
2086
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
527
2246
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
528 aim_tx_enqueue(sess, fr);
2167
edf8c5a70e5b [gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2122
diff changeset
529
edf8c5a70e5b [gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2122
diff changeset
530 return 0;
2086
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
531 }
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
532
2866
6d62d4520460 [gaim-migrate @ 2879]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2808
diff changeset
533 /*
3952
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
534 * Subtype 0x0006
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
535 *
2866
6d62d4520460 [gaim-migrate @ 2879]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2808
diff changeset
536 * This only works for ICQ 2001b (thats 2001 not 2000). Better, only
6d62d4520460 [gaim-migrate @ 2879]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2808
diff changeset
537 * send it to clients advertising the RTF capability. In fact, if you send
6d62d4520460 [gaim-migrate @ 2879]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2808
diff changeset
538 * it to a client that doesn't support that capability, the server will gladly
6d62d4520460 [gaim-migrate @ 2879]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2808
diff changeset
539 * bounce it back to you.
6d62d4520460 [gaim-migrate @ 2879]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2808
diff changeset
540 *
6d62d4520460 [gaim-migrate @ 2879]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2808
diff changeset
541 * You'd think this would be in icq.c, but, well, I'm trying to stick with
6d62d4520460 [gaim-migrate @ 2879]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2808
diff changeset
542 * the one-group-per-file scheme as much as possible. This could easily
6d62d4520460 [gaim-migrate @ 2879]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2808
diff changeset
543 * be an exception, since Rendezvous IMs are external of the Oscar core,
6d62d4520460 [gaim-migrate @ 2879]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2808
diff changeset
544 * and therefore are undefined. Really I just need to think of a good way to
6d62d4520460 [gaim-migrate @ 2879]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2808
diff changeset
545 * make an interface similar to what AOL actually uses. But I'm not using COM.
6d62d4520460 [gaim-migrate @ 2879]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2808
diff changeset
546 *
6d62d4520460 [gaim-migrate @ 2879]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2808
diff changeset
547 */
6d62d4520460 [gaim-migrate @ 2879]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2808
diff changeset
548 faim_export int aim_send_rtfmsg(aim_session_t *sess, struct aim_sendrtfmsg_args *args)
6d62d4520460 [gaim-migrate @ 2879]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2808
diff changeset
549 {
6d62d4520460 [gaim-migrate @ 2879]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2808
diff changeset
550 const char rtfcap[] = {"{97B12751-243C-4334-AD22-D6ABF73F1492}"}; /* AIM_CAPS_ICQRTF capability in string form */
6d62d4520460 [gaim-migrate @ 2879]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2808
diff changeset
551 aim_conn_t *conn;
6d62d4520460 [gaim-migrate @ 2879]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2808
diff changeset
552 int i;
6d62d4520460 [gaim-migrate @ 2879]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2808
diff changeset
553 fu8_t ck[8];
6d62d4520460 [gaim-migrate @ 2879]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2808
diff changeset
554 aim_frame_t *fr;
6d62d4520460 [gaim-migrate @ 2879]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2808
diff changeset
555 aim_snacid_t snacid;
6d62d4520460 [gaim-migrate @ 2879]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2808
diff changeset
556 int servdatalen;
6d62d4520460 [gaim-migrate @ 2879]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2808
diff changeset
557
6d62d4520460 [gaim-migrate @ 2879]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2808
diff changeset
558 if (!sess || !(conn = aim_conn_findbygroup(sess, 0x0004)))
6d62d4520460 [gaim-migrate @ 2879]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2808
diff changeset
559 return -EINVAL;
6d62d4520460 [gaim-migrate @ 2879]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2808
diff changeset
560
6d62d4520460 [gaim-migrate @ 2879]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2808
diff changeset
561 if (!args || !args->destsn || !args->rtfmsg)
6d62d4520460 [gaim-migrate @ 2879]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2808
diff changeset
562 return -EINVAL;
6d62d4520460 [gaim-migrate @ 2879]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2808
diff changeset
563
6d62d4520460 [gaim-migrate @ 2879]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2808
diff changeset
564 servdatalen = 2+2+16+2+4+1+2 + 2+2+4+4+4 + 2+4+2+strlen(args->rtfmsg)+1 + 4+4+4+strlen(rtfcap)+1;
6d62d4520460 [gaim-migrate @ 2879]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2808
diff changeset
565
6d62d4520460 [gaim-migrate @ 2879]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2808
diff changeset
566 for (i = 0; i < 8; i++)
6d62d4520460 [gaim-migrate @ 2879]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2808
diff changeset
567 aimutil_put8(ck+i, (fu8_t) rand());
6d62d4520460 [gaim-migrate @ 2879]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2808
diff changeset
568
6d62d4520460 [gaim-migrate @ 2879]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2808
diff changeset
569 if (!(fr = aim_tx_new(sess, conn, AIM_FRAMETYPE_FLAP, 0x02, 10+128+servdatalen)))
6d62d4520460 [gaim-migrate @ 2879]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2808
diff changeset
570 return -ENOMEM;
6d62d4520460 [gaim-migrate @ 2879]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2808
diff changeset
571
6d62d4520460 [gaim-migrate @ 2879]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2808
diff changeset
572 snacid = aim_cachesnac(sess, 0x0004, 0x0006, 0x0000, NULL, 0);
6d62d4520460 [gaim-migrate @ 2879]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2808
diff changeset
573 aim_putsnac(&fr->data, 0x0004, 0x0006, 0x0000, snacid);
6d62d4520460 [gaim-migrate @ 2879]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2808
diff changeset
574
6d62d4520460 [gaim-migrate @ 2879]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2808
diff changeset
575 /*
6d62d4520460 [gaim-migrate @ 2879]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2808
diff changeset
576 * Cookie
6d62d4520460 [gaim-migrate @ 2879]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2808
diff changeset
577 */
6d62d4520460 [gaim-migrate @ 2879]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2808
diff changeset
578 aimbs_putraw(&fr->data, ck, 8);
6d62d4520460 [gaim-migrate @ 2879]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2808
diff changeset
579
6d62d4520460 [gaim-migrate @ 2879]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2808
diff changeset
580 /*
6d62d4520460 [gaim-migrate @ 2879]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2808
diff changeset
581 * Channel (2)
6d62d4520460 [gaim-migrate @ 2879]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2808
diff changeset
582 */
6d62d4520460 [gaim-migrate @ 2879]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2808
diff changeset
583 aimbs_put16(&fr->data, 0x0002);
6d62d4520460 [gaim-migrate @ 2879]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2808
diff changeset
584
6d62d4520460 [gaim-migrate @ 2879]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2808
diff changeset
585 /*
6d62d4520460 [gaim-migrate @ 2879]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2808
diff changeset
586 * Dest sn
6d62d4520460 [gaim-migrate @ 2879]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2808
diff changeset
587 */
6d62d4520460 [gaim-migrate @ 2879]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2808
diff changeset
588 aimbs_put8(&fr->data, strlen(args->destsn));
6d62d4520460 [gaim-migrate @ 2879]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2808
diff changeset
589 aimbs_putraw(&fr->data, args->destsn, strlen(args->destsn));
6d62d4520460 [gaim-migrate @ 2879]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2808
diff changeset
590
6d62d4520460 [gaim-migrate @ 2879]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2808
diff changeset
591 /*
6d62d4520460 [gaim-migrate @ 2879]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2808
diff changeset
592 * TLV t(0005)
6d62d4520460 [gaim-migrate @ 2879]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2808
diff changeset
593 *
6d62d4520460 [gaim-migrate @ 2879]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2808
diff changeset
594 * Encompasses everything below.
6d62d4520460 [gaim-migrate @ 2879]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2808
diff changeset
595 */
6d62d4520460 [gaim-migrate @ 2879]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2808
diff changeset
596 aimbs_put16(&fr->data, 0x0005);
6d62d4520460 [gaim-migrate @ 2879]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2808
diff changeset
597 aimbs_put16(&fr->data, 2+8+16 + 2+2+2 + 2+2 + 2+2+servdatalen);
6d62d4520460 [gaim-migrate @ 2879]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2808
diff changeset
598
6d62d4520460 [gaim-migrate @ 2879]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2808
diff changeset
599 aimbs_put16(&fr->data, 0x0000);
6d62d4520460 [gaim-migrate @ 2879]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2808
diff changeset
600 aimbs_putraw(&fr->data, ck, 8);
6d62d4520460 [gaim-migrate @ 2879]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2808
diff changeset
601 aim_putcap(&fr->data, AIM_CAPS_ICQSERVERRELAY);
6d62d4520460 [gaim-migrate @ 2879]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2808
diff changeset
602
6d62d4520460 [gaim-migrate @ 2879]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2808
diff changeset
603 /*
6d62d4520460 [gaim-migrate @ 2879]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2808
diff changeset
604 * t(000a) l(0002) v(0001)
6d62d4520460 [gaim-migrate @ 2879]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2808
diff changeset
605 */
6d62d4520460 [gaim-migrate @ 2879]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2808
diff changeset
606 aimbs_put16(&fr->data, 0x000a);
6d62d4520460 [gaim-migrate @ 2879]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2808
diff changeset
607 aimbs_put16(&fr->data, 0x0002);
6d62d4520460 [gaim-migrate @ 2879]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2808
diff changeset
608 aimbs_put16(&fr->data, 0x0001);
6d62d4520460 [gaim-migrate @ 2879]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2808
diff changeset
609
6d62d4520460 [gaim-migrate @ 2879]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2808
diff changeset
610 /*
6d62d4520460 [gaim-migrate @ 2879]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2808
diff changeset
611 * t(000f) l(0000) v()
6d62d4520460 [gaim-migrate @ 2879]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2808
diff changeset
612 */
6d62d4520460 [gaim-migrate @ 2879]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2808
diff changeset
613 aimbs_put16(&fr->data, 0x000f);
6d62d4520460 [gaim-migrate @ 2879]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2808
diff changeset
614 aimbs_put16(&fr->data, 0x0000);
6d62d4520460 [gaim-migrate @ 2879]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2808
diff changeset
615
6d62d4520460 [gaim-migrate @ 2879]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2808
diff changeset
616 /*
6d62d4520460 [gaim-migrate @ 2879]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2808
diff changeset
617 * Service Data TLV
6d62d4520460 [gaim-migrate @ 2879]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2808
diff changeset
618 */
6d62d4520460 [gaim-migrate @ 2879]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2808
diff changeset
619 aimbs_put16(&fr->data, 0x2711);
6d62d4520460 [gaim-migrate @ 2879]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2808
diff changeset
620 aimbs_put16(&fr->data, servdatalen);
6d62d4520460 [gaim-migrate @ 2879]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2808
diff changeset
621
6d62d4520460 [gaim-migrate @ 2879]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2808
diff changeset
622 aimbs_putle16(&fr->data, 11 + 16 /* 11 + (sizeof CLSID) */);
6d62d4520460 [gaim-migrate @ 2879]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2808
diff changeset
623 aimbs_putle16(&fr->data, 9);
6d62d4520460 [gaim-migrate @ 2879]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2808
diff changeset
624 aim_putcap(&fr->data, AIM_CAPS_EMPTY);
6d62d4520460 [gaim-migrate @ 2879]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2808
diff changeset
625 aimbs_putle16(&fr->data, 0);
6d62d4520460 [gaim-migrate @ 2879]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2808
diff changeset
626 aimbs_putle32(&fr->data, 0);
6d62d4520460 [gaim-migrate @ 2879]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2808
diff changeset
627 aimbs_putle8(&fr->data, 0);
6d62d4520460 [gaim-migrate @ 2879]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2808
diff changeset
628 aimbs_putle16(&fr->data, 0x03ea); /* trid1 */
6d62d4520460 [gaim-migrate @ 2879]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2808
diff changeset
629
6d62d4520460 [gaim-migrate @ 2879]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2808
diff changeset
630 aimbs_putle16(&fr->data, 14);
6d62d4520460 [gaim-migrate @ 2879]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2808
diff changeset
631 aimbs_putle16(&fr->data, 0x03eb); /* trid2 */
6d62d4520460 [gaim-migrate @ 2879]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2808
diff changeset
632 aimbs_putle32(&fr->data, 0);
6d62d4520460 [gaim-migrate @ 2879]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2808
diff changeset
633 aimbs_putle32(&fr->data, 0);
6d62d4520460 [gaim-migrate @ 2879]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2808
diff changeset
634 aimbs_putle32(&fr->data, 0);
6d62d4520460 [gaim-migrate @ 2879]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2808
diff changeset
635
6d62d4520460 [gaim-migrate @ 2879]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2808
diff changeset
636 aimbs_putle16(&fr->data, 0x0001);
6d62d4520460 [gaim-migrate @ 2879]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2808
diff changeset
637 aimbs_putle32(&fr->data, 0);
6d62d4520460 [gaim-migrate @ 2879]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2808
diff changeset
638 aimbs_putle16(&fr->data, strlen(args->rtfmsg)+1);
6d62d4520460 [gaim-migrate @ 2879]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2808
diff changeset
639 aimbs_putraw(&fr->data, args->rtfmsg, strlen(args->rtfmsg)+1);
6d62d4520460 [gaim-migrate @ 2879]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2808
diff changeset
640
6d62d4520460 [gaim-migrate @ 2879]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2808
diff changeset
641 aimbs_putle32(&fr->data, args->fgcolor);
6d62d4520460 [gaim-migrate @ 2879]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2808
diff changeset
642 aimbs_putle32(&fr->data, args->bgcolor);
6d62d4520460 [gaim-migrate @ 2879]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2808
diff changeset
643 aimbs_putle32(&fr->data, strlen(rtfcap)+1);
6d62d4520460 [gaim-migrate @ 2879]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2808
diff changeset
644 aimbs_putraw(&fr->data, rtfcap, strlen(rtfcap)+1);
6d62d4520460 [gaim-migrate @ 2879]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2808
diff changeset
645
6d62d4520460 [gaim-migrate @ 2879]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2808
diff changeset
646 aim_tx_enqueue(sess, fr);
6d62d4520460 [gaim-migrate @ 2879]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2808
diff changeset
647
6d62d4520460 [gaim-migrate @ 2879]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2808
diff changeset
648 return 0;
6d62d4520460 [gaim-migrate @ 2879]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2808
diff changeset
649 }
6d62d4520460 [gaim-migrate @ 2879]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2808
diff changeset
650
3952
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
651 /* Subtype 0x0006 */
2717
03bf072c6238 [gaim-migrate @ 2730]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2703
diff changeset
652 faim_internal int aim_request_directim(aim_session_t *sess, const char *destsn, fu8_t *ip, fu16_t port, fu8_t *ckret)
03bf072c6238 [gaim-migrate @ 2730]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2703
diff changeset
653 {
03bf072c6238 [gaim-migrate @ 2730]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2703
diff changeset
654 aim_conn_t *conn;
03bf072c6238 [gaim-migrate @ 2730]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2703
diff changeset
655 fu8_t ck[8];
03bf072c6238 [gaim-migrate @ 2730]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2703
diff changeset
656 aim_frame_t *fr;
03bf072c6238 [gaim-migrate @ 2730]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2703
diff changeset
657 aim_snacid_t snacid;
03bf072c6238 [gaim-migrate @ 2730]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2703
diff changeset
658 aim_tlvlist_t *tl = NULL, *itl = NULL;
03bf072c6238 [gaim-migrate @ 2730]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2703
diff changeset
659 int hdrlen, i;
03bf072c6238 [gaim-migrate @ 2730]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2703
diff changeset
660 fu8_t *hdr;
03bf072c6238 [gaim-migrate @ 2730]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2703
diff changeset
661 aim_bstream_t hdrbs;
03bf072c6238 [gaim-migrate @ 2730]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2703
diff changeset
662
03bf072c6238 [gaim-migrate @ 2730]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2703
diff changeset
663 if (!sess || !(conn = aim_conn_findbygroup(sess, 0x0004)))
03bf072c6238 [gaim-migrate @ 2730]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2703
diff changeset
664 return -EINVAL;
03bf072c6238 [gaim-migrate @ 2730]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2703
diff changeset
665
03bf072c6238 [gaim-migrate @ 2730]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2703
diff changeset
666 if (!(fr = aim_tx_new(sess, conn, AIM_FRAMETYPE_FLAP, 0x02, 256+strlen(destsn))))
03bf072c6238 [gaim-migrate @ 2730]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2703
diff changeset
667 return -ENOMEM;
03bf072c6238 [gaim-migrate @ 2730]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2703
diff changeset
668
03bf072c6238 [gaim-migrate @ 2730]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2703
diff changeset
669 snacid = aim_cachesnac(sess, 0x0004, 0x0006, 0x0000, NULL, 0);
03bf072c6238 [gaim-migrate @ 2730]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2703
diff changeset
670 aim_putsnac(&fr->data, 0x0004, 0x0006, 0x0000, snacid);
03bf072c6238 [gaim-migrate @ 2730]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2703
diff changeset
671
03bf072c6238 [gaim-migrate @ 2730]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2703
diff changeset
672 /*
03bf072c6238 [gaim-migrate @ 2730]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2703
diff changeset
673 * Generate a random message cookie
03bf072c6238 [gaim-migrate @ 2730]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2703
diff changeset
674 *
03bf072c6238 [gaim-migrate @ 2730]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2703
diff changeset
675 * This cookie needs to be alphanumeric and NULL-terminated to be
03bf072c6238 [gaim-migrate @ 2730]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2703
diff changeset
676 * TOC-compatible.
03bf072c6238 [gaim-migrate @ 2730]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2703
diff changeset
677 *
03bf072c6238 [gaim-migrate @ 2730]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2703
diff changeset
678 * XXX have I mentioned these should be generated in msgcookie.c?
03bf072c6238 [gaim-migrate @ 2730]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2703
diff changeset
679 *
03bf072c6238 [gaim-migrate @ 2730]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2703
diff changeset
680 */
03bf072c6238 [gaim-migrate @ 2730]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2703
diff changeset
681 for (i = 0; i < 7; i++)
03bf072c6238 [gaim-migrate @ 2730]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2703
diff changeset
682 ck[i] = 0x30 + ((fu8_t) rand() % 10);
03bf072c6238 [gaim-migrate @ 2730]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2703
diff changeset
683 ck[7] = '\0';
03bf072c6238 [gaim-migrate @ 2730]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2703
diff changeset
684
03bf072c6238 [gaim-migrate @ 2730]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2703
diff changeset
685 if (ckret)
03bf072c6238 [gaim-migrate @ 2730]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2703
diff changeset
686 memcpy(ckret, ck, 8);
03bf072c6238 [gaim-migrate @ 2730]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2703
diff changeset
687
03bf072c6238 [gaim-migrate @ 2730]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2703
diff changeset
688 /* Cookie */
03bf072c6238 [gaim-migrate @ 2730]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2703
diff changeset
689 aimbs_putraw(&fr->data, ck, 8);
03bf072c6238 [gaim-migrate @ 2730]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2703
diff changeset
690
03bf072c6238 [gaim-migrate @ 2730]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2703
diff changeset
691 /* Channel */
03bf072c6238 [gaim-migrate @ 2730]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2703
diff changeset
692 aimbs_put16(&fr->data, 0x0002);
03bf072c6238 [gaim-migrate @ 2730]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2703
diff changeset
693
03bf072c6238 [gaim-migrate @ 2730]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2703
diff changeset
694 /* Destination SN */
03bf072c6238 [gaim-migrate @ 2730]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2703
diff changeset
695 aimbs_put8(&fr->data, strlen(destsn));
03bf072c6238 [gaim-migrate @ 2730]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2703
diff changeset
696 aimbs_putraw(&fr->data, destsn, strlen(destsn));
03bf072c6238 [gaim-migrate @ 2730]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2703
diff changeset
697
03bf072c6238 [gaim-migrate @ 2730]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2703
diff changeset
698 aim_addtlvtochain_noval(&tl, 0x0003);
03bf072c6238 [gaim-migrate @ 2730]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2703
diff changeset
699
03bf072c6238 [gaim-migrate @ 2730]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2703
diff changeset
700 hdrlen = 2+8+16+6+8+6+4;
03bf072c6238 [gaim-migrate @ 2730]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2703
diff changeset
701 hdr = malloc(hdrlen);
03bf072c6238 [gaim-migrate @ 2730]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2703
diff changeset
702 aim_bstream_init(&hdrbs, hdr, hdrlen);
03bf072c6238 [gaim-migrate @ 2730]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2703
diff changeset
703
03bf072c6238 [gaim-migrate @ 2730]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2703
diff changeset
704 aimbs_put16(&hdrbs, 0x0000);
03bf072c6238 [gaim-migrate @ 2730]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2703
diff changeset
705 aimbs_putraw(&hdrbs, ck, 8);
03bf072c6238 [gaim-migrate @ 2730]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2703
diff changeset
706 aim_putcap(&hdrbs, AIM_CAPS_IMIMAGE);
03bf072c6238 [gaim-migrate @ 2730]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2703
diff changeset
707
03bf072c6238 [gaim-migrate @ 2730]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2703
diff changeset
708 aim_addtlvtochain16(&itl, 0x000a, 0x0001);
03bf072c6238 [gaim-migrate @ 2730]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2703
diff changeset
709 aim_addtlvtochain_raw(&itl, 0x0003, 4, ip);
03bf072c6238 [gaim-migrate @ 2730]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2703
diff changeset
710 aim_addtlvtochain16(&itl, 0x0005, port);
03bf072c6238 [gaim-migrate @ 2730]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2703
diff changeset
711 aim_addtlvtochain_noval(&itl, 0x000f);
03bf072c6238 [gaim-migrate @ 2730]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2703
diff changeset
712
03bf072c6238 [gaim-migrate @ 2730]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2703
diff changeset
713 aim_writetlvchain(&hdrbs, &itl);
03bf072c6238 [gaim-migrate @ 2730]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2703
diff changeset
714
03bf072c6238 [gaim-migrate @ 2730]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2703
diff changeset
715 aim_addtlvtochain_raw(&tl, 0x0005, aim_bstream_curpos(&hdrbs), hdr);
03bf072c6238 [gaim-migrate @ 2730]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2703
diff changeset
716
03bf072c6238 [gaim-migrate @ 2730]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2703
diff changeset
717 aim_writetlvchain(&fr->data, &tl);
03bf072c6238 [gaim-migrate @ 2730]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2703
diff changeset
718
03bf072c6238 [gaim-migrate @ 2730]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2703
diff changeset
719 free(hdr);
03bf072c6238 [gaim-migrate @ 2730]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2703
diff changeset
720 aim_freetlvchain(&itl);
03bf072c6238 [gaim-migrate @ 2730]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2703
diff changeset
721 aim_freetlvchain(&tl);
03bf072c6238 [gaim-migrate @ 2730]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2703
diff changeset
722
03bf072c6238 [gaim-migrate @ 2730]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2703
diff changeset
723 aim_tx_enqueue(sess, fr);
03bf072c6238 [gaim-migrate @ 2730]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2703
diff changeset
724
03bf072c6238 [gaim-migrate @ 2730]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2703
diff changeset
725 return 0;
03bf072c6238 [gaim-migrate @ 2730]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2703
diff changeset
726 }
03bf072c6238 [gaim-migrate @ 2730]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2703
diff changeset
727
3952
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
728 /* Subtype 0x0006 */
2717
03bf072c6238 [gaim-migrate @ 2730]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2703
diff changeset
729 faim_internal int aim_request_sendfile(aim_session_t *sess, const char *sn, const char *filename, fu16_t numfiles, fu32_t totsize, fu8_t *ip, fu16_t port, fu8_t *ckret)
03bf072c6238 [gaim-migrate @ 2730]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2703
diff changeset
730 {
03bf072c6238 [gaim-migrate @ 2730]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2703
diff changeset
731 aim_conn_t *conn;
03bf072c6238 [gaim-migrate @ 2730]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2703
diff changeset
732 int i;
03bf072c6238 [gaim-migrate @ 2730]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2703
diff changeset
733 fu8_t ck[8];
03bf072c6238 [gaim-migrate @ 2730]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2703
diff changeset
734 aim_frame_t *fr;
03bf072c6238 [gaim-migrate @ 2730]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2703
diff changeset
735 aim_snacid_t snacid;
3752
b32474e522fa [gaim-migrate @ 3890]
Luke Schierer <lschiere@pidgin.im>
parents: 3630
diff changeset
736 struct aim_snac_destructor snacdest;
2717
03bf072c6238 [gaim-migrate @ 2730]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2703
diff changeset
737
03bf072c6238 [gaim-migrate @ 2730]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2703
diff changeset
738 if (!sess || !(conn = aim_conn_findbygroup(sess, 0x0004)))
03bf072c6238 [gaim-migrate @ 2730]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2703
diff changeset
739 return -EINVAL;
03bf072c6238 [gaim-migrate @ 2730]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2703
diff changeset
740
03bf072c6238 [gaim-migrate @ 2730]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2703
diff changeset
741 if (!sn || !filename)
03bf072c6238 [gaim-migrate @ 2730]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2703
diff changeset
742 return -EINVAL;
03bf072c6238 [gaim-migrate @ 2730]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2703
diff changeset
743
03bf072c6238 [gaim-migrate @ 2730]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2703
diff changeset
744 if (!(fr = aim_tx_new(sess, conn, AIM_FRAMETYPE_FLAP, 0x02, 10+8+2+1+strlen(sn)+2+2+2+8+16+6+8+6+4+2+2+2+2+4+strlen(filename)+4)))
03bf072c6238 [gaim-migrate @ 2730]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2703
diff changeset
745 return -ENOMEM;
03bf072c6238 [gaim-migrate @ 2730]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2703
diff changeset
746
03bf072c6238 [gaim-migrate @ 2730]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2703
diff changeset
747 for (i = 0; i < 7; i++)
03bf072c6238 [gaim-migrate @ 2730]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2703
diff changeset
748 aimutil_put8(ck+i, 0x30 + ((fu8_t) rand() % 10));
03bf072c6238 [gaim-migrate @ 2730]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2703
diff changeset
749 ck[7] = '\0';
03bf072c6238 [gaim-migrate @ 2730]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2703
diff changeset
750
03bf072c6238 [gaim-migrate @ 2730]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2703
diff changeset
751 if (ckret)
03bf072c6238 [gaim-migrate @ 2730]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2703
diff changeset
752 memcpy(ckret, ck, 8);
03bf072c6238 [gaim-migrate @ 2730]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2703
diff changeset
753
3752
b32474e522fa [gaim-migrate @ 3890]
Luke Schierer <lschiere@pidgin.im>
parents: 3630
diff changeset
754 /* Fill in the snac destructor so we know if the request
b32474e522fa [gaim-migrate @ 3890]
Luke Schierer <lschiere@pidgin.im>
parents: 3630
diff changeset
755 * times out. Use the cookie in the data field, so we
b32474e522fa [gaim-migrate @ 3890]
Luke Schierer <lschiere@pidgin.im>
parents: 3630
diff changeset
756 * know what request to cancel if there is an error.
b32474e522fa [gaim-migrate @ 3890]
Luke Schierer <lschiere@pidgin.im>
parents: 3630
diff changeset
757 */
b32474e522fa [gaim-migrate @ 3890]
Luke Schierer <lschiere@pidgin.im>
parents: 3630
diff changeset
758 snacdest.data = malloc(8);
b32474e522fa [gaim-migrate @ 3890]
Luke Schierer <lschiere@pidgin.im>
parents: 3630
diff changeset
759 memcpy(snacdest.data, ck, 8);
b32474e522fa [gaim-migrate @ 3890]
Luke Schierer <lschiere@pidgin.im>
parents: 3630
diff changeset
760 snacdest.conn = conn;
b32474e522fa [gaim-migrate @ 3890]
Luke Schierer <lschiere@pidgin.im>
parents: 3630
diff changeset
761 snacid = aim_cachesnac(sess, 0x0004, 0x0006, AIM_SNACFLAGS_DESTRUCTOR, &snacdest, sizeof(snacdest));
b32474e522fa [gaim-migrate @ 3890]
Luke Schierer <lschiere@pidgin.im>
parents: 3630
diff changeset
762 aim_putsnac(&fr->data, 0x0004, 0x0006, 0x0000, snacid);
b32474e522fa [gaim-migrate @ 3890]
Luke Schierer <lschiere@pidgin.im>
parents: 3630
diff changeset
763
2717
03bf072c6238 [gaim-migrate @ 2730]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2703
diff changeset
764 /*
03bf072c6238 [gaim-migrate @ 2730]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2703
diff changeset
765 * Cookie
03bf072c6238 [gaim-migrate @ 2730]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2703
diff changeset
766 */
03bf072c6238 [gaim-migrate @ 2730]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2703
diff changeset
767 aimbs_putraw(&fr->data, ck, 8);
03bf072c6238 [gaim-migrate @ 2730]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2703
diff changeset
768
03bf072c6238 [gaim-migrate @ 2730]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2703
diff changeset
769 /*
03bf072c6238 [gaim-migrate @ 2730]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2703
diff changeset
770 * Channel (2)
03bf072c6238 [gaim-migrate @ 2730]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2703
diff changeset
771 */
03bf072c6238 [gaim-migrate @ 2730]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2703
diff changeset
772 aimbs_put16(&fr->data, 0x0002);
03bf072c6238 [gaim-migrate @ 2730]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2703
diff changeset
773
03bf072c6238 [gaim-migrate @ 2730]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2703
diff changeset
774 /*
03bf072c6238 [gaim-migrate @ 2730]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2703
diff changeset
775 * Dest sn
03bf072c6238 [gaim-migrate @ 2730]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2703
diff changeset
776 */
03bf072c6238 [gaim-migrate @ 2730]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2703
diff changeset
777 aimbs_put8(&fr->data, strlen(sn));
03bf072c6238 [gaim-migrate @ 2730]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2703
diff changeset
778 aimbs_putraw(&fr->data, sn, strlen(sn));
03bf072c6238 [gaim-migrate @ 2730]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2703
diff changeset
779
03bf072c6238 [gaim-migrate @ 2730]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2703
diff changeset
780 /*
03bf072c6238 [gaim-migrate @ 2730]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2703
diff changeset
781 * TLV t(0005)
03bf072c6238 [gaim-migrate @ 2730]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2703
diff changeset
782 *
03bf072c6238 [gaim-migrate @ 2730]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2703
diff changeset
783 * Encompasses everything below. Gee.
03bf072c6238 [gaim-migrate @ 2730]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2703
diff changeset
784 */
03bf072c6238 [gaim-migrate @ 2730]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2703
diff changeset
785 aimbs_put16(&fr->data, 0x0005);
03bf072c6238 [gaim-migrate @ 2730]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2703
diff changeset
786 aimbs_put16(&fr->data, 2+8+16+6+8+6+4+2+2+2+2+4+strlen(filename)+4);
03bf072c6238 [gaim-migrate @ 2730]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2703
diff changeset
787
03bf072c6238 [gaim-migrate @ 2730]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2703
diff changeset
788 aimbs_put16(&fr->data, 0x0000);
03bf072c6238 [gaim-migrate @ 2730]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2703
diff changeset
789 aimbs_putraw(&fr->data, ck, 8);
03bf072c6238 [gaim-migrate @ 2730]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2703
diff changeset
790 aim_putcap(&fr->data, AIM_CAPS_SENDFILE);
03bf072c6238 [gaim-migrate @ 2730]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2703
diff changeset
791
03bf072c6238 [gaim-migrate @ 2730]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2703
diff changeset
792 /* TLV t(000a) */
03bf072c6238 [gaim-migrate @ 2730]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2703
diff changeset
793 aimbs_put16(&fr->data, 0x000a);
03bf072c6238 [gaim-migrate @ 2730]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2703
diff changeset
794 aimbs_put16(&fr->data, 0x0002);
03bf072c6238 [gaim-migrate @ 2730]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2703
diff changeset
795 aimbs_put16(&fr->data, 0x0001);
03bf072c6238 [gaim-migrate @ 2730]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2703
diff changeset
796
03bf072c6238 [gaim-migrate @ 2730]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2703
diff changeset
797 /* TLV t(0003) (IP) */
03bf072c6238 [gaim-migrate @ 2730]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2703
diff changeset
798 aimbs_put16(&fr->data, 0x0003);
03bf072c6238 [gaim-migrate @ 2730]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2703
diff changeset
799 aimbs_put16(&fr->data, 0x0004);
03bf072c6238 [gaim-migrate @ 2730]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2703
diff changeset
800 aimbs_putraw(&fr->data, ip, 4);
03bf072c6238 [gaim-migrate @ 2730]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2703
diff changeset
801
03bf072c6238 [gaim-migrate @ 2730]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2703
diff changeset
802 /* TLV t(0005) (port) */
03bf072c6238 [gaim-migrate @ 2730]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2703
diff changeset
803 aimbs_put16(&fr->data, 0x0005);
03bf072c6238 [gaim-migrate @ 2730]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2703
diff changeset
804 aimbs_put16(&fr->data, 0x0002);
03bf072c6238 [gaim-migrate @ 2730]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2703
diff changeset
805 aimbs_put16(&fr->data, port);
03bf072c6238 [gaim-migrate @ 2730]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2703
diff changeset
806
03bf072c6238 [gaim-migrate @ 2730]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2703
diff changeset
807 /* TLV t(000f) */
03bf072c6238 [gaim-migrate @ 2730]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2703
diff changeset
808 aimbs_put16(&fr->data, 0x000f);
03bf072c6238 [gaim-migrate @ 2730]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2703
diff changeset
809 aimbs_put16(&fr->data, 0x0000);
03bf072c6238 [gaim-migrate @ 2730]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2703
diff changeset
810
03bf072c6238 [gaim-migrate @ 2730]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2703
diff changeset
811 /* TLV t(2711) */
03bf072c6238 [gaim-migrate @ 2730]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2703
diff changeset
812 aimbs_put16(&fr->data, 0x2711);
03bf072c6238 [gaim-migrate @ 2730]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2703
diff changeset
813 aimbs_put16(&fr->data, 2+2+4+strlen(filename)+4);
03bf072c6238 [gaim-migrate @ 2730]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2703
diff changeset
814
03bf072c6238 [gaim-migrate @ 2730]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2703
diff changeset
815 /* ? */
3630
9682c0e022c6 [gaim-migrate @ 3753]
Rob Flynn <gaim@robflynn.com>
parents: 3595
diff changeset
816 aimbs_put16(&fr->data, (numfiles > 1) ? 0x0002 : 0x0001);
2717
03bf072c6238 [gaim-migrate @ 2730]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2703
diff changeset
817 aimbs_put16(&fr->data, numfiles);
03bf072c6238 [gaim-migrate @ 2730]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2703
diff changeset
818 aimbs_put32(&fr->data, totsize);
03bf072c6238 [gaim-migrate @ 2730]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2703
diff changeset
819 aimbs_putraw(&fr->data, filename, strlen(filename));
03bf072c6238 [gaim-migrate @ 2730]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2703
diff changeset
820
03bf072c6238 [gaim-migrate @ 2730]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2703
diff changeset
821 /* ? */
03bf072c6238 [gaim-migrate @ 2730]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2703
diff changeset
822 aimbs_put32(&fr->data, 0x00000000);
03bf072c6238 [gaim-migrate @ 2730]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2703
diff changeset
823
3630
9682c0e022c6 [gaim-migrate @ 3753]
Rob Flynn <gaim@robflynn.com>
parents: 3595
diff changeset
824 #if 0
3752
b32474e522fa [gaim-migrate @ 3890]
Luke Schierer <lschiere@pidgin.im>
parents: 3630
diff changeset
825 /* Newer clients seem to send this (?) -- wtm */
3630
9682c0e022c6 [gaim-migrate @ 3753]
Rob Flynn <gaim@robflynn.com>
parents: 3595
diff changeset
826 aimbs_put32(&fr->data, 0x00030000);
9682c0e022c6 [gaim-migrate @ 3753]
Rob Flynn <gaim@robflynn.com>
parents: 3595
diff changeset
827 #endif
9682c0e022c6 [gaim-migrate @ 3753]
Rob Flynn <gaim@robflynn.com>
parents: 3595
diff changeset
828
2717
03bf072c6238 [gaim-migrate @ 2730]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2703
diff changeset
829 aim_tx_enqueue(sess, fr);
03bf072c6238 [gaim-migrate @ 2730]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2703
diff changeset
830
03bf072c6238 [gaim-migrate @ 2730]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2703
diff changeset
831 return 0;
03bf072c6238 [gaim-migrate @ 2730]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2703
diff changeset
832 }
03bf072c6238 [gaim-migrate @ 2730]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2703
diff changeset
833
3212
56746b0868db [gaim-migrate @ 3229]
Sean Egan <seanegan@gmail.com>
parents: 3159
diff changeset
834 /**
3952
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
835 * Subtype 0x0006 - Request the status message of the given ICQ user.
3212
56746b0868db [gaim-migrate @ 3229]
Sean Egan <seanegan@gmail.com>
parents: 3159
diff changeset
836 *
56746b0868db [gaim-migrate @ 3229]
Sean Egan <seanegan@gmail.com>
parents: 3159
diff changeset
837 * @param sess The oscar session.
56746b0868db [gaim-migrate @ 3229]
Sean Egan <seanegan@gmail.com>
parents: 3159
diff changeset
838 * @param sn The UIN of the user of whom you wish to request info.
56746b0868db [gaim-migrate @ 3229]
Sean Egan <seanegan@gmail.com>
parents: 3159
diff changeset
839 * @param type The type of info you wish to request. This should be the current
56746b0868db [gaim-migrate @ 3229]
Sean Egan <seanegan@gmail.com>
parents: 3159
diff changeset
840 * state of the user, as one of the AIM_ICQ_STATE_* defines.
56746b0868db [gaim-migrate @ 3229]
Sean Egan <seanegan@gmail.com>
parents: 3159
diff changeset
841 * @return Return 0 if no errors, otherwise return the error number.
56746b0868db [gaim-migrate @ 3229]
Sean Egan <seanegan@gmail.com>
parents: 3159
diff changeset
842 */
56746b0868db [gaim-migrate @ 3229]
Sean Egan <seanegan@gmail.com>
parents: 3159
diff changeset
843 faim_export int aim_send_im_ch2_geticqmessage(aim_session_t *sess, const char *sn, int type)
56746b0868db [gaim-migrate @ 3229]
Sean Egan <seanegan@gmail.com>
parents: 3159
diff changeset
844 {
56746b0868db [gaim-migrate @ 3229]
Sean Egan <seanegan@gmail.com>
parents: 3159
diff changeset
845 aim_conn_t *conn;
56746b0868db [gaim-migrate @ 3229]
Sean Egan <seanegan@gmail.com>
parents: 3159
diff changeset
846 int i;
56746b0868db [gaim-migrate @ 3229]
Sean Egan <seanegan@gmail.com>
parents: 3159
diff changeset
847 fu8_t ck[8];
56746b0868db [gaim-migrate @ 3229]
Sean Egan <seanegan@gmail.com>
parents: 3159
diff changeset
848 aim_frame_t *fr;
56746b0868db [gaim-migrate @ 3229]
Sean Egan <seanegan@gmail.com>
parents: 3159
diff changeset
849 aim_snacid_t snacid;
56746b0868db [gaim-migrate @ 3229]
Sean Egan <seanegan@gmail.com>
parents: 3159
diff changeset
850
56746b0868db [gaim-migrate @ 3229]
Sean Egan <seanegan@gmail.com>
parents: 3159
diff changeset
851 if (!sess || !(conn = aim_conn_findbygroup(sess, 0x0004)) || !sn)
56746b0868db [gaim-migrate @ 3229]
Sean Egan <seanegan@gmail.com>
parents: 3159
diff changeset
852 return -EINVAL;
56746b0868db [gaim-migrate @ 3229]
Sean Egan <seanegan@gmail.com>
parents: 3159
diff changeset
853
56746b0868db [gaim-migrate @ 3229]
Sean Egan <seanegan@gmail.com>
parents: 3159
diff changeset
854 for (i = 0; i < 8; i++)
56746b0868db [gaim-migrate @ 3229]
Sean Egan <seanegan@gmail.com>
parents: 3159
diff changeset
855 aimutil_put8(ck+i, (fu8_t) rand());
56746b0868db [gaim-migrate @ 3229]
Sean Egan <seanegan@gmail.com>
parents: 3159
diff changeset
856
56746b0868db [gaim-migrate @ 3229]
Sean Egan <seanegan@gmail.com>
parents: 3159
diff changeset
857 if (!(fr = aim_tx_new(sess, conn, AIM_FRAMETYPE_FLAP, 0x02, 10+8+2+1+strlen(sn) + 4+0x5e + 4)))
56746b0868db [gaim-migrate @ 3229]
Sean Egan <seanegan@gmail.com>
parents: 3159
diff changeset
858 return -ENOMEM;
56746b0868db [gaim-migrate @ 3229]
Sean Egan <seanegan@gmail.com>
parents: 3159
diff changeset
859
56746b0868db [gaim-migrate @ 3229]
Sean Egan <seanegan@gmail.com>
parents: 3159
diff changeset
860 snacid = aim_cachesnac(sess, 0x0004, 0x0006, 0x0000, NULL, 0);
56746b0868db [gaim-migrate @ 3229]
Sean Egan <seanegan@gmail.com>
parents: 3159
diff changeset
861 aim_putsnac(&fr->data, 0x0004, 0x0006, 0x0000, snacid);
56746b0868db [gaim-migrate @ 3229]
Sean Egan <seanegan@gmail.com>
parents: 3159
diff changeset
862
56746b0868db [gaim-migrate @ 3229]
Sean Egan <seanegan@gmail.com>
parents: 3159
diff changeset
863 /* Cookie */
56746b0868db [gaim-migrate @ 3229]
Sean Egan <seanegan@gmail.com>
parents: 3159
diff changeset
864 aimbs_putraw(&fr->data, ck, 8);
56746b0868db [gaim-migrate @ 3229]
Sean Egan <seanegan@gmail.com>
parents: 3159
diff changeset
865
56746b0868db [gaim-migrate @ 3229]
Sean Egan <seanegan@gmail.com>
parents: 3159
diff changeset
866 /* Channel (2) */
56746b0868db [gaim-migrate @ 3229]
Sean Egan <seanegan@gmail.com>
parents: 3159
diff changeset
867 aimbs_put16(&fr->data, 0x0002);
56746b0868db [gaim-migrate @ 3229]
Sean Egan <seanegan@gmail.com>
parents: 3159
diff changeset
868
56746b0868db [gaim-migrate @ 3229]
Sean Egan <seanegan@gmail.com>
parents: 3159
diff changeset
869 /* Dest sn */
56746b0868db [gaim-migrate @ 3229]
Sean Egan <seanegan@gmail.com>
parents: 3159
diff changeset
870 aimbs_put8(&fr->data, strlen(sn));
56746b0868db [gaim-migrate @ 3229]
Sean Egan <seanegan@gmail.com>
parents: 3159
diff changeset
871 aimbs_putraw(&fr->data, sn, strlen(sn));
56746b0868db [gaim-migrate @ 3229]
Sean Egan <seanegan@gmail.com>
parents: 3159
diff changeset
872
56746b0868db [gaim-migrate @ 3229]
Sean Egan <seanegan@gmail.com>
parents: 3159
diff changeset
873 /* TLV t(0005) - Encompasses almost everything below. */
56746b0868db [gaim-migrate @ 3229]
Sean Egan <seanegan@gmail.com>
parents: 3159
diff changeset
874 aimbs_put16(&fr->data, 0x0005); /* T */
56746b0868db [gaim-migrate @ 3229]
Sean Egan <seanegan@gmail.com>
parents: 3159
diff changeset
875 aimbs_put16(&fr->data, 0x005e); /* L */
56746b0868db [gaim-migrate @ 3229]
Sean Egan <seanegan@gmail.com>
parents: 3159
diff changeset
876 { /* V */
56746b0868db [gaim-migrate @ 3229]
Sean Egan <seanegan@gmail.com>
parents: 3159
diff changeset
877 aimbs_put16(&fr->data, 0x0000);
56746b0868db [gaim-migrate @ 3229]
Sean Egan <seanegan@gmail.com>
parents: 3159
diff changeset
878
56746b0868db [gaim-migrate @ 3229]
Sean Egan <seanegan@gmail.com>
parents: 3159
diff changeset
879 /* Cookie */
56746b0868db [gaim-migrate @ 3229]
Sean Egan <seanegan@gmail.com>
parents: 3159
diff changeset
880 aimbs_putraw(&fr->data, ck, 8);
56746b0868db [gaim-migrate @ 3229]
Sean Egan <seanegan@gmail.com>
parents: 3159
diff changeset
881
56746b0868db [gaim-migrate @ 3229]
Sean Egan <seanegan@gmail.com>
parents: 3159
diff changeset
882 /* Put the 16 byte server relay capability */
56746b0868db [gaim-migrate @ 3229]
Sean Egan <seanegan@gmail.com>
parents: 3159
diff changeset
883 aim_putcap(&fr->data, AIM_CAPS_ICQSERVERRELAY);
56746b0868db [gaim-migrate @ 3229]
Sean Egan <seanegan@gmail.com>
parents: 3159
diff changeset
884
56746b0868db [gaim-migrate @ 3229]
Sean Egan <seanegan@gmail.com>
parents: 3159
diff changeset
885 /* TLV t(000a) */
56746b0868db [gaim-migrate @ 3229]
Sean Egan <seanegan@gmail.com>
parents: 3159
diff changeset
886 aimbs_put16(&fr->data, 0x000a);
56746b0868db [gaim-migrate @ 3229]
Sean Egan <seanegan@gmail.com>
parents: 3159
diff changeset
887 aimbs_put16(&fr->data, 0x0002);
56746b0868db [gaim-migrate @ 3229]
Sean Egan <seanegan@gmail.com>
parents: 3159
diff changeset
888 aimbs_put16(&fr->data, 0x0001);
56746b0868db [gaim-migrate @ 3229]
Sean Egan <seanegan@gmail.com>
parents: 3159
diff changeset
889
56746b0868db [gaim-migrate @ 3229]
Sean Egan <seanegan@gmail.com>
parents: 3159
diff changeset
890 /* TLV t(000f) */
56746b0868db [gaim-migrate @ 3229]
Sean Egan <seanegan@gmail.com>
parents: 3159
diff changeset
891 aimbs_put16(&fr->data, 0x000f);
56746b0868db [gaim-migrate @ 3229]
Sean Egan <seanegan@gmail.com>
parents: 3159
diff changeset
892 aimbs_put16(&fr->data, 0x0000);
56746b0868db [gaim-migrate @ 3229]
Sean Egan <seanegan@gmail.com>
parents: 3159
diff changeset
893
56746b0868db [gaim-migrate @ 3229]
Sean Egan <seanegan@gmail.com>
parents: 3159
diff changeset
894 /* TLV t(2711) */
56746b0868db [gaim-migrate @ 3229]
Sean Egan <seanegan@gmail.com>
parents: 3159
diff changeset
895 aimbs_put16(&fr->data, 0x2711);
56746b0868db [gaim-migrate @ 3229]
Sean Egan <seanegan@gmail.com>
parents: 3159
diff changeset
896 aimbs_put16(&fr->data, 0x0036);
56746b0868db [gaim-migrate @ 3229]
Sean Egan <seanegan@gmail.com>
parents: 3159
diff changeset
897 { /* V */
56746b0868db [gaim-migrate @ 3229]
Sean Egan <seanegan@gmail.com>
parents: 3159
diff changeset
898 aimbs_putle16(&fr->data, 0x001b); /* L */
3952
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
899 aimbs_putle16(&fr->data, 0x0008); /* XXX - Protocol version */
4154
3468d666d3cc [gaim-migrate @ 4382]
Mark Doliner <mark@kingant.net>
parents: 4102
diff changeset
900 aim_putcap(&fr->data, AIM_CAPS_EMPTY);
3212
56746b0868db [gaim-migrate @ 3229]
Sean Egan <seanegan@gmail.com>
parents: 3159
diff changeset
901 aimbs_putle16(&fr->data, 0x0000); /* Unknown */
56746b0868db [gaim-migrate @ 3229]
Sean Egan <seanegan@gmail.com>
parents: 3159
diff changeset
902 aimbs_putle16(&fr->data, 0x0003); /* Client features? */
56746b0868db [gaim-migrate @ 3229]
Sean Egan <seanegan@gmail.com>
parents: 3159
diff changeset
903 aimbs_putle16(&fr->data, 0x0000); /* Unknown */
56746b0868db [gaim-migrate @ 3229]
Sean Egan <seanegan@gmail.com>
parents: 3159
diff changeset
904 aimbs_putle8(&fr->data, 0x00); /* Unkizown */
56746b0868db [gaim-migrate @ 3229]
Sean Egan <seanegan@gmail.com>
parents: 3159
diff changeset
905 aimbs_putle16(&fr->data, 0xffff); /* Sequence number? XXX - This should decrement by 1 with each request */
56746b0868db [gaim-migrate @ 3229]
Sean Egan <seanegan@gmail.com>
parents: 3159
diff changeset
906
56746b0868db [gaim-migrate @ 3229]
Sean Egan <seanegan@gmail.com>
parents: 3159
diff changeset
907 aimbs_putle16(&fr->data, 0x000e); /* L */
56746b0868db [gaim-migrate @ 3229]
Sean Egan <seanegan@gmail.com>
parents: 3159
diff changeset
908 aimbs_putle16(&fr->data, 0xffff); /* Sequence number? XXX - This should decrement by 1 with each request */
56746b0868db [gaim-migrate @ 3229]
Sean Egan <seanegan@gmail.com>
parents: 3159
diff changeset
909 aimbs_putle32(&fr->data, 0x00000000); /* Unknown */
56746b0868db [gaim-migrate @ 3229]
Sean Egan <seanegan@gmail.com>
parents: 3159
diff changeset
910 aimbs_putle32(&fr->data, 0x00000000); /* Unknown */
56746b0868db [gaim-migrate @ 3229]
Sean Egan <seanegan@gmail.com>
parents: 3159
diff changeset
911 aimbs_putle32(&fr->data, 0x00000000); /* Unknown */
56746b0868db [gaim-migrate @ 3229]
Sean Egan <seanegan@gmail.com>
parents: 3159
diff changeset
912
56746b0868db [gaim-migrate @ 3229]
Sean Egan <seanegan@gmail.com>
parents: 3159
diff changeset
913 /* The type of status message being requested */
56746b0868db [gaim-migrate @ 3229]
Sean Egan <seanegan@gmail.com>
parents: 3159
diff changeset
914 if (type & AIM_ICQ_STATE_CHAT)
56746b0868db [gaim-migrate @ 3229]
Sean Egan <seanegan@gmail.com>
parents: 3159
diff changeset
915 aimbs_putle16(&fr->data, 0x03ec);
56746b0868db [gaim-migrate @ 3229]
Sean Egan <seanegan@gmail.com>
parents: 3159
diff changeset
916 else if(type & AIM_ICQ_STATE_DND)
56746b0868db [gaim-migrate @ 3229]
Sean Egan <seanegan@gmail.com>
parents: 3159
diff changeset
917 aimbs_putle16(&fr->data, 0x03eb);
56746b0868db [gaim-migrate @ 3229]
Sean Egan <seanegan@gmail.com>
parents: 3159
diff changeset
918 else if(type & AIM_ICQ_STATE_OUT)
56746b0868db [gaim-migrate @ 3229]
Sean Egan <seanegan@gmail.com>
parents: 3159
diff changeset
919 aimbs_putle16(&fr->data, 0x03ea);
56746b0868db [gaim-migrate @ 3229]
Sean Egan <seanegan@gmail.com>
parents: 3159
diff changeset
920 else if(type & AIM_ICQ_STATE_BUSY)
56746b0868db [gaim-migrate @ 3229]
Sean Egan <seanegan@gmail.com>
parents: 3159
diff changeset
921 aimbs_putle16(&fr->data, 0x03e9);
56746b0868db [gaim-migrate @ 3229]
Sean Egan <seanegan@gmail.com>
parents: 3159
diff changeset
922 else if(type & AIM_ICQ_STATE_AWAY)
56746b0868db [gaim-migrate @ 3229]
Sean Egan <seanegan@gmail.com>
parents: 3159
diff changeset
923 aimbs_putle16(&fr->data, 0x03e8);
56746b0868db [gaim-migrate @ 3229]
Sean Egan <seanegan@gmail.com>
parents: 3159
diff changeset
924
56746b0868db [gaim-migrate @ 3229]
Sean Egan <seanegan@gmail.com>
parents: 3159
diff changeset
925 aimbs_putle16(&fr->data, 0x0000); /* Status? */
56746b0868db [gaim-migrate @ 3229]
Sean Egan <seanegan@gmail.com>
parents: 3159
diff changeset
926 aimbs_putle16(&fr->data, 0x0001); /* Priority of this message? */
4154
3468d666d3cc [gaim-migrate @ 4382]
Mark Doliner <mark@kingant.net>
parents: 4102
diff changeset
927 aimbs_putle16(&fr->data, 0x0001); /* L */
3468d666d3cc [gaim-migrate @ 4382]
Mark Doliner <mark@kingant.net>
parents: 4102
diff changeset
928 aimbs_putle8(&fr->data, 0x00); /* String of length L */
3212
56746b0868db [gaim-migrate @ 3229]
Sean Egan <seanegan@gmail.com>
parents: 3159
diff changeset
929 } /* End TLV t(2711) */
56746b0868db [gaim-migrate @ 3229]
Sean Egan <seanegan@gmail.com>
parents: 3159
diff changeset
930 } /* End TLV t(0005) */
56746b0868db [gaim-migrate @ 3229]
Sean Egan <seanegan@gmail.com>
parents: 3159
diff changeset
931
56746b0868db [gaim-migrate @ 3229]
Sean Egan <seanegan@gmail.com>
parents: 3159
diff changeset
932 /* TLV t(0003) */
56746b0868db [gaim-migrate @ 3229]
Sean Egan <seanegan@gmail.com>
parents: 3159
diff changeset
933 aimbs_put16(&fr->data, 0x0003);
56746b0868db [gaim-migrate @ 3229]
Sean Egan <seanegan@gmail.com>
parents: 3159
diff changeset
934 aimbs_put16(&fr->data, 0x0000);
56746b0868db [gaim-migrate @ 3229]
Sean Egan <seanegan@gmail.com>
parents: 3159
diff changeset
935
56746b0868db [gaim-migrate @ 3229]
Sean Egan <seanegan@gmail.com>
parents: 3159
diff changeset
936 aim_tx_enqueue(sess, fr);
56746b0868db [gaim-migrate @ 3229]
Sean Egan <seanegan@gmail.com>
parents: 3159
diff changeset
937
56746b0868db [gaim-migrate @ 3229]
Sean Egan <seanegan@gmail.com>
parents: 3159
diff changeset
938 return 0;
56746b0868db [gaim-migrate @ 3229]
Sean Egan <seanegan@gmail.com>
parents: 3159
diff changeset
939 }
56746b0868db [gaim-migrate @ 3229]
Sean Egan <seanegan@gmail.com>
parents: 3159
diff changeset
940
56746b0868db [gaim-migrate @ 3229]
Sean Egan <seanegan@gmail.com>
parents: 3159
diff changeset
941 /**
3952
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
942 * Subtype 0x0006
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
943 *
3141
bcdbffc2c3e6 [gaim-migrate @ 3156]
Rob Flynn <gaim@robflynn.com>
parents: 2869
diff changeset
944 * This can be used to send an ICQ authorization reply (deny or grant). It is the "old way."
bcdbffc2c3e6 [gaim-migrate @ 3156]
Rob Flynn <gaim@robflynn.com>
parents: 2869
diff changeset
945 * The new way is to use SSI. I like the new way a lot better. This seems like such a hack,
bcdbffc2c3e6 [gaim-migrate @ 3156]
Rob Flynn <gaim@robflynn.com>
parents: 2869
diff changeset
946 * mostly because it's in network byte order. Figuring this stuff out sometimes takes a while,
bcdbffc2c3e6 [gaim-migrate @ 3156]
Rob Flynn <gaim@robflynn.com>
parents: 2869
diff changeset
947 * but thats ok, because it gives me time to try to figure out what kind of drugs the AOL people
bcdbffc2c3e6 [gaim-migrate @ 3156]
Rob Flynn <gaim@robflynn.com>
parents: 2869
diff changeset
948 * were taking when they merged the two protocols.
bcdbffc2c3e6 [gaim-migrate @ 3156]
Rob Flynn <gaim@robflynn.com>
parents: 2869
diff changeset
949 *
3212
56746b0868db [gaim-migrate @ 3229]
Sean Egan <seanegan@gmail.com>
parents: 3159
diff changeset
950 * @param sn The destination screen name.
56746b0868db [gaim-migrate @ 3229]
Sean Egan <seanegan@gmail.com>
parents: 3159
diff changeset
951 * @param type The type of message. 0x0007 for authorization denied. 0x0008 for authorization granted.
56746b0868db [gaim-migrate @ 3229]
Sean Egan <seanegan@gmail.com>
parents: 3159
diff changeset
952 * @param message The message you want to send, it should be null terminated.
56746b0868db [gaim-migrate @ 3229]
Sean Egan <seanegan@gmail.com>
parents: 3159
diff changeset
953 * @return Return 0 if no errors, otherwise return the error number.
3141
bcdbffc2c3e6 [gaim-migrate @ 3156]
Rob Flynn <gaim@robflynn.com>
parents: 2869
diff changeset
954 */
bcdbffc2c3e6 [gaim-migrate @ 3156]
Rob Flynn <gaim@robflynn.com>
parents: 2869
diff changeset
955 faim_export int aim_send_im_ch4(aim_session_t *sess, char *sn, fu16_t type, fu8_t *message)
bcdbffc2c3e6 [gaim-migrate @ 3156]
Rob Flynn <gaim@robflynn.com>
parents: 2869
diff changeset
956 {
bcdbffc2c3e6 [gaim-migrate @ 3156]
Rob Flynn <gaim@robflynn.com>
parents: 2869
diff changeset
957 aim_conn_t *conn;
bcdbffc2c3e6 [gaim-migrate @ 3156]
Rob Flynn <gaim@robflynn.com>
parents: 2869
diff changeset
958 aim_frame_t *fr;
bcdbffc2c3e6 [gaim-migrate @ 3156]
Rob Flynn <gaim@robflynn.com>
parents: 2869
diff changeset
959 aim_snacid_t snacid;
bcdbffc2c3e6 [gaim-migrate @ 3156]
Rob Flynn <gaim@robflynn.com>
parents: 2869
diff changeset
960 int i;
bcdbffc2c3e6 [gaim-migrate @ 3156]
Rob Flynn <gaim@robflynn.com>
parents: 2869
diff changeset
961
bcdbffc2c3e6 [gaim-migrate @ 3156]
Rob Flynn <gaim@robflynn.com>
parents: 2869
diff changeset
962 if (!sess || !(conn = aim_conn_findbygroup(sess, 0x0002)))
bcdbffc2c3e6 [gaim-migrate @ 3156]
Rob Flynn <gaim@robflynn.com>
parents: 2869
diff changeset
963 return -EINVAL;
bcdbffc2c3e6 [gaim-migrate @ 3156]
Rob Flynn <gaim@robflynn.com>
parents: 2869
diff changeset
964
bcdbffc2c3e6 [gaim-migrate @ 3156]
Rob Flynn <gaim@robflynn.com>
parents: 2869
diff changeset
965 if (!sn || !type || !message)
bcdbffc2c3e6 [gaim-migrate @ 3156]
Rob Flynn <gaim@robflynn.com>
parents: 2869
diff changeset
966 return -EINVAL;
bcdbffc2c3e6 [gaim-migrate @ 3156]
Rob Flynn <gaim@robflynn.com>
parents: 2869
diff changeset
967
bcdbffc2c3e6 [gaim-migrate @ 3156]
Rob Flynn <gaim@robflynn.com>
parents: 2869
diff changeset
968 if (!(fr = aim_tx_new(sess, conn, AIM_FRAMETYPE_FLAP, 0x02, 10+8+3+strlen(sn)+12+strlen(message)+1+4)))
bcdbffc2c3e6 [gaim-migrate @ 3156]
Rob Flynn <gaim@robflynn.com>
parents: 2869
diff changeset
969 return -ENOMEM;
bcdbffc2c3e6 [gaim-migrate @ 3156]
Rob Flynn <gaim@robflynn.com>
parents: 2869
diff changeset
970
bcdbffc2c3e6 [gaim-migrate @ 3156]
Rob Flynn <gaim@robflynn.com>
parents: 2869
diff changeset
971 snacid = aim_cachesnac(sess, 0x0004, 0x0006, 0x0000, NULL, 0);
bcdbffc2c3e6 [gaim-migrate @ 3156]
Rob Flynn <gaim@robflynn.com>
parents: 2869
diff changeset
972 aim_putsnac(&fr->data, 0x0004, 0x0006, 0x0000, snacid);
bcdbffc2c3e6 [gaim-migrate @ 3156]
Rob Flynn <gaim@robflynn.com>
parents: 2869
diff changeset
973
bcdbffc2c3e6 [gaim-migrate @ 3156]
Rob Flynn <gaim@robflynn.com>
parents: 2869
diff changeset
974 /*
bcdbffc2c3e6 [gaim-migrate @ 3156]
Rob Flynn <gaim@robflynn.com>
parents: 2869
diff changeset
975 * Cookie
bcdbffc2c3e6 [gaim-migrate @ 3156]
Rob Flynn <gaim@robflynn.com>
parents: 2869
diff changeset
976 */
bcdbffc2c3e6 [gaim-migrate @ 3156]
Rob Flynn <gaim@robflynn.com>
parents: 2869
diff changeset
977 for (i=0; i<8; i++)
bcdbffc2c3e6 [gaim-migrate @ 3156]
Rob Flynn <gaim@robflynn.com>
parents: 2869
diff changeset
978 aimbs_put8(&fr->data, (fu8_t)rand());
bcdbffc2c3e6 [gaim-migrate @ 3156]
Rob Flynn <gaim@robflynn.com>
parents: 2869
diff changeset
979
bcdbffc2c3e6 [gaim-migrate @ 3156]
Rob Flynn <gaim@robflynn.com>
parents: 2869
diff changeset
980 /*
bcdbffc2c3e6 [gaim-migrate @ 3156]
Rob Flynn <gaim@robflynn.com>
parents: 2869
diff changeset
981 * Channel (4)
bcdbffc2c3e6 [gaim-migrate @ 3156]
Rob Flynn <gaim@robflynn.com>
parents: 2869
diff changeset
982 */
bcdbffc2c3e6 [gaim-migrate @ 3156]
Rob Flynn <gaim@robflynn.com>
parents: 2869
diff changeset
983 aimbs_put16(&fr->data, 0x0004);
bcdbffc2c3e6 [gaim-migrate @ 3156]
Rob Flynn <gaim@robflynn.com>
parents: 2869
diff changeset
984
bcdbffc2c3e6 [gaim-migrate @ 3156]
Rob Flynn <gaim@robflynn.com>
parents: 2869
diff changeset
985 /*
bcdbffc2c3e6 [gaim-migrate @ 3156]
Rob Flynn <gaim@robflynn.com>
parents: 2869
diff changeset
986 * Dest sn
bcdbffc2c3e6 [gaim-migrate @ 3156]
Rob Flynn <gaim@robflynn.com>
parents: 2869
diff changeset
987 */
bcdbffc2c3e6 [gaim-migrate @ 3156]
Rob Flynn <gaim@robflynn.com>
parents: 2869
diff changeset
988 aimbs_put8(&fr->data, strlen(sn));
bcdbffc2c3e6 [gaim-migrate @ 3156]
Rob Flynn <gaim@robflynn.com>
parents: 2869
diff changeset
989 aimbs_putraw(&fr->data, sn, strlen(sn));
bcdbffc2c3e6 [gaim-migrate @ 3156]
Rob Flynn <gaim@robflynn.com>
parents: 2869
diff changeset
990
bcdbffc2c3e6 [gaim-migrate @ 3156]
Rob Flynn <gaim@robflynn.com>
parents: 2869
diff changeset
991 /*
bcdbffc2c3e6 [gaim-migrate @ 3156]
Rob Flynn <gaim@robflynn.com>
parents: 2869
diff changeset
992 * TLV t(0005)
bcdbffc2c3e6 [gaim-migrate @ 3156]
Rob Flynn <gaim@robflynn.com>
parents: 2869
diff changeset
993 *
bcdbffc2c3e6 [gaim-migrate @ 3156]
Rob Flynn <gaim@robflynn.com>
parents: 2869
diff changeset
994 * ICQ data (the UIN and the message).
bcdbffc2c3e6 [gaim-migrate @ 3156]
Rob Flynn <gaim@robflynn.com>
parents: 2869
diff changeset
995 */
bcdbffc2c3e6 [gaim-migrate @ 3156]
Rob Flynn <gaim@robflynn.com>
parents: 2869
diff changeset
996 aimbs_put16(&fr->data, 0x0005);
bcdbffc2c3e6 [gaim-migrate @ 3156]
Rob Flynn <gaim@robflynn.com>
parents: 2869
diff changeset
997 aimbs_put16(&fr->data, 4 + 2+2+strlen(message)+1);
bcdbffc2c3e6 [gaim-migrate @ 3156]
Rob Flynn <gaim@robflynn.com>
parents: 2869
diff changeset
998
bcdbffc2c3e6 [gaim-migrate @ 3156]
Rob Flynn <gaim@robflynn.com>
parents: 2869
diff changeset
999 /*
bcdbffc2c3e6 [gaim-migrate @ 3156]
Rob Flynn <gaim@robflynn.com>
parents: 2869
diff changeset
1000 * Your UIN
bcdbffc2c3e6 [gaim-migrate @ 3156]
Rob Flynn <gaim@robflynn.com>
parents: 2869
diff changeset
1001 */
bcdbffc2c3e6 [gaim-migrate @ 3156]
Rob Flynn <gaim@robflynn.com>
parents: 2869
diff changeset
1002 aimbs_putle32(&fr->data, atoi(sess->sn));
bcdbffc2c3e6 [gaim-migrate @ 3156]
Rob Flynn <gaim@robflynn.com>
parents: 2869
diff changeset
1003
bcdbffc2c3e6 [gaim-migrate @ 3156]
Rob Flynn <gaim@robflynn.com>
parents: 2869
diff changeset
1004 /*
bcdbffc2c3e6 [gaim-migrate @ 3156]
Rob Flynn <gaim@robflynn.com>
parents: 2869
diff changeset
1005 * TLV t(type) l(strlen(message)+1) v(message+NULL)
bcdbffc2c3e6 [gaim-migrate @ 3156]
Rob Flynn <gaim@robflynn.com>
parents: 2869
diff changeset
1006 */
bcdbffc2c3e6 [gaim-migrate @ 3156]
Rob Flynn <gaim@robflynn.com>
parents: 2869
diff changeset
1007 aimbs_putle16(&fr->data, type);
bcdbffc2c3e6 [gaim-migrate @ 3156]
Rob Flynn <gaim@robflynn.com>
parents: 2869
diff changeset
1008 aimbs_putle16(&fr->data, strlen(message)+1);
bcdbffc2c3e6 [gaim-migrate @ 3156]
Rob Flynn <gaim@robflynn.com>
parents: 2869
diff changeset
1009 aimbs_putraw(&fr->data, message, strlen(message)+1);
bcdbffc2c3e6 [gaim-migrate @ 3156]
Rob Flynn <gaim@robflynn.com>
parents: 2869
diff changeset
1010
bcdbffc2c3e6 [gaim-migrate @ 3156]
Rob Flynn <gaim@robflynn.com>
parents: 2869
diff changeset
1011 /*
bcdbffc2c3e6 [gaim-migrate @ 3156]
Rob Flynn <gaim@robflynn.com>
parents: 2869
diff changeset
1012 * TLV t(0006) l(0000) v()
bcdbffc2c3e6 [gaim-migrate @ 3156]
Rob Flynn <gaim@robflynn.com>
parents: 2869
diff changeset
1013 */
bcdbffc2c3e6 [gaim-migrate @ 3156]
Rob Flynn <gaim@robflynn.com>
parents: 2869
diff changeset
1014 aimbs_put16(&fr->data, 0x0006);
bcdbffc2c3e6 [gaim-migrate @ 3156]
Rob Flynn <gaim@robflynn.com>
parents: 2869
diff changeset
1015 aimbs_put16(&fr->data, 0x0000);
bcdbffc2c3e6 [gaim-migrate @ 3156]
Rob Flynn <gaim@robflynn.com>
parents: 2869
diff changeset
1016
bcdbffc2c3e6 [gaim-migrate @ 3156]
Rob Flynn <gaim@robflynn.com>
parents: 2869
diff changeset
1017 aim_tx_enqueue(sess, fr);
bcdbffc2c3e6 [gaim-migrate @ 3156]
Rob Flynn <gaim@robflynn.com>
parents: 2869
diff changeset
1018
bcdbffc2c3e6 [gaim-migrate @ 3156]
Rob Flynn <gaim@robflynn.com>
parents: 2869
diff changeset
1019 return 0;
bcdbffc2c3e6 [gaim-migrate @ 3156]
Rob Flynn <gaim@robflynn.com>
parents: 2869
diff changeset
1020 }
bcdbffc2c3e6 [gaim-migrate @ 3156]
Rob Flynn <gaim@robflynn.com>
parents: 2869
diff changeset
1021
2246
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
1022 static int outgoingim(aim_session_t *sess, aim_module_t *mod, aim_frame_t *rx, aim_modsnac_t *snac, aim_bstream_t *bs)
2086
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
1023 {
2246
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
1024 int i, ret = 0;
2167
edf8c5a70e5b [gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2122
diff changeset
1025 aim_rxcallback_t userfunc;
2246
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
1026 fu8_t cookie[8];
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
1027 fu16_t channel;
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
1028 aim_tlvlist_t *tlvlist;
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
1029 char *sn;
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
1030 int snlen;
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
1031 fu16_t icbmflags = 0;
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
1032 fu8_t flag1 = 0, flag2 = 0;
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
1033 fu8_t *msg = NULL;
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
1034 aim_tlv_t *msgblock;
2086
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
1035
2167
edf8c5a70e5b [gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2122
diff changeset
1036 /* ICBM Cookie. */
edf8c5a70e5b [gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2122
diff changeset
1037 for (i = 0; i < 8; i++)
2246
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
1038 cookie[i] = aimbs_get8(bs);
2086
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
1039
2167
edf8c5a70e5b [gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2122
diff changeset
1040 /* Channel ID */
2246
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
1041 channel = aimbs_get16(bs);
2086
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
1042
2167
edf8c5a70e5b [gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2122
diff changeset
1043 if (channel != 0x01) {
edf8c5a70e5b [gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2122
diff changeset
1044 faimdprintf(sess, 0, "icbm: ICBM recieved on unsupported channel. Ignoring. (chan = %04x)\n", channel);
2246
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
1045 return 0;
2167
edf8c5a70e5b [gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2122
diff changeset
1046 }
2086
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
1047
2246
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
1048 snlen = aimbs_get8(bs);
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
1049 sn = aimbs_getstr(bs, snlen);
2086
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
1050
2246
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
1051 tlvlist = aim_readtlvchain(bs);
2086
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
1052
2167
edf8c5a70e5b [gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2122
diff changeset
1053 if (aim_gettlv(tlvlist, 0x0003, 1))
edf8c5a70e5b [gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2122
diff changeset
1054 icbmflags |= AIM_IMFLAGS_ACK;
edf8c5a70e5b [gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2122
diff changeset
1055 if (aim_gettlv(tlvlist, 0x0004, 1))
edf8c5a70e5b [gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2122
diff changeset
1056 icbmflags |= AIM_IMFLAGS_AWAY;
2086
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
1057
2246
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
1058 if ((msgblock = aim_gettlv(tlvlist, 0x0002, 1))) {
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
1059 aim_bstream_t mbs;
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
1060 int featurelen, msglen;
2086
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
1061
2246
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
1062 aim_bstream_init(&mbs, msgblock->value, msgblock->length);
2167
edf8c5a70e5b [gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2122
diff changeset
1063
2246
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
1064 aimbs_get8(&mbs);
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
1065 aimbs_get8(&mbs);
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
1066 for (featurelen = aimbs_get16(&mbs); featurelen; featurelen--)
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
1067 aimbs_get8(&mbs);
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
1068 aimbs_get8(&mbs);
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
1069 aimbs_get8(&mbs);
2086
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
1070
2246
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
1071 msglen = aimbs_get16(&mbs) - 4; /* final block length */
2167
edf8c5a70e5b [gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2122
diff changeset
1072
2246
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
1073 flag1 = aimbs_get16(&mbs);
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
1074 flag2 = aimbs_get16(&mbs);
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
1075
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
1076 msg = aimbs_getstr(&mbs, msglen);
2167
edf8c5a70e5b [gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2122
diff changeset
1077 }
2086
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
1078
2167
edf8c5a70e5b [gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2122
diff changeset
1079 if ((userfunc = aim_callhandler(sess, rx->conn, snac->family, snac->subtype)))
edf8c5a70e5b [gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2122
diff changeset
1080 ret = userfunc(sess, rx, channel, sn, msg, icbmflags, flag1, flag2);
2086
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
1081
2246
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
1082 free(sn);
2167
edf8c5a70e5b [gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2122
diff changeset
1083 aim_freetlvchain(&tlvlist);
edf8c5a70e5b [gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2122
diff changeset
1084
edf8c5a70e5b [gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2122
diff changeset
1085 return ret;
2086
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
1086 }
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
1087
2167
edf8c5a70e5b [gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2122
diff changeset
1088 /*
2270
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1089 * Ahh, the joys of nearly ridiculous over-engineering.
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1090 *
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1091 * Not only do AIM ICBM's support multiple channels. Not only do they
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1092 * support multiple character sets. But they support multiple character
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1093 * sets / encodings within the same ICBM.
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1094 *
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1095 * These multipart messages allow for complex space savings techniques, which
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1096 * seem utterly unnecessary by today's standards. In fact, there is only
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1097 * one client still in popular use that still uses this method: AOL for the
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1098 * Macintosh, Version 5.0. Obscure, yes, I know.
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1099 *
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1100 * In modern (non-"legacy") clients, if the user tries to send a character
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1101 * that is not ISO-8859-1 or ASCII, the client will send the entire message
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1102 * as UNICODE, meaning that every character in the message will occupy the
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1103 * full 16 bit UNICODE field, even if the high order byte would be zero.
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1104 * Multipart messages prevent this wasted space by allowing the client to
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1105 * only send the characters in UNICODE that need to be sent that way, and
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1106 * the rest of the message can be sent in whatever the native character
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1107 * set is (probably ASCII).
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1108 *
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1109 * An important note is that sections will be displayed in the order that
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1110 * they appear in the ICBM. There is no facility for merging or rearranging
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1111 * sections at run time. So if you have, say, ASCII then UNICODE then ASCII,
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1112 * you must supply two ASCII sections with a UNICODE in the middle, and incur
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1113 * the associated overhead.
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1114 *
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1115 * Normally I would have laughed and given a firm 'no' to supporting this
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1116 * seldom-used feature, but something is attracting me to it. In the future,
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1117 * it may be possible to abuse this to send mixed-media messages to other
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1118 * open source clients (like encryption or something) -- see faimtest for
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1119 * examples of how to do this.
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1120 *
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1121 * I would definitly recommend avoiding this feature unless you really
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1122 * know what you are doing, and/or you have something neat to do with it.
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1123 *
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1124 */
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1125 faim_export int aim_mpmsg_init(aim_session_t *sess, aim_mpmsg_t *mpm)
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1126 {
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1127
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1128 memset(mpm, 0, sizeof(aim_mpmsg_t));
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1129
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1130 return 0;
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1131 }
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1132
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1133 static int mpmsg_addsection(aim_session_t *sess, aim_mpmsg_t *mpm, fu16_t charset, fu16_t charsubset, fu8_t *data, fu16_t datalen)
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1134 {
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1135 aim_mpmsg_section_t *sec;
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1136
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1137 if (!(sec = malloc(sizeof(aim_mpmsg_section_t))))
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1138 return -1;
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1139
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1140 sec->charset = charset;
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1141 sec->charsubset = charsubset;
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1142 sec->data = data;
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1143 sec->datalen = datalen;
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1144 sec->next = NULL;
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1145
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1146 if (!mpm->parts)
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1147 mpm->parts = sec;
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1148 else {
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1149 aim_mpmsg_section_t *cur;
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1150
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1151 for (cur = mpm->parts; cur->next; cur = cur->next)
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1152 ;
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1153 cur->next = sec;
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1154 }
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1155
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1156 mpm->numparts++;
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1157
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1158 return 0;
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1159 }
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1160
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1161 faim_export int aim_mpmsg_addraw(aim_session_t *sess, aim_mpmsg_t *mpm, fu16_t charset, fu16_t charsubset, const fu8_t *data, fu16_t datalen)
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1162 {
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1163 fu8_t *dup;
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1164
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1165 if (!(dup = malloc(datalen)))
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1166 return -1;
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1167 memcpy(dup, data, datalen);
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1168
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1169 if (mpmsg_addsection(sess, mpm, charset, charsubset, dup, datalen) == -1) {
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1170 free(dup);
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1171 return -1;
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1172 }
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1173
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1174 return 0;
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1175 }
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1176
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1177 /* XXX should provide a way of saying ISO-8859-1 specifically */
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1178 faim_export int aim_mpmsg_addascii(aim_session_t *sess, aim_mpmsg_t *mpm, const char *ascii)
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1179 {
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1180 fu8_t *dup;
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1181
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1182 if (!(dup = strdup(ascii)))
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1183 return -1;
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1184
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1185 if (mpmsg_addsection(sess, mpm, 0x0000, 0x0000, dup, strlen(ascii)) == -1) {
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1186 free(dup);
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1187 return -1;
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1188 }
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1189
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1190 return 0;
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1191 }
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1192
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1193 faim_export int aim_mpmsg_addunicode(aim_session_t *sess, aim_mpmsg_t *mpm, const fu16_t *unicode, fu16_t unicodelen)
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1194 {
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1195 fu8_t *buf;
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1196 aim_bstream_t bs;
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1197 int i;
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1198
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1199 if (!(buf = malloc(unicodelen * 2)))
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1200 return -1;
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1201
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1202 aim_bstream_init(&bs, buf, unicodelen * 2);
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1203
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1204 /* We assume unicode is in /host/ byte order -- convert to network */
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1205 for (i = 0; i < unicodelen; i++)
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1206 aimbs_put16(&bs, unicode[i]);
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1207
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1208 if (mpmsg_addsection(sess, mpm, 0x0002, 0x0000, buf, aim_bstream_curpos(&bs)) == -1) {
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1209 free(buf);
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1210 return -1;
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1211 }
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1212
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1213 return 0;
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1214 }
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1215
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1216 faim_export void aim_mpmsg_free(aim_session_t *sess, aim_mpmsg_t *mpm)
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1217 {
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1218 aim_mpmsg_section_t *cur;
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1219
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1220 for (cur = mpm->parts; cur; ) {
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1221 aim_mpmsg_section_t *tmp;
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1222
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1223 tmp = cur->next;
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1224 free(cur->data);
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1225 free(cur);
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1226 cur = tmp;
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1227 }
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1228
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1229 mpm->numparts = 0;
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1230 mpm->parts = NULL;
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1231
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1232 return;
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1233 }
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1234
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1235 /*
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1236 * Start by building the multipart structures, then pick the first
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1237 * human-readable section and stuff it into args->msg so no one gets
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1238 * suspicious.
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1239 *
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1240 */
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1241 static int incomingim_ch1_parsemsgs(aim_session_t *sess, fu8_t *data, int len, struct aim_incomingim_ch1_args *args)
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1242 {
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1243 static const fu16_t charsetpri[] = {
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1244 0x0000, /* ASCII first */
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1245 0x0003, /* then ISO-8859-1 */
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1246 0x0002, /* UNICODE as last resort */
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1247 };
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1248 static const int charsetpricount = 3;
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1249 int i;
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1250 aim_bstream_t mbs;
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1251 aim_mpmsg_section_t *sec;
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1252
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1253 aim_bstream_init(&mbs, data, len);
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1254
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1255 while (aim_bstream_empty(&mbs)) {
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1256 fu16_t msglen, flag1, flag2;
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1257 fu8_t *msgbuf;
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1258
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1259 aimbs_get8(&mbs); /* 01 */
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1260 aimbs_get8(&mbs); /* 01 */
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1261
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1262 /* Message string length, including character set info. */
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1263 msglen = aimbs_get16(&mbs);
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1264
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1265 /* Character set info */
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1266 flag1 = aimbs_get16(&mbs);
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1267 flag2 = aimbs_get16(&mbs);
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1268
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1269 /* Message. */
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1270 msglen -= 4;
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1271
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1272 /*
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1273 * For now, we don't care what the encoding is. Just copy
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1274 * it into a multipart struct and deal with it later. However,
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1275 * always pad the ending with a NULL. This makes it easier
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1276 * to treat ASCII sections as strings. It won't matter for
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1277 * UNICODE or binary data, as you should never read past
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1278 * the specified data length, which will not include the pad.
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1279 *
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1280 * XXX There's an API bug here. For sending, the UNICODE is
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1281 * given in host byte order (aim_mpmsg_addunicode), but here
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1282 * the received messages are given in network byte order.
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1283 *
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1284 */
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1285 msgbuf = aimbs_getstr(&mbs, msglen);
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1286 mpmsg_addsection(sess, &args->mpmsg, flag1, flag2, msgbuf, msglen);
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1287
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1288 } /* while */
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1289
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1290 args->icbmflags |= AIM_IMFLAGS_MULTIPART; /* always set */
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1291
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1292 /*
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1293 * Clients that support multiparts should never use args->msg, as it
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1294 * will point to an arbitrary section.
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1295 *
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1296 * Here, we attempt to provide clients that do not support multipart
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1297 * messages with something to look at -- hopefully a human-readable
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1298 * string. But, failing that, a UNICODE message, or nothing at all.
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1299 *
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1300 * Which means that even if args->msg is NULL, it does not mean the
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1301 * message was blank.
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1302 *
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1303 */
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1304 for (i = 0; i < charsetpricount; i++) {
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1305 for (sec = args->mpmsg.parts; sec; sec = sec->next) {
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1306
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1307 if (sec->charset != charsetpri[i])
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1308 continue;
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1309
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1310 /* Great. We found one. Fill it in. */
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1311 args->charset = sec->charset;
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1312 args->charsubset = sec->charsubset;
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1313 args->icbmflags |= AIM_IMFLAGS_CUSTOMCHARSET;
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1314
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1315 /* Set up the simple flags */
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1316 if (args->charset == 0x0000)
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1317 ; /* ASCII */
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1318 else if (args->charset == 0x0002)
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1319 args->icbmflags |= AIM_IMFLAGS_UNICODE;
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1320 else if (args->charset == 0x0003)
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1321 args->icbmflags |= AIM_IMFLAGS_ISO_8859_1;
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1322 else if (args->charset == 0xffff)
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1323 ; /* no encoding (yeep!) */
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1324
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1325 if (args->charsubset == 0x0000)
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1326 ; /* standard subencoding? */
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1327 else if (args->charsubset == 0x000b)
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1328 args->icbmflags |= AIM_IMFLAGS_SUBENC_MACINTOSH;
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1329 else if (args->charsubset == 0xffff)
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1330 ; /* no subencoding */
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1331 #if 0
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1332 /* XXX this isn't really necesary... */
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1333 if ( ((args.flag1 != 0x0000) &&
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1334 (args.flag1 != 0x0002) &&
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1335 (args.flag1 != 0x0003) &&
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1336 (args.flag1 != 0xffff)) ||
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1337 ((args.flag2 != 0x0000) &&
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1338 (args.flag2 != 0x000b) &&
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1339 (args.flag2 != 0xffff))) {
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1340 faimdprintf(sess, 0, "icbm: **warning: encoding flags are being used! {%04x, %04x}\n", args.flag1, args.flag2);
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1341 }
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1342 #endif
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1343
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1344 args->msg = sec->data;
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1345 args->msglen = sec->datalen;
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1346
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1347 return 0;
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1348 }
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1349 }
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1350
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1351 /* No human-readable sections found. Oh well. */
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1352 args->charset = args->charsubset = 0xffff;
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1353 args->msg = NULL;
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1354 args->msglen = 0;
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1355
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1356 return 0;
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1357 }
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1358
2421
95b4ec08abec [gaim-migrate @ 2434]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2341
diff changeset
1359 static int incomingim_ch1(aim_session_t *sess, aim_module_t *mod, aim_frame_t *rx, aim_modsnac_t *snac, fu16_t channel, aim_userinfo_t *userinfo, aim_bstream_t *bs, fu8_t *cookie)
2086
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
1360 {
2246
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
1361 fu16_t type, length;
2167
edf8c5a70e5b [gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2122
diff changeset
1362 aim_rxcallback_t userfunc;
2246
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
1363 int ret = 0;
2167
edf8c5a70e5b [gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2122
diff changeset
1364 struct aim_incomingim_ch1_args args;
2246
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
1365 int endpos;
2086
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
1366
2167
edf8c5a70e5b [gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2122
diff changeset
1367 memset(&args, 0, sizeof(args));
2086
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
1368
2270
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1369 aim_mpmsg_init(sess, &args.mpmsg);
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1370
2167
edf8c5a70e5b [gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2122
diff changeset
1371 /*
edf8c5a70e5b [gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2122
diff changeset
1372 * This used to be done using tlvchains. For performance reasons,
edf8c5a70e5b [gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2122
diff changeset
1373 * I've changed it to process the TLVs in-place. This avoids lots
edf8c5a70e5b [gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2122
diff changeset
1374 * of per-IM memory allocations.
edf8c5a70e5b [gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2122
diff changeset
1375 */
2246
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
1376 while (aim_bstream_empty(bs)) {
2086
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
1377
2246
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
1378 type = aimbs_get16(bs);
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
1379 length = aimbs_get16(bs);
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
1380
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
1381 endpos = aim_bstream_curpos(bs) + length;
2167
edf8c5a70e5b [gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2122
diff changeset
1382
edf8c5a70e5b [gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2122
diff changeset
1383 if (type == 0x0002) { /* Message Block */
2086
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
1384
2167
edf8c5a70e5b [gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2122
diff changeset
1385 /*
2246
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
1386 * This TLV consists of the following:
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
1387 * - 0501 -- Unknown
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
1388 * - Features: Don't know how to interpret these
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
1389 * - 0101 -- Unknown
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
1390 * - Message
2167
edf8c5a70e5b [gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2122
diff changeset
1391 *
edf8c5a70e5b [gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2122
diff changeset
1392 */
2086
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
1393
2246
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
1394 aimbs_get8(bs); /* 05 */
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
1395 aimbs_get8(bs); /* 01 */
2086
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
1396
2246
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
1397 args.featureslen = aimbs_get16(bs);
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
1398 /* XXX XXX this is all evil! */
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
1399 args.features = bs->data + bs->offset;
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
1400 aim_bstream_advance(bs, args.featureslen);
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
1401 args.icbmflags |= AIM_IMFLAGS_CUSTOMFEATURES;
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
1402
2270
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1403 /*
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1404 * The rest of the TLV contains one or more message
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1405 * blocks...
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1406 */
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1407 incomingim_ch1_parsemsgs(sess, bs->data + bs->offset /* XXX evil!!! */, length - 2 - 2 - args.featureslen, &args);
2086
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
1408
2167
edf8c5a70e5b [gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2122
diff changeset
1409 } else if (type == 0x0003) { /* Server Ack Requested */
edf8c5a70e5b [gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2122
diff changeset
1410
edf8c5a70e5b [gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2122
diff changeset
1411 args.icbmflags |= AIM_IMFLAGS_ACK;
2086
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
1412
2167
edf8c5a70e5b [gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2122
diff changeset
1413 } else if (type == 0x0004) { /* Message is Auto Response */
2086
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
1414
2167
edf8c5a70e5b [gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2122
diff changeset
1415 args.icbmflags |= AIM_IMFLAGS_AWAY;
2086
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
1416
2703
441b84ab7f4e [gaim-migrate @ 2716]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2673
diff changeset
1417 } else if (type == 0x0006) { /* Message was received offline. */
441b84ab7f4e [gaim-migrate @ 2716]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2673
diff changeset
1418
441b84ab7f4e [gaim-migrate @ 2716]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2673
diff changeset
1419 /* XXX not sure if this actually gets sent. */
441b84ab7f4e [gaim-migrate @ 2716]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2673
diff changeset
1420 args.icbmflags |= AIM_IMFLAGS_OFFLINE;
441b84ab7f4e [gaim-migrate @ 2716]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2673
diff changeset
1421
2246
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
1422 } else if (type == 0x0008) { /* I-HAVE-A-REALLY-PURTY-ICON Flag */
2086
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
1423
2246
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
1424 args.iconlen = aimbs_get32(bs);
2626
93f9bbd62630 [gaim-migrate @ 2639]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2507
diff changeset
1425 aimbs_get16(bs); /* 0x0001 */
93f9bbd62630 [gaim-migrate @ 2639]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2507
diff changeset
1426 args.iconsum = aimbs_get16(bs);
2246
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
1427 args.iconstamp = aimbs_get32(bs);
2869
9b029055cfba [gaim-migrate @ 2882]
Adam Fritzler <mid@auk.cx>
parents: 2866
diff changeset
1428
9b029055cfba [gaim-migrate @ 2882]
Adam Fritzler <mid@auk.cx>
parents: 2866
diff changeset
1429 /*
9b029055cfba [gaim-migrate @ 2882]
Adam Fritzler <mid@auk.cx>
parents: 2866
diff changeset
1430 * This looks to be a client bug. MacAIM 4.3 will
9b029055cfba [gaim-migrate @ 2882]
Adam Fritzler <mid@auk.cx>
parents: 2866
diff changeset
1431 * send this tag, but with all zero values, in the
9b029055cfba [gaim-migrate @ 2882]
Adam Fritzler <mid@auk.cx>
parents: 2866
diff changeset
1432 * first message of a conversation. This makes no
9b029055cfba [gaim-migrate @ 2882]
Adam Fritzler <mid@auk.cx>
parents: 2866
diff changeset
1433 * sense whatsoever, so I'm going to say its a bug.
9b029055cfba [gaim-migrate @ 2882]
Adam Fritzler <mid@auk.cx>
parents: 2866
diff changeset
1434 *
9b029055cfba [gaim-migrate @ 2882]
Adam Fritzler <mid@auk.cx>
parents: 2866
diff changeset
1435 * You really shouldn't advertise a zero-length icon
9b029055cfba [gaim-migrate @ 2882]
Adam Fritzler <mid@auk.cx>
parents: 2866
diff changeset
1436 * anyway.
9b029055cfba [gaim-migrate @ 2882]
Adam Fritzler <mid@auk.cx>
parents: 2866
diff changeset
1437 *
9b029055cfba [gaim-migrate @ 2882]
Adam Fritzler <mid@auk.cx>
parents: 2866
diff changeset
1438 */
9b029055cfba [gaim-migrate @ 2882]
Adam Fritzler <mid@auk.cx>
parents: 2866
diff changeset
1439 if (args.iconlen)
9b029055cfba [gaim-migrate @ 2882]
Adam Fritzler <mid@auk.cx>
parents: 2866
diff changeset
1440 args.icbmflags |= AIM_IMFLAGS_HASICON;
2086
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
1441
2167
edf8c5a70e5b [gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2122
diff changeset
1442 } else if (type == 0x0009) {
edf8c5a70e5b [gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2122
diff changeset
1443
edf8c5a70e5b [gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2122
diff changeset
1444 args.icbmflags |= AIM_IMFLAGS_BUDDYREQ;
2086
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
1445
3595
1e60a05c7482 [gaim-migrate @ 3697]
Mark Doliner <mark@kingant.net>
parents: 3255
diff changeset
1446 } else if (type == 0x000b) { /* Non-direct connect typing notification */
1e60a05c7482 [gaim-migrate @ 3697]
Mark Doliner <mark@kingant.net>
parents: 3255
diff changeset
1447
1e60a05c7482 [gaim-migrate @ 3697]
Mark Doliner <mark@kingant.net>
parents: 3255
diff changeset
1448 args.icbmflags |= AIM_IMFLAGS_TYPINGNOT;
1e60a05c7482 [gaim-migrate @ 3697]
Mark Doliner <mark@kingant.net>
parents: 3255
diff changeset
1449
2167
edf8c5a70e5b [gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2122
diff changeset
1450 } else if (type == 0x0017) {
2086
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
1451
2167
edf8c5a70e5b [gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2122
diff changeset
1452 args.extdatalen = length;
2246
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
1453 args.extdata = aimbs_getraw(bs, args.extdatalen);
2086
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
1454
2167
edf8c5a70e5b [gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2122
diff changeset
1455 } else {
edf8c5a70e5b [gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2122
diff changeset
1456 faimdprintf(sess, 0, "incomingim_ch1: unknown TLV 0x%04x (len %d)\n", type, length);
edf8c5a70e5b [gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2122
diff changeset
1457 }
2086
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
1458
2246
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
1459 /*
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
1460 * This is here to protect ourselves from ourselves. That
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
1461 * is, if something above doesn't completly parse its value
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
1462 * section, or, worse, overparses it, this will set the
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
1463 * stream where it needs to be in order to land on the next
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
1464 * TLV when the loop continues.
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
1465 *
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
1466 */
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
1467 aim_bstream_setpos(bs, endpos);
2167
edf8c5a70e5b [gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2122
diff changeset
1468 }
2086
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
1469
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
1470
2167
edf8c5a70e5b [gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2122
diff changeset
1471 if ((userfunc = aim_callhandler(sess, rx->conn, snac->family, snac->subtype)))
edf8c5a70e5b [gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2122
diff changeset
1472 ret = userfunc(sess, rx, channel, userinfo, &args);
2086
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
1473
2270
d82efea341ef [gaim-migrate @ 2280]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2246
diff changeset
1474 aim_mpmsg_free(sess, &args.mpmsg);
2246
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
1475 free(args.extdata);
2086
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
1476
2167
edf8c5a70e5b [gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2122
diff changeset
1477 return ret;
2086
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
1478 }
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
1479
2869
9b029055cfba [gaim-migrate @ 2882]
Adam Fritzler <mid@auk.cx>
parents: 2866
diff changeset
1480 static void incomingim_ch2_buddylist(aim_session_t *sess, aim_module_t *mod, aim_frame_t *rx, aim_modsnac_t *snac, aim_userinfo_t *userinfo, struct aim_incomingim_ch2_args *args, aim_bstream_t *servdata)
2246
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
1481 {
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
1482
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
1483 /*
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
1484 * This goes like this...
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
1485 *
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
1486 * group name length
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
1487 * group name
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
1488 * num of buddies in group
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
1489 * buddy name length
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
1490 * buddy name
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
1491 * buddy name length
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
1492 * buddy name
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
1493 * ...
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
1494 * group name length
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
1495 * group name
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
1496 * num of buddies in group
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
1497 * buddy name length
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
1498 * buddy name
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
1499 * ...
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
1500 * ...
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
1501 */
2869
9b029055cfba [gaim-migrate @ 2882]
Adam Fritzler <mid@auk.cx>
parents: 2866
diff changeset
1502 while (servdata && aim_bstream_empty(servdata)) {
2246
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
1503 fu16_t gnlen, numb;
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
1504 int i;
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
1505 char *gn;
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
1506
2869
9b029055cfba [gaim-migrate @ 2882]
Adam Fritzler <mid@auk.cx>
parents: 2866
diff changeset
1507 gnlen = aimbs_get16(servdata);
9b029055cfba [gaim-migrate @ 2882]
Adam Fritzler <mid@auk.cx>
parents: 2866
diff changeset
1508 gn = aimbs_getstr(servdata, gnlen);
9b029055cfba [gaim-migrate @ 2882]
Adam Fritzler <mid@auk.cx>
parents: 2866
diff changeset
1509 numb = aimbs_get16(servdata);
2246
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
1510
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
1511 for (i = 0; i < numb; i++) {
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
1512 fu16_t bnlen;
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
1513 char *bn;
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
1514
2869
9b029055cfba [gaim-migrate @ 2882]
Adam Fritzler <mid@auk.cx>
parents: 2866
diff changeset
1515 bnlen = aimbs_get16(servdata);
9b029055cfba [gaim-migrate @ 2882]
Adam Fritzler <mid@auk.cx>
parents: 2866
diff changeset
1516 bn = aimbs_getstr(servdata, bnlen);
2246
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
1517
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
1518 faimdprintf(sess, 0, "got a buddy list from %s: group %s, buddy %s\n", userinfo->sn, gn, bn);
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
1519
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
1520 free(bn);
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
1521 }
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
1522
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
1523 free(gn);
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
1524 }
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
1525
2869
9b029055cfba [gaim-migrate @ 2882]
Adam Fritzler <mid@auk.cx>
parents: 2866
diff changeset
1526 return;
2246
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
1527 }
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
1528
2869
9b029055cfba [gaim-migrate @ 2882]
Adam Fritzler <mid@auk.cx>
parents: 2866
diff changeset
1529 static void incomingim_ch2_buddyicon_free(aim_session_t *sess, struct aim_incomingim_ch2_args *args)
2086
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
1530 {
2246
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
1531
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
1532 free(args->info.icon.icon);
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
1533
2869
9b029055cfba [gaim-migrate @ 2882]
Adam Fritzler <mid@auk.cx>
parents: 2866
diff changeset
1534 return;
2246
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
1535 }
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
1536
2869
9b029055cfba [gaim-migrate @ 2882]
Adam Fritzler <mid@auk.cx>
parents: 2866
diff changeset
1537 static void incomingim_ch2_buddyicon(aim_session_t *sess, aim_module_t *mod, aim_frame_t *rx, aim_modsnac_t *snac, aim_userinfo_t *userinfo, struct aim_incomingim_ch2_args *args, aim_bstream_t *servdata)
2246
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
1538 {
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
1539
2869
9b029055cfba [gaim-migrate @ 2882]
Adam Fritzler <mid@auk.cx>
parents: 2866
diff changeset
1540 if (servdata) {
9b029055cfba [gaim-migrate @ 2882]
Adam Fritzler <mid@auk.cx>
parents: 2866
diff changeset
1541 args->info.icon.checksum = aimbs_get32(servdata);
9b029055cfba [gaim-migrate @ 2882]
Adam Fritzler <mid@auk.cx>
parents: 2866
diff changeset
1542 args->info.icon.length = aimbs_get32(servdata);
9b029055cfba [gaim-migrate @ 2882]
Adam Fritzler <mid@auk.cx>
parents: 2866
diff changeset
1543 args->info.icon.timestamp = aimbs_get32(servdata);
9b029055cfba [gaim-migrate @ 2882]
Adam Fritzler <mid@auk.cx>
parents: 2866
diff changeset
1544 args->info.icon.icon = aimbs_getraw(servdata, args->info.icon.length);
2246
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
1545 }
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
1546
2869
9b029055cfba [gaim-migrate @ 2882]
Adam Fritzler <mid@auk.cx>
parents: 2866
diff changeset
1547 args->destructor = (void *)incomingim_ch2_buddyicon_free;
2246
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
1548
2869
9b029055cfba [gaim-migrate @ 2882]
Adam Fritzler <mid@auk.cx>
parents: 2866
diff changeset
1549 return;
2246
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
1550 }
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
1551
2869
9b029055cfba [gaim-migrate @ 2882]
Adam Fritzler <mid@auk.cx>
parents: 2866
diff changeset
1552 static void incomingim_ch2_chat_free(aim_session_t *sess, struct aim_incomingim_ch2_args *args)
2246
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
1553 {
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
1554
2869
9b029055cfba [gaim-migrate @ 2882]
Adam Fritzler <mid@auk.cx>
parents: 2866
diff changeset
1555 /* XXX aim_chat_roominfo_free() */
9b029055cfba [gaim-migrate @ 2882]
Adam Fritzler <mid@auk.cx>
parents: 2866
diff changeset
1556 free(args->info.chat.roominfo.name);
2246
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
1557
2869
9b029055cfba [gaim-migrate @ 2882]
Adam Fritzler <mid@auk.cx>
parents: 2866
diff changeset
1558 return;
2246
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
1559 }
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
1560
2869
9b029055cfba [gaim-migrate @ 2882]
Adam Fritzler <mid@auk.cx>
parents: 2866
diff changeset
1561 static void incomingim_ch2_chat(aim_session_t *sess, aim_module_t *mod, aim_frame_t *rx, aim_modsnac_t *snac, aim_userinfo_t *userinfo, struct aim_incomingim_ch2_args *args, aim_bstream_t *servdata)
2246
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
1562 {
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
1563
2869
9b029055cfba [gaim-migrate @ 2882]
Adam Fritzler <mid@auk.cx>
parents: 2866
diff changeset
1564 /*
9b029055cfba [gaim-migrate @ 2882]
Adam Fritzler <mid@auk.cx>
parents: 2866
diff changeset
1565 * Chat room info.
9b029055cfba [gaim-migrate @ 2882]
Adam Fritzler <mid@auk.cx>
parents: 2866
diff changeset
1566 */
9b029055cfba [gaim-migrate @ 2882]
Adam Fritzler <mid@auk.cx>
parents: 2866
diff changeset
1567 if (servdata)
9b029055cfba [gaim-migrate @ 2882]
Adam Fritzler <mid@auk.cx>
parents: 2866
diff changeset
1568 aim_chat_readroominfo(servdata, &args->info.chat.roominfo);
2246
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
1569
2869
9b029055cfba [gaim-migrate @ 2882]
Adam Fritzler <mid@auk.cx>
parents: 2866
diff changeset
1570 args->destructor = (void *)incomingim_ch2_chat_free;
9b029055cfba [gaim-migrate @ 2882]
Adam Fritzler <mid@auk.cx>
parents: 2866
diff changeset
1571
9b029055cfba [gaim-migrate @ 2882]
Adam Fritzler <mid@auk.cx>
parents: 2866
diff changeset
1572 return;
9b029055cfba [gaim-migrate @ 2882]
Adam Fritzler <mid@auk.cx>
parents: 2866
diff changeset
1573 }
2246
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
1574
2869
9b029055cfba [gaim-migrate @ 2882]
Adam Fritzler <mid@auk.cx>
parents: 2866
diff changeset
1575 static void incomingim_ch2_icqserverrelay_free(aim_session_t *sess, struct aim_incomingim_ch2_args *args)
9b029055cfba [gaim-migrate @ 2882]
Adam Fritzler <mid@auk.cx>
parents: 2866
diff changeset
1576 {
2246
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
1577
2869
9b029055cfba [gaim-migrate @ 2882]
Adam Fritzler <mid@auk.cx>
parents: 2866
diff changeset
1578 free((char *)args->info.rtfmsg.rtfmsg);
2246
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
1579
2869
9b029055cfba [gaim-migrate @ 2882]
Adam Fritzler <mid@auk.cx>
parents: 2866
diff changeset
1580 return;
2246
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
1581 }
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
1582
2866
6d62d4520460 [gaim-migrate @ 2879]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2808
diff changeset
1583 /*
6d62d4520460 [gaim-migrate @ 2879]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2808
diff changeset
1584 * The relationship between AIM_CAPS_ICQSERVERRELAY and AIM_CAPS_ICQRTF is
6d62d4520460 [gaim-migrate @ 2879]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2808
diff changeset
1585 * kind of odd. This sends the client ICQRTF since that is all that I've seen
6d62d4520460 [gaim-migrate @ 2879]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2808
diff changeset
1586 * SERVERRELAY used for.
2869
9b029055cfba [gaim-migrate @ 2882]
Adam Fritzler <mid@auk.cx>
parents: 2866
diff changeset
1587 *
9b029055cfba [gaim-migrate @ 2882]
Adam Fritzler <mid@auk.cx>
parents: 2866
diff changeset
1588 * Note that this is all little-endian. Cringe.
9b029055cfba [gaim-migrate @ 2882]
Adam Fritzler <mid@auk.cx>
parents: 2866
diff changeset
1589 *
2866
6d62d4520460 [gaim-migrate @ 2879]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2808
diff changeset
1590 */
2869
9b029055cfba [gaim-migrate @ 2882]
Adam Fritzler <mid@auk.cx>
parents: 2866
diff changeset
1591 static void incomingim_ch2_icqserverrelay(aim_session_t *sess, aim_module_t *mod, aim_frame_t *rx, aim_modsnac_t *snac, aim_userinfo_t *userinfo, struct aim_incomingim_ch2_args *args, aim_bstream_t *servdata)
2866
6d62d4520460 [gaim-migrate @ 2879]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2808
diff changeset
1592 {
6d62d4520460 [gaim-migrate @ 2879]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2808
diff changeset
1593 fu16_t hdrlen, anslen, msglen;
6d62d4520460 [gaim-migrate @ 2879]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2808
diff changeset
1594 fu16_t msgtype;
6d62d4520460 [gaim-migrate @ 2879]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2808
diff changeset
1595
2869
9b029055cfba [gaim-migrate @ 2882]
Adam Fritzler <mid@auk.cx>
parents: 2866
diff changeset
1596 hdrlen = aimbs_getle16(servdata);
9b029055cfba [gaim-migrate @ 2882]
Adam Fritzler <mid@auk.cx>
parents: 2866
diff changeset
1597 aim_bstream_advance(servdata, hdrlen);
2866
6d62d4520460 [gaim-migrate @ 2879]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2808
diff changeset
1598
2869
9b029055cfba [gaim-migrate @ 2882]
Adam Fritzler <mid@auk.cx>
parents: 2866
diff changeset
1599 hdrlen = aimbs_getle16(servdata);
9b029055cfba [gaim-migrate @ 2882]
Adam Fritzler <mid@auk.cx>
parents: 2866
diff changeset
1600 aim_bstream_advance(servdata, hdrlen);
2866
6d62d4520460 [gaim-migrate @ 2879]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2808
diff changeset
1601
2869
9b029055cfba [gaim-migrate @ 2882]
Adam Fritzler <mid@auk.cx>
parents: 2866
diff changeset
1602 msgtype = aimbs_getle16(servdata);
2866
6d62d4520460 [gaim-migrate @ 2879]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2808
diff changeset
1603
2869
9b029055cfba [gaim-migrate @ 2882]
Adam Fritzler <mid@auk.cx>
parents: 2866
diff changeset
1604 anslen = aimbs_getle32(servdata);
9b029055cfba [gaim-migrate @ 2882]
Adam Fritzler <mid@auk.cx>
parents: 2866
diff changeset
1605 aim_bstream_advance(servdata, anslen);
2866
6d62d4520460 [gaim-migrate @ 2879]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2808
diff changeset
1606
2869
9b029055cfba [gaim-migrate @ 2882]
Adam Fritzler <mid@auk.cx>
parents: 2866
diff changeset
1607 msglen = aimbs_getle16(servdata);
9b029055cfba [gaim-migrate @ 2882]
Adam Fritzler <mid@auk.cx>
parents: 2866
diff changeset
1608 args->info.rtfmsg.rtfmsg = aimbs_getstr(servdata, msglen);
2866
6d62d4520460 [gaim-migrate @ 2879]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2808
diff changeset
1609
2869
9b029055cfba [gaim-migrate @ 2882]
Adam Fritzler <mid@auk.cx>
parents: 2866
diff changeset
1610 args->info.rtfmsg.fgcolor = aimbs_getle32(servdata);
9b029055cfba [gaim-migrate @ 2882]
Adam Fritzler <mid@auk.cx>
parents: 2866
diff changeset
1611 args->info.rtfmsg.bgcolor = aimbs_getle32(servdata);
2866
6d62d4520460 [gaim-migrate @ 2879]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2808
diff changeset
1612
2869
9b029055cfba [gaim-migrate @ 2882]
Adam Fritzler <mid@auk.cx>
parents: 2866
diff changeset
1613 hdrlen = aimbs_getle32(servdata);
9b029055cfba [gaim-migrate @ 2882]
Adam Fritzler <mid@auk.cx>
parents: 2866
diff changeset
1614 aim_bstream_advance(servdata, hdrlen);
2866
6d62d4520460 [gaim-migrate @ 2879]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2808
diff changeset
1615
2869
9b029055cfba [gaim-migrate @ 2882]
Adam Fritzler <mid@auk.cx>
parents: 2866
diff changeset
1616 /* XXX This is such a hack. */
2866
6d62d4520460 [gaim-migrate @ 2879]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2808
diff changeset
1617 args->reqclass = AIM_CAPS_ICQRTF;
6d62d4520460 [gaim-migrate @ 2879]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2808
diff changeset
1618
2869
9b029055cfba [gaim-migrate @ 2882]
Adam Fritzler <mid@auk.cx>
parents: 2866
diff changeset
1619 args->destructor = (void *)incomingim_ch2_icqserverrelay_free;
2866
6d62d4520460 [gaim-migrate @ 2879]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2808
diff changeset
1620
2869
9b029055cfba [gaim-migrate @ 2882]
Adam Fritzler <mid@auk.cx>
parents: 2866
diff changeset
1621 return;
2866
6d62d4520460 [gaim-migrate @ 2879]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2808
diff changeset
1622 }
6d62d4520460 [gaim-migrate @ 2879]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2808
diff changeset
1623
3630
9682c0e022c6 [gaim-migrate @ 3753]
Rob Flynn <gaim@robflynn.com>
parents: 3595
diff changeset
1624 static void incomingim_ch2_sendfile_free(aim_session_t *sess, struct aim_incomingim_ch2_args *args)
9682c0e022c6 [gaim-migrate @ 3753]
Rob Flynn <gaim@robflynn.com>
parents: 3595
diff changeset
1625 {
9682c0e022c6 [gaim-migrate @ 3753]
Rob Flynn <gaim@robflynn.com>
parents: 3595
diff changeset
1626 free(args->info.sendfile.filename);
9682c0e022c6 [gaim-migrate @ 3753]
Rob Flynn <gaim@robflynn.com>
parents: 3595
diff changeset
1627 }
9682c0e022c6 [gaim-migrate @ 3753]
Rob Flynn <gaim@robflynn.com>
parents: 3595
diff changeset
1628
9682c0e022c6 [gaim-migrate @ 3753]
Rob Flynn <gaim@robflynn.com>
parents: 3595
diff changeset
1629 static void incomingim_ch2_sendfile(aim_session_t *sess, aim_module_t *mod, aim_frame_t *rx, aim_modsnac_t *snac, aim_userinfo_t *userinfo, struct aim_incomingim_ch2_args *args, aim_bstream_t *servdata)
9682c0e022c6 [gaim-migrate @ 3753]
Rob Flynn <gaim@robflynn.com>
parents: 3595
diff changeset
1630 {
9682c0e022c6 [gaim-migrate @ 3753]
Rob Flynn <gaim@robflynn.com>
parents: 3595
diff changeset
1631
9682c0e022c6 [gaim-migrate @ 3753]
Rob Flynn <gaim@robflynn.com>
parents: 3595
diff changeset
1632 args->destructor = (void *)incomingim_ch2_sendfile_free;
9682c0e022c6 [gaim-migrate @ 3753]
Rob Flynn <gaim@robflynn.com>
parents: 3595
diff changeset
1633
9682c0e022c6 [gaim-migrate @ 3753]
Rob Flynn <gaim@robflynn.com>
parents: 3595
diff changeset
1634 if (servdata) {
3952
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
1635 int flen;
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
1636
3771
765769211688 [gaim-migrate @ 3910]
Rob Flynn <gaim@robflynn.com>
parents: 3752
diff changeset
1637 /* subtype is one of AIM_OFT_SUBTYPE_* */
765769211688 [gaim-migrate @ 3910]
Rob Flynn <gaim@robflynn.com>
parents: 3752
diff changeset
1638 args->info.sendfile.subtype = aimbs_get16(servdata);
3630
9682c0e022c6 [gaim-migrate @ 3753]
Rob Flynn <gaim@robflynn.com>
parents: 3595
diff changeset
1639 args->info.sendfile.totfiles = aimbs_get16(servdata);
9682c0e022c6 [gaim-migrate @ 3753]
Rob Flynn <gaim@robflynn.com>
parents: 3595
diff changeset
1640 args->info.sendfile.totsize = aimbs_get32(servdata);
3952
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
1641
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
1642 /* XXX - create an aimbs_getnullstr function */
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
1643 /* Use an inelegant way of getting the null-terminated filename,
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
1644 * since there's no easy bstream routine. */
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
1645 for (flen = 0; aimbs_get8(servdata); flen++);
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
1646 aim_bstream_advance(servdata, -flen -1);
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
1647 args->info.sendfile.filename = aimbs_getstr(servdata, flen);
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
1648
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
1649 /* There is sometimes more after the null-terminated filename,
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
1650 * but I'm unsure of its format. */
3630
9682c0e022c6 [gaim-migrate @ 3753]
Rob Flynn <gaim@robflynn.com>
parents: 3595
diff changeset
1651 }
9682c0e022c6 [gaim-migrate @ 3753]
Rob Flynn <gaim@robflynn.com>
parents: 3595
diff changeset
1652
9682c0e022c6 [gaim-migrate @ 3753]
Rob Flynn <gaim@robflynn.com>
parents: 3595
diff changeset
1653 return;
9682c0e022c6 [gaim-migrate @ 3753]
Rob Flynn <gaim@robflynn.com>
parents: 3595
diff changeset
1654 }
9682c0e022c6 [gaim-migrate @ 3753]
Rob Flynn <gaim@robflynn.com>
parents: 3595
diff changeset
1655
2869
9b029055cfba [gaim-migrate @ 2882]
Adam Fritzler <mid@auk.cx>
parents: 2866
diff changeset
1656 typedef void (*ch2_args_destructor_t)(aim_session_t *sess, struct aim_incomingim_ch2_args *args);
9b029055cfba [gaim-migrate @ 2882]
Adam Fritzler <mid@auk.cx>
parents: 2866
diff changeset
1657
2421
95b4ec08abec [gaim-migrate @ 2434]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2341
diff changeset
1658 static int incomingim_ch2(aim_session_t *sess, aim_module_t *mod, aim_frame_t *rx, aim_modsnac_t *snac, fu16_t channel, aim_userinfo_t *userinfo, aim_tlvlist_t *tlvlist, fu8_t *cookie)
2246
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
1659 {
2869
9b029055cfba [gaim-migrate @ 2882]
Adam Fritzler <mid@auk.cx>
parents: 2866
diff changeset
1660 aim_rxcallback_t userfunc;
9b029055cfba [gaim-migrate @ 2882]
Adam Fritzler <mid@auk.cx>
parents: 2866
diff changeset
1661 aim_tlv_t *block1, *servdatatlv;
2246
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
1662 aim_tlvlist_t *list2;
2869
9b029055cfba [gaim-migrate @ 2882]
Adam Fritzler <mid@auk.cx>
parents: 2866
diff changeset
1663 struct aim_incomingim_ch2_args args;
9b029055cfba [gaim-migrate @ 2882]
Adam Fritzler <mid@auk.cx>
parents: 2866
diff changeset
1664 aim_bstream_t bbs, sdbs, *sdbsptr = NULL;
9b029055cfba [gaim-migrate @ 2882]
Adam Fritzler <mid@auk.cx>
parents: 2866
diff changeset
1665 fu8_t *cookie2;
2167
edf8c5a70e5b [gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2122
diff changeset
1666 int ret = 0;
2869
9b029055cfba [gaim-migrate @ 2882]
Adam Fritzler <mid@auk.cx>
parents: 2866
diff changeset
1667
9b029055cfba [gaim-migrate @ 2882]
Adam Fritzler <mid@auk.cx>
parents: 2866
diff changeset
1668 char clientip1[30] = {""};
9b029055cfba [gaim-migrate @ 2882]
Adam Fritzler <mid@auk.cx>
parents: 2866
diff changeset
1669 char clientip2[30] = {""};
9b029055cfba [gaim-migrate @ 2882]
Adam Fritzler <mid@auk.cx>
parents: 2866
diff changeset
1670 char verifiedip[30] = {""};
2167
edf8c5a70e5b [gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2122
diff changeset
1671
edf8c5a70e5b [gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2122
diff changeset
1672 memset(&args, 0, sizeof(args));
2086
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
1673
2167
edf8c5a70e5b [gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2122
diff changeset
1674 /*
edf8c5a70e5b [gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2122
diff changeset
1675 * There's another block of TLVs embedded in the type 5 here.
edf8c5a70e5b [gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2122
diff changeset
1676 */
2869
9b029055cfba [gaim-migrate @ 2882]
Adam Fritzler <mid@auk.cx>
parents: 2866
diff changeset
1677 block1 = aim_gettlv(tlvlist, 0x0005, 1);
2246
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
1678 aim_bstream_init(&bbs, block1->value, block1->length);
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
1679
2167
edf8c5a70e5b [gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2122
diff changeset
1680 /*
edf8c5a70e5b [gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2122
diff changeset
1681 * First two bytes represent the status of the connection.
edf8c5a70e5b [gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2122
diff changeset
1682 *
3771
765769211688 [gaim-migrate @ 3910]
Rob Flynn <gaim@robflynn.com>
parents: 3752
diff changeset
1683 * 0 is a request, 1 is a cancel, 2 is an accept
2167
edf8c5a70e5b [gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2122
diff changeset
1684 */
2246
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
1685 args.status = aimbs_get16(&bbs);
2167
edf8c5a70e5b [gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2122
diff changeset
1686
edf8c5a70e5b [gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2122
diff changeset
1687 /*
edf8c5a70e5b [gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2122
diff changeset
1688 * Next comes the cookie. Should match the ICBM cookie.
edf8c5a70e5b [gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2122
diff changeset
1689 */
2246
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
1690 cookie2 = aimbs_getraw(&bbs, 8);
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
1691 if (memcmp(cookie, cookie2, 8) != 0)
2167
edf8c5a70e5b [gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2122
diff changeset
1692 faimdprintf(sess, 0, "rend: warning cookies don't match!\n");
2246
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
1693 memcpy(args.cookie, cookie2, 8);
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
1694 free(cookie2);
2086
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
1695
2167
edf8c5a70e5b [gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2122
diff changeset
1696 /*
edf8c5a70e5b [gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2122
diff changeset
1697 * The next 16bytes are a capability block so we can
edf8c5a70e5b [gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2122
diff changeset
1698 * identify what type of rendezvous this is.
edf8c5a70e5b [gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2122
diff changeset
1699 */
2869
9b029055cfba [gaim-migrate @ 2882]
Adam Fritzler <mid@auk.cx>
parents: 2866
diff changeset
1700 args.reqclass = aim_getcap(sess, &bbs, 0x10);
2086
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
1701
2167
edf8c5a70e5b [gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2122
diff changeset
1702 /*
2196
016c5307f26b [gaim-migrate @ 2206]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2167
diff changeset
1703 * What follows may be TLVs or nothing, depending on the
016c5307f26b [gaim-migrate @ 2206]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2167
diff changeset
1704 * purpose of the message.
016c5307f26b [gaim-migrate @ 2206]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2167
diff changeset
1705 *
016c5307f26b [gaim-migrate @ 2206]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2167
diff changeset
1706 * Ack packets for instance have nothing more to them.
016c5307f26b [gaim-migrate @ 2206]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2167
diff changeset
1707 */
2246
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
1708 list2 = aim_readtlvchain(&bbs);
2167
edf8c5a70e5b [gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2122
diff changeset
1709
2869
9b029055cfba [gaim-migrate @ 2882]
Adam Fritzler <mid@auk.cx>
parents: 2866
diff changeset
1710 /*
9b029055cfba [gaim-migrate @ 2882]
Adam Fritzler <mid@auk.cx>
parents: 2866
diff changeset
1711 * IP address from the perspective of the client.
9b029055cfba [gaim-migrate @ 2882]
Adam Fritzler <mid@auk.cx>
parents: 2866
diff changeset
1712 */
9b029055cfba [gaim-migrate @ 2882]
Adam Fritzler <mid@auk.cx>
parents: 2866
diff changeset
1713 if (aim_gettlv(list2, 0x0002, 1)) {
9b029055cfba [gaim-migrate @ 2882]
Adam Fritzler <mid@auk.cx>
parents: 2866
diff changeset
1714 aim_tlv_t *iptlv;
9b029055cfba [gaim-migrate @ 2882]
Adam Fritzler <mid@auk.cx>
parents: 2866
diff changeset
1715
9b029055cfba [gaim-migrate @ 2882]
Adam Fritzler <mid@auk.cx>
parents: 2866
diff changeset
1716 iptlv = aim_gettlv(list2, 0x0002, 1);
2167
edf8c5a70e5b [gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2122
diff changeset
1717
2869
9b029055cfba [gaim-migrate @ 2882]
Adam Fritzler <mid@auk.cx>
parents: 2866
diff changeset
1718 snprintf(clientip1, sizeof(clientip1), "%d.%d.%d.%d",
9b029055cfba [gaim-migrate @ 2882]
Adam Fritzler <mid@auk.cx>
parents: 2866
diff changeset
1719 aimutil_get8(iptlv->value+0),
9b029055cfba [gaim-migrate @ 2882]
Adam Fritzler <mid@auk.cx>
parents: 2866
diff changeset
1720 aimutil_get8(iptlv->value+1),
9b029055cfba [gaim-migrate @ 2882]
Adam Fritzler <mid@auk.cx>
parents: 2866
diff changeset
1721 aimutil_get8(iptlv->value+2),
9b029055cfba [gaim-migrate @ 2882]
Adam Fritzler <mid@auk.cx>
parents: 2866
diff changeset
1722 aimutil_get8(iptlv->value+3));
9b029055cfba [gaim-migrate @ 2882]
Adam Fritzler <mid@auk.cx>
parents: 2866
diff changeset
1723 }
9b029055cfba [gaim-migrate @ 2882]
Adam Fritzler <mid@auk.cx>
parents: 2866
diff changeset
1724
9b029055cfba [gaim-migrate @ 2882]
Adam Fritzler <mid@auk.cx>
parents: 2866
diff changeset
1725 /*
9b029055cfba [gaim-migrate @ 2882]
Adam Fritzler <mid@auk.cx>
parents: 2866
diff changeset
1726 * Secondary IP address from the perspective of the client.
9b029055cfba [gaim-migrate @ 2882]
Adam Fritzler <mid@auk.cx>
parents: 2866
diff changeset
1727 */
9b029055cfba [gaim-migrate @ 2882]
Adam Fritzler <mid@auk.cx>
parents: 2866
diff changeset
1728 if (aim_gettlv(list2, 0x0003, 1)) {
9b029055cfba [gaim-migrate @ 2882]
Adam Fritzler <mid@auk.cx>
parents: 2866
diff changeset
1729 aim_tlv_t *iptlv;
9b029055cfba [gaim-migrate @ 2882]
Adam Fritzler <mid@auk.cx>
parents: 2866
diff changeset
1730
9b029055cfba [gaim-migrate @ 2882]
Adam Fritzler <mid@auk.cx>
parents: 2866
diff changeset
1731 iptlv = aim_gettlv(list2, 0x0003, 1);
2086
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
1732
2869
9b029055cfba [gaim-migrate @ 2882]
Adam Fritzler <mid@auk.cx>
parents: 2866
diff changeset
1733 snprintf(clientip2, sizeof(clientip2), "%d.%d.%d.%d",
9b029055cfba [gaim-migrate @ 2882]
Adam Fritzler <mid@auk.cx>
parents: 2866
diff changeset
1734 aimutil_get8(iptlv->value+0),
9b029055cfba [gaim-migrate @ 2882]
Adam Fritzler <mid@auk.cx>
parents: 2866
diff changeset
1735 aimutil_get8(iptlv->value+1),
9b029055cfba [gaim-migrate @ 2882]
Adam Fritzler <mid@auk.cx>
parents: 2866
diff changeset
1736 aimutil_get8(iptlv->value+2),
9b029055cfba [gaim-migrate @ 2882]
Adam Fritzler <mid@auk.cx>
parents: 2866
diff changeset
1737 aimutil_get8(iptlv->value+3));
9b029055cfba [gaim-migrate @ 2882]
Adam Fritzler <mid@auk.cx>
parents: 2866
diff changeset
1738 }
2086
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
1739
2869
9b029055cfba [gaim-migrate @ 2882]
Adam Fritzler <mid@auk.cx>
parents: 2866
diff changeset
1740 /*
9b029055cfba [gaim-migrate @ 2882]
Adam Fritzler <mid@auk.cx>
parents: 2866
diff changeset
1741 * Verified IP address (from the perspective of Oscar).
9b029055cfba [gaim-migrate @ 2882]
Adam Fritzler <mid@auk.cx>
parents: 2866
diff changeset
1742 *
9b029055cfba [gaim-migrate @ 2882]
Adam Fritzler <mid@auk.cx>
parents: 2866
diff changeset
1743 * This is added by the server.
9b029055cfba [gaim-migrate @ 2882]
Adam Fritzler <mid@auk.cx>
parents: 2866
diff changeset
1744 */
9b029055cfba [gaim-migrate @ 2882]
Adam Fritzler <mid@auk.cx>
parents: 2866
diff changeset
1745 if (aim_gettlv(list2, 0x0004, 1)) {
9b029055cfba [gaim-migrate @ 2882]
Adam Fritzler <mid@auk.cx>
parents: 2866
diff changeset
1746 aim_tlv_t *iptlv;
2086
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
1747
2869
9b029055cfba [gaim-migrate @ 2882]
Adam Fritzler <mid@auk.cx>
parents: 2866
diff changeset
1748 iptlv = aim_gettlv(list2, 0x0004, 1);
2167
edf8c5a70e5b [gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2122
diff changeset
1749
2869
9b029055cfba [gaim-migrate @ 2882]
Adam Fritzler <mid@auk.cx>
parents: 2866
diff changeset
1750 snprintf(verifiedip, sizeof(verifiedip), "%d.%d.%d.%d",
9b029055cfba [gaim-migrate @ 2882]
Adam Fritzler <mid@auk.cx>
parents: 2866
diff changeset
1751 aimutil_get8(iptlv->value+0),
9b029055cfba [gaim-migrate @ 2882]
Adam Fritzler <mid@auk.cx>
parents: 2866
diff changeset
1752 aimutil_get8(iptlv->value+1),
9b029055cfba [gaim-migrate @ 2882]
Adam Fritzler <mid@auk.cx>
parents: 2866
diff changeset
1753 aimutil_get8(iptlv->value+2),
9b029055cfba [gaim-migrate @ 2882]
Adam Fritzler <mid@auk.cx>
parents: 2866
diff changeset
1754 aimutil_get8(iptlv->value+3));
9b029055cfba [gaim-migrate @ 2882]
Adam Fritzler <mid@auk.cx>
parents: 2866
diff changeset
1755 }
2086
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
1756
2869
9b029055cfba [gaim-migrate @ 2882]
Adam Fritzler <mid@auk.cx>
parents: 2866
diff changeset
1757 /*
9b029055cfba [gaim-migrate @ 2882]
Adam Fritzler <mid@auk.cx>
parents: 2866
diff changeset
1758 * Port number for something.
9b029055cfba [gaim-migrate @ 2882]
Adam Fritzler <mid@auk.cx>
parents: 2866
diff changeset
1759 */
9b029055cfba [gaim-migrate @ 2882]
Adam Fritzler <mid@auk.cx>
parents: 2866
diff changeset
1760 if (aim_gettlv(list2, 0x0005, 1))
9b029055cfba [gaim-migrate @ 2882]
Adam Fritzler <mid@auk.cx>
parents: 2866
diff changeset
1761 args.port = aim_gettlv16(list2, 0x0005, 1);
2086
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
1762
2869
9b029055cfba [gaim-migrate @ 2882]
Adam Fritzler <mid@auk.cx>
parents: 2866
diff changeset
1763 /*
9b029055cfba [gaim-migrate @ 2882]
Adam Fritzler <mid@auk.cx>
parents: 2866
diff changeset
1764 * Error code.
9b029055cfba [gaim-migrate @ 2882]
Adam Fritzler <mid@auk.cx>
parents: 2866
diff changeset
1765 */
9b029055cfba [gaim-migrate @ 2882]
Adam Fritzler <mid@auk.cx>
parents: 2866
diff changeset
1766 if (aim_gettlv(list2, 0x000b, 1))
9b029055cfba [gaim-migrate @ 2882]
Adam Fritzler <mid@auk.cx>
parents: 2866
diff changeset
1767 args.errorcode = aim_gettlv16(list2, 0x000b, 1);
2246
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
1768
2869
9b029055cfba [gaim-migrate @ 2882]
Adam Fritzler <mid@auk.cx>
parents: 2866
diff changeset
1769 /*
9b029055cfba [gaim-migrate @ 2882]
Adam Fritzler <mid@auk.cx>
parents: 2866
diff changeset
1770 * Invitation message / chat description.
9b029055cfba [gaim-migrate @ 2882]
Adam Fritzler <mid@auk.cx>
parents: 2866
diff changeset
1771 */
9b029055cfba [gaim-migrate @ 2882]
Adam Fritzler <mid@auk.cx>
parents: 2866
diff changeset
1772 if (aim_gettlv(list2, 0x000c, 1))
9b029055cfba [gaim-migrate @ 2882]
Adam Fritzler <mid@auk.cx>
parents: 2866
diff changeset
1773 args.msg = aim_gettlv_str(list2, 0x000c, 1);
2167
edf8c5a70e5b [gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2122
diff changeset
1774
2869
9b029055cfba [gaim-migrate @ 2882]
Adam Fritzler <mid@auk.cx>
parents: 2866
diff changeset
1775 /*
9b029055cfba [gaim-migrate @ 2882]
Adam Fritzler <mid@auk.cx>
parents: 2866
diff changeset
1776 * Character set.
9b029055cfba [gaim-migrate @ 2882]
Adam Fritzler <mid@auk.cx>
parents: 2866
diff changeset
1777 */
9b029055cfba [gaim-migrate @ 2882]
Adam Fritzler <mid@auk.cx>
parents: 2866
diff changeset
1778 if (aim_gettlv(list2, 0x000d, 1))
9b029055cfba [gaim-migrate @ 2882]
Adam Fritzler <mid@auk.cx>
parents: 2866
diff changeset
1779 args.encoding = aim_gettlv_str(list2, 0x000d, 1);
9b029055cfba [gaim-migrate @ 2882]
Adam Fritzler <mid@auk.cx>
parents: 2866
diff changeset
1780
9b029055cfba [gaim-migrate @ 2882]
Adam Fritzler <mid@auk.cx>
parents: 2866
diff changeset
1781 /*
9b029055cfba [gaim-migrate @ 2882]
Adam Fritzler <mid@auk.cx>
parents: 2866
diff changeset
1782 * Language.
9b029055cfba [gaim-migrate @ 2882]
Adam Fritzler <mid@auk.cx>
parents: 2866
diff changeset
1783 */
9b029055cfba [gaim-migrate @ 2882]
Adam Fritzler <mid@auk.cx>
parents: 2866
diff changeset
1784 if (aim_gettlv(list2, 0x000e, 1))
9b029055cfba [gaim-migrate @ 2882]
Adam Fritzler <mid@auk.cx>
parents: 2866
diff changeset
1785 args.language = aim_gettlv_str(list2, 0x000e, 1);
9b029055cfba [gaim-migrate @ 2882]
Adam Fritzler <mid@auk.cx>
parents: 2866
diff changeset
1786
9b029055cfba [gaim-migrate @ 2882]
Adam Fritzler <mid@auk.cx>
parents: 2866
diff changeset
1787 /* Unknown -- two bytes = 0x0001 */
9b029055cfba [gaim-migrate @ 2882]
Adam Fritzler <mid@auk.cx>
parents: 2866
diff changeset
1788 if (aim_gettlv(list2, 0x000a, 1))
9b029055cfba [gaim-migrate @ 2882]
Adam Fritzler <mid@auk.cx>
parents: 2866
diff changeset
1789 ;
2086
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
1790
2869
9b029055cfba [gaim-migrate @ 2882]
Adam Fritzler <mid@auk.cx>
parents: 2866
diff changeset
1791 /* Unknown -- no value */
9b029055cfba [gaim-migrate @ 2882]
Adam Fritzler <mid@auk.cx>
parents: 2866
diff changeset
1792 if (aim_gettlv(list2, 0x000f, 1))
9b029055cfba [gaim-migrate @ 2882]
Adam Fritzler <mid@auk.cx>
parents: 2866
diff changeset
1793 ;
9b029055cfba [gaim-migrate @ 2882]
Adam Fritzler <mid@auk.cx>
parents: 2866
diff changeset
1794
9b029055cfba [gaim-migrate @ 2882]
Adam Fritzler <mid@auk.cx>
parents: 2866
diff changeset
1795 if (strlen(clientip1))
9b029055cfba [gaim-migrate @ 2882]
Adam Fritzler <mid@auk.cx>
parents: 2866
diff changeset
1796 args.clientip = (char *)clientip1;
9b029055cfba [gaim-migrate @ 2882]
Adam Fritzler <mid@auk.cx>
parents: 2866
diff changeset
1797 if (strlen(clientip2))
9b029055cfba [gaim-migrate @ 2882]
Adam Fritzler <mid@auk.cx>
parents: 2866
diff changeset
1798 args.clientip2 = (char *)clientip2;
9b029055cfba [gaim-migrate @ 2882]
Adam Fritzler <mid@auk.cx>
parents: 2866
diff changeset
1799 if (strlen(verifiedip))
9b029055cfba [gaim-migrate @ 2882]
Adam Fritzler <mid@auk.cx>
parents: 2866
diff changeset
1800 args.verifiedip = (char *)verifiedip;
2167
edf8c5a70e5b [gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2122
diff changeset
1801
2869
9b029055cfba [gaim-migrate @ 2882]
Adam Fritzler <mid@auk.cx>
parents: 2866
diff changeset
1802 /*
9b029055cfba [gaim-migrate @ 2882]
Adam Fritzler <mid@auk.cx>
parents: 2866
diff changeset
1803 * This is must be present in PROPOSALs, but will probably not
9b029055cfba [gaim-migrate @ 2882]
Adam Fritzler <mid@auk.cx>
parents: 2866
diff changeset
1804 * exist in CANCELs and ACCEPTs.
9b029055cfba [gaim-migrate @ 2882]
Adam Fritzler <mid@auk.cx>
parents: 2866
diff changeset
1805 *
9b029055cfba [gaim-migrate @ 2882]
Adam Fritzler <mid@auk.cx>
parents: 2866
diff changeset
1806 * Service Data blocks are module-specific in format.
9b029055cfba [gaim-migrate @ 2882]
Adam Fritzler <mid@auk.cx>
parents: 2866
diff changeset
1807 */
9b029055cfba [gaim-migrate @ 2882]
Adam Fritzler <mid@auk.cx>
parents: 2866
diff changeset
1808 if ((servdatatlv = aim_gettlv(list2, 0x2711 /* 10001 */, 1))) {
2167
edf8c5a70e5b [gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2122
diff changeset
1809
2869
9b029055cfba [gaim-migrate @ 2882]
Adam Fritzler <mid@auk.cx>
parents: 2866
diff changeset
1810 aim_bstream_init(&sdbs, servdatatlv->value, servdatatlv->length);
9b029055cfba [gaim-migrate @ 2882]
Adam Fritzler <mid@auk.cx>
parents: 2866
diff changeset
1811 sdbsptr = &sdbs;
2086
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
1812 }
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
1813
2167
edf8c5a70e5b [gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2122
diff changeset
1814 /*
edf8c5a70e5b [gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2122
diff changeset
1815 * The rest of the handling depends on what type it is.
2869
9b029055cfba [gaim-migrate @ 2882]
Adam Fritzler <mid@auk.cx>
parents: 2866
diff changeset
1816 *
9b029055cfba [gaim-migrate @ 2882]
Adam Fritzler <mid@auk.cx>
parents: 2866
diff changeset
1817 * Not all of them have special handling (yet).
2167
edf8c5a70e5b [gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2122
diff changeset
1818 */
2246
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
1819 if (args.reqclass & AIM_CAPS_BUDDYICON)
2869
9b029055cfba [gaim-migrate @ 2882]
Adam Fritzler <mid@auk.cx>
parents: 2866
diff changeset
1820 incomingim_ch2_buddyicon(sess, mod, rx, snac, userinfo, &args, sdbsptr);
2246
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
1821 else if (args.reqclass & AIM_CAPS_SENDBUDDYLIST)
2869
9b029055cfba [gaim-migrate @ 2882]
Adam Fritzler <mid@auk.cx>
parents: 2866
diff changeset
1822 incomingim_ch2_buddylist(sess, mod, rx, snac, userinfo, &args, sdbsptr);
2246
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
1823 else if (args.reqclass & AIM_CAPS_CHAT)
2869
9b029055cfba [gaim-migrate @ 2882]
Adam Fritzler <mid@auk.cx>
parents: 2866
diff changeset
1824 incomingim_ch2_chat(sess, mod, rx, snac, userinfo, &args, sdbsptr);
2866
6d62d4520460 [gaim-migrate @ 2879]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2808
diff changeset
1825 else if (args.reqclass & AIM_CAPS_ICQSERVERRELAY)
2869
9b029055cfba [gaim-migrate @ 2882]
Adam Fritzler <mid@auk.cx>
parents: 2866
diff changeset
1826 incomingim_ch2_icqserverrelay(sess, mod, rx, snac, userinfo, &args, sdbsptr);
3630
9682c0e022c6 [gaim-migrate @ 3753]
Rob Flynn <gaim@robflynn.com>
parents: 3595
diff changeset
1827 else if (args.reqclass & AIM_CAPS_SENDFILE)
9682c0e022c6 [gaim-migrate @ 3753]
Rob Flynn <gaim@robflynn.com>
parents: 3595
diff changeset
1828 incomingim_ch2_sendfile(sess, mod, rx, snac, userinfo, &args, sdbsptr);
2869
9b029055cfba [gaim-migrate @ 2882]
Adam Fritzler <mid@auk.cx>
parents: 2866
diff changeset
1829
9b029055cfba [gaim-migrate @ 2882]
Adam Fritzler <mid@auk.cx>
parents: 2866
diff changeset
1830
9b029055cfba [gaim-migrate @ 2882]
Adam Fritzler <mid@auk.cx>
parents: 2866
diff changeset
1831 if ((userfunc = aim_callhandler(sess, rx->conn, snac->family, snac->subtype)))
9b029055cfba [gaim-migrate @ 2882]
Adam Fritzler <mid@auk.cx>
parents: 2866
diff changeset
1832 ret = userfunc(sess, rx, channel, userinfo, &args);
9b029055cfba [gaim-migrate @ 2882]
Adam Fritzler <mid@auk.cx>
parents: 2866
diff changeset
1833
9b029055cfba [gaim-migrate @ 2882]
Adam Fritzler <mid@auk.cx>
parents: 2866
diff changeset
1834
9b029055cfba [gaim-migrate @ 2882]
Adam Fritzler <mid@auk.cx>
parents: 2866
diff changeset
1835 if (args.destructor)
9b029055cfba [gaim-migrate @ 2882]
Adam Fritzler <mid@auk.cx>
parents: 2866
diff changeset
1836 ((ch2_args_destructor_t)args.destructor)(sess, &args);
9b029055cfba [gaim-migrate @ 2882]
Adam Fritzler <mid@auk.cx>
parents: 2866
diff changeset
1837
9b029055cfba [gaim-migrate @ 2882]
Adam Fritzler <mid@auk.cx>
parents: 2866
diff changeset
1838 free((char *)args.msg);
9b029055cfba [gaim-migrate @ 2882]
Adam Fritzler <mid@auk.cx>
parents: 2866
diff changeset
1839 free((char *)args.encoding);
9b029055cfba [gaim-migrate @ 2882]
Adam Fritzler <mid@auk.cx>
parents: 2866
diff changeset
1840 free((char *)args.language);
2086
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
1841
2167
edf8c5a70e5b [gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2122
diff changeset
1842 aim_freetlvchain(&list2);
2086
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
1843
2167
edf8c5a70e5b [gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2122
diff changeset
1844 return ret;
2086
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
1845 }
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
1846
3141
bcdbffc2c3e6 [gaim-migrate @ 3156]
Rob Flynn <gaim@robflynn.com>
parents: 2869
diff changeset
1847 static int incomingim_ch4(aim_session_t *sess, aim_module_t *mod, aim_frame_t *rx, aim_modsnac_t *snac, fu16_t channel, aim_userinfo_t *userinfo, aim_tlvlist_t *tlvlist, fu8_t *cookie)
bcdbffc2c3e6 [gaim-migrate @ 3156]
Rob Flynn <gaim@robflynn.com>
parents: 2869
diff changeset
1848 {
bcdbffc2c3e6 [gaim-migrate @ 3156]
Rob Flynn <gaim@robflynn.com>
parents: 2869
diff changeset
1849 aim_bstream_t meat;
bcdbffc2c3e6 [gaim-migrate @ 3156]
Rob Flynn <gaim@robflynn.com>
parents: 2869
diff changeset
1850 aim_rxcallback_t userfunc;
bcdbffc2c3e6 [gaim-migrate @ 3156]
Rob Flynn <gaim@robflynn.com>
parents: 2869
diff changeset
1851 aim_tlv_t *block;
bcdbffc2c3e6 [gaim-migrate @ 3156]
Rob Flynn <gaim@robflynn.com>
parents: 2869
diff changeset
1852 struct aim_incomingim_ch4_args args;
3159
fce1883cc608 [gaim-migrate @ 3175]
Sean Egan <seanegan@gmail.com>
parents: 3141
diff changeset
1853 int ret = 0;
3141
bcdbffc2c3e6 [gaim-migrate @ 3156]
Rob Flynn <gaim@robflynn.com>
parents: 2869
diff changeset
1854
bcdbffc2c3e6 [gaim-migrate @ 3156]
Rob Flynn <gaim@robflynn.com>
parents: 2869
diff changeset
1855 /*
bcdbffc2c3e6 [gaim-migrate @ 3156]
Rob Flynn <gaim@robflynn.com>
parents: 2869
diff changeset
1856 * Make a bstream for the meaty part. Yum. Meat.
bcdbffc2c3e6 [gaim-migrate @ 3156]
Rob Flynn <gaim@robflynn.com>
parents: 2869
diff changeset
1857 */
bcdbffc2c3e6 [gaim-migrate @ 3156]
Rob Flynn <gaim@robflynn.com>
parents: 2869
diff changeset
1858 if (!(block = aim_gettlv(tlvlist, 0x0005, 1)))
bcdbffc2c3e6 [gaim-migrate @ 3156]
Rob Flynn <gaim@robflynn.com>
parents: 2869
diff changeset
1859 return -1;
bcdbffc2c3e6 [gaim-migrate @ 3156]
Rob Flynn <gaim@robflynn.com>
parents: 2869
diff changeset
1860 aim_bstream_init(&meat, block->value, block->length);
bcdbffc2c3e6 [gaim-migrate @ 3156]
Rob Flynn <gaim@robflynn.com>
parents: 2869
diff changeset
1861
bcdbffc2c3e6 [gaim-migrate @ 3156]
Rob Flynn <gaim@robflynn.com>
parents: 2869
diff changeset
1862 args.uin = aimbs_getle32(&meat);
4173
b66f960bfe60 [gaim-migrate @ 4403]
Mark Doliner <mark@kingant.net>
parents: 4154
diff changeset
1863 args.type = aimbs_getle8(&meat);
b66f960bfe60 [gaim-migrate @ 4403]
Mark Doliner <mark@kingant.net>
parents: 4154
diff changeset
1864 args.flags = aimbs_getle8(&meat);
4076
91c4bd698d39 [gaim-migrate @ 4291]
Mark Doliner <mark@kingant.net>
parents: 4071
diff changeset
1865 args.msglen = aimbs_getle16(&meat);
91c4bd698d39 [gaim-migrate @ 4291]
Mark Doliner <mark@kingant.net>
parents: 4071
diff changeset
1866 args.msg = aimbs_getraw(&meat, args.msglen);
3141
bcdbffc2c3e6 [gaim-migrate @ 3156]
Rob Flynn <gaim@robflynn.com>
parents: 2869
diff changeset
1867
bcdbffc2c3e6 [gaim-migrate @ 3156]
Rob Flynn <gaim@robflynn.com>
parents: 2869
diff changeset
1868 if ((userfunc = aim_callhandler(sess, rx->conn, snac->family, snac->subtype)))
bcdbffc2c3e6 [gaim-migrate @ 3156]
Rob Flynn <gaim@robflynn.com>
parents: 2869
diff changeset
1869 ret = userfunc(sess, rx, channel, userinfo, &args);
bcdbffc2c3e6 [gaim-migrate @ 3156]
Rob Flynn <gaim@robflynn.com>
parents: 2869
diff changeset
1870
bcdbffc2c3e6 [gaim-migrate @ 3156]
Rob Flynn <gaim@robflynn.com>
parents: 2869
diff changeset
1871 free(args.msg);
bcdbffc2c3e6 [gaim-migrate @ 3156]
Rob Flynn <gaim@robflynn.com>
parents: 2869
diff changeset
1872
bcdbffc2c3e6 [gaim-migrate @ 3156]
Rob Flynn <gaim@robflynn.com>
parents: 2869
diff changeset
1873 return ret;
bcdbffc2c3e6 [gaim-migrate @ 3156]
Rob Flynn <gaim@robflynn.com>
parents: 2869
diff changeset
1874 }
bcdbffc2c3e6 [gaim-migrate @ 3156]
Rob Flynn <gaim@robflynn.com>
parents: 2869
diff changeset
1875
2086
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
1876 /*
3952
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
1877 * Subtype 0x0007
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
1878 *
2086
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
1879 * It can easily be said that parsing ICBMs is THE single
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
1880 * most difficult thing to do in the in AIM protocol. In
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
1881 * fact, I think I just did say that.
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
1882 *
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
1883 * Below is the best damned solution I've come up with
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
1884 * over the past sixteen months of battling with it. This
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
1885 * can parse both away and normal messages from every client
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
1886 * I have access to. Its not fast, its not clean. But it works.
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
1887 *
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
1888 */
2246
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
1889 static int incomingim(aim_session_t *sess, aim_module_t *mod, aim_frame_t *rx, aim_modsnac_t *snac, aim_bstream_t *bs)
2086
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
1890 {
2167
edf8c5a70e5b [gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2122
diff changeset
1891 int i, ret = 0;
2246
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
1892 fu8_t cookie[8];
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
1893 fu16_t channel;
2421
95b4ec08abec [gaim-migrate @ 2434]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2341
diff changeset
1894 aim_userinfo_t userinfo;
2167
edf8c5a70e5b [gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2122
diff changeset
1895
2421
95b4ec08abec [gaim-migrate @ 2434]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2341
diff changeset
1896 memset(&userinfo, 0x00, sizeof(aim_userinfo_t));
2167
edf8c5a70e5b [gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2122
diff changeset
1897
edf8c5a70e5b [gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2122
diff changeset
1898 /*
edf8c5a70e5b [gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2122
diff changeset
1899 * Read ICBM Cookie. And throw away.
edf8c5a70e5b [gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2122
diff changeset
1900 */
edf8c5a70e5b [gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2122
diff changeset
1901 for (i = 0; i < 8; i++)
2246
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
1902 cookie[i] = aimbs_get8(bs);
2086
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
1903
2167
edf8c5a70e5b [gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2122
diff changeset
1904 /*
edf8c5a70e5b [gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2122
diff changeset
1905 * Channel ID.
edf8c5a70e5b [gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2122
diff changeset
1906 *
edf8c5a70e5b [gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2122
diff changeset
1907 * Channel 0x0001 is the message channel. There are
edf8c5a70e5b [gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2122
diff changeset
1908 * other channels for things called "rendevous"
edf8c5a70e5b [gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2122
diff changeset
1909 * which represent chat and some of the other new
edf8c5a70e5b [gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2122
diff changeset
1910 * features of AIM2/3/3.5.
edf8c5a70e5b [gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2122
diff changeset
1911 *
edf8c5a70e5b [gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2122
diff changeset
1912 * Channel 0x0002 is the Rendevous channel, which
edf8c5a70e5b [gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2122
diff changeset
1913 * is where Chat Invitiations and various client-client
edf8c5a70e5b [gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2122
diff changeset
1914 * connection negotiations come from.
3141
bcdbffc2c3e6 [gaim-migrate @ 3156]
Rob Flynn <gaim@robflynn.com>
parents: 2869
diff changeset
1915 *
bcdbffc2c3e6 [gaim-migrate @ 3156]
Rob Flynn <gaim@robflynn.com>
parents: 2869
diff changeset
1916 * Channel 0x0004 is used for ICQ authorization, or
bcdbffc2c3e6 [gaim-migrate @ 3156]
Rob Flynn <gaim@robflynn.com>
parents: 2869
diff changeset
1917 * possibly any system notice.
bcdbffc2c3e6 [gaim-migrate @ 3156]
Rob Flynn <gaim@robflynn.com>
parents: 2869
diff changeset
1918 *
2167
edf8c5a70e5b [gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2122
diff changeset
1919 */
2246
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
1920 channel = aimbs_get16(bs);
2167
edf8c5a70e5b [gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2122
diff changeset
1921
edf8c5a70e5b [gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2122
diff changeset
1922 /*
edf8c5a70e5b [gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2122
diff changeset
1923 * Extract the standard user info block.
edf8c5a70e5b [gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2122
diff changeset
1924 *
edf8c5a70e5b [gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2122
diff changeset
1925 * Note that although this contains TLVs that appear contiguous
edf8c5a70e5b [gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2122
diff changeset
1926 * with the TLVs read below, they are two different pieces. The
edf8c5a70e5b [gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2122
diff changeset
1927 * userinfo block contains the number of TLVs that contain user
edf8c5a70e5b [gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2122
diff changeset
1928 * information, the rest are not even though there is no seperation.
edf8c5a70e5b [gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2122
diff changeset
1929 * aim_extractuserinfo() returns the number of bytes used by the
edf8c5a70e5b [gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2122
diff changeset
1930 * userinfo tlvs, so you can start reading the rest of them right
edf8c5a70e5b [gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2122
diff changeset
1931 * afterward.
edf8c5a70e5b [gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2122
diff changeset
1932 *
edf8c5a70e5b [gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2122
diff changeset
1933 * That also means that TLV types can be duplicated between the
edf8c5a70e5b [gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2122
diff changeset
1934 * userinfo block and the rest of the message, however there should
edf8c5a70e5b [gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2122
diff changeset
1935 * never be two TLVs of the same type in one block.
edf8c5a70e5b [gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2122
diff changeset
1936 *
edf8c5a70e5b [gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2122
diff changeset
1937 */
2246
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
1938 aim_extractuserinfo(sess, bs, &userinfo);
2086
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
1939
2167
edf8c5a70e5b [gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2122
diff changeset
1940 /*
edf8c5a70e5b [gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2122
diff changeset
1941 * From here on, its depends on what channel we're on.
edf8c5a70e5b [gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2122
diff changeset
1942 *
edf8c5a70e5b [gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2122
diff changeset
1943 * Technically all channels have a TLV list have this, however,
edf8c5a70e5b [gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2122
diff changeset
1944 * for the common channel 1 case, in-place parsing is used for
edf8c5a70e5b [gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2122
diff changeset
1945 * performance reasons (less memory allocation).
edf8c5a70e5b [gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2122
diff changeset
1946 */
edf8c5a70e5b [gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2122
diff changeset
1947 if (channel == 1) {
2086
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
1948
2246
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
1949 ret = incomingim_ch1(sess, mod, rx, snac, channel, &userinfo, bs, cookie);
2167
edf8c5a70e5b [gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2122
diff changeset
1950
2869
9b029055cfba [gaim-migrate @ 2882]
Adam Fritzler <mid@auk.cx>
parents: 2866
diff changeset
1951 } else if (channel == 2) {
2246
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
1952 aim_tlvlist_t *tlvlist;
2086
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
1953
2167
edf8c5a70e5b [gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2122
diff changeset
1954 /*
edf8c5a70e5b [gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2122
diff changeset
1955 * Read block of TLVs (not including the userinfo data). All
edf8c5a70e5b [gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2122
diff changeset
1956 * further data is derived from what is parsed here.
edf8c5a70e5b [gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2122
diff changeset
1957 */
2246
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
1958 tlvlist = aim_readtlvchain(bs);
2086
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
1959
2167
edf8c5a70e5b [gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2122
diff changeset
1960 ret = incomingim_ch2(sess, mod, rx, snac, channel, &userinfo, tlvlist, cookie);
2086
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
1961
2167
edf8c5a70e5b [gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2122
diff changeset
1962 aim_freetlvchain(&tlvlist);
2869
9b029055cfba [gaim-migrate @ 2882]
Adam Fritzler <mid@auk.cx>
parents: 2866
diff changeset
1963
3141
bcdbffc2c3e6 [gaim-migrate @ 3156]
Rob Flynn <gaim@robflynn.com>
parents: 2869
diff changeset
1964 } else if (channel == 4) {
bcdbffc2c3e6 [gaim-migrate @ 3156]
Rob Flynn <gaim@robflynn.com>
parents: 2869
diff changeset
1965 aim_tlvlist_t *tlvlist;
bcdbffc2c3e6 [gaim-migrate @ 3156]
Rob Flynn <gaim@robflynn.com>
parents: 2869
diff changeset
1966
bcdbffc2c3e6 [gaim-migrate @ 3156]
Rob Flynn <gaim@robflynn.com>
parents: 2869
diff changeset
1967 tlvlist = aim_readtlvchain(bs);
bcdbffc2c3e6 [gaim-migrate @ 3156]
Rob Flynn <gaim@robflynn.com>
parents: 2869
diff changeset
1968 ret = incomingim_ch4(sess, mod, rx, snac, channel, &userinfo, tlvlist, cookie);
bcdbffc2c3e6 [gaim-migrate @ 3156]
Rob Flynn <gaim@robflynn.com>
parents: 2869
diff changeset
1969 aim_freetlvchain(&tlvlist);
bcdbffc2c3e6 [gaim-migrate @ 3156]
Rob Flynn <gaim@robflynn.com>
parents: 2869
diff changeset
1970
2507
1069b0940237 [gaim-migrate @ 2520]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2421
diff changeset
1971 } else {
2869
9b029055cfba [gaim-migrate @ 2882]
Adam Fritzler <mid@auk.cx>
parents: 2866
diff changeset
1972
2507
1069b0940237 [gaim-migrate @ 2520]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2421
diff changeset
1973 faimdprintf(sess, 0, "icbm: ICBM received on an unsupported channel. Ignoring.\n (chan = %04x)", channel);
2869
9b029055cfba [gaim-migrate @ 2882]
Adam Fritzler <mid@auk.cx>
parents: 2866
diff changeset
1974
2507
1069b0940237 [gaim-migrate @ 2520]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2421
diff changeset
1975 return 0;
2167
edf8c5a70e5b [gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2122
diff changeset
1976 }
2086
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
1977
2167
edf8c5a70e5b [gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2122
diff changeset
1978 return ret;
2086
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
1979 }
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
1980
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
1981 /*
3952
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
1982 * Subtype 0x0008 - Send a warning to destsn.
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
1983 *
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
1984 * Flags:
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
1985 * AIM_WARN_ANON Send as an anonymous (doesn't count as much)
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
1986 *
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
1987 * returns -1 on error (couldn't alloc packet), 0 on success.
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
1988 *
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
1989 */
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
1990 faim_export int aim_send_warning(aim_session_t *sess, aim_conn_t *conn, const char *destsn, fu32_t flags)
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
1991 {
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
1992 aim_frame_t *fr;
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
1993 aim_snacid_t snacid;
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
1994 fu16_t outflags = 0x0000;
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
1995
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
1996 if (!(fr = aim_tx_new(sess, conn, AIM_FRAMETYPE_FLAP, 0x02, strlen(destsn)+13)))
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
1997 return -ENOMEM;
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
1998
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
1999 snacid = aim_cachesnac(sess, 0x0004, 0x0008, 0x0000, destsn, strlen(destsn)+1);
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
2000
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
2001 aim_putsnac(&fr->data, 0x0004, 0x0008, 0x0000, snacid);
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
2002
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
2003 if (flags & AIM_WARN_ANON)
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
2004 outflags |= 0x0001;
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
2005
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
2006 aimbs_put16(&fr->data, outflags);
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
2007 aimbs_put8(&fr->data, strlen(destsn));
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
2008 aimbs_putraw(&fr->data, destsn, strlen(destsn));
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
2009
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
2010 aim_tx_enqueue(sess, fr);
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
2011
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
2012 return 0;
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
2013 }
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
2014
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
2015 /* Subtype 0x000a */
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
2016 static int missedcall(aim_session_t *sess, aim_module_t *mod, aim_frame_t *rx, aim_modsnac_t *snac, aim_bstream_t *bs)
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
2017 {
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
2018 int ret = 0;
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
2019 aim_rxcallback_t userfunc;
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
2020 fu16_t channel, nummissed, reason;
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
2021 aim_userinfo_t userinfo;
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
2022
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
2023 while (aim_bstream_empty(bs)) {
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
2024
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
2025 channel = aimbs_get16(bs);
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
2026 aim_extractuserinfo(sess, bs, &userinfo);
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
2027 nummissed = aimbs_get16(bs);
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
2028 reason = aimbs_get16(bs);
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
2029
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
2030 if ((userfunc = aim_callhandler(sess, rx->conn, snac->family, snac->subtype)))
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
2031 ret = userfunc(sess, rx, channel, &userinfo, nummissed, reason);
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
2032 }
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
2033
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
2034 return ret;
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
2035 }
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
2036
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
2037 /*
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
2038 * Subtype 0x000b
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
2039 *
2086
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
2040 * Possible codes:
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
2041 * AIM_TRANSFER_DENY_NOTSUPPORTED -- "client does not support"
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
2042 * AIM_TRANSFER_DENY_DECLINE -- "client has declined transfer"
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
2043 * AIM_TRANSFER_DENY_NOTACCEPTING -- "client is not accepting transfers"
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
2044 *
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
2045 */
2673
81d658e6ac1e [gaim-migrate @ 2686]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2672
diff changeset
2046 faim_export int aim_denytransfer(aim_session_t *sess, const char *sender, const char *cookie, fu16_t code)
2086
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
2047 {
2673
81d658e6ac1e [gaim-migrate @ 2686]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2672
diff changeset
2048 aim_conn_t *conn;
2246
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
2049 aim_frame_t *fr;
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
2050 aim_snacid_t snacid;
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
2051 aim_tlvlist_t *tl = NULL;
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
2052
2673
81d658e6ac1e [gaim-migrate @ 2686]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2672
diff changeset
2053 if (!sess || !(conn = aim_conn_findbygroup(sess, 0x0004)))
81d658e6ac1e [gaim-migrate @ 2686]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2672
diff changeset
2054 return -EINVAL;
81d658e6ac1e [gaim-migrate @ 2686]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2672
diff changeset
2055
2246
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
2056 if (!(fr = aim_tx_new(sess, conn, AIM_FRAMETYPE_FLAP, 0x02, 10+8+2+1+strlen(sender)+6)))
2167
edf8c5a70e5b [gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2122
diff changeset
2057 return -ENOMEM;
2086
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
2058
2246
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
2059 snacid = aim_cachesnac(sess, 0x0004, 0x000b, 0x0000, NULL, 0);
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
2060 aim_putsnac(&fr->data, 0x0004, 0x000b, 0x0000, snacid);
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
2061
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
2062 aimbs_putraw(&fr->data, cookie, 8);
2086
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
2063
2246
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
2064 aimbs_put16(&fr->data, 0x0002); /* channel */
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
2065 aimbs_put8(&fr->data, strlen(sender));
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
2066 aimbs_putraw(&fr->data, sender, strlen(sender));
2086
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
2067
2246
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
2068 aim_addtlvtochain16(&tl, 0x0003, code);
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
2069 aim_writetlvchain(&fr->data, &tl);
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
2070 aim_freetlvchain(&tl);
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
2071
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
2072 aim_tx_enqueue(sess, fr);
2086
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
2073
2167
edf8c5a70e5b [gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2122
diff changeset
2074 return 0;
2086
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
2075 }
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
2076
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
2077 /*
3952
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
2078 * Subtype 0x000b - Receive the response from an ICQ status message request.
2086
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
2079 *
3952
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
2080 * This contains the ICQ status message. Go figure.
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
2081 *
3212
56746b0868db [gaim-migrate @ 3229]
Sean Egan <seanegan@gmail.com>
parents: 3159
diff changeset
2082 */
56746b0868db [gaim-migrate @ 3229]
Sean Egan <seanegan@gmail.com>
parents: 3159
diff changeset
2083 static int clientautoresp(aim_session_t *sess, aim_module_t *mod, aim_frame_t *rx, aim_modsnac_t *snac, aim_bstream_t *bs)
2246
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
2084 {
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
2085 int ret = 0;
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
2086 aim_rxcallback_t userfunc;
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
2087 fu16_t channel, reason;
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
2088 char *sn;
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
2089 fu8_t *ck, snlen;
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
2090
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
2091 ck = aimbs_getraw(bs, 8);
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
2092 channel = aimbs_get16(bs);
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
2093 snlen = aimbs_get8(bs);
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
2094 sn = aimbs_getstr(bs, snlen);
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
2095 reason = aimbs_get16(bs);
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
2096
3952
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
2097 if (channel == 0x0002) { /* File transfer declined */
3630
9682c0e022c6 [gaim-migrate @ 3753]
Rob Flynn <gaim@robflynn.com>
parents: 3595
diff changeset
2098 if ((userfunc = aim_callhandler(sess, rx->conn, snac->family, snac->subtype)))
9682c0e022c6 [gaim-migrate @ 3753]
Rob Flynn <gaim@robflynn.com>
parents: 3595
diff changeset
2099 ret = userfunc(sess, rx, channel, sn, reason, ck);
3952
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
2100 } else if (channel == 0x0004) { /* ICQ message */
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
2101 switch (reason) {
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
2102 case 0x0003: { /* ICQ status message. Maybe other stuff too, you never know with these people. */
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
2103 fu8_t statusmsgtype, *msg;
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
2104 fu16_t len;
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
2105 fu32_t state;
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
2106
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
2107 len = aimbs_getle16(bs); /* Should be 0x001b */
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
2108 aim_bstream_advance(bs, len); /* Unknown */
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
2109
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
2110 len = aimbs_getle16(bs); /* Should be 0x000e */
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
2111 aim_bstream_advance(bs, len); /* Unknown */
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
2112
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
2113 statusmsgtype = aimbs_getle8(bs);
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
2114 switch (statusmsgtype) {
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
2115 case 0xe8:
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
2116 state = AIM_ICQ_STATE_AWAY;
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
2117 break;
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
2118 case 0xe9:
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
2119 state = AIM_ICQ_STATE_AWAY | AIM_ICQ_STATE_BUSY;
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
2120 break;
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
2121 case 0xea:
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
2122 state = AIM_ICQ_STATE_AWAY | AIM_ICQ_STATE_OUT;
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
2123 break;
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
2124 case 0xeb:
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
2125 state = AIM_ICQ_STATE_AWAY | AIM_ICQ_STATE_DND | AIM_ICQ_STATE_BUSY;
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
2126 break;
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
2127 case 0xec:
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
2128 state = AIM_ICQ_STATE_CHAT;
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
2129 break;
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
2130 default:
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
2131 state = 0;
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
2132 break;
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
2133 }
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
2134
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
2135 aimbs_getle8(bs); /* Unknown - 0x03 Maybe this means this is an auto-reply */
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
2136 aimbs_getle16(bs); /* Unknown - 0x0000 */
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
2137 aimbs_getle16(bs); /* Unknown - 0x0000 */
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
2138
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
2139 len = aimbs_getle16(bs);
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
2140 msg = aimbs_getraw(bs, len);
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
2141
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
2142 if ((userfunc = aim_callhandler(sess, rx->conn, snac->family, snac->subtype)))
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
2143 ret = userfunc(sess, rx, channel, sn, reason, state, msg);
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
2144
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
2145 free(msg);
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
2146 } break;
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
2147
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
2148 default: {
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
2149 if ((userfunc = aim_callhandler(sess, rx->conn, snac->family, snac->subtype)))
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
2150 ret = userfunc(sess, rx, channel, sn, reason);
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
2151 } break;
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
2152 } /* end switch */
3630
9682c0e022c6 [gaim-migrate @ 3753]
Rob Flynn <gaim@robflynn.com>
parents: 3595
diff changeset
2153 }
9682c0e022c6 [gaim-migrate @ 3753]
Rob Flynn <gaim@robflynn.com>
parents: 3595
diff changeset
2154
2341
5486d558ecee [gaim-migrate @ 2354]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2315
diff changeset
2155 free(ck);
5486d558ecee [gaim-migrate @ 2354]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2315
diff changeset
2156 free(sn);
5486d558ecee [gaim-migrate @ 2354]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2315
diff changeset
2157
2246
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
2158 return ret;
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
2159 }
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
2160
3952
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
2161 /* Subtype 0x000c */
2246
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
2162 static int msgack(aim_session_t *sess, aim_module_t *mod, aim_frame_t *rx, aim_modsnac_t *snac, aim_bstream_t *bs)
2086
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
2163 {
2167
edf8c5a70e5b [gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2122
diff changeset
2164 aim_rxcallback_t userfunc;
2246
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
2165 fu16_t type;
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
2166 fu8_t snlen, *ck;
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
2167 char *sn;
2341
5486d558ecee [gaim-migrate @ 2354]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2315
diff changeset
2168 int ret = 0;
2086
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
2169
2246
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
2170 ck = aimbs_getraw(bs, 8);
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
2171 type = aimbs_get16(bs);
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
2172 snlen = aimbs_get8(bs);
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
2173 sn = aimbs_getstr(bs, snlen);
2086
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
2174
2167
edf8c5a70e5b [gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2122
diff changeset
2175 if ((userfunc = aim_callhandler(sess, rx->conn, snac->family, snac->subtype)))
2341
5486d558ecee [gaim-migrate @ 2354]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2315
diff changeset
2176 ret = userfunc(sess, rx, type, sn);
2086
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
2177
2246
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
2178 free(sn);
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
2179 free(ck);
2086
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
2180
2341
5486d558ecee [gaim-migrate @ 2354]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2315
diff changeset
2181 return ret;
2086
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
2182 }
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
2183
3595
1e60a05c7482 [gaim-migrate @ 3697]
Mark Doliner <mark@kingant.net>
parents: 3255
diff changeset
2184 /*
3952
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
2185 * Subtype 0x0014 - Send a mini typing notification (mtn) packet.
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
2186 *
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
2187 * This is supported by winaim5 and newer, MacAIM bleh and newer, iChat bleh and newer,
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
2188 * and Gaim 0.60 and newer.
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
2189 *
3595
1e60a05c7482 [gaim-migrate @ 3697]
Mark Doliner <mark@kingant.net>
parents: 3255
diff changeset
2190 */
1e60a05c7482 [gaim-migrate @ 3697]
Mark Doliner <mark@kingant.net>
parents: 3255
diff changeset
2191 faim_export int aim_mtn_send(aim_session_t *sess, fu16_t type1, char *sn, fu16_t type2)
1e60a05c7482 [gaim-migrate @ 3697]
Mark Doliner <mark@kingant.net>
parents: 3255
diff changeset
2192 {
1e60a05c7482 [gaim-migrate @ 3697]
Mark Doliner <mark@kingant.net>
parents: 3255
diff changeset
2193 aim_conn_t *conn;
1e60a05c7482 [gaim-migrate @ 3697]
Mark Doliner <mark@kingant.net>
parents: 3255
diff changeset
2194 aim_frame_t *fr;
1e60a05c7482 [gaim-migrate @ 3697]
Mark Doliner <mark@kingant.net>
parents: 3255
diff changeset
2195 aim_snacid_t snacid;
1e60a05c7482 [gaim-migrate @ 3697]
Mark Doliner <mark@kingant.net>
parents: 3255
diff changeset
2196
1e60a05c7482 [gaim-migrate @ 3697]
Mark Doliner <mark@kingant.net>
parents: 3255
diff changeset
2197 if (!sess || !(conn = aim_conn_findbygroup(sess, 0x0002)))
1e60a05c7482 [gaim-migrate @ 3697]
Mark Doliner <mark@kingant.net>
parents: 3255
diff changeset
2198 return -EINVAL;
1e60a05c7482 [gaim-migrate @ 3697]
Mark Doliner <mark@kingant.net>
parents: 3255
diff changeset
2199
1e60a05c7482 [gaim-migrate @ 3697]
Mark Doliner <mark@kingant.net>
parents: 3255
diff changeset
2200 if (!sn)
1e60a05c7482 [gaim-migrate @ 3697]
Mark Doliner <mark@kingant.net>
parents: 3255
diff changeset
2201 return -EINVAL;
1e60a05c7482 [gaim-migrate @ 3697]
Mark Doliner <mark@kingant.net>
parents: 3255
diff changeset
2202
1e60a05c7482 [gaim-migrate @ 3697]
Mark Doliner <mark@kingant.net>
parents: 3255
diff changeset
2203 if (!(fr = aim_tx_new(sess, conn, AIM_FRAMETYPE_FLAP, 0x02, 10+11+strlen(sn)+2)))
1e60a05c7482 [gaim-migrate @ 3697]
Mark Doliner <mark@kingant.net>
parents: 3255
diff changeset
2204 return -ENOMEM;
1e60a05c7482 [gaim-migrate @ 3697]
Mark Doliner <mark@kingant.net>
parents: 3255
diff changeset
2205
1e60a05c7482 [gaim-migrate @ 3697]
Mark Doliner <mark@kingant.net>
parents: 3255
diff changeset
2206 snacid = aim_cachesnac(sess, 0x0004, 0x0014, 0x0000, NULL, 0);
1e60a05c7482 [gaim-migrate @ 3697]
Mark Doliner <mark@kingant.net>
parents: 3255
diff changeset
2207 aim_putsnac(&fr->data, 0x0004, 0x0014, 0x0000, snacid);
1e60a05c7482 [gaim-migrate @ 3697]
Mark Doliner <mark@kingant.net>
parents: 3255
diff changeset
2208
1e60a05c7482 [gaim-migrate @ 3697]
Mark Doliner <mark@kingant.net>
parents: 3255
diff changeset
2209 /*
1e60a05c7482 [gaim-migrate @ 3697]
Mark Doliner <mark@kingant.net>
parents: 3255
diff changeset
2210 * 8 days of light
1e60a05c7482 [gaim-migrate @ 3697]
Mark Doliner <mark@kingant.net>
parents: 3255
diff changeset
2211 * Er, that is to say, 8 bytes of 0's
1e60a05c7482 [gaim-migrate @ 3697]
Mark Doliner <mark@kingant.net>
parents: 3255
diff changeset
2212 */
1e60a05c7482 [gaim-migrate @ 3697]
Mark Doliner <mark@kingant.net>
parents: 3255
diff changeset
2213 aimbs_put16(&fr->data, 0x0000);
1e60a05c7482 [gaim-migrate @ 3697]
Mark Doliner <mark@kingant.net>
parents: 3255
diff changeset
2214 aimbs_put16(&fr->data, 0x0000);
1e60a05c7482 [gaim-migrate @ 3697]
Mark Doliner <mark@kingant.net>
parents: 3255
diff changeset
2215 aimbs_put16(&fr->data, 0x0000);
1e60a05c7482 [gaim-migrate @ 3697]
Mark Doliner <mark@kingant.net>
parents: 3255
diff changeset
2216 aimbs_put16(&fr->data, 0x0000);
1e60a05c7482 [gaim-migrate @ 3697]
Mark Doliner <mark@kingant.net>
parents: 3255
diff changeset
2217
1e60a05c7482 [gaim-migrate @ 3697]
Mark Doliner <mark@kingant.net>
parents: 3255
diff changeset
2218 /*
1e60a05c7482 [gaim-migrate @ 3697]
Mark Doliner <mark@kingant.net>
parents: 3255
diff changeset
2219 * Type 1 (should be 0x0001 for mtn)
1e60a05c7482 [gaim-migrate @ 3697]
Mark Doliner <mark@kingant.net>
parents: 3255
diff changeset
2220 */
1e60a05c7482 [gaim-migrate @ 3697]
Mark Doliner <mark@kingant.net>
parents: 3255
diff changeset
2221 aimbs_put16(&fr->data, type1);
1e60a05c7482 [gaim-migrate @ 3697]
Mark Doliner <mark@kingant.net>
parents: 3255
diff changeset
2222
1e60a05c7482 [gaim-migrate @ 3697]
Mark Doliner <mark@kingant.net>
parents: 3255
diff changeset
2223 /*
1e60a05c7482 [gaim-migrate @ 3697]
Mark Doliner <mark@kingant.net>
parents: 3255
diff changeset
2224 * Dest sn
1e60a05c7482 [gaim-migrate @ 3697]
Mark Doliner <mark@kingant.net>
parents: 3255
diff changeset
2225 */
1e60a05c7482 [gaim-migrate @ 3697]
Mark Doliner <mark@kingant.net>
parents: 3255
diff changeset
2226 aimbs_put8(&fr->data, strlen(sn));
1e60a05c7482 [gaim-migrate @ 3697]
Mark Doliner <mark@kingant.net>
parents: 3255
diff changeset
2227 aimbs_putraw(&fr->data, sn, strlen(sn));
1e60a05c7482 [gaim-migrate @ 3697]
Mark Doliner <mark@kingant.net>
parents: 3255
diff changeset
2228
1e60a05c7482 [gaim-migrate @ 3697]
Mark Doliner <mark@kingant.net>
parents: 3255
diff changeset
2229 /*
1e60a05c7482 [gaim-migrate @ 3697]
Mark Doliner <mark@kingant.net>
parents: 3255
diff changeset
2230 * Type 2 (should be 0x0000, 0x0001, or 0x0002 for mtn)
1e60a05c7482 [gaim-migrate @ 3697]
Mark Doliner <mark@kingant.net>
parents: 3255
diff changeset
2231 */
1e60a05c7482 [gaim-migrate @ 3697]
Mark Doliner <mark@kingant.net>
parents: 3255
diff changeset
2232 aimbs_put16(&fr->data, type2);
1e60a05c7482 [gaim-migrate @ 3697]
Mark Doliner <mark@kingant.net>
parents: 3255
diff changeset
2233
1e60a05c7482 [gaim-migrate @ 3697]
Mark Doliner <mark@kingant.net>
parents: 3255
diff changeset
2234 aim_tx_enqueue(sess, fr);
1e60a05c7482 [gaim-migrate @ 3697]
Mark Doliner <mark@kingant.net>
parents: 3255
diff changeset
2235
1e60a05c7482 [gaim-migrate @ 3697]
Mark Doliner <mark@kingant.net>
parents: 3255
diff changeset
2236 return 0;
1e60a05c7482 [gaim-migrate @ 3697]
Mark Doliner <mark@kingant.net>
parents: 3255
diff changeset
2237 }
1e60a05c7482 [gaim-migrate @ 3697]
Mark Doliner <mark@kingant.net>
parents: 3255
diff changeset
2238
1e60a05c7482 [gaim-migrate @ 3697]
Mark Doliner <mark@kingant.net>
parents: 3255
diff changeset
2239 /*
3952
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
2240 * Subtype 0x0014 - Receive a mini typing notification (mtn) packet.
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
2241 *
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
2242 * This is supported by winaim5 and newer, MacAIM bleh and newer, iChat bleh and newer,
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
2243 * and Gaim 0.60 and newer.
07283934dedd [gaim-migrate @ 4133]
Mark Doliner <mark@kingant.net>
parents: 3771
diff changeset
2244 *
3595
1e60a05c7482 [gaim-migrate @ 3697]
Mark Doliner <mark@kingant.net>
parents: 3255
diff changeset
2245 */
1e60a05c7482 [gaim-migrate @ 3697]
Mark Doliner <mark@kingant.net>
parents: 3255
diff changeset
2246 static int mtn_receive(aim_session_t *sess, aim_module_t *mod, aim_frame_t *rx, aim_modsnac_t *snac, aim_bstream_t *bs)
1e60a05c7482 [gaim-migrate @ 3697]
Mark Doliner <mark@kingant.net>
parents: 3255
diff changeset
2247 {
1e60a05c7482 [gaim-migrate @ 3697]
Mark Doliner <mark@kingant.net>
parents: 3255
diff changeset
2248 int ret = 0;
1e60a05c7482 [gaim-migrate @ 3697]
Mark Doliner <mark@kingant.net>
parents: 3255
diff changeset
2249 aim_rxcallback_t userfunc;
1e60a05c7482 [gaim-migrate @ 3697]
Mark Doliner <mark@kingant.net>
parents: 3255
diff changeset
2250 char *sn;
1e60a05c7482 [gaim-migrate @ 3697]
Mark Doliner <mark@kingant.net>
parents: 3255
diff changeset
2251 fu8_t snlen;
1e60a05c7482 [gaim-migrate @ 3697]
Mark Doliner <mark@kingant.net>
parents: 3255
diff changeset
2252 fu16_t type1, type2;
1e60a05c7482 [gaim-migrate @ 3697]
Mark Doliner <mark@kingant.net>
parents: 3255
diff changeset
2253
1e60a05c7482 [gaim-migrate @ 3697]
Mark Doliner <mark@kingant.net>
parents: 3255
diff changeset
2254 aim_bstream_advance(bs, 8); /* Unknown - All 0's */
1e60a05c7482 [gaim-migrate @ 3697]
Mark Doliner <mark@kingant.net>
parents: 3255
diff changeset
2255 type1 = aimbs_get16(bs);
1e60a05c7482 [gaim-migrate @ 3697]
Mark Doliner <mark@kingant.net>
parents: 3255
diff changeset
2256 snlen = aimbs_get8(bs);
1e60a05c7482 [gaim-migrate @ 3697]
Mark Doliner <mark@kingant.net>
parents: 3255
diff changeset
2257 sn = aimbs_getstr(bs, snlen);
1e60a05c7482 [gaim-migrate @ 3697]
Mark Doliner <mark@kingant.net>
parents: 3255
diff changeset
2258 type2 = aimbs_get16(bs);
1e60a05c7482 [gaim-migrate @ 3697]
Mark Doliner <mark@kingant.net>
parents: 3255
diff changeset
2259
1e60a05c7482 [gaim-migrate @ 3697]
Mark Doliner <mark@kingant.net>
parents: 3255
diff changeset
2260 if ((userfunc = aim_callhandler(sess, rx->conn, snac->family, snac->subtype)))
1e60a05c7482 [gaim-migrate @ 3697]
Mark Doliner <mark@kingant.net>
parents: 3255
diff changeset
2261 ret = userfunc(sess, rx, type1, sn, type2);
1e60a05c7482 [gaim-migrate @ 3697]
Mark Doliner <mark@kingant.net>
parents: 3255
diff changeset
2262
1e60a05c7482 [gaim-migrate @ 3697]
Mark Doliner <mark@kingant.net>
parents: 3255
diff changeset
2263 free(sn);
1e60a05c7482 [gaim-migrate @ 3697]
Mark Doliner <mark@kingant.net>
parents: 3255
diff changeset
2264
1e60a05c7482 [gaim-migrate @ 3697]
Mark Doliner <mark@kingant.net>
parents: 3255
diff changeset
2265 return ret;
1e60a05c7482 [gaim-migrate @ 3697]
Mark Doliner <mark@kingant.net>
parents: 3255
diff changeset
2266 }
1e60a05c7482 [gaim-migrate @ 3697]
Mark Doliner <mark@kingant.net>
parents: 3255
diff changeset
2267
2246
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
2268 static int snachandler(aim_session_t *sess, aim_module_t *mod, aim_frame_t *rx, aim_modsnac_t *snac, aim_bstream_t *bs)
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
2269 {
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
2270
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
2271 if (snac->subtype == 0x0005)
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
2272 return paraminfo(sess, mod, rx, snac, bs);
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
2273 else if (snac->subtype == 0x0006)
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
2274 return outgoingim(sess, mod, rx, snac, bs);
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
2275 else if (snac->subtype == 0x0007)
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
2276 return incomingim(sess, mod, rx, snac, bs);
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
2277 else if (snac->subtype == 0x000a)
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
2278 return missedcall(sess, mod, rx, snac, bs);
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
2279 else if (snac->subtype == 0x000b)
3212
56746b0868db [gaim-migrate @ 3229]
Sean Egan <seanegan@gmail.com>
parents: 3159
diff changeset
2280 return clientautoresp(sess, mod, rx, snac, bs);
2246
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
2281 else if (snac->subtype == 0x000c)
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
2282 return msgack(sess, mod, rx, snac, bs);
3595
1e60a05c7482 [gaim-migrate @ 3697]
Mark Doliner <mark@kingant.net>
parents: 3255
diff changeset
2283 else if (snac->subtype == 0x0014)
1e60a05c7482 [gaim-migrate @ 3697]
Mark Doliner <mark@kingant.net>
parents: 3255
diff changeset
2284 return mtn_receive(sess, mod, rx, snac, bs);
2246
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
2285
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
2286 return 0;
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
2287 }
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
2288
3752
b32474e522fa [gaim-migrate @ 3890]
Luke Schierer <lschiere@pidgin.im>
parents: 3630
diff changeset
2289 static int snacdestructor(aim_session_t *sess, aim_conn_t *conn, aim_modsnac_t *snac, void *data)
b32474e522fa [gaim-migrate @ 3890]
Luke Schierer <lschiere@pidgin.im>
parents: 3630
diff changeset
2290 {
b32474e522fa [gaim-migrate @ 3890]
Luke Schierer <lschiere@pidgin.im>
parents: 3630
diff changeset
2291 aim_rxcallback_t userfunc;
b32474e522fa [gaim-migrate @ 3890]
Luke Schierer <lschiere@pidgin.im>
parents: 3630
diff changeset
2292 int ret = 0;
b32474e522fa [gaim-migrate @ 3890]
Luke Schierer <lschiere@pidgin.im>
parents: 3630
diff changeset
2293
b32474e522fa [gaim-migrate @ 3890]
Luke Schierer <lschiere@pidgin.im>
parents: 3630
diff changeset
2294 if (snac->subtype == 0x0006) {
b32474e522fa [gaim-migrate @ 3890]
Luke Schierer <lschiere@pidgin.im>
parents: 3630
diff changeset
2295 if ((userfunc = aim_callhandler(sess, conn, AIM_CB_FAM_SPECIAL, AIM_CB_SPECIAL_MSGTIMEOUT)))
b32474e522fa [gaim-migrate @ 3890]
Luke Schierer <lschiere@pidgin.im>
parents: 3630
diff changeset
2296 ret = userfunc(sess, NULL, conn, data);
b32474e522fa [gaim-migrate @ 3890]
Luke Schierer <lschiere@pidgin.im>
parents: 3630
diff changeset
2297 }
b32474e522fa [gaim-migrate @ 3890]
Luke Schierer <lschiere@pidgin.im>
parents: 3630
diff changeset
2298 /* Note that we return 1 for success, 0 for failure. */
b32474e522fa [gaim-migrate @ 3890]
Luke Schierer <lschiere@pidgin.im>
parents: 3630
diff changeset
2299 return ret;
b32474e522fa [gaim-migrate @ 3890]
Luke Schierer <lschiere@pidgin.im>
parents: 3630
diff changeset
2300 }
b32474e522fa [gaim-migrate @ 3890]
Luke Schierer <lschiere@pidgin.im>
parents: 3630
diff changeset
2301
2246
933346315b9b [gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2196
diff changeset
2302 faim_internal int msg_modfirst(aim_session_t *sess, aim_module_t *mod)
2086
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
2303 {
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
2304
2167
edf8c5a70e5b [gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2122
diff changeset
2305 mod->family = 0x0004;
2672
c41030cfed76 [gaim-migrate @ 2685]
Adam Fritzler <mid@auk.cx>
parents: 2639
diff changeset
2306 mod->version = 0x0001;
c41030cfed76 [gaim-migrate @ 2685]
Adam Fritzler <mid@auk.cx>
parents: 2639
diff changeset
2307 mod->toolid = 0x0110;
4071
2532f1192da3 [gaim-migrate @ 4283]
Mark Doliner <mark@kingant.net>
parents: 3952
diff changeset
2308 mod->toolversion = 0x0629;
2167
edf8c5a70e5b [gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2122
diff changeset
2309 mod->flags = 0;
edf8c5a70e5b [gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2122
diff changeset
2310 strncpy(mod->name, "messaging", sizeof(mod->name));
edf8c5a70e5b [gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2122
diff changeset
2311 mod->snachandler = snachandler;
3752
b32474e522fa [gaim-migrate @ 3890]
Luke Schierer <lschiere@pidgin.im>
parents: 3630
diff changeset
2312 mod->snacdestructor = snacdestructor;
2086
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
2313
2167
edf8c5a70e5b [gaim-migrate @ 2177]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 2122
diff changeset
2314 return 0;
2086
424a40f12a6c [gaim-migrate @ 2096]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
diff changeset
2315 }