19 package org.sleuthkit.autopsy.casemodule;
 
   21 import java.util.ArrayList;
 
   22 import java.util.List;
 
   23 import java.util.logging.Level;
 
   24 import org.openide.util.NbBundle;
 
   38 class AddImageTask 
implements Runnable {
 
   40     private final Logger logger = Logger.getLogger(AddImageTask.class.getName());
 
   41     private final String deviceId;
 
   42     private final String imagePath;
 
   43     private final String timeZone;
 
   44     private final boolean ignoreFatOrphanFiles;
 
   45     private final DataSourceProcessorProgressMonitor progressMonitor;
 
   46     private final DataSourceProcessorCallback callback;
 
   47     private boolean criticalErrorOccurred;
 
   60     private final Object tskAddImageProcessLock;
 
   61     private boolean tskAddImageProcessStopped;
 
   62     private SleuthkitJNI.CaseDbHandle.AddImageProcess tskAddImageProcess;
 
   81     AddImageTask(String deviceId, String imagePath, String timeZone, 
boolean ignoreFatOrphanFiles, DataSourceProcessorProgressMonitor progressMonitor, DataSourceProcessorCallback callback) {
 
   82         this.deviceId = deviceId;
 
   83         this.imagePath = imagePath;
 
   84         this.timeZone = timeZone;
 
   85         this.ignoreFatOrphanFiles = ignoreFatOrphanFiles;
 
   86         this.callback = callback;
 
   87         this.progressMonitor = progressMonitor;
 
   88         tskAddImageProcessLock = 
new Object();
 
   96         progressMonitor.setIndeterminate(
true);
 
   97         progressMonitor.setProgress(0);
 
   98         Case currentCase = Case.getCurrentCase();
 
   99         List<String> errorMessages = 
new ArrayList<>();
 
  100         List<Content> newDataSources = 
new ArrayList<>();
 
  102             currentCase.getSleuthkitCase().acquireExclusiveLock();
 
  103             synchronized (tskAddImageProcessLock) {
 
  104                 tskAddImageProcess = currentCase.getSleuthkitCase().makeAddImageProcess(timeZone, 
true, ignoreFatOrphanFiles);
 
  106             Thread progressUpdateThread = 
new Thread(
new ProgressUpdater(progressMonitor, tskAddImageProcess));
 
  107             progressUpdateThread.start();
 
  108             runAddImageProcess(errorMessages);
 
  109             if (null != progressUpdateThread) {
 
  110                 progressUpdateThread.interrupt();
 
  112             commitOrRevertAddImageProcess(currentCase, errorMessages, newDataSources);
 
  113             progressMonitor.setProgress(100);
 
  115             currentCase.getSleuthkitCase().releaseExclusiveLock();
 
  116             DataSourceProcessorCallback.DataSourceProcessorResult result;
 
  117             if (criticalErrorOccurred) {
 
  118                 result = DataSourceProcessorResult.CRITICAL_ERRORS;
 
  119             } 
else if (!errorMessages.isEmpty()) {
 
  120                 result = DataSourceProcessorResult.NONCRITICAL_ERRORS;
 
  122                 result = DataSourceProcessorResult.NO_ERRORS;
 
  124             callback.done(result, errorMessages, newDataSources);
 
  131     public void cancelTask() {
 
  132         synchronized (tskAddImageProcessLock) {
 
  133             if (null != tskAddImageProcess) {
 
  143                     tskAddImageProcess.stop();
 
  144                     tskAddImageProcessStopped = 
true;
 
  145                 } 
catch (TskCoreException ex) {
 
  146                     logger.log(Level.SEVERE, String.format(
"Error cancelling adding image %s to the case database", imagePath), ex); 
 
  158     private void runAddImageProcess(List<String> errorMessages) {
 
  160             tskAddImageProcess.run(deviceId, 
new String[]{imagePath});
 
  161         } 
catch (TskCoreException ex) {
 
  162             logger.log(Level.SEVERE, String.format(
"Critical error occurred adding image %s", imagePath), ex); 
 
  163             criticalErrorOccurred = 
true;
 
  164             errorMessages.add(ex.getMessage());
 
  165         } 
catch (TskDataException ex) {
 
  166             logger.log(Level.WARNING, String.format(
"Non-critical error occurred adding image %s", imagePath), ex); 
 
  167             errorMessages.add(ex.getMessage());
 
  185     private void commitOrRevertAddImageProcess(Case currentCase, List<String> errorMessages, List<Content> newDataSources) {
 
  186         synchronized (tskAddImageProcessLock) {
 
  187             if (tskAddImageProcessStopped || criticalErrorOccurred) {
 
  189                     tskAddImageProcess.revert();
 
  190                 } 
catch (TskCoreException ex) {
 
  191                     logger.log(Level.SEVERE, String.format(
"Error reverting adding image %s to the case database", imagePath), ex); 
 
  192                     errorMessages.add(ex.getMessage());
 
  193                     criticalErrorOccurred = 
true;
 
  197                     long imageId = tskAddImageProcess.commit();
 
  199                         Image newImage = currentCase.getSleuthkitCase().getImageById(imageId);
 
  200                         String verificationError = newImage.verifyImageSize();
 
  201                         if (!verificationError.isEmpty()) {
 
  202                             errorMessages.add(verificationError);
 
  204                         newDataSources.add(newImage);
 
  206                         String errorMessage = String.format(
"Error commiting adding image %s to the case database, no object id returned", imagePath); 
 
  207                         logger.log(Level.SEVERE, errorMessage); 
 
  208                         errorMessages.add(errorMessage);
 
  209                         criticalErrorOccurred = 
true;
 
  211                 } 
catch (TskCoreException ex) {
 
  212                     logger.log(Level.SEVERE, String.format(
"Error committing adding image %s to the case database", imagePath), ex); 
 
  213                     errorMessages.add(ex.getMessage());
 
  214                     criticalErrorOccurred = 
true;
 
  248                 while (!Thread.currentThread().isInterrupted()) {
 
  250                     if (currDir != null) {
 
  251                         if (!currDir.isEmpty()) {
 
  253                                     NbBundle.getMessage(
this.getClass(), 
"AddImageTask.run.progress.adding",
 
  268             } 
catch (InterruptedException expected) {
 
void setProgressText(String text)
final SleuthkitJNI.CaseDbHandle.AddImageProcess tskAddImageProcess
final DataSourceProcessorProgressMonitor progressMonitor