package org.witness.informacam.informa.embed; import java.io.IOException; import org.apache.commons.io.IOUtils; import org.witness.informacam.Debug; import org.witness.informacam.InformaCam; import org.witness.informacam.models.media.IAsset; import org.witness.informacam.models.media.IMedia; import org.witness.informacam.models.transport.ITransportStub; import org.witness.informacam.storage.IOUtility; import org.witness.informacam.utils.Constants.App.Informa; import org.witness.informacam.utils.Constants.App.Storage; import org.witness.informacam.utils.Constants.App.Storage.Type; import org.witness.informacam.utils.Constants.Logger; import org.witness.informacam.utils.Constants.MetadataEmbededListener; import org.witness.informacam.utils.Constants.Models; import android.util.Log; public class ImageConstructor { InformaCam informaCam; IAsset destinationAsset, sourceAsset; IMedia media; ITransportStub connection; private final static String LOG = Informa.LOG; static { System.loadLibrary("JpegRedaction"); } public static native int constructImage( String clonePath, String versionPath, String j3mString, int j3mStringLength); public ImageConstructor(IMedia media, IAsset destinationAsset, ITransportStub connection) throws IOException { informaCam = InformaCam.getInstance(); this.media = media; this.destinationAsset = destinationAsset; this.connection = connection; sourceAsset = this.media.dcimEntry.fileAsset; if(sourceAsset.source == Type.IOCIPHER) { if (destinationAsset.source == Type.IOCIPHER) { info.guardianproject.iocipher.File fileDest = new info.guardianproject.iocipher.File(destinationAsset.path); if (fileDest.exists()) fileDest.delete(); //delete a file if it is there else { fileDest.getParentFile().mkdirs(); } //now copy the main image to external IOUtils.copy(new info.guardianproject.iocipher.FileInputStream(sourceAsset.path),new info.guardianproject.iocipher.FileOutputStream(fileDest)); finish(); } else if (destinationAsset.source == Type.FILE_SYSTEM) { java.io.File fileDest = new java.io.File(destinationAsset.path); if (fileDest.exists()) fileDest.delete(); //delete a file if it is there else { fileDest.getParentFile().mkdirs(); } //now copy the main image to external IOUtils.copy(new info.guardianproject.iocipher.FileInputStream(sourceAsset.path),new java.io.FileOutputStream(fileDest)); String metadata = new String(informaCam.ioService.getBytes(this.media.getAsset(media.dcimEntry.name + ".j3m"))); try { int c = constructImage(destinationAsset.path, destinationAsset.path, metadata, metadata.length()); if(c > 0) { finish(); } } catch (Exception e) { Log.e(LOG,"error unable to export image",e); } } } else if (sourceAsset.source == Type.FILE_SYSTEM) { java.io.File fileDest = new java.io.File(destinationAsset.path); if (fileDest.exists()) fileDest.delete(); //delete a file if it is there else { fileDest.getParentFile().mkdirs(); } //IOUtils.copy(new java.io.FileInputStream(sourceAsset.path),new java.io.FileOutputStream(fileDest)); String metadata = new String(informaCam.ioService.getBytes(this.media.getAsset(media.dcimEntry.name + ".j3m"))); try { int c = constructImage(sourceAsset.path, destinationAsset.path, metadata, metadata.length()); if(c > 0) { finish(); } } catch (Exception e) { Log.e(LOG,"error unable to export image",e); } } } public IAsset finish() { //Log.d(LOG, "FINISHING UP IMAGE CONSTRUCTOR... (destination " + destinationAsset.path + ")"); // int storageType = Storage.Type.FILE_SYSTEM; /* // if this was in encrypted space, delete temp files if(intentedForIOCipher) { try { destinationAsset.copy(Type.FILE_SYSTEM, Type.IOCIPHER, media.rootFolder); storageType = Storage.Type.IOCIPHER; } catch (IOException e) { Logger.e(LOG, e); } //java.io.File publicRoot = new java.io.File(IOUtility.buildPublicPath(new String[] { media.rootFolder })); //InformaCam.getInstance().ioService.clear(publicRoot.getAbsolutePath(), Type.FILE_SYSTEM); }*/ if(connection != null) { connection.setAsset(destinationAsset, "image/jpeg", destinationAsset.source); ((MetadataEmbededListener) media).onMediaReadyForTransport(connection); } ((MetadataEmbededListener) media).onMetadataEmbeded(destinationAsset); return destinationAsset; } }