package fuzion24.device.vulnerability.vulnerabilities.helper;
import android.content.Context;
import android.content.res.AssetManager;
import android.util.Log;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
public class BinaryAssets {
private static final String TAG = BinaryAssets.class.getSimpleName();
public static void extractAsset(Context ctx, String name, String destination) throws IOException {
extractAsset(ctx, name, destination, true);
}
public static String extractAsset(Context ctx, String name) throws IOException {
AssetManager assetManager = ctx.getAssets();
InputStream asset = assetManager.open(name);
ByteArrayOutputStream fos = new ByteArrayOutputStream();
copy(asset, fos);
return fos.toString();
}
public static void extractAsset(Context ctx, String name, String destination, boolean overwrite) throws IOException {
Log.d(TAG, "Extracting \'" + name + "\' from assets to \'" + destination + "\' ...");
try {
File f = new File(destination);
if(f.exists() && overwrite) {
f.delete();
}
}
catch(Exception e) {e.printStackTrace();}
AssetManager assetManager = ctx.getAssets();
InputStream asset = assetManager.open(name);
FileOutputStream fos = new FileOutputStream(destination);
copy(asset,fos);
}
public static void extractZipAsset(Context ctx, String zipAsset, String destination) throws IOException {
AssetManager assetManager = ctx.getAssets();
InputStream asset = assetManager.open(zipAsset);
ZipInputStream zis = new ZipInputStream(asset);
File extractionDir = new File(destination);
boolean directionCreationSucceeded = extractionDir.mkdirs();
ZipEntry ze = null;
byte[] buffer = new byte[8192];
while ((ze = zis.getNextEntry()) != null) {
if(ze.isDirectory()){
continue;
}
//Strip everything from the last '/'
String zeName = ze.getName();
String fileName = zeName;
if(zeName.lastIndexOf('/') != -1){
fileName = zeName.substring(zeName.lastIndexOf('/'), zeName.length());
}
String fileExtractionPath = destination + fileName;
FileOutputStream fos = new FileOutputStream(fileExtractionPath);
int len;
while ((len = zis.read(buffer)) != -1) {
fos.write(buffer, 0, len);
}
fos.close();
}
}
private static final int BUFFER_SIZE = 2 * 1024 * 1024;
public static void copy(InputStream input, OutputStream output) throws IOException {
try {
byte[] buffer = new byte[BUFFER_SIZE];
int bytesRead = input.read(buffer);
while (bytesRead != -1) {
output.write(buffer, 0, bytesRead);
bytesRead = input.read(buffer);
}
//If needed, close streams.
} finally {
input.close();
output.close();
}
}
}