package org.limewire.core.impl.library;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.UnknownHostException;
import org.limewire.core.api.library.FileItem;
import org.limewire.core.api.library.MagnetLinkFactory;
import com.google.inject.Inject;
import com.google.inject.Singleton;
import com.limegroup.gnutella.ApplicationServices;
import com.limegroup.gnutella.NetworkManager;
import com.limegroup.gnutella.browser.MagnetOptions;
@Singleton
public class MagnetLinkFactoryImpl implements MagnetLinkFactory {
private NetworkManager networkManager;
private ApplicationServices applicationServices;
@Inject
public MagnetLinkFactoryImpl(NetworkManager networkManager, ApplicationServices applicationServices){
this.networkManager = networkManager;
this.applicationServices = applicationServices;
}
@Override
public String createMagnetLink(FileItem fileItem) {
if (fileItem instanceof CoreLocalFileItem){
return createMagnetLink((CoreLocalFileItem)fileItem);
}
throw new IllegalArgumentException("FileItem must be instance of CoreLocalFileItem or CoreRemoteFileItem: " + fileItem);
}
private String createMagnetLink(CoreLocalFileItem fileItem) {
return MagnetOptions.createMagnet(fileItem.getFileDetails(),
getInetSocketAddress(), applicationServices.getMyGUID()).toExternalForm();
}
private InetSocketAddress getInetSocketAddress() {
// TODO maybe cache this, even statically
try {
return new InetSocketAddress(InetAddress.getByAddress(networkManager.getAddress()), networkManager.getPort());
} catch (UnknownHostException e) {
//TODO what should be done with UnknownHostException?
throw new RuntimeException(e);
}
}
}