/// <summary> /// Retrieves the message text from SNAC(04,07) TLV 02 /// </summary> /// <param name="stream">A received <see cref="ByteStream"/></param> /// <param name="message">An <see cref="IM"/> object to be populated</param> private void GetChannelOneMessage(ByteStream stream, ref IM message) { while (stream.HasMoreData) { byte identifier = stream.ReadByte(); byte version = stream.ReadByte(); ushort length = stream.ReadUshort(); switch (identifier) { case 0x01: // Message text ushort charset = stream.ReadUshort(); ushort language = stream.ReadUshort(); Encoding incoming = IM.GetEncodingFromCharset(charset, language); message.Message = Encoding.Unicode.GetString( Encoding.Convert(incoming, Encoding.Unicode, stream.ReadByteArray(length - 4))); break; default: // Unhandled case stream.AdvanceOffset(length); break; } } }
/// <summary> /// Parses a byte buffer into an <see cref="BartID"/> object /// </summary> private void ReadIconInfo(byte[] buffer, UserInfo userinfo) { using (ByteStream iconStream = new ByteStream(buffer)) { int iconStreamSize = iconStream.GetByteCount(); while (iconStream.CurrentPosition + 4 <= iconStreamSize) { BartID item = new BartID(iconStream); // Find the end of the current data item in the stream int endDataPosition = iconStream.CurrentPosition + item.Data.Length; switch (item.Type) { case BartTypeId.BuddyIcon: if (!GraphicsManager.IsBlankIcon(item.Data)) { userinfo.Icon = item; } break; case BartTypeId.StatusString: // Available message using (ByteStream messageStream = new ByteStream(item.Data)) { Encoding encoding = Encoding.UTF8; byte[] amessage = new byte[0]; if (messageStream.HasMoreData) { // Pull the message to a byte array, assume at first that the encoding // is UTF-8. If existing encoding information exists, use that instead amessage = messageStream.ReadByteArray(messageStream.ReadByte()); // Check if there's encoding information available if (messageStream.HasMoreData) { // Check to see if the encoding's been specified if (messageStream.ReadUshort() == 0x0001) { messageStream.AdvanceOffset(2); string encodingStr = messageStream.ReadString(messageStream.ReadUshort(), Encoding.ASCII); // Try to use the encoding from the byte stream try { encoding = Encoding.GetEncoding(encodingStr); } catch (ArgumentException) { Logging.WriteString( "ReadIconInfo: Got unknown encoding for available message (" + encodingStr + "), falling back to UTF-8"); encoding = Encoding.UTF8; } } } } userinfo.AvailableMessage = Encoding.Unicode.GetString( Encoding.Convert(encoding, Encoding.Unicode, amessage)); } break; default: break; } } } }