/*
* This file is part of Transdroid <http://www.transdroid.org>
*
* Transdroid is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Transdroid is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Transdroid. If not, see <http://www.gnu.org/licenses/>.
*
*/
package org.transdroid.daemon;
import java.util.HashMap;
import java.util.Map;
import org.transdroid.daemon.util.FileSizeConverter;
import android.os.Parcel;
import android.os.Parcelable;
/**
* Represents a single file contained in a torrent.
*
* @author erickok
*
*/
public final class TorrentFile implements Parcelable, Comparable<TorrentFile>, Finishable {
private final String key;
private final String name;
private final String relativePath;
private final String fullPath;
private final long totalSize;
private final long downloaded;
private Priority priority;
public TorrentFile(String key, String name, String relativePath, String fullPath, long size, long done, Priority priority) {
this.key = key;
this.name = name;
this.relativePath = relativePath;
this.fullPath = fullPath;
this.totalSize = size;
this.downloaded = done;
this.priority = priority;
}
private TorrentFile(Parcel in) {
this.key = in.readString();
this.name = in.readString();
this.relativePath = in.readString();
this.fullPath = in.readString();
this.totalSize = in.readLong();
this.downloaded = in.readLong();
this.priority = Priority.getPriority(in.readInt());
}
public String getKey() {
return this.key;
}
public String getName() {
return this.name;
}
public String getRelativePath() {
return this.relativePath;
}
public String getFullPath() {
return this.fullPath;
}
public long getTotalSize() {
return this.totalSize;
}
public long getDownloaded() {
return this.downloaded;
}
public Priority getPriority() {
return priority;
}
public void mimicPriority(Priority newPriority) {
priority = newPriority;
}
public float getPartDone() {
return (float)downloaded / (float)totalSize;
}
/**
* Returns a text showing the percentage that is already downloaded of this file
* @return A string indicating the progress, e.g. '85%'
*/
public String getProgressText() {
return String.format("%.1f", getPartDone() * 100) + "%";
}
/**
* Returns a text showing the downloaded and total sizes of this file
* @return A string with the sizes, e.g. '125.3 of 251.2 MB'
*/
public String getDownloadedAndTotalSizeText() {
return FileSizeConverter.getSize(getDownloaded()) + " / " + FileSizeConverter.getSize(getTotalSize());
}
/**
* Returns if the download for this file is complete
* @return True if the downloaded size equals the total size, i.e. if it is completed
*/
public boolean isComplete() {
return getDownloaded() == getTotalSize();
}
/**
* Returns the full path of this file as it should be located on the remote server
* @return The full path, as String
*/
public String getFullPathUri() {
return "file://" + getFullPath();
}
/**
* Try to infer the mime type of this file
* @return The mime type of this file, or null if it could not be inferred
*/
public String getMimeType() {
// TODO: Test if this still works
if (getFullPath() != null && getFullPath().contains(".")) {
final String ext = getFullPath().substring(getFullPath().lastIndexOf('.') + 1);
if (mimeTypes.containsKey(ext)) {
// One of the known extensions: return logical mime type
return mimeTypes.get(ext);
}
}
// Unknown/none/unregistered extension: return null
return null;
}
/**
* {@inheritDoc}
*/
@Override
public boolean isStarted() {
return getPartDone() > 0;
}
/**
* {@inheritDoc}
*/
@Override
public boolean isFinished() {
return getPartDone() >= 1;
}
@Override
public String toString() {
return name;
}
@Override
public int compareTo(TorrentFile another) {
// Compare file objects on their name (used for sorting only!)
return name.compareTo(another.getName());
}
private static final Map<String, String> mimeTypes = fillMimeTypes();
private static Map<String, String> fillMimeTypes() {
// Full mime type support list is in http://code.google.com/p/android-vlc-remote/source/browse/trunk/AndroidManifest.xml
// We use a selection of the most popular/obvious ones
HashMap<String, String> types = new HashMap<String, String>();
// Application
types.put("m4a", "application/x-extension-m4a");
types.put("flac", "application/x-flac");
types.put("mkv", "application/x-matroska");
types.put("ogg", "application/x-ogg");
// Audio
types.put("m3u", "audio/mpegurl");
types.put("mp3", "audio/mpeg");
types.put("mpa", "audio/mpeg");
types.put("mpc", "audio/x-musepack");
types.put("wav", "audio/x-wav");
types.put("wma", "audio/x-ms-wma");
// Video
types.put("3gp", "video/3gpp");
types.put("avi", "video/x-avi");
types.put("flv", "video/x-flv");
types.put("mov", "video/quicktime");
types.put("mp4", "video/mp4");
types.put("mpg", "video/mpeg");
types.put("mpeg", "video/mpeg");
types.put("vob", "video/mpeg");
types.put("wmv", "video/x-ms-wmv");
return types;
}
public static final Parcelable.Creator<TorrentFile> CREATOR = new Parcelable.Creator<TorrentFile>() {
public TorrentFile createFromParcel(Parcel in) {
return new TorrentFile(in);
}
public TorrentFile[] newArray(int size) {
return new TorrentFile[size];
}
};
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(key);
dest.writeString(name);
dest.writeString(relativePath);
dest.writeString(fullPath);
dest.writeLong(downloaded);
dest.writeLong(totalSize);
dest.writeInt(priority.getCode());
}
}