package pl.radical.open.gg.packet.in;
import pl.radical.open.gg.IRemoteStatus;
import pl.radical.open.gg.PersonalInfo;
import pl.radical.open.gg.PublicDirSearchReply;
import pl.radical.open.gg.dicts.Gender;
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.GGPubdirConsts;
import pl.radical.open.gg.packet.handlers.GGPubdirReplyPacketHandler;
import pl.radical.open.gg.utils.GGConversion;
import pl.radical.open.gg.utils.GGUtils;
import java.util.StringTokenizer;
/**
* @author <a href="mailto:mnaglik@gazeta.pl">Marcin Naglik</a>
* @author <a href="mailto:mati@sz.home.pl">Mateusz Szczap</a>
* @author <a href="mailto:lukasz.rzanek@radical.com.pl>Łukasz Rżanek</a>
*/
@IncomingPacket(type = 0x000e, label = "GG_PUBDIR50_REPLY", handler = GGPubdirReplyPacketHandler.class)
public final class GGPubdirReply extends AbstractGGIncomingPacket implements GGPubdirConsts, GGIncomingPackage {
private byte replyType = -1;
private int querySeq = -1;
private PersonalInfo pubDirInfo = null;
private PublicDirSearchReply publicDirSearchReply = null;
public GGPubdirReply(final byte[] data) {
replyType = data[0];
querySeq = GGUtils.byteToInt(data, 1);
if (isPubdirReadReply()) {
handlePubdirReadReply(data);
} else if (isPubdirSearchReply()) {
handlePubdirSearchReply(data);
}
}
public int getQuerySeq() {
return querySeq;
}
public PersonalInfo getPubdirReadReply() {
return pubDirInfo;
}
public PublicDirSearchReply getPubdirSearchReply() {
return publicDirSearchReply;
}
public boolean isPubdirSearchReply() {
return replyType == GG_PUBDIR50_SEARCH_REPLY;
}
public boolean isPubdirReadReply() {
return replyType == GG_PUBDIR50_SEARCH;
}
public boolean isPubdirWriteReply() {
return replyType == GG_PUBDIR50_WRITE;
}
private String byteToString(final byte[] data, final int startIndex) {
int counter = 0;
while (counter + startIndex < data.length) {
counter++;
}
final byte[] desc = new byte[counter];
System.arraycopy(data, startIndex, desc, 0, counter);
return new String(desc);
}
private void handlePubdirReadReply(final byte[] data) {
final String string = byteToString(data, 5);
final StringTokenizer tokenizer = new StringTokenizer(string, "\0");
pubDirInfo = new PersonalInfo();
while (tokenizer.hasMoreTokens()) {
final String token = tokenizer.nextToken();
if (token.equals(FIRST_NAME)) {
final String firstName = tokenizer.nextToken();
pubDirInfo.setFirstName(firstName);
} else if (token.equals(LAST_NAME)) {
final String lastName = tokenizer.nextToken();
pubDirInfo.setLastName(lastName);
} else if (token.equals(BIRTH_YEAR)) {
final String birthDate = tokenizer.nextToken();
pubDirInfo.setBirthDate(birthDate);
} else if (token.equals(CITY)) {
final String city = tokenizer.nextToken();
pubDirInfo.setCity(city);
} else if (token.equals(NICK_NAME)) {
final String nickName = tokenizer.nextToken();
pubDirInfo.setNickName(nickName);
} else if (token.equals(GENDER)) {
// FIXME Review this part
final String genderString = tokenizer.nextToken();
Gender gender = null;
if (genderString.equals("1")) {
gender = Gender.MALE;
} else if (genderString.equals("2")) {
gender = Gender.FEMALE;
}
pubDirInfo.setGender(gender);
} else if (token.equals(FAMILY_NAME)) {
final String familyName = tokenizer.nextToken();
pubDirInfo.setFamilyName(familyName);
} else if (token.equals(FAMILY_CITY)) {
final String familyCity = tokenizer.nextToken();
pubDirInfo.setFamilyCity(familyCity);
}
}
}
private void handlePubdirSearchReply(final byte[] data) {
final String string = byteToString(data, 5);
publicDirSearchReply = new PublicDirSearchReply();
final StringTokenizer tokenizer = new StringTokenizer(string, "\0");
PublicDirSearchReply.Entry entry = publicDirSearchReply.createSearchEntry();
boolean processedUin = false;
while (tokenizer.hasMoreTokens()) {
final String token = tokenizer.nextToken();
if (processedUin && token.equals(UIN)) {
processedUin = false;
entry = publicDirSearchReply.createSearchEntry();
final String uin = tokenizer.nextToken();
entry.setUin(Integer.valueOf(uin));
processedUin = true;
} else if (token.equals(FIRST_NAME)) {
final String firstName = tokenizer.nextToken();
entry.setFirstName(firstName);
} else if (token.equals(UIN)) {
final String uin = tokenizer.nextToken();
entry.setUin(Integer.valueOf(uin));
processedUin = true;
} else if (token.equals(STATUS)) {
final String status = tokenizer.nextToken();
final int protocolStatus = Integer.valueOf(status).intValue();
final IRemoteStatus statusBiz = GGConversion.getClientRemoteStatus(protocolStatus, null, -1);
entry.setStatus(statusBiz);
} else if (token.equals(BIRTH_YEAR)) {
final String birthYear = tokenizer.nextToken();
entry.setBirthYear(birthYear);
} else if (token.equals(CITY)) {
final String city = tokenizer.nextToken();
entry.setCity(city);
} else if (token.equals(NICK_NAME)) {
final String nickName = tokenizer.nextToken();
entry.setNickName(nickName);
} else if (token.equals(NEXT_START)) {
final String nextNumber = tokenizer.nextToken();
publicDirSearchReply.setNextStart(Integer.valueOf(nextNumber));
break;
}
}
}
}