public static void ProcessInfoResponse(DataPacket dp) { // The first four bytes of this are the TLV 0x0001 // header which encapsulates the rest of the data int index = 4; ushort cmdlength = dp.Data.ReadUshortLE(); uint my_uin = dp.Data.ReadUintLE(); ushort command = dp.Data.ReadUshortLE(); ushort requestID = dp.Data.ReadUshortLE(); Encoding enc = Encoding.ASCII; switch (command) { case 0x0041: break; case 0x0042: // Gaim does a callback here break; case 0x07DA: ICQInfo info = new ICQInfo(); // RecallICQInfo(requestid) ushort subtype = dp.Data.ReadUshortLE(); index++; // 0x0A switch (subtype) { case 0x00A0: break; case 0x00AA: break; case 0x00C8: info.Nickname = dp.Data.ReadString(dp.Data.ReadUshortLE(), Encoding.ASCII); info.Firstname = dp.Data.ReadString(dp.Data.ReadUshortLE(), Encoding.ASCII); info.Lastname = dp.Data.ReadString(dp.Data.ReadUshortLE(), Encoding.ASCII); info.Email = dp.Data.ReadString(dp.Data.ReadUshortLE(), Encoding.ASCII); info.HomeCity = dp.Data.ReadString(dp.Data.ReadUshortLE(), Encoding.ASCII); info.HomeState = dp.Data.ReadString(dp.Data.ReadUshortLE(), Encoding.ASCII); info.HomePhone = dp.Data.ReadString(dp.Data.ReadUshortLE(), Encoding.ASCII); info.HomeFax = dp.Data.ReadString(dp.Data.ReadUshortLE(), Encoding.ASCII); info.HomeAddress = dp.Data.ReadString(dp.Data.ReadUshortLE(), Encoding.ASCII); info.MobilePhone = dp.Data.ReadString(dp.Data.ReadUshortLE(), Encoding.ASCII); info.HomeZip = dp.Data.ReadString(dp.Data.ReadUshortLE(), Encoding.ASCII); info.HomeCountry = dp.Data.ReadUshortLE(); break; case 0x00DC: info.Age = dp.Data.ReadByte(); index++; // unknown info.Gender = dp.Data.ReadByte(); info.PersonalURL = dp.Data.ReadString(dp.Data.ReadUshortLE(), Encoding.ASCII); info.BirthYear = dp.Data.ReadUshortLE(); info.BirthMonth = dp.Data.ReadByte(); info.BirthDay = dp.Data.ReadByte(); info.Language1 = dp.Data.ReadByte(); info.Language2 = dp.Data.ReadByte(); info.Language3 = dp.Data.ReadByte(); break; case 0x00D2: info.WorkCity = dp.Data.ReadString(dp.Data.ReadUshortLE(), Encoding.ASCII); info.WorkState = dp.Data.ReadString(dp.Data.ReadUshortLE(), Encoding.ASCII); info.WorkPhone = dp.Data.ReadString(dp.Data.ReadUshortLE(), Encoding.ASCII); info.WorkFax = dp.Data.ReadString(dp.Data.ReadUshortLE(), Encoding.ASCII); info.WorkAddress = dp.Data.ReadString(dp.Data.ReadUshortLE(), Encoding.ASCII); info.WorkZip = dp.Data.ReadString(dp.Data.ReadUshortLE(), Encoding.ASCII); info.WorkCountry = dp.Data.ReadUshortLE(); info.WorkCompany = dp.Data.ReadString(dp.Data.ReadUshortLE(), Encoding.ASCII); info.WorkDivision = dp.Data.ReadString(dp.Data.ReadUshortLE(), Encoding.ASCII); info.WorkPosition = dp.Data.ReadString(dp.Data.ReadUshortLE(), Encoding.ASCII); index += 2; info.WorkWebsite = dp.Data.ReadString(dp.Data.ReadUshortLE(), Encoding.ASCII); break; case 0x00E6: info.Information = dp.Data.ReadString(dp.Data.ReadUshortLE(), Encoding.ASCII); break; case 0x00EB: ushort numaddresses = dp.Data.ReadUshortLE(); info.EmailAddresses = new string[numaddresses]; for (int i = 0; i < numaddresses; i++) { info.EmailAddresses[i] = dp.Data.ReadString(dp.Data.ReadUshortLE(), Encoding.ASCII); if (i + 1 != numaddresses) index++; } break; case 0x00F0: break; case 0x00FA: break; case 0x0104: info.Nickname = dp.Data.ReadString(dp.Data.ReadUshortLE(), Encoding.ASCII); info.Firstname = dp.Data.ReadString(dp.Data.ReadUshortLE(), Encoding.ASCII); info.Lastname = dp.Data.ReadString(dp.Data.ReadUshortLE(), Encoding.ASCII); break; case 0x010E: break; case 0x019A: index += 2; info.Screenname = dp.Data.ReadUintLE().ToString(); info.Nickname = dp.Data.ReadString(dp.Data.ReadUshortLE(), Encoding.ASCII); info.Firstname = dp.Data.ReadString(dp.Data.ReadUshortLE(), Encoding.ASCII); info.Lastname = dp.Data.ReadString(dp.Data.ReadUshortLE(), Encoding.ASCII); info.Email = dp.Data.ReadString(dp.Data.ReadUshortLE(), Encoding.ASCII); break; } // End the subtype switch statement break; // Do some crazy multipart snac stuff default: index += cmdlength; break; } }
public static void ProcessInfoResponse(DataPacket dp) { // The first four bytes of this are the TLV 0x0001 // header which encapsulates the rest of the data int index = 4; ushort cmdlength = dp.Data.ReadUshortLE(); uint my_uin = dp.Data.ReadUintLE(); ushort command = dp.Data.ReadUshortLE(); ushort requestID = dp.Data.ReadUshortLE(); Encoding enc = Encoding.ASCII; switch (command) { case 0x0041: break; case 0x0042: // Gaim does a callback here break; case 0x07DA: ICQInfo info = new ICQInfo(); // RecallICQInfo(requestid) ushort subtype = dp.Data.ReadUshortLE(); index++; // 0x0A switch (subtype) { case 0x00A0: break; case 0x00AA: break; case 0x00C8: info.Nickname = dp.Data.ReadString(dp.Data.ReadUshortLE(), Encoding.ASCII); info.Firstname = dp.Data.ReadString(dp.Data.ReadUshortLE(), Encoding.ASCII); info.Lastname = dp.Data.ReadString(dp.Data.ReadUshortLE(), Encoding.ASCII); info.Email = dp.Data.ReadString(dp.Data.ReadUshortLE(), Encoding.ASCII); info.HomeCity = dp.Data.ReadString(dp.Data.ReadUshortLE(), Encoding.ASCII); info.HomeState = dp.Data.ReadString(dp.Data.ReadUshortLE(), Encoding.ASCII); info.HomePhone = dp.Data.ReadString(dp.Data.ReadUshortLE(), Encoding.ASCII); info.HomeFax = dp.Data.ReadString(dp.Data.ReadUshortLE(), Encoding.ASCII); info.HomeAddress = dp.Data.ReadString(dp.Data.ReadUshortLE(), Encoding.ASCII); info.MobilePhone = dp.Data.ReadString(dp.Data.ReadUshortLE(), Encoding.ASCII); info.HomeZip = dp.Data.ReadString(dp.Data.ReadUshortLE(), Encoding.ASCII); info.HomeCountry = dp.Data.ReadUshortLE(); break; case 0x00DC: info.Age = dp.Data.ReadByte(); index++; // unknown info.Gender = dp.Data.ReadByte(); info.PersonalURL = dp.Data.ReadString(dp.Data.ReadUshortLE(), Encoding.ASCII); info.BirthYear = dp.Data.ReadUshortLE(); info.BirthMonth = dp.Data.ReadByte(); info.BirthDay = dp.Data.ReadByte(); info.Language1 = dp.Data.ReadByte(); info.Language2 = dp.Data.ReadByte(); info.Language3 = dp.Data.ReadByte(); break; case 0x00D2: info.WorkCity = dp.Data.ReadString(dp.Data.ReadUshortLE(), Encoding.ASCII); info.WorkState = dp.Data.ReadString(dp.Data.ReadUshortLE(), Encoding.ASCII); info.WorkPhone = dp.Data.ReadString(dp.Data.ReadUshortLE(), Encoding.ASCII); info.WorkFax = dp.Data.ReadString(dp.Data.ReadUshortLE(), Encoding.ASCII); info.WorkAddress = dp.Data.ReadString(dp.Data.ReadUshortLE(), Encoding.ASCII); info.WorkZip = dp.Data.ReadString(dp.Data.ReadUshortLE(), Encoding.ASCII); info.WorkCountry = dp.Data.ReadUshortLE(); info.WorkCompany = dp.Data.ReadString(dp.Data.ReadUshortLE(), Encoding.ASCII); info.WorkDivision = dp.Data.ReadString(dp.Data.ReadUshortLE(), Encoding.ASCII); info.WorkPosition = dp.Data.ReadString(dp.Data.ReadUshortLE(), Encoding.ASCII); index += 2; info.WorkWebsite = dp.Data.ReadString(dp.Data.ReadUshortLE(), Encoding.ASCII); break; case 0x00E6: info.Information = dp.Data.ReadString(dp.Data.ReadUshortLE(), Encoding.ASCII); break; case 0x00EB: ushort numaddresses = dp.Data.ReadUshortLE(); info.EmailAddresses = new string[numaddresses]; for (int i = 0; i < numaddresses; i++) { info.EmailAddresses[i] = dp.Data.ReadString(dp.Data.ReadUshortLE(), Encoding.ASCII); if (i + 1 != numaddresses) { index++; } } break; case 0x00F0: break; case 0x00FA: break; case 0x0104: info.Nickname = dp.Data.ReadString(dp.Data.ReadUshortLE(), Encoding.ASCII); info.Firstname = dp.Data.ReadString(dp.Data.ReadUshortLE(), Encoding.ASCII); info.Lastname = dp.Data.ReadString(dp.Data.ReadUshortLE(), Encoding.ASCII); break; case 0x010E: break; case 0x019A: index += 2; info.Screenname = dp.Data.ReadUintLE().ToString(); info.Nickname = dp.Data.ReadString(dp.Data.ReadUshortLE(), Encoding.ASCII); info.Firstname = dp.Data.ReadString(dp.Data.ReadUshortLE(), Encoding.ASCII); info.Lastname = dp.Data.ReadString(dp.Data.ReadUshortLE(), Encoding.ASCII); info.Email = dp.Data.ReadString(dp.Data.ReadUshortLE(), Encoding.ASCII); break; } // End the subtype switch statement break; // Do some crazy multipart snac stuff default: index += cmdlength; break; } }