package org.limewire.core.impl.friend;
import java.io.IOException;
import java.util.HashSet;
import java.util.Set;
import org.limewire.core.api.download.DownloadException;
import org.limewire.core.api.friend.FileMetaDataConverter;
import org.limewire.core.api.search.SearchResult;
import org.limewire.core.impl.search.RemoteFileDescAdapter;
import org.limewire.friend.api.FileMetaData;
import org.limewire.friend.api.FriendPresence;
import org.limewire.friend.api.feature.AddressFeature;
import org.limewire.friend.impl.address.FriendAddress;
import org.limewire.io.InvalidDataException;
import org.limewire.io.IpPort;
import com.google.inject.Inject;
import com.google.inject.Singleton;
import com.limegroup.gnutella.RemoteFileDesc;
import com.limegroup.gnutella.URN;
import com.limegroup.gnutella.downloader.RemoteFileDescFactory;
import com.limegroup.gnutella.util.DataUtils;
@Singleton
class FileMetaDataConverterImpl implements FileMetaDataConverter {
private final RemoteFileDescFactory remoteFileDescFactory;
private final RemoteFileDescAdapter.Factory remoteFileDescAdapterFactory;
@Inject
public FileMetaDataConverterImpl(FriendRemoteFileDescDeserializer remoteFileDescDeserializer,
RemoteFileDescFactory remoteFileDescFactory,
RemoteFileDescAdapter.Factory remoteFileDescAdapterFactory) {
this.remoteFileDescFactory = remoteFileDescFactory;
this.remoteFileDescAdapterFactory = remoteFileDescAdapterFactory;
}
public SearchResult create(FriendPresence presence, FileMetaData fileMetaData) throws InvalidDataException, DownloadException {
FriendAddress presenceAddress = getAddressFromPresence(presence);
RemoteFileDesc remoteFileDesc = createRfdFromChatResult(presenceAddress, fileMetaData);
RemoteFileDescAdapter remoteFileDescAdapter = remoteFileDescAdapterFactory.create(remoteFileDesc,
IpPort.EMPTY_SET, presence);
return remoteFileDescAdapter;
}
private RemoteFileDesc createRfdFromChatResult(FriendAddress address, FileMetaData fileMeta)
throws DownloadException, InvalidDataException {
byte[] clientGuid = DataUtils.EMPTY_GUID;
Set<String> urnsAsString = fileMeta.getUrns();
Set<URN> urns = new HashSet<URN>();
for (String urnStr : urnsAsString) {
try {
urns.add(URN.createUrnFromString(urnStr));
} catch(IOException iox) {
throw new InvalidDataException(iox);
}
}
return remoteFileDescFactory.createRemoteFileDesc(address,
fileMeta.getIndex(), fileMeta.getName(), fileMeta.getSize(), clientGuid,
0, 0, true, null, urns, false, null,
fileMeta.getCreateTime().getTime());
}
/**
* Get the address if the presence has an address feature at the present moment.
* Else construct an XMPPAddress with the friendPresence id.
*/
private FriendAddress getAddressFromPresence(FriendPresence presence) {
if (presence.hasFeatures(AddressFeature.ID)) {
return (FriendAddress)((AddressFeature)presence.getFeature(AddressFeature.ID)).getFeature();
}
return new FriendAddress(presence.getPresenceId());
}
}