/* * This file is part of Transdroid * * 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 . * */ package org.transdroid.daemon.Deluge; import android.support.annotation.NonNull; import org.base64.android.Base64; import org.transdroid.core.gui.log.Log; import org.transdroid.daemon.Daemon; import org.transdroid.daemon.DaemonException; import org.transdroid.daemon.DaemonException.ExceptionType; import org.transdroid.daemon.DaemonSettings; import org.transdroid.daemon.IDaemonAdapter; import org.transdroid.daemon.Label; import org.transdroid.daemon.Priority; import org.transdroid.daemon.Torrent; import org.transdroid.daemon.TorrentDetails; import org.transdroid.daemon.TorrentFile; import org.transdroid.daemon.task.AddByFileTask; import org.transdroid.daemon.task.AddByMagnetUrlTask; import org.transdroid.daemon.task.AddByUrlTask; import org.transdroid.daemon.task.DaemonTask; import org.transdroid.daemon.task.DaemonTaskFailureResult; import org.transdroid.daemon.task.DaemonTaskResult; import org.transdroid.daemon.task.DaemonTaskSuccessResult; import org.transdroid.daemon.task.ForceRecheckTask; import org.transdroid.daemon.task.GetFileListTask; import org.transdroid.daemon.task.GetFileListTaskSuccessResult; import org.transdroid.daemon.task.GetTorrentDetailsTask; import org.transdroid.daemon.task.GetTorrentDetailsTaskSuccessResult; import org.transdroid.daemon.task.RemoveTask; import org.transdroid.daemon.task.RetrieveTask; import org.transdroid.daemon.task.RetrieveTaskSuccessResult; import org.transdroid.daemon.task.SetDownloadLocationTask; import org.transdroid.daemon.task.SetFilePriorityTask; import org.transdroid.daemon.task.SetLabelTask; import org.transdroid.daemon.task.SetTrackersTask; import org.transdroid.daemon.task.SetTransferRatesTask; import java.io.BufferedInputStream; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.net.URI; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.Date; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.Set; import static org.transdroid.daemon.Deluge.DelugeCommon.RPC_DETAILS; import static org.transdroid.daemon.Deluge.DelugeCommon.RPC_DETAILS_FIELDS_ARRAY; import static org.transdroid.daemon.Deluge.DelugeCommon.RPC_DOWNLOADEDEVER; import static org.transdroid.daemon.Deluge.DelugeCommon.RPC_ETA; import static org.transdroid.daemon.Deluge.DelugeCommon.RPC_FIELDS_ARRAY; import static org.transdroid.daemon.Deluge.DelugeCommon.RPC_FILEPRIORITIES; import static org.transdroid.daemon.Deluge.DelugeCommon.RPC_FILEPROGRESS; import static org.transdroid.daemon.Deluge.DelugeCommon.RPC_FILE_FIELDS_ARRAY; import static org.transdroid.daemon.Deluge.DelugeCommon.RPC_HASH; import static org.transdroid.daemon.Deluge.DelugeCommon.RPC_INDEX; import static org.transdroid.daemon.Deluge.DelugeCommon.RPC_LABEL; import static org.transdroid.daemon.Deluge.DelugeCommon.RPC_MAXDOWNLOAD; import static org.transdroid.daemon.Deluge.DelugeCommon.RPC_MAXUPLOAD; import static org.transdroid.daemon.Deluge.DelugeCommon.RPC_MESSAGE; import static org.transdroid.daemon.Deluge.DelugeCommon.RPC_METHOD_ADD; import static org.transdroid.daemon.Deluge.DelugeCommon.RPC_METHOD_ADD_FILE; import static org.transdroid.daemon.Deluge.DelugeCommon.RPC_METHOD_ADD_MAGNET; import static org.transdroid.daemon.Deluge.DelugeCommon.RPC_METHOD_FORCERECHECK; import static org.transdroid.daemon.Deluge.DelugeCommon.RPC_METHOD_GET_LABELS; import static org.transdroid.daemon.Deluge.DelugeCommon.RPC_METHOD_GET_METHOD_LIST; import static org.transdroid.daemon.Deluge.DelugeCommon.RPC_METHOD_GET_TORRENTS_STATUS; import static org.transdroid.daemon.Deluge.DelugeCommon.RPC_METHOD_INFO; import static org.transdroid.daemon.Deluge.DelugeCommon.RPC_METHOD_MOVESTORAGE; import static org.transdroid.daemon.Deluge.DelugeCommon.RPC_METHOD_PAUSE; import static org.transdroid.daemon.Deluge.DelugeCommon.RPC_METHOD_PAUSE_ALL; import static org.transdroid.daemon.Deluge.DelugeCommon.RPC_METHOD_REMOVE; import static org.transdroid.daemon.Deluge.DelugeCommon.RPC_METHOD_RESUME; import static org.transdroid.daemon.Deluge.DelugeCommon.RPC_METHOD_RESUME_ALL; import static org.transdroid.daemon.Deluge.DelugeCommon.RPC_METHOD_SETCONFIG; import static org.transdroid.daemon.Deluge.DelugeCommon.RPC_METHOD_SETLABEL; import static org.transdroid.daemon.Deluge.DelugeCommon.RPC_METHOD_SETTRACKERS; import static org.transdroid.daemon.Deluge.DelugeCommon.RPC_METHOD_SET_TORRENT_OPTIONS; import static org.transdroid.daemon.Deluge.DelugeCommon.RPC_METHOD_STATUS; import static org.transdroid.daemon.Deluge.DelugeCommon.RPC_NAME; import static org.transdroid.daemon.Deluge.DelugeCommon.RPC_NUMPEERS; import static org.transdroid.daemon.Deluge.DelugeCommon.RPC_NUMSEEDS; import static org.transdroid.daemon.Deluge.DelugeCommon.RPC_PARTDONE; import static org.transdroid.daemon.Deluge.DelugeCommon.RPC_PATH; import static org.transdroid.daemon.Deluge.DelugeCommon.RPC_RATEDOWNLOAD; import static org.transdroid.daemon.Deluge.DelugeCommon.RPC_RATEUPLOAD; import static org.transdroid.daemon.Deluge.DelugeCommon.RPC_SAVEPATH; import static org.transdroid.daemon.Deluge.DelugeCommon.RPC_SIZE; import static org.transdroid.daemon.Deluge.DelugeCommon.RPC_STATUS; import static org.transdroid.daemon.Deluge.DelugeCommon.RPC_TIER; import static org.transdroid.daemon.Deluge.DelugeCommon.RPC_TIMEADDED; import static org.transdroid.daemon.Deluge.DelugeCommon.RPC_TOTALPEERS; import static org.transdroid.daemon.Deluge.DelugeCommon.RPC_TOTALSEEDS; import static org.transdroid.daemon.Deluge.DelugeCommon.RPC_TOTALSIZE; import static org.transdroid.daemon.Deluge.DelugeCommon.RPC_TRACKERS; import static org.transdroid.daemon.Deluge.DelugeCommon.RPC_TRACKER_STATUS; import static org.transdroid.daemon.Deluge.DelugeCommon.RPC_UPLOADEDEVER; import static org.transdroid.daemon.Deluge.DelugeCommon.RPC_URL; /** * The daemon adapter from the Deluge torrent client using deluged API directly. * @author alon.albert */ public class DelugeRpcAdapter implements IDaemonAdapter { public static final int DEFAULT_PORT = 58846; private final DaemonSettings settings; private int version = -1; public DelugeRpcAdapter(DaemonSettings settings) { this.settings = settings; } @Override public DaemonTaskResult executeTask(Log log, DaemonTask task) { final DelugeRpcClient client = new DelugeRpcClient(); try { client.connect(settings); switch (task.getMethod()) { case Retrieve: return doRetrieve(client, (RetrieveTask) task); case AddByUrl: return doAddByUrl(client, (AddByUrlTask) task); case AddByMagnetUrl: return doAddByMagnetUrl(client, (AddByMagnetUrlTask) task); case AddByFile: return doAddByFile(client, (AddByFileTask) task); case Remove: return doRemove(client, (RemoveTask) task); case Pause: return doControl(client, task, RPC_METHOD_PAUSE); case PauseAll: return doControlAll(client, task, RPC_METHOD_PAUSE_ALL); case Resume: return doControl(client, task, RPC_METHOD_RESUME); case ResumeAll: return doControlAll(client, task, RPC_METHOD_RESUME_ALL); case GetFileList: return doGetFileList(client, (GetFileListTask) task); case SetFilePriorities: return doSetFilePriorities(client, (SetFilePriorityTask) task); case SetTransferRates: return doSetTransferRates(client, (SetTransferRatesTask) task); case SetLabel: return doSetLabel(client, (SetLabelTask) task); case SetDownloadLocation: return doSetDownloadLocation(client, (SetDownloadLocationTask) task); case GetTorrentDetails: return doGetTorrentDetails(client, (GetTorrentDetailsTask) task); case SetTrackers: return doSetTrackers(client, (SetTrackersTask) task); case ForceRecheck: return doForceRecheck(client, (ForceRecheckTask) task); default: return new DaemonTaskFailureResult(task, new DaemonException(ExceptionType.MethodUnsupported, task.getMethod() + " is not " + "supported by " + getType())); } } catch (DaemonException e) { return new DaemonTaskFailureResult(task, e); } finally { client.close(); } } @Override public Daemon getType() { return Daemon.DelugeRpc; } @Override public DaemonSettings getSettings() { return settings; } @NonNull private RetrieveTaskSuccessResult doRetrieve(DelugeRpcClient client, RetrieveTask task) throws DaemonException { // Get torrents //noinspection unchecked final Map> torrentsStatus = (Map>) client.sendRequest (RPC_METHOD_GET_TORRENTS_STATUS, new HashMap<>(), RPC_FIELDS_ARRAY); final List torrents = getTorrents(torrentsStatus.values()); // Check if Label plugin is enabled final boolean hasLabelPlugin = hasMethod(client, RPC_METHOD_GET_LABELS); // Get label list from server //noinspection unchecked final List labelNames = hasLabelPlugin ? (List) client.sendRequest(RPC_METHOD_GET_LABELS) : new ArrayList(); // Extract labels & counts from torrents. final List