comparison src/protocols/oscar/im.c @ 11263:14a166f01a8e

[gaim-migrate @ 13443] Reverting sf patch #1247984 because Kevin and I think it's causing "Not supported by client" gaim_notify windows to pop up. committer: Tailor Script <tailor@pidgin.im>
author Mark Doliner <mark@kingant.net>
date Mon, 15 Aug 2005 03:23:55 +0000
parents 1b1d63602d77
children bcd7bd6a42dd
comparison
equal deleted inserted replaced
11262:ecbbe6d18b0d 11263:14a166f01a8e
970 /* TLV t(2711) */ 970 /* TLV t(2711) */
971 aimbs_put16(&fr->data, 0x2711); 971 aimbs_put16(&fr->data, 0x2711);
972 aimbs_put16(&fr->data, 0x0036); 972 aimbs_put16(&fr->data, 0x0036);
973 { /* V */ 973 { /* V */
974 aimbs_putle16(&fr->data, 0x001b); /* L */ 974 aimbs_putle16(&fr->data, 0x001b); /* L */
975 aimbs_putle16(&fr->data, 0x0009); /* Protocol version */ 975 aimbs_putle16(&fr->data, 0x0008); /* XXX - Protocol version */
976 aim_putcap(&fr->data, AIM_CAPS_EMPTY); 976 aim_putcap(&fr->data, AIM_CAPS_EMPTY);
977 aimbs_putle16(&fr->data, 0x0000); /* Unknown */ 977 aimbs_putle16(&fr->data, 0x0000); /* Unknown */
978 aimbs_putle16(&fr->data, 0x0001); /* Client features? */ 978 aimbs_putle16(&fr->data, 0x0003); /* Client features? */
979 aimbs_putle16(&fr->data, 0x0000); /* Unknown */ 979 aimbs_putle16(&fr->data, 0x0000); /* Unknown */
980 aimbs_putle8(&fr->data, 0x00); /* Unkizown */ 980 aimbs_putle8(&fr->data, 0x00); /* Unkizown */
981 aimbs_putle16(&fr->data, 0xffff); /* Sequence number? XXX - This should decrement by 1 with each request */ 981 aimbs_putle16(&fr->data, 0xffff); /* Sequence number? XXX - This should decrement by 1 with each request */
982 982
983 aimbs_putle16(&fr->data, 0x000e); /* L */ 983 aimbs_putle16(&fr->data, 0x000e); /* L */
986 aimbs_putle32(&fr->data, 0x00000000); /* Unknown */ 986 aimbs_putle32(&fr->data, 0x00000000); /* Unknown */
987 aimbs_putle32(&fr->data, 0x00000000); /* Unknown */ 987 aimbs_putle32(&fr->data, 0x00000000); /* Unknown */
988 988
989 /* The type of status message being requested */ 989 /* The type of status message being requested */
990 if (type & AIM_ICQ_STATE_CHAT) 990 if (type & AIM_ICQ_STATE_CHAT)
991 aimbs_putle8(&fr->data, 0xec); 991 aimbs_putle16(&fr->data, 0x03ec);
992 else if(type & AIM_ICQ_STATE_DND) 992 else if(type & AIM_ICQ_STATE_DND)
993 aimbs_putle8(&fr->data, 0xeb); 993 aimbs_putle16(&fr->data, 0x03eb);
994 else if(type & AIM_ICQ_STATE_OUT) 994 else if(type & AIM_ICQ_STATE_OUT)
995 aimbs_putle8(&fr->data, 0xea); 995 aimbs_putle16(&fr->data, 0x03ea);
996 else if(type & AIM_ICQ_STATE_BUSY) 996 else if(type & AIM_ICQ_STATE_BUSY)
997 aimbs_putle8(&fr->data, 0xe9); 997 aimbs_putle16(&fr->data, 0x03e9);
998 else if(type & AIM_ICQ_STATE_AWAY) 998 else if(type & AIM_ICQ_STATE_AWAY)
999 aimbs_putle8(&fr->data, 0xe8); 999 aimbs_putle16(&fr->data, 0x03e8);
1000 else
1001 /* This should not happen */
1002 aimbs_putle8(&fr->data, 0x00);
1003 aimbs_putle8(&fr->data, 0x03); /* Message Flags */
1004 1000
1005 aimbs_putle16(&fr->data, 0x0000); /* Status? */ 1001 aimbs_putle16(&fr->data, 0x0000); /* Status? */
1006 aimbs_putle16(&fr->data, 0x0001); /* Priority of this message? */ 1002 aimbs_putle16(&fr->data, 0x0001); /* Priority of this message? */
1007 aimbs_putle16(&fr->data, 0x0001); /* L */ 1003 aimbs_putle16(&fr->data, 0x0001); /* L */
1008 aimbs_putle8(&fr->data, 0x00); /* String of length L */ 1004 aimbs_putle8(&fr->data, 0x00); /* String of length L */
2196 channel = aimbs_get16(bs); 2192 channel = aimbs_get16(bs);
2197 snlen = aimbs_get8(bs); 2193 snlen = aimbs_get8(bs);
2198 sn = aimbs_getstr(bs, snlen); 2194 sn = aimbs_getstr(bs, snlen);
2199 reason = aimbs_get16(bs); 2195 reason = aimbs_get16(bs);
2200 2196
2201 if (channel == 0x0002) { 2197 if (channel == 0x0002) { /* File transfer declined */
2202 switch (reason) { 2198 aimbs_get16(bs); /* Unknown */
2203 case 0x0003: { 2199 aimbs_get16(bs); /* Unknown */
2204 /* This is exactly like the Extended Data TLV (2711) */ 2200 if ((userfunc = aim_callhandler(sess, rx->conn, snac->family, snac->subtype)))
2205 fu16_t len; 2201 ret = userfunc(sess, rx, channel, sn, reason, ck);
2206 fu16_t version;
2207 fu8_t plugin_uuid[16];
2208
2209 len = aimbs_getle16(bs); /* Usually 0x001b */
2210 version = aimbs_getle16(bs);
2211 aimbs_getrawbuf(bs, plugin_uuid, sizeof(plugin_uuid));
2212 aim_bstream_advance(bs, len - sizeof(version) - sizeof(plugin_uuid)); /* Rest is unknown */
2213
2214 len = aimbs_getle16(bs); /* Usually 0x000e */
2215 aim_bstream_advance(bs, len); /* Unknown */
2216
2217 if (plugin_uuid[0] == 0 &&
2218 plugin_uuid[1] == 0 &&
2219 plugin_uuid[2] == 0 &&
2220 plugin_uuid[3] == 0 &&
2221 plugin_uuid[4] == 0 &&
2222 plugin_uuid[5] == 0 &&
2223 plugin_uuid[6] == 0 &&
2224 plugin_uuid[7] == 0 &&
2225 plugin_uuid[8] == 0 &&
2226 plugin_uuid[9] == 0 &&
2227 plugin_uuid[10] == 0 &&
2228 plugin_uuid[11] == 0 &&
2229 plugin_uuid[12] == 0 &&
2230 plugin_uuid[13] == 0 &&
2231 plugin_uuid[14] == 0 &&
2232 plugin_uuid[15] == 0)
2233 {
2234 fu8_t msg_type, msg_flags, *msg;
2235 fu16_t status_code, priority_code, msg_length;
2236 fu32_t state;
2237
2238 msg_type = aimbs_getle8(bs);
2239 switch (msg_type) {
2240 case 0xe8:
2241 state = AIM_ICQ_STATE_AWAY;
2242 break;
2243 case 0xe9:
2244 state = AIM_ICQ_STATE_AWAY | AIM_ICQ_STATE_BUSY;
2245 break;
2246 case 0xea:
2247 state = AIM_ICQ_STATE_AWAY | AIM_ICQ_STATE_OUT;
2248 break;
2249 case 0xeb:
2250 state = AIM_ICQ_STATE_AWAY | AIM_ICQ_STATE_DND | AIM_ICQ_STATE_BUSY;
2251 break;
2252 case 0xec:
2253 state = AIM_ICQ_STATE_CHAT;
2254 break;
2255 default:
2256 state = 0;
2257 break;
2258 }
2259 msg_flags = aimbs_getle8(bs); /* would usually have 0x03 == auto msg */
2260 status_code = aimbs_getle16(bs);
2261 priority_code = aimbs_getle16(bs);
2262
2263 msg_length = aimbs_getle16(bs);
2264 msg = aimbs_getraw(bs, msg_length);
2265
2266 if (state & AIM_ICQ_STATE_AWAY)
2267 {
2268 aim_userinfo_t *userinfo = aim_locate_finduserinfo(sess, sn);
2269 free(userinfo->away);
2270 free(userinfo->away_encoding);
2271 if (msg_length > 0)
2272 {
2273 userinfo->away = (char *)malloc(msg_length);
2274 memcpy(userinfo->away, msg, msg_length);
2275 }
2276 else
2277 {
2278 userinfo->away = NULL;
2279 }
2280 userinfo->away_len = msg_length - 1; /* msg_length includes a terminating '\0' */
2281 userinfo->away_encoding = strdup("text/x-aolrtf; charset=\"utf-8\"");
2282 }
2283
2284 if ((userfunc = aim_callhandler(sess, rx->conn, snac->family, snac->subtype)))
2285 ret = userfunc(sess, rx, channel, sn, reason, state, msg);
2286 }
2287 else
2288 {
2289 if ((userfunc = aim_callhandler(sess, rx->conn, snac->family, snac->subtype)))
2290 ret = userfunc(sess, rx, channel, sn, reason, ck);
2291 }
2292 break;
2293 }
2294
2295 default: {
2296 /* File transfer declined? */
2297 if ((userfunc = aim_callhandler(sess, rx->conn, snac->family, snac->subtype)))
2298 ret = userfunc(sess, rx, channel, sn, reason, ck);
2299 }
2300 }
2301 } else if (channel == 0x0004) { /* ICQ message */ 2202 } else if (channel == 0x0004) { /* ICQ message */
2302 switch (reason) { 2203 switch (reason) {
2303 case 0x0003: { /* ICQ status message. Maybe other stuff too, you never know with these people. */ 2204 case 0x0003: { /* ICQ status message. Maybe other stuff too, you never know with these people. */
2304 fu8_t statusmsgtype, *msg; 2205 fu8_t statusmsgtype, *msg;
2305 fu16_t len; 2206 fu16_t len;