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