|
|
@@ -1,4 +1,241 @@ |
|
|
|
package fr.mobdev.lpcprog.managers; |
|
|
|
|
|
|
|
import android.content.Context; |
|
|
|
import android.net.ConnectivityManager; |
|
|
|
import android.net.NetworkInfo; |
|
|
|
|
|
|
|
import java.io.BufferedReader; |
|
|
|
import java.io.File; |
|
|
|
import java.io.FileInputStream; |
|
|
|
import java.io.FileNotFoundException; |
|
|
|
import java.io.FileOutputStream; |
|
|
|
import java.io.IOException; |
|
|
|
import java.io.InputStream; |
|
|
|
import java.io.InputStreamReader; |
|
|
|
import java.net.HttpURLConnection; |
|
|
|
import java.net.URL; |
|
|
|
import java.security.MessageDigest; |
|
|
|
import java.security.NoSuchAlgorithmException; |
|
|
|
import java.util.ArrayList; |
|
|
|
import java.util.List; |
|
|
|
|
|
|
|
import fr.mobdev.lpcprog.R; |
|
|
|
import fr.mobdev.lpcprog.listener.NetworkListener; |
|
|
|
import fr.mobdev.lpcprog.objects.Binary; |
|
|
|
import fr.mobdev.lpcprog.objects.Server; |
|
|
|
|
|
|
|
public class NetworkManager { |
|
|
|
|
|
|
|
private NetworkListener listener; |
|
|
|
private static NetworkManager instance; |
|
|
|
private Context context; |
|
|
|
private boolean isCanceled; |
|
|
|
private boolean downloadInProgress; |
|
|
|
|
|
|
|
private NetworkManager(NetworkListener listener, Context context) |
|
|
|
{ |
|
|
|
this.listener = listener; |
|
|
|
this.context = context; |
|
|
|
this.isCanceled = false; |
|
|
|
} |
|
|
|
|
|
|
|
public static NetworkManager getInstance(NetworkListener listener, Context context){ |
|
|
|
if (instance == null) |
|
|
|
instance = new NetworkManager(listener,context); |
|
|
|
if(listener != null && listener != instance.getListener()) |
|
|
|
instance.setListener(listener); |
|
|
|
return instance; |
|
|
|
} |
|
|
|
|
|
|
|
private NetworkListener getListener() |
|
|
|
{ |
|
|
|
return listener; |
|
|
|
} |
|
|
|
|
|
|
|
private void setListener(NetworkListener listener) |
|
|
|
{ |
|
|
|
this.listener = listener; |
|
|
|
} |
|
|
|
|
|
|
|
public void browseBinaries(){ |
|
|
|
if(isConnectedToInternet(context)) { |
|
|
|
new Thread(new Runnable() { |
|
|
|
@Override |
|
|
|
public void run() { |
|
|
|
getBinariesList(); |
|
|
|
} |
|
|
|
}).start(); |
|
|
|
} |
|
|
|
else |
|
|
|
listener.onError(context.getString(R.string.network_error)); |
|
|
|
} |
|
|
|
|
|
|
|
public void retrieveBinary(final Server server, final Binary binary){ |
|
|
|
if(isConnectedToInternet(context)){ |
|
|
|
new Thread(new Runnable() { |
|
|
|
@Override |
|
|
|
public void run() { |
|
|
|
getBinary(server, binary); |
|
|
|
} |
|
|
|
}).start(); |
|
|
|
} |
|
|
|
else |
|
|
|
listener.onError(context.getString(R.string.network_error)); |
|
|
|
} |
|
|
|
|
|
|
|
private void getBinariesList(){ |
|
|
|
List<List<Server>> servers = DatabaseManager.getInstance(context).getServers(); |
|
|
|
List<Server> serversAvailable = new ArrayList<>(); |
|
|
|
for(Server server : servers.get(0)){ |
|
|
|
serversAvailable.add(server); |
|
|
|
} |
|
|
|
for(Server server : servers.get(1)){ |
|
|
|
serversAvailable.add(server); |
|
|
|
} |
|
|
|
|
|
|
|
listener.startBinaries(); |
|
|
|
|
|
|
|
for(Server server : serversAvailable) { |
|
|
|
listener.startServer(server); |
|
|
|
try { |
|
|
|
URL url = new URL(server.url.toString()+"Binaries"); |
|
|
|
HttpURLConnection connection = (HttpURLConnection) url.openConnection(); |
|
|
|
connection.setDoInput(true); |
|
|
|
InputStream stream = connection.getInputStream(); |
|
|
|
if(stream != null){ |
|
|
|
InputStreamReader isr = new InputStreamReader(stream); |
|
|
|
BufferedReader reader = new BufferedReader(isr); |
|
|
|
String line = reader.readLine(); |
|
|
|
while(line != null){ |
|
|
|
Binary b = parseLine(line); |
|
|
|
if(b != null) |
|
|
|
server.addBinary(b); |
|
|
|
line = reader.readLine(); |
|
|
|
} |
|
|
|
} |
|
|
|
} catch (IOException e) { |
|
|
|
e.printStackTrace(); |
|
|
|
DatabaseManager.getInstance(context).serverFail(server); |
|
|
|
} finally { |
|
|
|
listener.endServer(server); |
|
|
|
} |
|
|
|
} |
|
|
|
listener.endBinaries(); |
|
|
|
} |
|
|
|
|
|
|
|
private Binary parseLine(String line){ |
|
|
|
if(!line.matches("(.*;){5}")){ |
|
|
|
System.out.println("Line not match regex"); |
|
|
|
return null; |
|
|
|
} |
|
|
|
Binary b = new Binary(); |
|
|
|
b.name = line.substring(0,line.indexOf(";")); |
|
|
|
line = line.substring(line.indexOf(";")+1); |
|
|
|
b.filename = line.substring(0,line.indexOf(";")); |
|
|
|
line = line.substring(line.indexOf(";")+1); |
|
|
|
b.version = Integer.valueOf(line.substring(0,line.indexOf(";"))); |
|
|
|
line = line.substring(line.indexOf(";")+1); |
|
|
|
b.path = line.substring(0,line.indexOf(";")); |
|
|
|
line = line.substring(line.indexOf(";")+1); |
|
|
|
b.sha1 = line.substring(0,line.indexOf(";")); |
|
|
|
return b; |
|
|
|
} |
|
|
|
|
|
|
|
private void getBinary(Server server, Binary binary){ |
|
|
|
try { |
|
|
|
URL url = new URL(server.url.toString() + binary.path + binary.filename); |
|
|
|
downloadInProgress = true; |
|
|
|
HttpURLConnection connection = (HttpURLConnection) url.openConnection(); |
|
|
|
connection.setDoInput(true); |
|
|
|
InputStream stream = connection.getInputStream(); |
|
|
|
File file = new File(context.getApplicationInfo().dataDir+"/"+server.id+"/"+binary.path+binary.filename); |
|
|
|
file.getParentFile().mkdirs(); |
|
|
|
if (!file.createNewFile() && !file.canWrite()){ |
|
|
|
listener.downloadError(server,binary,context.getString(R.string.cant_create_file)); |
|
|
|
return; |
|
|
|
} |
|
|
|
FileOutputStream output = new FileOutputStream(file); |
|
|
|
int fileLength = connection.getContentLength(); |
|
|
|
if (stream != null) { |
|
|
|
byte[] data = new byte[4096]; |
|
|
|
long totalSizeReaded = 0; |
|
|
|
int sizeReaded ; |
|
|
|
while((sizeReaded = stream.read(data)) != -1){ |
|
|
|
if(isCanceled) { |
|
|
|
isCanceled = false; |
|
|
|
downloadInProgress = false; |
|
|
|
listener.downloadCanceled(server,binary); |
|
|
|
stream.close(); |
|
|
|
output.close(); |
|
|
|
cleanupFile(server,binary); |
|
|
|
return; |
|
|
|
} |
|
|
|
totalSizeReaded += sizeReaded; |
|
|
|
if(fileLength > 0){ |
|
|
|
listener.progress(server,binary, (int) totalSizeReaded * 100 / fileLength); |
|
|
|
} |
|
|
|
output.write(data,0,sizeReaded); |
|
|
|
} |
|
|
|
output.close(); |
|
|
|
if(checkFileSha1(server,binary)) |
|
|
|
listener.downloadSuccessful(server,binary); |
|
|
|
else |
|
|
|
listener.downloadError(server,binary,context.getString(R.string.sha1_error)); |
|
|
|
} |
|
|
|
}catch (IOException e) { |
|
|
|
e.printStackTrace(); |
|
|
|
cleanupFile(server,binary); |
|
|
|
listener.downloadFailed(server,binary); |
|
|
|
} |
|
|
|
downloadInProgress = false; |
|
|
|
isCanceled = false; |
|
|
|
} |
|
|
|
|
|
|
|
public boolean checkFileSha1(Server server, Binary binary){ |
|
|
|
String sha1 = ""; |
|
|
|
try { |
|
|
|
File f = new File(context.getApplicationInfo().dataDir+"/"+server.id+"/"+binary.path+binary.filename); |
|
|
|
FileInputStream fis = new FileInputStream(f); |
|
|
|
MessageDigest md = MessageDigest.getInstance("SHA-1"); |
|
|
|
byte[] data = new byte[4096]; |
|
|
|
int sizeReaded; |
|
|
|
while((sizeReaded = fis.read(data)) >0){ |
|
|
|
md.update(data,0,sizeReaded); |
|
|
|
} |
|
|
|
byte[] output = md.digest(); |
|
|
|
for(byte b : output){ |
|
|
|
sha1 += String.format("%02x",b); |
|
|
|
} |
|
|
|
} catch (Exception e) { |
|
|
|
e.printStackTrace(); |
|
|
|
} |
|
|
|
System.out.println("Sha1 "+sha1); |
|
|
|
return sha1.compareToIgnoreCase(binary.sha1) == 0; |
|
|
|
} |
|
|
|
|
|
|
|
public boolean cleanupFile(Server server, Binary binary){ |
|
|
|
File f = new File(context.getApplicationInfo().dataDir+"/"+server.id+"/"+binary.path+binary.filename); |
|
|
|
return f.delete(); |
|
|
|
} |
|
|
|
|
|
|
|
public void cancelDownload(){ |
|
|
|
if(downloadInProgress) |
|
|
|
isCanceled = true; |
|
|
|
} |
|
|
|
|
|
|
|
private boolean isConnectedToInternet(Context context) |
|
|
|
{ |
|
|
|
//verify the connectivity |
|
|
|
ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); |
|
|
|
NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo(); |
|
|
|
if (networkInfo != null) |
|
|
|
{ |
|
|
|
NetworkInfo.State networkState = networkInfo.getState(); |
|
|
|
if (networkState.equals(NetworkInfo.State.CONNECTED)) |
|
|
|
{ |
|
|
|
return true; |
|
|
|
} |
|
|
|
} |
|
|
|
return false; |
|
|
|
} |
|
|
|
} |