package pl.radical.open.gg.packet.out;
import pl.radical.open.gg.PersonalInfo;
import pl.radical.open.gg.PublicDirSearchQuery;
import pl.radical.open.gg.dicts.Gender;
import pl.radical.open.gg.packet.GGOutgoingPackage;
import pl.radical.open.gg.packet.OutgoingPacket;
import pl.radical.open.gg.packet.dicts.GGPubdirConsts;
import java.util.Random;
/**
* @author <a href="mailto:mnaglik@gazeta.pl">Marcin Naglik</a>
* @author <a href="mailto:mati@sz.home.pl">Mateusz Szczap</a>
*/
@OutgoingPacket(type = 0x0014, label = "GG_PUBDIR50_REQUEST")
public final class GGPubdirRequest implements GGOutgoingPackage, GGPubdirConsts {
public static final int GG_PUBDIR50_REQUEST = 0x0014;
private static final Random SEQUENCER = new Random();
private byte requestType = -1;
private int seq = -1;
private String request = "";
private GGPubdirRequest() {
seq = SEQUENCER.nextInt(99999);
}
/**
* @see pl.radical.open.gg.packet.GGOutgoingPackage#getPacketType()
*/
public int getPacketType() {
return GG_PUBDIR50_REQUEST;
}
/**
* @see pl.radical.open.gg.packet.GGOutgoingPackage#getLength()
*/
public int getLength() {
return 5 + request.getBytes().length;
}
/**
* @see pl.radical.open.gg.packet.GGOutgoingPackage#getContents()
*/
public byte[] getContents() {
final byte[] toSend = new byte[getLength()];
toSend[0] = requestType;
toSend[1] = (byte) (seq & 0xFF);
toSend[2] = (byte) (seq >> 8 & 0xFF);
toSend[3] = (byte) (seq >> 16 & 0xFF);
toSend[4] = (byte) (seq >> 24 & 0xFF);
final byte[] requestBytes = request.getBytes();
System.arraycopy(requestBytes, 0, toSend, 5, requestBytes.length);
return toSend;
}
public static GGPubdirRequest createSearchPubdirRequest(final PublicDirSearchQuery publicDirQuery) {
final GGPubdirRequest pubdirRequest = new GGPubdirRequest();
pubdirRequest.requestType = GG_PUBDIR50_SEARCH;
final StringBuffer buffer = new StringBuffer();
if (publicDirQuery.getUin() != null) {
final Integer uin = publicDirQuery.getUin();
final String uinEntry = getEntry(UIN, String.valueOf(uin.intValue()));
buffer.append(uinEntry);
}
if (publicDirQuery.getFirstName() != null) {
final String firstNameEntry = getEntry(FIRST_NAME, publicDirQuery.getFirstName());
buffer.append(firstNameEntry);
}
if (publicDirQuery.getLastName() != null) {
final String lastNameEntry = getEntry(LAST_NAME, publicDirQuery.getLastName());
buffer.append(lastNameEntry);
}
if (publicDirQuery.getCity() != null) {
final String cityEntry = getEntry(CITY, publicDirQuery.getCity());
buffer.append(cityEntry);
}
if (publicDirQuery.getNickName() != null) {
final String nickNameEntry = getEntry(NICK_NAME, publicDirQuery.getNickName());
buffer.append(nickNameEntry);
}
if (publicDirQuery.getBirthYear() != null) {
final String birthEntry = getEntry(BIRTH_YEAR, publicDirQuery.getBirthYear());
buffer.append(birthEntry);
}
if (publicDirQuery.getGender() != null) {
final Gender gender = publicDirQuery.getGender();
final String genderEntry = getEntry(GENDER, gender == Gender.MALE ? "2" : "1");
buffer.append(genderEntry);
}
if (publicDirQuery.getFamilyName() != null) {
final String familyNameEntry = getEntry(FAMILY_NAME, publicDirQuery.getFamilyName());
buffer.append(familyNameEntry);
}
if (publicDirQuery.getFamilyCity() != null) {
final String familyCityEntry = getEntry(FAMILY_CITY, publicDirQuery.getFamilyCity());
buffer.append(familyCityEntry);
}
if (publicDirQuery.getStart() != null) {
final Integer startInteger = publicDirQuery.getStart();
final String startEntry = getEntry(START, String.valueOf(startInteger.intValue()));
buffer.append(startEntry);
}
pubdirRequest.request = buffer.toString();
return pubdirRequest;
}
public static GGPubdirRequest createReadPubdirRequest() {
final GGPubdirRequest pubdirRequest = new GGPubdirRequest();
pubdirRequest.requestType = GG_PUBDIR50_READ;
pubdirRequest.request = "";
return pubdirRequest;
}
public static GGPubdirRequest createWritePubdirRequest(final PersonalInfo publicDirInfo) {
if (publicDirInfo == null) {
throw new IllegalArgumentException("publicDirInfo cannot be null");
}
final GGPubdirRequest pubdirRequest = new GGPubdirRequest();
pubdirRequest.requestType = GG_PUBDIR50_WRITE;
pubdirRequest.request = prepareWriteRequest(publicDirInfo);
return pubdirRequest;
}
private static String prepareWriteRequest(final PersonalInfo publicDirInfo) {
final StringBuffer buffer = new StringBuffer();
if (publicDirInfo.getFirstName() != null) {
final String firstNameEntry = getEntry(FIRST_NAME, publicDirInfo.getFirstName());
buffer.append(firstNameEntry);
}
if (publicDirInfo.getLastName() != null) {
final String lastNameEntry = getEntry(LAST_NAME, publicDirInfo.getLastName());
buffer.append(lastNameEntry);
}
if (publicDirInfo.getCity() != null) {
final String cityEntry = getEntry(CITY, publicDirInfo.getCity());
buffer.append(cityEntry);
}
if (publicDirInfo.getNickName() != null) {
final String nickNameEntry = getEntry(NICK_NAME, publicDirInfo.getNickName());
buffer.append(nickNameEntry);
}
if (publicDirInfo.getGender() != null) {
final Gender gender = publicDirInfo.getGender();
final String genderEntry = getEntry(GENDER, gender == Gender.MALE ? "1" : "2");
buffer.append(genderEntry);
}
if (publicDirInfo.getFamilyName() != null) {
final String familyNameEntry = getEntry(FAMILY_NAME, publicDirInfo.getFamilyName());
buffer.append(familyNameEntry);
}
if (publicDirInfo.getFamilyCity() != null) {
final String familyCityEntry = getEntry(FAMILY_CITY, publicDirInfo.getFamilyCity());
buffer.append(familyCityEntry);
}
if (publicDirInfo.getBirthDate() != null) {
final String birthDateEntry = getEntry(BIRTH_YEAR, publicDirInfo.getBirthDate());
buffer.append(birthDateEntry);
}
return buffer.toString();
}
private static String getEntry(final String key, final String value) {
final StringBuffer buffer = new StringBuffer();
buffer.append(key);
buffer.append('\0');
buffer.append(value);
buffer.append('\0');
return buffer.toString();
}
}