/// <summary> /// Reads a <see cref="UserInfo"/> from the stream /// </summary> public UserInfo ReadUserInfo() { UserInfo retval = new UserInfo(); byte screenNameLength = ReadByte(); if (screenNameLength == 0) { return(null); } retval.ScreenName = ReadString(screenNameLength, Encoding.ASCII); retval.WarningLevel = ReadUshort(); using (TlvBlock tlvBlock = ReadTlvBlock(ReadUshort())) { retval.Class = (UserClass)tlvBlock.ReadUshort(0x0001); retval.CreateTime = tlvBlock.ReadDateTime(0x0002); retval.SignonTime = tlvBlock.ReadDateTime(0x0003); retval.IdleTime = tlvBlock.ReadUshort(0x0004); if (retval.IdleTime == 0xFFFF) { retval.IdleTime = 0; } retval.RegisterTime = tlvBlock.ReadDateTime(0x0005); retval.ICQUserStatus = tlvBlock.ReadUint(0x0006); retval.ExternalIPAddress = tlvBlock.ReadUint(0x000A); // Read the DC info from 0x000C retval.ClientCapabilities = CapabilityProcessor.ProcessCLSIDList(tlvBlock.ReadByteArray(0x000D)); retval.OnlineTime = tlvBlock.ReadUint(0x000F); if (tlvBlock.HasTlv(0x001D)) { ReadIconInfo(tlvBlock.ReadByteArray(0x001D), retval); } } return(retval); }
/// <summary> /// Processes an incoming ICBM message on channel 1 -- SNAC(04,07) /// </summary> /// <param name="stream">A received <see cref="ByteStream"/></param> /// <param name="ui">The UserInfo block that came with this message</param> private void ProcessChannelOneMessage(ByteStream stream, UserInfo ui) { IM message = new IM(ui); using (TlvBlock tlvs = new TlvBlock(stream.ReadByteArrayToEnd())) { message.IsAutoResponse = tlvs.HasTlv(0x0004); // If this message was received offline, cast it to an OfflineIM if (tlvs.HasTlv(0x0006)) { message = new OfflineIM(message); if (tlvs.HasTlv(0x0016)) { ((OfflineIM)message).ReceivedOn = tlvs.ReadDateTime(0x0016); } } GetChannelOneMessage(new ByteStream(tlvs.ReadByteArray(0x0002)), ref message); } // Figure out what to do with it if (message is OfflineIM) { OfflineIM offlineMessage = message as OfflineIM; if (isRetrievingOfflineMessages) { // Queue it for delivery AcceptIcbmOIM(offlineMessage); } else { // A single offline message? Okay then if (OfflineMessagesReceived != null) { List<OfflineIM> tmpList = new List<OfflineIM>(1); tmpList.Add(offlineMessage); OfflineMessagesReceived(this, new OfflineMessagesReceivedEventArgs(parent.ScreenName, new Collection<OfflineIM>(tmpList))); } } // Offline messages don't get delivered via OnMessageReceived - if the offline messages event // isn't hooked up, tough stuff. return; } else { OnMessageReceived(message); } }