package org.sugr.gearshift.core; import android.os.Parcel; import android.os.Parcelable; import com.fasterxml.jackson.annotation.JsonAutoDetect; import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonProperty; import java.util.ArrayList; import java.util.Collection; import java.util.HashSet; import java.util.List; import java.util.Set; @JsonAutoDetect( fieldVisibility = JsonAutoDetect.Visibility.NONE, creatorVisibility = JsonAutoDetect.Visibility.NONE, getterVisibility = JsonAutoDetect.Visibility.PUBLIC_ONLY, isGetterVisibility = JsonAutoDetect.Visibility.PUBLIC_ONLY, setterVisibility = JsonAutoDetect.Visibility.NONE) public class TransmissionSession implements Parcelable { public static final class SetterFields { public static final String ALT_SPEED_LIMIT_ENABLED = "alt-speed-enabled"; public static final String ALT_DOWNLOAD_SPEED_LIMIT = "alt-speed-down"; public static final String ALT_UPLOAD_SPEED_LIMIT = "alt-speed-up"; public static final String ALT_SPEED_LIMIT_TIME_ENABLED = "alt-speed-time-enabled"; public static final String ALT_SPEED_LIMIT_TIME_BEGIN = "alt-speed-time-begin"; public static final String ALT_SPEED_LIMIT_TIME_END = "alt-speed-time-end"; public static final String ALT_SPEED_LIMIT_TIME_DAY = "alt-speed-time-day"; public static final String BLOCKLIST_ENABLED = "blocklist-enabled"; public static final String BLOCKLIST_URL = "blocklist-url"; public static final String CACHE_SIZE = "cache-size-mb"; public static final String DHT = "dht-enabled"; public static final String DOWNLOAD_DIR = "download-dir"; public static final String DOWNLOAD_QUEUE_SIZE = "download-queue-size"; public static final String DOWNLOAD_QUEUE_ENABLED = "download-queue-enabled"; public static final String DOWNLOAD_SPEED_LIMIT = "speed-limit-down"; public static final String DOWNLOAD_SPEED_LIMIT_ENABLED = "speed-limit-down-enabled"; public static final String ENCRYPTION = "encryption"; public static final String GLOBAL_PEER_LIMIT = "peer-limit-global"; public static final String IDLE_SEEDING_LIMIT = "idle-seeding-limit"; public static final String IDLE_SEEDING_LIMIT_ENABLED = "idle-seeding-limit-enabled"; public static final String INCOMPLETE_DIR = "incomplete-dir"; public static final String INCOMPLETE_DIR_ENABLED = "incomplete-dir-enabled"; public static final String LOCAL_DISCOVERY = "lpd-enabled"; public static final String UTP = "utp-enabled"; public static final String PEER_EXCHANGE = "pex-enabled"; public static final String PEER_PORT = "peer-port"; public static final String PORT_FORWARDING = "port-forwarding-enabled"; public static final String RANDOM_PORT = "peer-port-random-on-start"; public static final String RENAME_PARTIAL = "rename-partial-files"; public static final String DONE_SCRIPT = "script-torrent-done-filename"; public static final String DONE_SCRIPT_ENABLED = "script-torrent-done-enabled"; public static final String SEED_QUEUE_SIZE = "seed-queue-size"; public static final String SEED_QUEUE_ENABLED = "seed-queue-enabled"; public static final String SEED_RATIO_LIMIT = "seedRatioLimit"; public static final String SEED_RATIO_LIMIT_ENABLED = "seedRatioLimited"; public static final String STALLED_QUEUE_SIZE = "queue-stalled-minutes"; public static final String STALLED_QUEUE_ENABLED = "queue-stalled-enabled"; public static final String START_ADDED = "start-added-torrents"; public static final String TORRENT_PEER_LIMIT = "peer-limit-per-torrent"; public static final String TRASH_ORIGINAL = "trash-original-torrent-files"; public static final String UPLOAD_SPEED_LIMIT = "speed-limit-up"; public static final String UPLOAD_SPEED_LIMIT_ENABLED = "speed-limit-up-enabled"; } public static final int FREE_SPACE_METHOD_RPC_VERSION = 15; private boolean altSpeedEnabled; private long altSpeedDown; private long altSpeedUp; private boolean altSpeedTimeEnabled; private int altSpeedTimeBegin; private int altSpeedTimeEnd; private int altSpeedTimeDay; private boolean blocklistEnabled; private long blocklistSize; private String blocklistURL; private long cacheSize; private String configDir; private boolean dhtEnabled; private String downloadDir; private long downloadDirFreeSpace; private int downloadQueueSize; private boolean downloadQueueEnabled; private long speedLimitDown; private boolean speedLimitDownEnabled; private String encryption; private long idleSeedingLimig; private boolean idleSeedingLimitEnabled; private String incompleteDir; private boolean incompleteDirEnabled; private boolean lpdEnabled; private boolean utpEnabled; private int globalPeerLimit; private int torrentPeerLimit; private boolean pexEnabled; private int peerPort; private boolean portForwardingEnabled; private boolean peerPortRandomOnStart; private boolean renamePartial; private int rpcVersion; private int rpcVersionMin; private String doneScript; private boolean doneScriptEnabled; private int seedQueueSize; private boolean seedQueueEnabled; private float seedRatioLimit; private boolean seedRatioLimited; private long speedLimitUp; private boolean speedLimitUpEnabled; private int stalledQueueSize; private boolean stalledQueueEnabled; private boolean startAdded; private boolean trashOriginal; private String version; // https://trac.transmissionbt.com/browser/trunk/libtransmission/transmission.h - tr_sched_day public static class AltSpeedDay { public static final int SUN = (1); public static final int MON = (1<<1); public static final int TUE = (1<<2); public static final int WED = (1<<3); public static final int THU = (1<<4); public static final int FRI = (1<<5); public static final int SAT = (1<<6); public static final int WEEKDAY = (MON|TUE|WED|THU|FRI); public static final int WEEKEND = (SUN|SAT); public static final int ALL = (WEEKDAY|WEEKEND); } public static class Encryption { public static final String REQUIRED = "required"; public static final String PREFERRED = "preferred"; public static final String TOLERATED = "tolerated"; } private Set<String> downloadDirectories; public TransmissionSession() { downloadDirectories = new HashSet<>(); } @JsonProperty(SetterFields.ALT_SPEED_LIMIT_ENABLED) public boolean isAltSpeedLimitEnabled() { return altSpeedEnabled; } @JsonProperty(SetterFields.ALT_DOWNLOAD_SPEED_LIMIT) public long getAltDownloadSpeedLimit() { return altSpeedDown; } @JsonProperty(SetterFields.ALT_UPLOAD_SPEED_LIMIT) public long getAltUploadSpeedLimit() { return altSpeedUp; } @JsonProperty(SetterFields.ALT_SPEED_LIMIT_TIME_ENABLED) public boolean isAltSpeedLimitTimeEnabled() { return altSpeedTimeEnabled; } @JsonProperty(SetterFields.ALT_SPEED_LIMIT_TIME_BEGIN) public int getAltSpeedTimeBegin() { return altSpeedTimeBegin; } @JsonProperty(SetterFields.ALT_SPEED_LIMIT_TIME_END) public int getAltSpeedTimeEnd() { return altSpeedTimeEnd; } @JsonProperty(SetterFields.ALT_SPEED_LIMIT_TIME_DAY) public int getAltSpeedTimeDay() { return altSpeedTimeDay; } @JsonProperty(SetterFields.BLOCKLIST_ENABLED) public boolean isBlocklistEnabled() { return blocklistEnabled; } @JsonProperty("blocklist-size") public long getBlocklistSize() { return blocklistSize; } @JsonProperty(SetterFields.BLOCKLIST_URL) public String getBlocklistURL() { return blocklistURL; } @JsonProperty(SetterFields.DHT) public boolean isDhtEnabled() { return dhtEnabled; } @JsonProperty(SetterFields.ENCRYPTION) public String getEncryption() { return encryption; } @JsonProperty(SetterFields.CACHE_SIZE) public long getCacheSize() { return cacheSize; } @JsonProperty("config-dir") public String getConfigDir() { return configDir; } @JsonProperty(SetterFields.DOWNLOAD_DIR) public String getDownloadDir() { return downloadDir; } @JsonProperty("download-dir-free-space") public long getDownloadDirFreeSpace() { return downloadDirFreeSpace; } @JsonProperty(SetterFields.DOWNLOAD_QUEUE_SIZE) public int getDownloadQueueSize() { return downloadQueueSize; } @JsonProperty(SetterFields.DOWNLOAD_QUEUE_ENABLED) public boolean isDownloadQueueEnabled() { return downloadQueueEnabled; } @JsonProperty(SetterFields.IDLE_SEEDING_LIMIT) public long getIdleSeedingLimig() { return idleSeedingLimig; } @JsonProperty(SetterFields.IDLE_SEEDING_LIMIT_ENABLED) public boolean isIdleSeedingLimitEnabled() { return idleSeedingLimitEnabled; } @JsonProperty(SetterFields.INCOMPLETE_DIR) public String getIncompleteDir() { return incompleteDir; } @JsonProperty(SetterFields.INCOMPLETE_DIR_ENABLED) public boolean isIncompleteDirEnabled() { return incompleteDirEnabled; } @JsonProperty(SetterFields.LOCAL_DISCOVERY) public boolean isLocalDiscoveryEnabled() { return lpdEnabled; } @JsonProperty(SetterFields.UTP) public boolean isUtpEnabled() { return utpEnabled; } @JsonProperty(SetterFields.GLOBAL_PEER_LIMIT) public int getGlobalPeerLimit() { return globalPeerLimit; } @JsonProperty(SetterFields.TORRENT_PEER_LIMIT) public int getTorrentPeerLimit() { return torrentPeerLimit; } @JsonProperty(SetterFields.PEER_EXCHANGE) public boolean isPeerExchangeEnabled() { return pexEnabled; } @JsonProperty(SetterFields.PEER_PORT) public int getPeerPort() { return peerPort; } @JsonProperty(SetterFields.RANDOM_PORT) public boolean isPeerPortRandomOnStart() { return peerPortRandomOnStart; } @JsonProperty(SetterFields.PORT_FORWARDING) public boolean isPortForwardingEnabled() { return portForwardingEnabled; } @JsonProperty(SetterFields.RENAME_PARTIAL) public boolean isRenamePartialFilesEnabled() { return renamePartial; } @JsonProperty("rpc-version") public int getRPCVersion() { return rpcVersion; } @JsonProperty("rpc-version-minimum") public int getRPCVersionMin() { return rpcVersionMin; } @JsonProperty(SetterFields.DONE_SCRIPT) public String getDoneScript() { return doneScript; } @JsonProperty(SetterFields.DONE_SCRIPT_ENABLED) public boolean isDoneScriptEnabled() { return doneScriptEnabled; } @JsonProperty(SetterFields.SEED_QUEUE_SIZE) public int getSeedQueueSize() { return seedQueueSize; } @JsonProperty(SetterFields.SEED_QUEUE_ENABLED) public boolean isSeedQueueEnabled() { return seedQueueEnabled; } @JsonProperty(SetterFields.SEED_RATIO_LIMIT) public float getSeedRatioLimit() { return seedRatioLimit; } @JsonProperty(SetterFields.SEED_RATIO_LIMIT_ENABLED) public boolean isSeedRatioLimitEnabled() { return seedRatioLimited; } @JsonProperty(SetterFields.DOWNLOAD_SPEED_LIMIT) public long getDownloadSpeedLimit() { return speedLimitDown; } @JsonProperty(SetterFields.DOWNLOAD_SPEED_LIMIT_ENABLED) public boolean isDownloadSpeedLimitEnabled() { return speedLimitDownEnabled; } @JsonProperty(SetterFields.UPLOAD_SPEED_LIMIT) public long getUploadSpeedLimit() { return speedLimitUp; } @JsonProperty(SetterFields.UPLOAD_SPEED_LIMIT_ENABLED) public boolean isUploadSpeedLimitEnabled() { return speedLimitUpEnabled; } @JsonProperty(SetterFields.STALLED_QUEUE_SIZE) public int getStalledQueueSize() { return stalledQueueSize; } @JsonProperty(SetterFields.STALLED_QUEUE_ENABLED) public boolean isStalledQueueEnabled() { return stalledQueueEnabled; } @JsonProperty(SetterFields.START_ADDED) public boolean isStartAddedTorrentsEnabled() { return startAdded; } @JsonProperty(SetterFields.TRASH_ORIGINAL) public boolean isTrashOriginalTorrentFilesEnabled() { return trashOriginal; } @JsonProperty("version") public String getVersion() { return version; } public void setAltSpeedLimitEnabled(boolean altSpeedEnabled) { this.altSpeedEnabled = altSpeedEnabled; } public void setAltDownloadSpeedLimit(long altSpeedDown) { this.altSpeedDown = altSpeedDown; } public void setAltUploadSpeedLimit(long altSpeedUp) { this.altSpeedUp = altSpeedUp; } public void setAltSpeedLimitTimeEnabled(boolean altSpeedTimeEnabled) { this.altSpeedTimeEnabled = altSpeedTimeEnabled; } public void setAltSpeedTimeBegin(int altSpeedTimeBegin) { this.altSpeedTimeBegin = altSpeedTimeBegin; } public void setAltSpeedTimeEnd(int altSpeedTimeEnd) { this.altSpeedTimeEnd = altSpeedTimeEnd; } public void setAltSpeedTimeDay(int days) { altSpeedTimeDay = days; } public void setBlocklistEnabled(boolean blocklistEnabled) { this.blocklistEnabled = blocklistEnabled; } public void setBlocklistSize(long blocklistSize) { this.blocklistSize = blocklistSize; } public void setBlocklistURL(String url) { blocklistURL = url; } public void setDhtEnabled(boolean enable) { dhtEnabled = enable; } public void setEncryption(String encryption) { this.encryption = encryption; } public void setCacheSize(long size) { cacheSize = size; } public void setConfigDir(String dir) { configDir = dir; } public void setDownloadDir(String downloadDir) { this.downloadDir = downloadDir; } public void setDownloadDirFreeSpace(long freeSpace) { downloadDirFreeSpace = freeSpace; } public void setDownloadQueueSize(int size) { downloadQueueSize = size; } public void setDownloadQueueEnabled(boolean enable) { downloadQueueEnabled = enable; } public void setIdleSeedingLimig(long limit) { idleSeedingLimig = limit; } public void setIdleSeedingLimitEnabled(boolean enable) { idleSeedingLimitEnabled = enable; } public void setIncompleteDir(String dir) { incompleteDir = dir; } public void setIncompleteDirEnabled(boolean enable) { incompleteDirEnabled = enable; } public void setLocalDiscoveryEnabled(boolean enable) { lpdEnabled = enable; } public void setUtpEnabled(boolean enable) { utpEnabled = enable; } public void setGlobalPeerLimit(int limit) { globalPeerLimit = limit; } public void setTorrentPeerLimit(int limit) { torrentPeerLimit = limit; } public void setPeerExchangeEnabled(boolean enable) { pexEnabled = enable; } public void setPeerPort(int peerPort) { this.peerPort = peerPort; } public void setPeerPortRandomOnStart(boolean peerPortRandomOnStart) { this.peerPortRandomOnStart = peerPortRandomOnStart; } public void setPortForwardingEnabled(boolean portForwardingEnabled) { this.portForwardingEnabled = portForwardingEnabled; } public void setRenamePartialFilesEnabled(boolean rename) { renamePartial = rename; } public void setRPCVersion(int rPCVersion) { rpcVersion = rPCVersion; } public void setRPCVersionMin(int rPCVersionMin) { rpcVersionMin = rPCVersionMin; } public void setDoneScript(String script) { doneScript = script; } public void setDoneScriptEnabled(boolean enabled) { doneScriptEnabled = enabled; } public void setSeedQueueSize(int size) { seedQueueSize = size; } public void setSeedQueueEnabled(boolean enable) { seedQueueEnabled = enable; } public void setSeedRatioLimit(float seedRatioLimit) { this.seedRatioLimit = seedRatioLimit; } public void setSeedRatioLimitEnabled(boolean seedRatioLimited) { this.seedRatioLimited = seedRatioLimited; } public void setDownloadSpeedLimit(long speedLimitDown) { this.speedLimitDown = speedLimitDown; } public void setDownloadSpeedLimitEnabled(boolean speedLimitDownEnabled) { this.speedLimitDownEnabled = speedLimitDownEnabled; } public void setUploadSpeedLimit(long speedLimitUp) { this.speedLimitUp = speedLimitUp; } public void setUploadSpeedLimitEnabled(boolean speedLimitUpEnabled) { this.speedLimitUpEnabled = speedLimitUpEnabled; } public void setStalledQueueSize(int size) { stalledQueueSize = size; } public void setStalledQueueEnabled(boolean enable) { stalledQueueEnabled = enable; } public void setStartAddedTorrentsEnabled(boolean enable) { startAdded = enable; } public void setTrashOriginalTorrentFilesEnabled(boolean enable) { trashOriginal = enable; } public void setVersion(String version) { this.version = version; } public void setDownloadDirectories(TransmissionProfile profile, List<String> directories) { downloadDirectories.clear(); downloadDirectories.add(downloadDir); downloadDirectories.addAll(profile.getDirectories()); downloadDirectories.addAll(directories); downloadDirectories.remove(null); } public void setDownloadDirectories(Collection<String> directories) { downloadDirectories.addAll(directories); } @JsonIgnore public Set<String> getDownloadDirectories() { return downloadDirectories; } @Override public int describeContents() { return 0; } @Override public void writeToParcel(Parcel in, int flags) { in.writeByte((byte) (altSpeedEnabled ? 1 : 0)); in.writeLong(altSpeedDown); in.writeLong(altSpeedUp); in.writeByte((byte) (altSpeedTimeEnabled ? 1 : 0)); in.writeInt(altSpeedTimeBegin); in.writeInt(altSpeedTimeEnd); in.writeByte((byte) (blocklistEnabled ? 1 : 0)); in.writeLong(blocklistSize); in.writeString(blocklistURL); in.writeByte((byte) (dhtEnabled ? 1 : 0)); in.writeString(encryption); in.writeLong(cacheSize); in.writeString(downloadDir); in.writeLong(downloadDirFreeSpace); in.writeInt(downloadQueueSize); in.writeByte((byte) (downloadQueueEnabled ? 1 : 0)); in.writeLong(idleSeedingLimig); in.writeByte((byte) (idleSeedingLimitEnabled ? 1 : 0)); in.writeString(incompleteDir); in.writeByte((byte) (incompleteDirEnabled ? 1 : 0)); in.writeByte((byte) (lpdEnabled ? 1 : 0)); in.writeByte((byte) (utpEnabled ? 1 : 0)); in.writeInt(globalPeerLimit); in.writeInt(torrentPeerLimit); in.writeByte((byte) (pexEnabled ? 1 : 0)); in.writeInt(peerPort); in.writeByte((byte) (peerPortRandomOnStart ? 1 : 0)); in.writeByte((byte) (portForwardingEnabled ? 1 : 0)); in.writeByte((byte) (renamePartial ? 1 : 0)); in.writeInt(rpcVersion); in.writeInt(rpcVersionMin); in.writeString(doneScript); in.writeByte((byte) (doneScriptEnabled ? 1 : 0)); in.writeInt(seedQueueSize); in.writeByte((byte) (seedQueueEnabled ? 1 : 0)); in.writeFloat(seedRatioLimit); in.writeByte((byte) (seedRatioLimited ? 1 : 0)); in.writeLong(speedLimitDown); in.writeByte((byte) (speedLimitDownEnabled ? 1 : 0)); in.writeLong(speedLimitUp); in.writeByte((byte) (speedLimitUpEnabled ? 1 : 0)); in.writeInt(stalledQueueSize); in.writeByte((byte) (stalledQueueEnabled ? 1 : 0)); in.writeByte((byte) (startAdded ? 1 : 0)); in.writeByte((byte) (trashOriginal ? 1 : 0)); in.writeString(version); in.writeStringList(new ArrayList<>(downloadDirectories)); } private TransmissionSession(Parcel in) { altSpeedEnabled = in.readByte() == 1; altSpeedDown = in.readLong(); altSpeedUp = in.readLong(); altSpeedTimeEnabled = in.readByte() == 1; altSpeedTimeBegin = in.readInt(); altSpeedTimeEnd = in.readInt(); blocklistEnabled = in.readByte() == 1; blocklistSize = in.readLong(); blocklistURL = in.readString(); dhtEnabled = in.readByte() == 1; encryption = in.readString(); cacheSize = in.readLong(); downloadDir = in.readString(); downloadDirFreeSpace = in.readLong(); downloadQueueSize = in.readInt(); downloadQueueEnabled = in.readByte() == 1; idleSeedingLimig = in.readLong(); idleSeedingLimitEnabled = in.readByte() == 1; incompleteDir = in.readString(); incompleteDirEnabled = in.readByte() == 1; lpdEnabled = in.readByte() == 1; utpEnabled = in.readByte() == 1; globalPeerLimit = in.readInt(); torrentPeerLimit = in.readInt(); pexEnabled = in.readByte() == 1; peerPort = in.readInt(); peerPortRandomOnStart = in.readByte() == 1; portForwardingEnabled = in.readByte() == 1; renamePartial = in.readByte() == 1; rpcVersion = in.readInt(); rpcVersionMin = in.readInt(); doneScript = in.readString(); doneScriptEnabled = in.readByte() == 1; seedQueueSize = in.readInt(); seedQueueEnabled = in.readByte() == 1; seedRatioLimit = in.readFloat(); seedRatioLimited = in.readByte() == 1; speedLimitDown = in.readLong(); speedLimitDownEnabled = in.readByte() == 1; speedLimitUp = in.readLong(); speedLimitUpEnabled = in.readByte() == 1; stalledQueueSize = in.readInt(); stalledQueueEnabled = in.readByte() == 1; startAdded = in.readByte() == 1; trashOriginal = in.readByte() == 1; version = in.readString(); downloadDirectories = new HashSet<String>(in.createStringArrayList()); } public static final Parcelable.Creator<TransmissionSession> CREATOR = new Parcelable.Creator<TransmissionSession>() { @Override public TransmissionSession createFromParcel(Parcel in) { return new TransmissionSession(in); } @Override public TransmissionSession[] newArray(int size) { return new TransmissionSession[size]; } }; }