package org.torrent.internal.data; import java.util.ArrayList; import java.util.Calendar; import java.util.Collections; import java.util.HashMap; import java.util.LinkedList; import java.util.List; import java.util.Map; import org.torrent.internal.bencoding.BList; import org.torrent.internal.bencoding.BMap; import org.torrent.internal.bencoding.BTypeException; import org.torrent.internal.util.Validator; public final class MetaInfoFile { private static final String MI_ANNOUNCE = "announce"; private static final String MI_INFO = "info"; private static final String ANNOUNCE_LISTS = "announce-list"; private static final String COMMENT = "comment"; private static final String CREATION_DATE = "creation date"; private static final String CREATED_BY = "created by"; private static final String ENCODING = "encoding"; // private final String announce; // private final InfoBlock dataInfo; // private final List<List<String>> announceLists; // private final String comment; // private final Long creationDate; // private final String createdBy; // private final String encoding; // // private final Map<String, ?> customKeys; public String announce; private final InfoBlock dataInfo; private final List<List<String>> announceLists; public String comment; public Long creationDate; public String createdBy; public String encoding; private final Map<String, ?> customKeys; public MetaInfoFile(String announceURL, List<List<String>> announceLists, InfoBlock data, String comment, Calendar creationDate, String createdBy, String encoding, Map<String, ?> customKeys) { Validator.nonNull(announceURL, data); announce = announceURL; dataInfo = data; this.announceLists = announceLists; this.comment = comment; this.creationDate = creationDate != null ? creationDate .getTimeInMillis() : null; this.createdBy = createdBy; this.encoding = encoding; if (customKeys == null) { customKeys = new HashMap<String, Object>(0); } this.customKeys = customKeys; } public MetaInfoFile(BMap torrent) throws BTypeException { Validator.notNull(torrent, "Dictionary is null!"); dataInfo = new InfoBlock(torrent.getMap(MI_INFO)); announce = torrent.getString(MI_ANNOUNCE); // BList aLists = torrent.getList(ANNOUNCE_LISTS); // // if (aLists != null) { // List<List<String>> a_l = new ArrayList<List<String>>(); // for (int i = 0; i < aLists.size(); i++) { // BList list = aLists.getList(i); // List<String> urls = new LinkedList<String>(); // for (int j = 0; j < list.size(); j++) { // urls.add(list.getString(j)); // } // a_l.add(Collections // .unmodifiableList(new ArrayList<String>(urls))); // } // announceLists = Collections // .unmodifiableList(new ArrayList<List<String>>(a_l)); // } else { announceLists = null; this.comment = torrent.getString(COMMENT); Long time = torrent.getLong(CREATION_DATE); if (time != null) { time *= 1000; } creationDate = time; createdBy = torrent.getString(CREATED_BY); encoding = torrent.getString("ENCODING"); customKeys = new HashMap<String, Object>(torrent); customKeys.remove(MI_INFO); customKeys.remove(MI_ANNOUNCE); customKeys.remove(COMMENT); customKeys.remove(CREATION_DATE); customKeys.remove(CREATED_BY); customKeys.remove(ENCODING); } public String getAnnounce() { return announce; } public InfoBlock getDataInfo() { return dataInfo; } public Hash getInfoHash() { return dataInfo.getInfoHash(); } public Map<String, ?> asDictionary() { Map<String, Object> map = new HashMap<String, Object>(); map.put(MI_ANNOUNCE, announce); map.put(MI_INFO, dataInfo.asDictionary()); if (announceLists != null) { map.put(ANNOUNCE_LISTS, announceLists); } if (comment != null) { map.put(COMMENT, comment); } if (creationDate != null) { map.put(CREATION_DATE, creationDate / 1000); } if (createdBy != null) { map.put(CREATED_BY, createdBy); } if (encoding != null) { map.put(ENCODING, encoding); } map.putAll(customKeys); return map; } public List<List<String>> getAnnounceTiers() { return announceLists; } public String getComment() { return comment; } public String getCreatedBy() { return createdBy; } public Calendar getCreationDate() { Calendar cal = Calendar.getInstance(); cal.setTimeInMillis(creationDate); return cal; } public Map<String, Object> getCustomKeys() { return Collections.unmodifiableMap(customKeys); } public String getEncoding() { return encoding; } }