comparison libpurple/protocols/oscar/odc.c @ 27805:80d3f4ff1cae

- fixed the offset of encoding field in ODC frame to be sent to peer. - added sanitize_utf8() to purple_plugin_oscar_convert_to_utf8() as nosuke pointed it out. - altered encoding candidates in purple_plugin_oscar_decode_im_part() to handle UTF-8 properly. - now direct IM with multi-byte characters works correctly.
author Yoshiki Yazawa <yaz@honeyplanet.jp>
date Thu, 20 Mar 2008 11:48:40 +0000
parents 35b4f1dc4c8d
children eeee264cd325
comparison
equal deleted inserted replaced
27804:d44a96d49ee5 27805:80d3f4ff1cae
99 99
100 length = 76; 100 length = 76;
101 byte_stream_new(&bs, length + frame->payload.len); 101 byte_stream_new(&bs, length + frame->payload.len);
102 byte_stream_putraw(&bs, conn->magic, 4); 102 byte_stream_putraw(&bs, conn->magic, 4);
103 byte_stream_put16(&bs, length); 103 byte_stream_put16(&bs, length);
104
104 byte_stream_put16(&bs, frame->type); 105 byte_stream_put16(&bs, frame->type);
105 byte_stream_put16(&bs, frame->subtype); 106 byte_stream_put16(&bs, frame->subtype);
106 byte_stream_put16(&bs, 0x0000); 107 byte_stream_put16(&bs, 0x0000);
108
107 byte_stream_putraw(&bs, frame->cookie, 8); 109 byte_stream_putraw(&bs, frame->cookie, 8);
108 byte_stream_put16(&bs, 0x0000); 110 byte_stream_put16(&bs, 0x0000);
109 byte_stream_put16(&bs, 0x0000); 111 byte_stream_put16(&bs, 0x0000);
110 byte_stream_put16(&bs, 0x0000); 112 byte_stream_put16(&bs, 0x0000);
111 byte_stream_put16(&bs, 0x0000); 113 byte_stream_put16(&bs, 0x0000);
114
112 byte_stream_put32(&bs, frame->payload.len); 115 byte_stream_put32(&bs, frame->payload.len);
113 byte_stream_put16(&bs, 0x0000);
114 byte_stream_put16(&bs, frame->encoding); 116 byte_stream_put16(&bs, frame->encoding);
115 byte_stream_put16(&bs, 0x0000); 117 byte_stream_put16(&bs, 0x0000);
118 byte_stream_put16(&bs, 0x0000);
119
116 byte_stream_put16(&bs, frame->flags); 120 byte_stream_put16(&bs, frame->flags);
117 byte_stream_put16(&bs, 0x0000); 121 byte_stream_put16(&bs, 0x0000);
118 byte_stream_put16(&bs, 0x0000); 122 byte_stream_put16(&bs, 0x0000);
123
119 byte_stream_putraw(&bs, frame->sn, 32); 124 byte_stream_putraw(&bs, frame->sn, 32);
125
120 byte_stream_putraw(&bs, frame->payload.data, frame->payload.len); 126 byte_stream_putraw(&bs, frame->payload.data, frame->payload.len);
121 127
122 peer_connection_send(conn, &bs); 128 peer_connection_send(conn, &bs);
123 129
124 g_free(bs.data); 130 g_free(bs.data);
494 500
495 frame = g_new0(OdcFrame, 1); 501 frame = g_new0(OdcFrame, 1);
496 frame->type = byte_stream_get16(bs); 502 frame->type = byte_stream_get16(bs);
497 frame->subtype = byte_stream_get16(bs); 503 frame->subtype = byte_stream_get16(bs);
498 byte_stream_advance(bs, 2); 504 byte_stream_advance(bs, 2);
505
499 byte_stream_getrawbuf(bs, frame->cookie, 8); 506 byte_stream_getrawbuf(bs, frame->cookie, 8);
500 byte_stream_advance(bs, 8); 507 byte_stream_advance(bs, 8);
508
501 frame->payload.len = byte_stream_get32(bs); 509 frame->payload.len = byte_stream_get32(bs);
502 frame->encoding = byte_stream_get16(bs); 510 frame->encoding = byte_stream_get16(bs);
503 byte_stream_advance(bs, 4); 511 byte_stream_advance(bs, 4);
512
504 frame->flags = byte_stream_get16(bs); 513 frame->flags = byte_stream_get16(bs);
505 byte_stream_advance(bs, 4); 514 byte_stream_advance(bs, 4);
515
506 byte_stream_getrawbuf(bs, frame->sn, 32); 516 byte_stream_getrawbuf(bs, frame->sn, 32);
507 517
508 purple_debug_info("oscar", "Incoming ODC frame from %s with " 518 purple_debug_info("oscar", "Incoming ODC frame from %s with "
509 "type=0x%04x, flags=0x%04x, payload length=%u\n", 519 "type=0x%04x, flags=0x%04x, payload length=%u\n",
510 frame->sn, frame->type, frame->flags, frame->payload.len); 520 frame->sn, frame->type, frame->flags, frame->payload.len);