package org.limewire.net.address; import java.io.IOException; import java.util.Set; import org.limewire.inject.EagerSingleton; import org.limewire.io.Address; import org.limewire.io.BadGGEPBlockException; import org.limewire.io.BadGGEPPropertyException; import org.limewire.io.Connectable; import org.limewire.io.GGEP; import org.limewire.io.GUID; import com.google.inject.Inject; @EagerSingleton public class FirewalledAddressSerializer implements AddressSerializer { static final String PUBLIC_ADDRESS = "PU"; static final String PRIVATEADDRESS = "PR"; static final String PROXIES = "PX"; static final String FWT_VERSION = "FW"; static final String GUID = "GU"; private final ConnectableSerializer serializer; @Inject public FirewalledAddressSerializer(ConnectableSerializer serializer) { this.serializer = serializer; } @Inject @Override public void register(AddressFactory factory) { factory.registerSerializer(this); } @Override public boolean canSerialize(Address address) { return address instanceof FirewalledAddress; } @Override public String getAddressType() { return "firewalled-address"; } @Override public FirewalledAddress deserialize(byte[] serializedAddress) throws IOException { try { GGEP ggep = new GGEP(serializedAddress, 0); Connectable publicAddress = serializer.deserialize(ggep.getBytes(PUBLIC_ADDRESS)); Connectable privateAddress = serializer.deserialize(ggep.getBytes(PRIVATEADDRESS)); GUID clientGuid = new GUID(ggep.getBytes(GUID)); Set<Connectable> pushProxies = serializer.deserializeSet(ggep.getBytes(PROXIES)); int fwtVersion = ggep.getInt(FWT_VERSION); return new FirewalledAddress(publicAddress, privateAddress, clientGuid, pushProxies, fwtVersion); } catch (BadGGEPBlockException e) { throw new IOException(e); } catch (BadGGEPPropertyException e) { throw new IOException(e); } } @Override public byte[] serialize(Address addr) throws IOException { FirewalledAddress address = (FirewalledAddress)addr; GGEP ggep = new GGEP(); ggep.put(PUBLIC_ADDRESS, serializer.serialize(address.getPublicAddress())); ggep.put(PRIVATEADDRESS, serializer.serialize(address.getPrivateAddress())); ggep.put(PROXIES, serializer.serialize(address.getPushProxies())); ggep.put(FWT_VERSION, address.getFwtVersion()); ggep.put(GUID, address.getClientGuid().bytes()); return ggep.toByteArray(); } @Override public Address deserialize(String address) throws IOException { throw new IOException(); } }