| 48 static const char ck[] = {"create"}; |
48 static const char ck[] = {"create"}; |
| 49 static const char lang[] = {"en"}; |
49 static const char lang[] = {"en"}; |
| 50 static const char charset[] = {"us-ascii"}; |
50 static const char charset[] = {"us-ascii"}; |
| 51 FlapFrame *frame; |
51 FlapFrame *frame; |
| 52 aim_snacid_t snacid; |
52 aim_snacid_t snacid; |
| 53 aim_tlvlist_t *tl = NULL; |
53 GSList *tlvlist = NULL; |
| 54 |
54 |
| 55 frame = flap_frame_new(od, 0x02, 1152); |
55 frame = flap_frame_new(od, 0x02, 1152); |
| 56 |
56 |
| 57 snacid = aim_cachesnac(od, 0x000d, 0x0008, 0x0000, NULL, 0); |
57 snacid = aim_cachesnac(od, 0x000d, 0x0008, 0x0000, NULL, 0); |
| 58 aim_putsnac(&frame->data, 0x000d, 0x0008, 0x0000, snacid); |
58 aim_putsnac(&frame->data, 0x000d, 0x0008, 0x0000, snacid); |
| 83 byte_stream_put16(&frame->data, 0xffff); |
83 byte_stream_put16(&frame->data, 0xffff); |
| 84 |
84 |
| 85 /* detail level */ |
85 /* detail level */ |
| 86 byte_stream_put8(&frame->data, 0x01); |
86 byte_stream_put8(&frame->data, 0x01); |
| 87 |
87 |
| 88 aim_tlvlist_add_str(&tl, 0x00d3, name); |
88 aim_tlvlist_add_str(&tlvlist, 0x00d3, name); |
| 89 aim_tlvlist_add_str(&tl, 0x00d6, charset); |
89 aim_tlvlist_add_str(&tlvlist, 0x00d6, charset); |
| 90 aim_tlvlist_add_str(&tl, 0x00d7, lang); |
90 aim_tlvlist_add_str(&tlvlist, 0x00d7, lang); |
| 91 |
91 |
| 92 /* tlvcount */ |
92 /* tlvcount */ |
| 93 byte_stream_put16(&frame->data, aim_tlvlist_count(&tl)); |
93 byte_stream_put16(&frame->data, aim_tlvlist_count(tlvlist)); |
| 94 aim_tlvlist_write(&frame->data, &tl); |
94 aim_tlvlist_write(&frame->data, &tlvlist); |
| 95 |
95 |
| 96 aim_tlvlist_free(&tl); |
96 aim_tlvlist_free(tlvlist); |
| 97 |
97 |
| 98 flap_connection_send(conn, frame); |
98 flap_connection_send(conn, frame); |
| 99 |
99 |
| 100 return 0; |
100 return 0; |
| 101 } |
101 } |
| 107 int ret = 0; |
107 int ret = 0; |
| 108 struct aim_chat_exchangeinfo *exchanges = NULL; |
108 struct aim_chat_exchangeinfo *exchanges = NULL; |
| 109 int curexchange; |
109 int curexchange; |
| 110 aim_tlv_t *exchangetlv; |
110 aim_tlv_t *exchangetlv; |
| 111 guint8 maxrooms = 0; |
111 guint8 maxrooms = 0; |
| 112 aim_tlvlist_t *tlvlist, *innerlist; |
112 GSList *tlvlist, *innerlist; |
| 113 |
113 |
| 114 tlvlist = aim_tlvlist_read(bs); |
114 tlvlist = aim_tlvlist_read(bs); |
| 115 |
115 |
| 116 /* |
116 /* |
| 117 * Type 0x0002: Maximum concurrent rooms. |
117 * Type 0x0002: Maximum concurrent rooms. |
| 305 g_free(exchanges[curexchange].lang1); |
305 g_free(exchanges[curexchange].lang1); |
| 306 g_free(exchanges[curexchange].charset2); |
306 g_free(exchanges[curexchange].charset2); |
| 307 g_free(exchanges[curexchange].lang2); |
307 g_free(exchanges[curexchange].lang2); |
| 308 } |
308 } |
| 309 g_free(exchanges); |
309 g_free(exchanges); |
| 310 aim_tlvlist_free(&tlvlist); |
310 aim_tlvlist_free(tlvlist); |
| 311 |
311 |
| 312 return ret; |
312 return ret; |
| 313 } |
313 } |
| 314 |
314 |
| 315 static int |
315 static int |
| 316 parseinfo_create(OscarData *od, FlapConnection *conn, aim_module_t *mod, FlapFrame *frame, aim_modsnac_t *snac, ByteStream *bs, aim_snac_t *snac2) |
316 parseinfo_create(OscarData *od, FlapConnection *conn, aim_module_t *mod, FlapFrame *frame, aim_modsnac_t *snac, ByteStream *bs, aim_snac_t *snac2) |
| 317 { |
317 { |
| 318 aim_rxcallback_t userfunc; |
318 aim_rxcallback_t userfunc; |
| 319 aim_tlvlist_t *tlvlist, *innerlist; |
319 GSList *tlvlist, *innerlist; |
| 320 char *ck = NULL, *fqcn = NULL, *name = NULL; |
320 char *ck = NULL, *fqcn = NULL, *name = NULL; |
| 321 guint16 exchange = 0, instance = 0, unknown = 0, flags = 0, maxmsglen = 0, maxoccupancy = 0; |
321 guint16 exchange = 0, instance = 0, unknown = 0, flags = 0, maxmsglen = 0, maxoccupancy = 0; |
| 322 guint32 createtime = 0; |
322 guint32 createtime = 0; |
| 323 guint8 createperms = 0, detaillevel; |
323 guint8 createperms = 0, detaillevel; |
| 324 int cklen; |
324 int cklen; |
| 328 |
328 |
| 329 tlvlist = aim_tlvlist_read(bs); |
329 tlvlist = aim_tlvlist_read(bs); |
| 330 |
330 |
| 331 if (!(bigblock = aim_tlv_gettlv(tlvlist, 0x0004, 1))) { |
331 if (!(bigblock = aim_tlv_gettlv(tlvlist, 0x0004, 1))) { |
| 332 purple_debug_misc("oscar", "no bigblock in top tlv in create room response\n"); |
332 purple_debug_misc("oscar", "no bigblock in top tlv in create room response\n"); |
| 333 aim_tlvlist_free(&tlvlist); |
333 aim_tlvlist_free(tlvlist); |
| 334 return 0; |
334 return 0; |
| 335 } |
335 } |
| 336 |
336 |
| 337 byte_stream_init(&bbbs, bigblock->value, bigblock->length); |
337 byte_stream_init(&bbbs, bigblock->value, bigblock->length); |
| 338 |
338 |
| 342 instance = byte_stream_get16(&bbbs); |
342 instance = byte_stream_get16(&bbbs); |
| 343 detaillevel = byte_stream_get8(&bbbs); |
343 detaillevel = byte_stream_get8(&bbbs); |
| 344 |
344 |
| 345 if (detaillevel != 0x02) { |
345 if (detaillevel != 0x02) { |
| 346 purple_debug_misc("oscar", "unknown detaillevel in create room response (0x%02x)\n", detaillevel); |
346 purple_debug_misc("oscar", "unknown detaillevel in create room response (0x%02x)\n", detaillevel); |
| 347 aim_tlvlist_free(&tlvlist); |
347 aim_tlvlist_free(tlvlist); |
| 348 g_free(ck); |
348 g_free(ck); |
| 349 return 0; |
349 return 0; |
| 350 } |
350 } |
| 351 |
351 |
| 352 unknown = byte_stream_get16(&bbbs); |
352 unknown = byte_stream_get16(&bbbs); |