@ -51,13 +51,10 @@ import com.android.internalcopy.http.multipart.FilePart;
@@ -51,13 +51,10 @@ import com.android.internalcopy.http.multipart.FilePart;
import com.android.internalcopy.http.multipart.MultipartEntity ;
import com.android.internalcopy.http.multipart.Part ;
/ * *
* An adapter that allows for easy access to Torrentflux - b4rt installs . Communication
* is handled via HTTP GET requests and XML responses .
*
* An adapter that allows for easy access to Torrentflux - b4rt installs . Communication is handled via HTTP GET requests
* and XML responses .
* @author erickok
*
* /
public class Tfb4rtAdapter implements IDaemonAdapter {
@ -84,25 +81,25 @@ public class Tfb4rtAdapter implements IDaemonAdapter {
@@ -84,25 +81,25 @@ public class Tfb4rtAdapter implements IDaemonAdapter {
@Override
public DaemonTaskResult executeTask ( DaemonTask task ) {
try {
switch ( task . getMethod ( ) ) {
case Retrieve :
// Request all torrents from server
return new RetrieveTaskSuccessResult ( ( RetrieveTask ) task , makeStatsRequest ( ) , null ) ;
return new RetrieveTaskSuccessResult ( ( RetrieveTask ) task , makeStatsRequest ( ) , null ) ;
case AddByFile :
// Add a torrent to the server by sending the contents of a local .torrent file
String file = ( ( AddByFileTask ) task ) . getFile ( ) ;
String file = ( ( AddByFileTask ) task ) . getFile ( ) ;
makeFileUploadRequest ( "fileUpload" , file ) ;
return null ;
case AddByUrl :
// Request to add a torrent by URL
String url = ( ( AddByUrlTask ) task ) . getUrl ( ) ;
String url = ( ( AddByUrlTask ) task ) . getUrl ( ) ;
makeActionRequest ( "urlUpload" , url ) ;
return new DaemonTaskSuccessResult ( task ) ;
@ -110,15 +107,16 @@ public class Tfb4rtAdapter implements IDaemonAdapter {
@@ -110,15 +107,16 @@ public class Tfb4rtAdapter implements IDaemonAdapter {
// Remove a torrent
RemoveTask removeTask = ( RemoveTask ) task ;
makeActionRequest ( ( removeTask . includingData ( ) ? "deleteWithData" : "delete" ) , task . getTargetTorrent ( ) . getUniqueID ( ) ) ;
makeActionRequest ( ( removeTask . includingData ( ) ? "deleteWithData" : "delete" ) , task . getTargetTorrent ( )
. getUniqueID ( ) ) ;
return new DaemonTaskSuccessResult ( task ) ;
case Pause :
// Pause a torrent
makeActionRequest ( "stop" , task . getTargetTorrent ( ) . getUniqueID ( ) ) ;
return new DaemonTaskSuccessResult ( task ) ;
case PauseAll :
// Pause all torrents
@ -130,21 +128,22 @@ public class Tfb4rtAdapter implements IDaemonAdapter {
@@ -130,21 +128,22 @@ public class Tfb4rtAdapter implements IDaemonAdapter {
// Resume a torrent
makeActionRequest ( "start" , task . getTargetTorrent ( ) . getUniqueID ( ) ) ;
return new DaemonTaskSuccessResult ( task ) ;
case ResumeAll :
// Resume all torrents
makeActionRequest ( "bulkStart" , null ) ;
return new DaemonTaskSuccessResult ( task ) ;
case SetTransferRates :
// Request to set the maximum transfer rates
// TODO: Implement this?
return null ;
default :
return new DaemonTaskFailureResult ( task , new DaemonException ( ExceptionType . MethodUnsupported , task . getMethod ( ) + " is not supported by " + getType ( ) ) ) ;
return new DaemonTaskFailureResult ( task , new DaemonException ( ExceptionType . MethodUnsupported ,
task . getMethod ( ) + " is not supported by " + getType ( ) ) ) ;
}
} catch ( DaemonException e ) {
return new DaemonTaskFailureResult ( task , e ) ;
@ -154,22 +153,22 @@ public class Tfb4rtAdapter implements IDaemonAdapter {
@@ -154,22 +153,22 @@ public class Tfb4rtAdapter implements IDaemonAdapter {
private List < Torrent > makeStatsRequest ( ) throws DaemonException {
try {
// Initialise the HTTP client
if ( httpclient = = null ) {
initialise ( ) ;
}
// Make request
HttpGet httpget = new HttpGet ( buildWebUIUrl ( RPC_URL_STATS ) ) ;
HttpResponse response = httpclient . execute ( httpget ) ;
HttpResponse response = httpclient . execute ( httpget ) ;
// Read XML response
InputStream instream = response . getEntity ( ) . getContent ( ) ;
List < Torrent > torrents = StatsParser . parse ( new InputStreamReader ( instream ) ) ;
instream . close ( ) ;
return torrents ;
return torrents ;
} catch ( DaemonException e ) {
DLog . d ( LOG_NAME , "Parsing error: " + e . toString ( ) ) ;
throw e ;
@ -177,20 +176,21 @@ public class Tfb4rtAdapter implements IDaemonAdapter {
@@ -177,20 +176,21 @@ public class Tfb4rtAdapter implements IDaemonAdapter {
DLog . d ( LOG_NAME , "Error: " + e . toString ( ) ) ;
throw new DaemonException ( ExceptionType . ConnectionError , e . toString ( ) ) ;
}
}
private boolean makeActionRequest ( String action , String target ) throws DaemonException {
try {
// Initialise the HTTP client
if ( httpclient = = null ) {
initialise ( ) ;
}
// Make request
HttpGet httpget = new HttpGet ( buildWebUIUrl ( RPC_URL_DISPATCH + action + RPC_URL_DISPATCH2 + RPC_URL_AID + ( action . equals ( "urlUpload" ) ? RPC_URL_URL : RPC_URL_TRANSFER ) + target ) ) ;
HttpGet httpget = new HttpGet ( buildWebUIUrl ( RPC_URL_DISPATCH + action + RPC_URL_DISPATCH2 + RPC_URL_AID
+ ( action . equals ( "urlUpload" ) ? RPC_URL_URL : RPC_URL_TRANSFER ) + target ) ) ;
HttpResponse response = httpclient . execute ( httpget ) ;
// Read response (a successful action always returned '1')
@ -210,21 +210,21 @@ public class Tfb4rtAdapter implements IDaemonAdapter {
@@ -210,21 +210,21 @@ public class Tfb4rtAdapter implements IDaemonAdapter {
DLog . d ( LOG_NAME , "Error: " + e . toString ( ) ) ;
throw new DaemonException ( ExceptionType . ConnectionError , e . toString ( ) ) ;
}
}
private boolean makeFileUploadRequest ( String action , String target ) throws DaemonException {
try {
// Initialise the HTTP client
if ( httpclient = = null ) {
initialise ( ) ;
}
// Make request
HttpPost httppost = new HttpPost ( buildWebUIUrl ( RPC_URL_DISPATCH + action + RPC_URL_DISPATCH2 + RPC_URL_AID ) ) ;
File upload = new File ( URI . create ( target ) ) ;
Part [ ] parts = { new FilePart ( "upload_files[]" , upload ) } ;
httppost . setEntity ( new MultipartEntity ( parts , httppost . getParams ( ) ) ) ;
@ -247,7 +247,7 @@ public class Tfb4rtAdapter implements IDaemonAdapter {
@@ -247,7 +247,7 @@ public class Tfb4rtAdapter implements IDaemonAdapter {
DLog . d ( LOG_NAME , "Error: " + e . toString ( ) ) ;
throw new DaemonException ( ExceptionType . ConnectionError , e . toString ( ) ) ;
}
}
/ * *
@ -258,20 +258,27 @@ public class Tfb4rtAdapter implements IDaemonAdapter {
@@ -258,20 +258,27 @@ public class Tfb4rtAdapter implements IDaemonAdapter {
private void initialise ( ) throws DaemonException {
httpclient = HttpHelper . createStandardHttpClient ( settings , true ) ;
}
/ * *
* Build the URL of specific Torrentflux site request from the user settings and some requested action .
* @param act The action to perform , which is an already build query string without usernmae / password , i . e . dispatcher . php ? action = stop & transfer = ubuntu . torrent
* @return The URL of a specific request , i . e . http : //localhost:80/turrentflux/dispatcher.php?action=stop&transfer=ubuntu.torrent&username=admin&md5pass=asd98as7d
* @param act The action to perform , which is an already build query string without usernmae / password , i . e .
* dispatcher . php ? action = stop & transfer = ubuntu . torrent
* @return The URL of a specific request , i . e .
* http : //localhost:80/turrentflux/dispatcher.php?action=stop&transfer=ubuntu
* . torrent & username = admin & md5pass = asd98as7d
* /
private String buildWebUIUrl ( String act ) {
String folder = settings . getFolder ( ) . endsWith ( "/" ) ?
settings . getFolder ( ) . substring ( 0 , settings . getFolder ( ) . length ( ) - 1 ) :
settings . getFolder ( ) ;
return ( settings . getSsl ( ) ? "https://" : "http://" ) + settings . getAddress ( ) + ":" + settings . getPort ( ) +
folder + act + RPC_URL_USER + settings . getUsername ( ) + RPC_URL_PASS + md5Pass ( ( settings . getPassword ( ) = = null ? "" : settings . getPassword ( ) ) ) ;
String folder = "" ;
if ( settings . getFolder ( ) ! = null ) {
folder = settings . getFolder ( ) ;
if ( folder . endsWith ( "/" ) )
folder = folder . substring ( 0 , folder . length ( ) - 1 ) ;
}
return ( settings . getSsl ( ) ? "https://" : "http://" ) + settings . getAddress ( ) + ":" + settings . getPort ( ) + folder
+ act + RPC_URL_USER + settings . getUsername ( ) + RPC_URL_PASS
+ md5Pass ( ( settings . getPassword ( ) = = null ? "" : settings . getPassword ( ) ) ) ;
}
/ * *
* Calculate the MD5 hash of a password to use with the Torrentflux - b4rt dispatcher requests .
* @param pass The plain text password
@ -280,9 +287,9 @@ public class Tfb4rtAdapter implements IDaemonAdapter {
@@ -280,9 +287,9 @@ public class Tfb4rtAdapter implements IDaemonAdapter {
public static String md5Pass ( String pass ) {
try {
MessageDigest m = MessageDigest . getInstance ( "MD5" ) ;
byte [ ] data = pass . getBytes ( ) ;
m . update ( data , 0 , data . length ) ;
BigInteger i = new BigInteger ( 1 , m . digest ( ) ) ;
byte [ ] data = pass . getBytes ( ) ;
m . update ( data , 0 , data . length ) ;
BigInteger i = new BigInteger ( 1 , m . digest ( ) ) ;
return String . format ( "%1$032X" , i ) ;
} catch ( NoSuchAlgorithmException e ) {
e . printStackTrace ( ) ;
@ -299,5 +306,5 @@ public class Tfb4rtAdapter implements IDaemonAdapter {
@@ -299,5 +306,5 @@ public class Tfb4rtAdapter implements IDaemonAdapter {
public DaemonSettings getSettings ( ) {
return this . settings ;
}
}