package org.limewire.facebook.service.livemessage;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import org.apache.commons.codec.binary.Base64;
import org.json.JSONObject;
import org.limewire.facebook.service.FacebookFriendConnection;
import org.limewire.friend.api.FriendException;
import org.limewire.friend.api.FriendPresence;
import org.limewire.friend.api.feature.FeatureTransport;
import org.limewire.io.Address;
import org.limewire.logging.Log;
import org.limewire.logging.LogFactory;
import org.limewire.net.address.AddressFactory;
import org.limewire.net.address.AddressSerializer;
import org.limewire.util.StringUtils;
import com.google.inject.Inject;
import com.google.inject.assistedinject.Assisted;
/**
* Used to (de)serialize "address" live messages.
*/
public class AddressHandler implements LiveMessageHandler, FeatureTransport<Address> {
private static final String TYPE = "address";
private static final Log LOG = LogFactory.getLog(AddressHandler.class);
private final FacebookFriendConnection connection;
private final AddressFactory addressFactory;
private final Handler<Address> addressHandler;
@Inject
AddressHandler(@Assisted FacebookFriendConnection connection,
AddressFactory addressFactory,
FeatureTransport.Handler<Address> addressHandler) {
this.connection = connection;
this.addressFactory = addressFactory;
this.addressHandler = addressHandler;
}
@Override
@Inject
public void register(LiveMessageHandlerRegistry registry) {
registry.register(TYPE, this);
}
@Override
public void handle(String messageType, JSONObject message) {
String from = message.optString("from", null);
String addressType = message.optString("address-type", null);
String addressData = message.optString("address", null);
if (from != null && addressType != null & addressData != null) {
Address address;
try {
address = addressFactory.deserialize(addressType, Base64.decodeBase64(StringUtils.toUTF8Bytes(addressData)));
addressHandler.featureReceived(from, address);
} catch (IOException e) {
LOG.debug("invalid address", e);
}
}
}
@Override
public void sendFeature(FriendPresence presence, Address localFeature) throws FriendException {
Map<String, Object> message = new HashMap<String, Object>();
AddressSerializer serializer = addressFactory.getSerializer(localFeature);
message.put("address-type", serializer.getAddressType());
try {
message.put("address", StringUtils.toUTF8String(Base64.encodeBase64(serializer.serialize(localFeature))));
} catch (IOException e) {
throw new FriendException(e);
}
LOG.debugf("sending address: {0}", message);
connection.sendLiveMessage(presence, TYPE, message);
}
}