package pl.radical.open.gg.packet.in; import pl.radical.open.gg.IUser; import pl.radical.open.gg.RemoteStatus; import pl.radical.open.gg.User; import pl.radical.open.gg.packet.AbstractGGIncomingPacket; import pl.radical.open.gg.packet.GGIncomingPackage; import pl.radical.open.gg.packet.IncomingPacket; import pl.radical.open.gg.packet.dicts.GGStatuses; import pl.radical.open.gg.packet.handlers.GGNotifyReply60PacketHandler; import pl.radical.open.gg.utils.GGConversion; import pl.radical.open.gg.utils.GGUtils; import java.util.HashMap; import java.util.Map; /** * @author <a href="mailto:mnaglik@gazeta.pl">Marcin Naglik</a> * @author <a href="mailto:mati@sz.home.pl">Mateusz Szczap</a> */ @IncomingPacket(type = 0x0011, label = "GG_NOTIFY_REPLY60", handler = GGNotifyReply60PacketHandler.class) @Deprecated public class GGNotifyReply60 extends AbstractGGIncomingPacket implements GGIncomingPackage { private final Map<IUser, RemoteStatus> statuses = new HashMap<IUser, RemoteStatus>(); public GGNotifyReply60(final byte[] data) { handlePacket(data); } public Map<IUser, RemoteStatus> getUsersStatus() { return statuses; } private void handlePacket(final byte[] data) { int offset = 0; while (offset < data.length) { final int flag = data[offset + 3]; data[offset + 3] = GGUtils.intToByte(0)[0]; final int uin = GGUtils.byteToInt(data, offset); final int status = GGUtils.unsignedByteToInt(data[offset + 4]); final User.UserMode userMode = GGConversion.getUserMode(status); final int remoteIP = GGUtils.byteToInt(data, offset + 5); final byte[] remoteIPArray = GGUtils.convertIntToByteArray(remoteIP); final int remotePort = GGUtils.byteToShort(data, offset + 9); final int version = GGUtils.unsignedByteToInt(data[offset + 11]); final int imageSize = GGUtils.unsignedByteToInt(data[offset + 12]); String description = null; int descriptionSize = -1; long timeInMillis = -1; if (status == GGStatuses.GG_STATUS_AVAIL_DESCR || status == GGStatuses.GG_STATUS_BUSY_DESCR || status == GGStatuses.GG_STATUS_INVISIBLE_DESCR || status == GGStatuses.GG_STATUS_NOT_AVAIL_DESCR) { descriptionSize = GGUtils.unsignedByteToInt(data[offset + 14]); final byte[] descBytes = new byte[descriptionSize]; System.arraycopy(data, offset + 15, descBytes, 0, descriptionSize); description = GGUtils.byteToString(descBytes, 0); final boolean isTimeSet = data[offset + 15 + descriptionSize - 5] == 0; if (isTimeSet) { final int timeInSeconds = GGUtils.byteToInt(data, offset + 15 + descriptionSize - 4); timeInMillis = GGUtils.secondsToMillis(timeInSeconds); descriptionSize -= 5; } offset += 15 + descriptionSize; if (isTimeSet) { offset += 5; } } else { offset += 14; // packet without description is only 14 bytes long } final IUser user = new User(uin, userMode); final RemoteStatus status60 = GGConversion.getClientRemoteStatus(status, description, timeInMillis); if (remotePort == 0) { status60.setSupportsDirectCommunication(false); } else if (remotePort == 1) { status60.setUserBehindFirewall(true); } else if (remotePort == 2) { status60.setInRemoteUserBuddyList(false); } else { status60.setRemotePort(remotePort); } status60.setRemoteIP(remoteIPArray); status60.setImageSize(imageSize); status60.setGGVersion(version); if (descriptionSize > 0) { status60.setDescriptionSize(descriptionSize); } if (flag == 0x40) { status60.setSupportsVoiceCommunication(true); } statuses.put(user, status60); } } }