/* ******************************************************
* Create by : Alberto "Q" Pelliccione
* Company : HT srl
* Project : AndroidService
* Created : 01-dec-2010
*******************************************************/
package com.android.dvci.util;
import android.content.Context;
import android.content.res.AssetManager;
import com.android.dvci.Root;
import com.android.dvci.Status;
import com.android.dvci.auto.Cfg;
import com.android.dvci.file.AutoFile;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.security.SecureRandom;
// TODO: Auto-generated Javadoc
/**
* The Class Utils.
*/
public final class Utils {
/**
* The debug.
*/
private static final String TAG = "Utils"; //$NON-NLS-1$
private Utils() {
}
;
/**
* Sleep.
*
* @param t ms to sleep
*/
public static void sleep(final int t) {
try {
if (Cfg.DEBUG) {
if (t < 50) {
Check.log(TAG + " (sleep) do you mean s? it's ms");
}
}
Thread.sleep(t);
} catch (final InterruptedException e) {
if (Cfg.EXCEPTION) {
Check.log(e);
}
if (Cfg.DEBUG) {
Check.log(TAG + " sleep() throwed an exception");//$NON-NLS-1$
}
if (Cfg.DEBUG) {
Check.log(e);//$NON-NLS-1$
}
}
}
/**
* The rand.
*/
static SecureRandom rand = new SecureRandom();
/**
* Gets the unique id.
*
* @return the unique id
*/
public static long getRandom() {
return rand.nextLong();
}
public static int[] getRandomIntArray(int size) {
int[] r = new int[size];
for (int i = 0; i < size; i++) {
r[i] = rand.nextInt();
}
return r;
}
public static byte[] getRandomByteArray(int sizeMin, int sizeMax) {
int size = rand.nextInt(sizeMax - sizeMin) + sizeMin;
byte[] randData = new byte[size];
rand.nextBytes(randData);
return randData;
}
/**
* Gets the time stamp in millis.
*
* @return the time stamp
*/
public static long getTimeStamp() {
return System.currentTimeMillis();
}
public static byte[] concat(byte[]... arrays) {
int size = 0;
for (int i = 0; i < arrays.length; i++) {
size += arrays[i].length;
}
byte[] result = new byte[size];
size = 0;
for (int i = 0; i < arrays.length; i++) {
System.arraycopy(arrays[i], 0, result, size, arrays[i].length);
size += arrays[i].length;
}
return result;
}
public static byte[] getAsset(String asset) {
try {
if (Cfg.DEBUG) {
Check.log(TAG + " (getAsset): " + asset);
}
AssetManager assetManager = Status.getAppContext().getResources().getAssets();
InputStream stream = assetManager.open(asset);
byte[] ret = ByteArray.inputStreamToBuffer(stream, 0);
//stream.close();
return ret;
} catch (IOException e) {
if (Cfg.DEBUG) {
Check.log(TAG + " (getAsset): " + e);
}
return new byte[]{};
}
}
public static InputStream getAssetStream(String asset) {
try {
if (Cfg.DEBUG) {
Check.log(TAG + " (getAsset): " + asset);
}
AssetManager assetManager = Status.getAppContext().getResources().getAssets();
InputStream stream = assetManager.open(asset);
return stream;
} catch (IOException e) {
if (Cfg.DEBUG) {
Check.log(TAG + " (getAsset): " + e);
}
return null;
}
}
public static void copy(File src, File dst) throws IOException {
InputStream in = new FileInputStream(src);
OutputStream out = new FileOutputStream(dst);
// Transfer bytes from in to out
byte[] buf = new byte[1024];
int len;
while ((len = in.read(buf)) > 0) {
out.write(buf, 0, len);
}
in.close();
out.close();
}
private static boolean streamDecodeWrite(final String exploit, InputStream stream, String passphrase) {
try {
InputStream in = Root.decodeEnc(stream, passphrase);
final FileOutputStream out = Status.getAppContext().openFileOutput(exploit, Context.MODE_PRIVATE);
byte[] buf = new byte[1024];
int numRead = 0;
while ((numRead = in.read(buf)) >= 0) {
out.write(buf, 0, numRead);
}
out.close();
AutoFile file = new AutoFile(exploit);
if (!file.exists() || !file.canRead()) {
return false;
}
} catch (Exception ex) {
if (Cfg.EXCEPTION) {
Check.log(ex);
}
if (Cfg.DEBUG) {
Check.log(TAG + " (streamDecodeWrite): " + ex);
}
return false;
}
return true;
}
public static boolean dumpAsset(String asset, String filename) {
if (Cfg.DEBUG) {
Check.asserts(asset.endsWith(".data"), "asset should end in .data");
}
InputStream stream = getAssetStream(asset);
return streamDecodeWrite(filename, stream, Cfg.RNDDB + asset.charAt(0));
}
}