From c51ddcc861139e2e8830c1a18db4ecb3090bcaa4 Mon Sep 17 00:00:00 2001 From: Alon Albert Date: Tue, 2 Jan 2018 11:57:42 +0200 Subject: [PATCH] Refactor sendRequest --- .../java/org/transdroid/daemon/Daemon.java | 4 +- .../daemon/Deluge/DelugeRpcAdapter.java | 281 +++++------------- .../daemon/Deluge/DelugeRpcClient.java | 169 +++++++++++ .../transdroid/daemon/Deluge/MutableInt.java | 21 ++ .../org/transdroid/daemon/Deluge/Request.java | 37 +++ .../transdroid/daemon/Deluge/Response.java | 55 ++++ app/src/main/res/values/strings.xml | 2 +- 7 files changed, 356 insertions(+), 213 deletions(-) create mode 100644 app/src/main/java/org/transdroid/daemon/Deluge/DelugeRpcClient.java create mode 100644 app/src/main/java/org/transdroid/daemon/Deluge/MutableInt.java create mode 100644 app/src/main/java/org/transdroid/daemon/Deluge/Request.java create mode 100644 app/src/main/java/org/transdroid/daemon/Deluge/Response.java diff --git a/app/src/main/java/org/transdroid/daemon/Daemon.java b/app/src/main/java/org/transdroid/daemon/Daemon.java index ea71ca26..5dd97bcf 100644 --- a/app/src/main/java/org/transdroid/daemon/Daemon.java +++ b/app/src/main/java/org/transdroid/daemon/Daemon.java @@ -156,7 +156,7 @@ public enum Daemon { case Deluge: return "daemon_deluge"; case DelugeRpc: - return "daemon_deluge_direct"; + return "daemon_deluge_rpc"; case DLinkRouterBT: return "daemon_dlinkrouterbt"; case Dummy: @@ -211,7 +211,7 @@ public enum Daemon { if (daemonCode.equals("daemon_deluge")) { return Deluge; } - if (daemonCode.equals("daemon_deluge_direct")) { + if (daemonCode.equals("daemon_deluge_rpc")) { return DelugeRpc; } if (daemonCode.equals("daemon_dlinkrouterbt")) { diff --git a/app/src/main/java/org/transdroid/daemon/Deluge/DelugeRpcAdapter.java b/app/src/main/java/org/transdroid/daemon/Deluge/DelugeRpcAdapter.java index 5df11a7e..cf0c34fc 100644 --- a/app/src/main/java/org/transdroid/daemon/Deluge/DelugeRpcAdapter.java +++ b/app/src/main/java/org/transdroid/daemon/Deluge/DelugeRpcAdapter.java @@ -18,20 +18,13 @@ package org.transdroid.daemon.Deluge; import android.support.annotation.NonNull; -import android.text.TextUtils; -import deluge.impl.net.AcceptAllTrustManager; 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.io.InputStream; -import java.net.Socket; import java.net.URI; -import java.net.UnknownHostException; -import java.security.KeyManagementException; -import java.security.NoSuchAlgorithmException; import java.util.ArrayList; import java.util.Collections; import java.util.Date; @@ -41,11 +34,6 @@ import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.Set; -import java.util.concurrent.atomic.AtomicInteger; -import java.util.zip.DeflaterOutputStream; -import java.util.zip.InflaterInputStream; -import javax.net.ssl.SSLContext; -import javax.net.ssl.TrustManager; import org.base64.android.Base64; import org.transdroid.core.gui.log.Log; import org.transdroid.daemon.Daemon; @@ -79,7 +67,6 @@ 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 se.dimovski.rencode.Rencode; /** * The daemon adapter from the Deluge torrent client using deluged API directly. @@ -91,7 +78,7 @@ public class DelugeRpcAdapter implements IDaemonAdapter { public static final int DEFAULT_PORT = 58846; // TODO: Extract constants to a common file used by both Adapters. - private static final String RPC_METHOD_LOGIN = "daemon.login"; + // private static final String RPC_METHOD_INFO = "daemon.info"; private static final String RPC_METHOD_GET_TORRENTS_STATUS = "core.get_torrents_status"; private static final String RPC_METHOD_STATUS = "core.get_torrent_status"; private static final String RPC_METHOD_GET_LABELS = "label.get_labels"; @@ -110,8 +97,6 @@ public class DelugeRpcAdapter implements IDaemonAdapter { private static final String RPC_METHOD_FORCERECHECK = "core.force_recheck"; private static final String RPC_METHOD_SETLABEL = "label.set_torrent"; - private static final int RPC_ERROR = 2; - private static final String RPC_HASH = "hash"; private static final String RPC_NAME = "name"; private static final String RPC_STATUS = "state"; @@ -180,7 +165,6 @@ public class DelugeRpcAdapter implements IDaemonAdapter { RPC_TRACKER_STATUS, }; - private static AtomicInteger requestIdCounter = new AtomicInteger(); private final DaemonSettings settings; public DelugeRpcAdapter(DaemonSettings settings) { @@ -190,43 +174,50 @@ public class DelugeRpcAdapter implements IDaemonAdapter { @Override public DaemonTaskResult executeTask(Log log, DaemonTask task) { try { + final DelugeRpcClient client = new DelugeRpcClient( + settings.getAddress(), + settings.getPort(), + settings.getUsername(), + settings.getPassword()); switch (task.getMethod()) { case Retrieve: - return doRetrieve((RetrieveTask) task); + return doRetrieve(client, (RetrieveTask) task); case AddByUrl: - return doAddByUrl((AddByUrlTask) task); + return doAddByUrl(client, (AddByUrlTask) task); case AddByMagnetUrl: - return doAddByMagnetUrl((AddByMagnetUrlTask) task); + return doAddByMagnetUrl(client, (AddByMagnetUrlTask) task); case AddByFile: - return doAddByFile((AddByFileTask) task); + return doAddByFile(client, (AddByFileTask) task); case Remove: - return doRemove((RemoveTask) task); + return doRemove(client, (RemoveTask) task); case Pause: - return doControl(task, RPC_METHOD_PAUSE); + return doControl(client, task, RPC_METHOD_PAUSE); case PauseAll: - return doControlAll(task, RPC_METHOD_PAUSE_ALL); + return doControlAll(client, task, RPC_METHOD_PAUSE_ALL); case Resume: - return doControl(task, RPC_METHOD_RESUME); + return doControl(client, task, RPC_METHOD_RESUME); case ResumeAll: - return doControlAll(task, RPC_METHOD_RESUME_ALL); + return doControlAll(client, task, RPC_METHOD_RESUME_ALL); case GetFileList: - return doGetFileList((GetFileListTask) task); + return doGetFileList(client, (GetFileListTask) task); case SetFilePriorities: - return doSetFilePriorities((SetFilePriorityTask) task); + return doSetFilePriorities(client, (SetFilePriorityTask) task); case SetTransferRates: - return doSetTransferRates((SetTransferRatesTask) task); + return doSetTransferRates(client, (SetTransferRatesTask) task); case SetLabel: - return doSetLabel((SetLabelTask) task); + return doSetLabel(client, (SetLabelTask) task); case SetDownloadLocation: - return doSetDownloadLocation((SetDownloadLocationTask) task); + return doSetDownloadLocation(client, (SetDownloadLocationTask) task); case GetTorrentDetails: - return doGetTorrentDetails((GetTorrentDetailsTask) task); + return doGetTorrentDetails(client, (GetTorrentDetailsTask) task); case SetTrackers: - return doSetTrackers((SetTrackersTask) task); + return doSetTrackers(client, (SetTrackersTask) task); case ForceRecheck: - return doForceRecheck((ForceRecheckTask) task); + return doForceRecheck(client, (ForceRecheckTask) task); default: - return notSupported(task); + return new DaemonTaskFailureResult(task, + new DaemonException(ExceptionType.MethodUnsupported, + task.getMethod() + " is not supported by " + getType())); } } catch (DaemonException e) { return new DaemonTaskFailureResult(task, e); @@ -244,17 +235,19 @@ public class DelugeRpcAdapter implements IDaemonAdapter { } @NonNull - private RetrieveTaskSuccessResult doRetrieve(RetrieveTask task) throws DaemonException { + private RetrieveTaskSuccessResult doRetrieve(DelugeRpcClient client, + RetrieveTask task) throws DaemonException { - final List torrents = getTorrents(); - return new RetrieveTaskSuccessResult(task, torrents, getLabels(torrents)); + final List torrents = getTorrents(client); + return new RetrieveTaskSuccessResult(task, torrents, getLabels(client, torrents)); } - private GetTorrentDetailsTaskSuccessResult doGetTorrentDetails(GetTorrentDetailsTask task) + private GetTorrentDetailsTaskSuccessResult doGetTorrentDetails( + DelugeRpcClient client, GetTorrentDetailsTask task) throws DaemonException { //noinspection unchecked - final Map response = (Map) sendRequest( + final Map response = (Map) client.sendRequest( RPC_METHOD_STATUS, task.getTargetTorrent().getUniqueID(), TORRENT_TRACKER_FIELDS); @@ -272,60 +265,65 @@ public class DelugeRpcAdapter implements IDaemonAdapter { Collections.singletonList((String) response.get(RPC_TRACKER_STATUS)))); } - private GetFileListTaskSuccessResult doGetFileList(GetFileListTask task) throws DaemonException { - final ArrayList files = getTorrentFiles(task.getTargetTorrent()); + private GetFileListTaskSuccessResult doGetFileList( + DelugeRpcClient client, GetFileListTask task) throws DaemonException { + final ArrayList files = getTorrentFiles(client, task.getTargetTorrent()); return new GetFileListTaskSuccessResult(task, files); } - private DaemonTaskResult doControl(DaemonTask task, String method) throws DaemonException { - sendRequest(method, (Object) getTorrentIdsArg(task)); + private DaemonTaskResult doControl(DelugeRpcClient client, DaemonTask task, String method) + throws DaemonException { + client.sendRequest(method, (Object) getTorrentIdsArg(task)); return new DaemonTaskSuccessResult(task); } - private DaemonTaskResult doRemove(RemoveTask task) throws DaemonException { - sendRequest(RPC_METHOD_REMOVE, task.getTargetTorrent().getUniqueID(), task.includingData()); + private DaemonTaskResult doRemove(DelugeRpcClient client, RemoveTask task) + throws DaemonException { + client.sendRequest(RPC_METHOD_REMOVE, task.getTargetTorrent().getUniqueID(), + task.includingData()); return new DaemonTaskSuccessResult(task); } @NonNull - private DaemonTaskResult doControlAll(DaemonTask task, String method) + private DaemonTaskResult doControlAll(DelugeRpcClient client, DaemonTask task, String method) throws DaemonException { - sendRequest(method); + client.sendRequest(method); return new DaemonTaskSuccessResult(task); } @NonNull - private DaemonTaskResult doAddByFile(AddByFileTask task) throws DaemonException { + private DaemonTaskResult doAddByFile(DelugeRpcClient client, AddByFileTask task) throws DaemonException { final String file = task.getFile(); final String fileContent = Base64.encodeBytes(loadFile(file)); - sendRequest(RPC_METHOD_ADD_FILE, file, fileContent, new HashMap<>()); + client.sendRequest(RPC_METHOD_ADD_FILE, file, fileContent, new HashMap<>()); return new DaemonTaskSuccessResult(task); } @NonNull - private DaemonTaskResult doAddByUrl(AddByUrlTask task) throws DaemonException { - sendRequest(RPC_METHOD_ADD, task.getUrl(), new HashMap<>()); + private DaemonTaskResult doAddByUrl(DelugeRpcClient client, AddByUrlTask task) throws DaemonException { + client.sendRequest(RPC_METHOD_ADD, task.getUrl(), new HashMap<>()); return new DaemonTaskSuccessResult(task); } @NonNull - private DaemonTaskResult doAddByMagnetUrl(AddByMagnetUrlTask task) throws DaemonException { - sendRequest(RPC_METHOD_ADD_MAGNET, task.getUrl(), new HashMap<>()); + private DaemonTaskResult doAddByMagnetUrl(DelugeRpcClient client, AddByMagnetUrlTask task) throws DaemonException { + client.sendRequest(RPC_METHOD_ADD_MAGNET, task.getUrl(), new HashMap<>()); return new DaemonTaskSuccessResult(task); } @NonNull - private DaemonTaskResult doSetLabel(SetLabelTask task) throws DaemonException { + private DaemonTaskResult doSetLabel(DelugeRpcClient client, SetLabelTask task) throws DaemonException { final String torrentId = task.getTargetTorrent().getUniqueID(); final String label = task.getNewLabel() == null ? "" : task.getNewLabel(); - sendRequest(RPC_METHOD_SETLABEL, torrentId, label); + client.sendRequest(RPC_METHOD_SETLABEL, torrentId, label); return new DaemonTaskSuccessResult(task); } @NonNull - private DaemonTaskResult doSetFilePriorities(SetFilePriorityTask task) throws DaemonException { + private DaemonTaskResult doSetFilePriorities(DelugeRpcClient client, + SetFilePriorityTask task) throws DaemonException { // We first need a listing of all the files (because we can only set the priorities all at once) - final ArrayList files = getTorrentFiles(task.getTargetTorrent()); + final ArrayList files = getTorrentFiles(client, task.getTargetTorrent()); // prepare options arg final Map optionsArgs = new HashMap<>(); @@ -345,21 +343,21 @@ public class DelugeRpcAdapter implements IDaemonAdapter { } optionsArgs.put(RPC_FILE_PRIORITIES, priorities); - sendRequest(RPC_METHOD_SET_TORRENT_OPTIONS, getTorrentIdsArg(task), optionsArgs); + client.sendRequest(RPC_METHOD_SET_TORRENT_OPTIONS, getTorrentIdsArg(task), optionsArgs); return new DaemonTaskSuccessResult(task); } @NonNull - private DaemonTaskResult doSetTransferRates(SetTransferRatesTask task) throws DaemonException { + private DaemonTaskResult doSetTransferRates(DelugeRpcClient client, SetTransferRatesTask task) throws DaemonException { final Map config = new HashMap<>(); config.put(RPC_MAX_DOWNLOAD, task.getDownloadRate() == null ? -1 : task.getDownloadRate()); config.put(RPC_MAX_UPLOAD, task.getUploadRate() == null ? -1 : task.getUploadRate()); - sendRequest(RPC_METHOD_SETCONFIG, config); + client.sendRequest(RPC_METHOD_SETCONFIG, config); return new DaemonTaskSuccessResult(task); } @NonNull - private DaemonTaskResult doSetTrackers(SetTrackersTask task) throws DaemonException { + private DaemonTaskResult doSetTrackers(DelugeRpcClient client, SetTrackersTask task) throws DaemonException { final List> trackers = new ArrayList<>(); final ArrayList newTrackers = task.getNewTrackers(); for (int i = 0, n = newTrackers.size(); i < n; i++) { @@ -368,26 +366,26 @@ public class DelugeRpcAdapter implements IDaemonAdapter { tracker.put(RPC_TRACKER_URL, newTrackers.get(i)); trackers.add(tracker); } - sendRequest(RPC_METHOD_SETTRACKERS, task.getTargetTorrent().getUniqueID(), trackers); + client.sendRequest(RPC_METHOD_SETTRACKERS, task.getTargetTorrent().getUniqueID(), trackers); return new DaemonTaskSuccessResult(task); } @NonNull - private DaemonTaskResult doForceRecheck(ForceRecheckTask task) throws DaemonException { - sendRequest(RPC_METHOD_FORCERECHECK, getTorrentIdsArg(task)); + private DaemonTaskResult doForceRecheck(DelugeRpcClient client, ForceRecheckTask task) throws DaemonException { + client.sendRequest(RPC_METHOD_FORCERECHECK, getTorrentIdsArg(task)); return new DaemonTaskSuccessResult(task); } @NonNull - private DaemonTaskResult doSetDownloadLocation(SetDownloadLocationTask task) + private DaemonTaskResult doSetDownloadLocation(DelugeRpcClient client, SetDownloadLocationTask task) throws DaemonException { - sendRequest(RPC_METHOD_MOVESTORAGE, getTorrentIdsArg(task), task.getNewLocation()); + client.sendRequest(RPC_METHOD_MOVESTORAGE, getTorrentIdsArg(task), task.getNewLocation()); return new DaemonTaskSuccessResult(task); } @NonNull - private List getTorrents() throws DaemonException { - final Map response = (Map) sendRequest( + private List getTorrents(DelugeRpcClient client) throws DaemonException { + final Map response = (Map) client.sendRequest( RPC_METHOD_GET_TORRENTS_STATUS, new HashMap<>(), TORRENT_FIELDS); @@ -444,7 +442,7 @@ public class DelugeRpcAdapter implements IDaemonAdapter { } @NonNull - private List