/* Copyright (c) 2009, Nathan Freitas, Orbot / The Guardian Project - http://openideals.com/guardian */ /* See LICENSE for licensing information */ package se.leap.bitmaskclient.pluggableTransports; import android.content.Context; import android.util.Log; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.util.concurrent.TimeoutException; import java.util.zip.ZipEntry; import java.util.zip.ZipInputStream; public class BinaryInstaller { File installFolder; Context context; public BinaryInstaller(Context context, File installFolder) { this.installFolder = installFolder; this.context = context; } public void deleteDirectory(File file) { if( file.exists() ) { if (file.isDirectory()) { File[] files = file.listFiles(); for(int i=0; i 0) { stmOut.write(buffer, 0, bytecount); } stmOut.close(); stm.close(); if (zis != null) zis.close(); return true; } //copy the file from inputstream to File output - alternative impl public static boolean copyFile (InputStream is, File outputFile) { try { if (outputFile.exists()) outputFile.delete(); boolean newFile = outputFile.createNewFile(); DataOutputStream out = new DataOutputStream(new FileOutputStream(outputFile)); DataInputStream in = new DataInputStream(is); int b = -1; byte[] data = new byte[1024]; while ((b = in.read(data)) != -1) { out.write(data); } if (b == -1); //rejoice // out.flush(); out.close(); in.close(); // chmod? return newFile; } catch (IOException ex) { Log.e("Binaryinstaller", "error copying binary", ex); return false; } } /** * Copies a raw resource file, given its ID to the given location * @param ctx context * @param resid resource id * @param file destination file * @param mode file permissions (E.g.: "755") * @throws IOException on error * @throws InterruptedException when interrupted */ public static void copyRawFile(Context ctx, int resid, File file, String mode, boolean isZipd) throws IOException, InterruptedException { final String abspath = file.getAbsolutePath(); // Write the iptables binary final FileOutputStream out = new FileOutputStream(file); InputStream is = ctx.getResources().openRawResource(resid); if (isZipd) { ZipInputStream zis = new ZipInputStream(is); ZipEntry ze = zis.getNextEntry(); is = zis; } byte buf[] = new byte[1024]; int len; while ((len = is.read(buf)) > 0) { out.write(buf, 0, len); } out.close(); is.close(); // Change the permissions Runtime.getRuntime().exec("chmod "+mode+" "+abspath).waitFor(); } private void setExecutable(File fileBin) { fileBin.setReadable(true); fileBin.setExecutable(true); fileBin.setWritable(false); fileBin.setWritable(true, true); } }