package org.limewire.core.impl.search.torrentweb;
import java.io.File;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.Collection;
import java.util.Map;
import org.limewire.bittorrent.BTData;
import org.limewire.bittorrent.Torrent;
import org.limewire.core.api.Category;
import org.limewire.core.api.FilePropertyKey;
import org.limewire.core.api.endpoint.RemoteHost;
import org.limewire.core.api.search.SearchResult;
import org.limewire.friend.api.Friend;
import org.limewire.friend.api.FriendPresence;
import org.limewire.friend.api.IncomingChatListener;
import org.limewire.friend.api.MessageReader;
import org.limewire.friend.api.MessageWriter;
import org.limewire.friend.api.Network;
import org.limewire.friend.api.PresenceEvent;
import org.limewire.friend.api.feature.Feature;
import org.limewire.friend.api.feature.FeatureTransport;
import org.limewire.friend.api.feature.ReferrerFeature;
import org.limewire.listener.EventListener;
import org.limewire.util.Base32;
import org.limewire.util.StringUtils;
import org.limewire.util.URIUtils;
import com.limegroup.gnutella.URN;
/**
* A torrent web search result.
*/
public class TorrentWebSearchResult implements SearchResult {
private final URI referrer;
private final URN urn;
private final BTData torrentData;
private final File torrentFile;
private final Torrent torrent;
public TorrentWebSearchResult(BTData torrentData,
URI referrer, File torrentFile, Torrent torrent) {
this.referrer = referrer;
this.torrentData = torrentData;
this.torrentFile = torrentFile;
this.torrent = torrent;
try {
URN topLevelURN = null;
try {
topLevelURN = URN.createSHA1Urn(torrentFile);
} catch (InterruptedException e) {
topLevelURN = URN.createSHA1UrnFromBytes(torrentData.getInfoHash());
}
urn = topLevelURN;
} catch (IOException e) {
throw new RuntimeException(e);
}
}
@Override
public Category getCategory() {
return Category.TORRENT;
}
@Override
public String getFileExtension() {
return "torrent";
}
@Override
public String getFileName() {
return torrentData.getName() + ".torrent";
}
@Override
public String getFileNameWithoutExtension() {
return torrentData.getName();
}
@Override
public String getMagnetURL() {
return null;
}
@Override
public Object getProperty(FilePropertyKey key) {
switch (key) {
case FILE_SIZE:
return getSize();
case NAME:
return torrentData.getName();
case TORRENT:
return torrent;
case REFERRER:
return getReferrer();
}
return null;
}
@Override
public float getRelevance(String query) {
return 0;
}
@Override
public long getSize() {
return torrent.getTotalPayloadSize();
}
@Override
public URN getUrn() {
return urn;
}
@Override
public boolean isLicensed() {
return false;
}
@Override
public boolean isSpam() {
return false;
}
public File getTorrentFile() {
return torrentFile;
}
private URI getReferrer() {
if (referrer != null) {
return referrer;
}
String sha1Base16 = torrent.getSha1();
String sha1Base32 = Base32.encode(StringUtils.fromHexString(sha1Base16));
String uriString = "http://www.google.com/#q=" + sha1Base16 + "+|+" + sha1Base32;
try {
return URIUtils.toURI(uriString);
} catch (URISyntaxException e) {
// Ignore
}
return null;
}
@Override
public RemoteHost getSource() {
return new RemoteHost() {
@Override
public boolean isSharingEnabled() {
return false;
}
@Override
public boolean isChatEnabled() {
return false;
}
@Override
public boolean isBrowseHostEnabled() {
return false;
}
@Override
public FriendPresence getFriendPresence() {
return new FriendPresence() {
@Override
public void addFeature(Feature feature) {
}
@Override
public <D, F extends Feature<D>> void addTransport(Class<F> clazz,
FeatureTransport<D> transport) {
}
@Override
public Feature getFeature(URI id) {
if (id.equals(ReferrerFeature.ID)) {
URI referrerURI = getReferrer();
if (referrerURI != null) {
return new ReferrerFeature(referrerURI);
}
}
return null;
}
@Override
public Collection<Feature> getFeatures() {
return null;
}
@Override
public Friend getFriend() {
return new Friend() {
@Override
public void addPresenceListener(
EventListener<PresenceEvent> presenceListener) {
}
@Override
public MessageWriter createChat(MessageReader reader) {
return null;
}
@Override
public FriendPresence getActivePresence() {
return null;
}
@Override
public String getFirstName() {
return null;
}
@Override
public String getId() {
return null;
}
@Override
public String getName() {
return null;
}
@Override
public Network getNetwork() {
return new Network() {
@Override
public String getCanonicalizedLocalID() {
return "";
}
@Override
public String getNetworkName() {
return "Torrent Web Search";
}
@Override
public Type getType() {
return Network.Type.WEBSEARCH;
}
};
}
@Override
public Map<String, FriendPresence> getPresences() {
return null;
}
@Override
public String getRenderName() {
return null;
}
@Override
public boolean hasActivePresence() {
return false;
}
@Override
public boolean isAnonymous() {
return true;
}
@Override
public boolean isSignedIn() {
return false;
}
@Override
public boolean isSubscribed() {
return false;
}
@Override
public void removeChatListener() {
}
@Override
public void setChatListenerIfNecessary(IncomingChatListener listener) {
}
@Override
public void setName(String name) {
}
};
}
@Override
public Mode getMode() {
return null;
}
@Override
public String getPresenceId() {
return null;
}
@Override
public int getPriority() {
return 0;
}
@Override
public String getStatus() {
return null;
}
@Override
public <F extends Feature<D>, D> FeatureTransport<D> getTransport(
Class<F> feature) {
return null;
}
@Override
public Type getType() {
return null;
}
@Override
public boolean hasFeatures(URI... id) {
return false;
}
@Override
public void removeFeature(URI id) {
}
};
}
};
}
}