Autopsy  4.1
Graphical digital forensics platform for The Sleuth Kit and other tools.
ImageExtractor.java
Go to the documentation of this file.
1 /*
2  * Autopsy Forensic Browser
3  *
4  * Copyright 2011-2015 Basis Technology Corp.
5  * Contact: carrier <at> sleuthkit <dot> org
6  *
7  * Licensed under the Apache License, Version 2.0 (the "License");
8  * you may not use this file except in compliance with the License.
9  * You may obtain a copy of the License at
10  *
11  * http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing, software
14  * distributed under the License is distributed on an "AS IS" BASIS,
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * See the License for the specific language governing permissions and
17  * limitations under the License.
18  */
19 package org.sleuthkit.autopsy.modules.embeddedfileextractor;
20 
21 import java.io.File;
22 import java.io.FileOutputStream;
23 import java.io.IOException;
24 import java.nio.file.Paths;
25 import java.util.ArrayList;
26 import java.util.List;
27 import java.util.logging.Level;
28 import org.apache.poi.hslf.model.Picture;
29 import org.apache.poi.hslf.usermodel.PictureData;
30 import org.apache.poi.hslf.usermodel.SlideShow;
31 import org.apache.poi.hssf.usermodel.HSSFWorkbook;
32 import org.apache.poi.hwpf.HWPFDocument;
33 import org.apache.poi.hwpf.model.PicturesTable;
34 import org.apache.poi.ss.usermodel.Workbook;
35 import org.apache.poi.xslf.usermodel.XMLSlideShow;
36 import org.apache.poi.xslf.usermodel.XSLFPictureData;
37 import org.apache.poi.xssf.usermodel.XSSFWorkbook;
38 import org.apache.poi.xwpf.usermodel.XWPFDocument;
39 import org.apache.poi.xwpf.usermodel.XWPFPictureData;
40 import org.openide.util.NbBundle;
53 
54 class ImageExtractor {
55 
56  private final FileManager fileManager;
57  private final IngestServices services;
58  private static final Logger logger = Logger.getLogger(ImageExtractor.class.getName());
59  private final IngestJobContext context;
60  private String parentFileName;
61  private final String UNKNOWN_NAME_PREFIX = "image_"; //NON-NLS
62  private final FileTypeDetector fileTypeDetector;
63 
64  private String moduleDirRelative;
65  private String moduleDirAbsolute;
66 
70  enum SupportedImageExtractionFormats {
71 
72  DOC("application/msword"), //NON-NLS
73  DOCX("application/vnd.openxmlformats-officedocument.wordprocessingml.document"), //NON-NLS
74  PPT("application/vnd.ms-powerpoint"), //NON-NLS
75  PPTX("application/vnd.openxmlformats-officedocument.presentationml.presentation"), //NON-NLS
76  XLS("application/vnd.ms-excel"), //NON-NLS
77  XLSX("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); //NON-NLS
78 
79  private final String mimeType;
80 
81  SupportedImageExtractionFormats(final String mimeType) {
82  this.mimeType = mimeType;
83  }
84 
85  @Override
86  public String toString() {
87  return this.mimeType;
88  }
89  // TODO Expand to support more formats
90  }
91  private SupportedImageExtractionFormats abstractFileExtractionFormat;
92 
93  ImageExtractor(IngestJobContext context, FileTypeDetector fileTypeDetector, String moduleDirRelative, String moduleDirAbsolute) {
94 
95  this.fileManager = Case.getCurrentCase().getServices().getFileManager();
96  this.services = IngestServices.getInstance();
97  this.context = context;
98  this.fileTypeDetector = fileTypeDetector;
99  this.moduleDirRelative = moduleDirRelative;
100  this.moduleDirAbsolute = moduleDirAbsolute;
101  }
102 
112  boolean isImageExtractionSupported(AbstractFile abstractFile) {
113  try {
114  String abstractFileMimeType = fileTypeDetector.getFileType(abstractFile);
115  for (SupportedImageExtractionFormats s : SupportedImageExtractionFormats.values()) {
116  if (s.toString().equals(abstractFileMimeType)) {
117  abstractFileExtractionFormat = s;
118  return true;
119  }
120  }
121  return false;
122  } catch (TskCoreException ex) {
123  logger.log(Level.WARNING, "Error executing FileTypeDetector.getFileType()", ex); // NON-NLS
124  return false;
125  }
126  }
127 
137  void extractImage(AbstractFile abstractFile) {
138  //
139  // switchcase for different supported formats
140  // process abstractFile according to the format by calling appropriate methods.
141 
142  List<ExtractedImage> listOfExtractedImages = null;
143  List<AbstractFile> listOfExtractedImageAbstractFiles = null;
144  this.parentFileName = EmbeddedFileExtractorIngestModule.getUniqueName(abstractFile);
145  //check if already has derived files, skip
146  try {
147  if (abstractFile.hasChildren()) {
148  //check if local unpacked dir exists
149  if (new File(getOutputFolderPath(parentFileName)).exists()) {
150  logger.log(Level.INFO, "File already has been processed as it has children and local unpacked file, skipping: {0}", abstractFile.getName()); //NON-NLS
151  return;
152  }
153  }
154  } catch (TskCoreException e) {
155  logger.log(Level.WARNING, String.format("Error checking if file already has been processed, skipping: %s", parentFileName), e); //NON-NLS
156  return;
157  }
158  switch (abstractFileExtractionFormat) {
159  case DOC:
160  listOfExtractedImages = extractImagesFromDoc(abstractFile);
161  break;
162  case DOCX:
163  listOfExtractedImages = extractImagesFromDocx(abstractFile);
164  break;
165  case PPT:
166  listOfExtractedImages = extractImagesFromPpt(abstractFile);
167  break;
168  case PPTX:
169  listOfExtractedImages = extractImagesFromPptx(abstractFile);
170  break;
171  case XLS:
172  listOfExtractedImages = extractImagesFromXls(abstractFile);
173  break;
174  case XLSX:
175  listOfExtractedImages = extractImagesFromXlsx(abstractFile);
176  break;
177  default:
178  break;
179  }
180 
181  if (listOfExtractedImages == null) {
182  return;
183  }
184  // the common task of adding abstractFile to derivedfiles is performed.
185  listOfExtractedImageAbstractFiles = new ArrayList<>();
186  for (ExtractedImage extractedImage : listOfExtractedImages) {
187  try {
188  listOfExtractedImageAbstractFiles.add(fileManager.addDerivedFile(extractedImage.getFileName(), extractedImage.getLocalPath(), extractedImage.getSize(),
189  extractedImage.getCtime(), extractedImage.getCrtime(), extractedImage.getAtime(), extractedImage.getAtime(),
190  true, abstractFile, null, EmbeddedFileExtractorModuleFactory.getModuleName(), null, null, TskData.EncodingType.XOR1));
191  } catch (TskCoreException ex) {
192  logger.log(Level.WARNING, NbBundle.getMessage(this.getClass(), "EmbeddedFileExtractorIngestModule.ImageExtractor.extractImage.addToDB.exception.msg"), ex); //NON-NLS
193  }
194  }
195  if (!listOfExtractedImages.isEmpty()) {
196  services.fireModuleContentEvent(new ModuleContentEvent(abstractFile));
197  context.addFilesToJob(listOfExtractedImageAbstractFiles);
198  }
199  }
200 
209  private List<ExtractedImage> extractImagesFromDoc(AbstractFile af) {
210  List<ExtractedImage> listOfExtractedImages;
211  HWPFDocument doc = null;
212  try {
213  doc = new HWPFDocument(new ReadContentInputStream(af));
214  } catch (Throwable ex) {
215  // instantiating POI containers throw RuntimeExceptions
216  logger.log(Level.WARNING, NbBundle.getMessage(this.getClass(), "EmbeddedFileExtractorIngestModule.ImageExtractor.docContainer.init.err", af.getName()), ex); //NON-NLS
217  return null;
218  }
219 
220  PicturesTable pictureTable = null;
221  List<org.apache.poi.hwpf.usermodel.Picture> listOfAllPictures = null;
222  try {
223  pictureTable = doc.getPicturesTable();
224  listOfAllPictures = pictureTable.getAllPictures();
225  } catch (Exception ex) {
226  // log internal Java and Apache errors as WARNING
227  logger.log(Level.WARNING, NbBundle.getMessage(this.getClass(), "EmbeddedFileExtractorIngestModule.ImageExtractor.processing.err", af.getName()), ex); //NON-NLS
228  return null;
229  }
230 
231  String outputFolderPath;
232  if (listOfAllPictures.isEmpty()) {
233  return null;
234  } else {
235  outputFolderPath = getOutputFolderPath(this.parentFileName);
236  }
237  if (outputFolderPath == null) {
238  return null;
239  }
240  listOfExtractedImages = new ArrayList<>();
241  byte[] data = null;
242  for (org.apache.poi.hwpf.usermodel.Picture picture : listOfAllPictures) {
243  String fileName = picture.suggestFullFileName();
244  try {
245  data = picture.getContent();
246  } catch (Exception ex) {
247  // log internal Java and Apache errors as WARNING
248  logger.log(Level.WARNING, NbBundle.getMessage(this.getClass(), "EmbeddedFileExtractorIngestModule.ImageExtractor.processing.err", af.getName()), ex); //NON-NLS
249  return null;
250  }
251  writeExtractedImage(Paths.get(outputFolderPath, fileName).toString(), data);
252  // TODO Extract more info from the Picture viz ctime, crtime, atime, mtime
253  listOfExtractedImages.add(new ExtractedImage(fileName, getFileRelativePath(fileName), picture.getSize(), af));
254  }
255 
256  return listOfExtractedImages;
257  }
258 
267  private List<ExtractedImage> extractImagesFromDocx(AbstractFile af) {
268  List<ExtractedImage> listOfExtractedImages;
269  XWPFDocument docx = null;
270  try {
271  docx = new XWPFDocument(new ReadContentInputStream(af));
272  } catch (Throwable ex) {
273  // instantiating POI containers throw RuntimeExceptions
274  logger.log(Level.WARNING, NbBundle.getMessage(this.getClass(), "EmbeddedFileExtractorIngestModule.ImageExtractor.docxContainer.init.err", af.getName()), ex); //NON-NLS
275  return null;
276  }
277  List<XWPFPictureData> listOfAllPictures = null;
278  try {
279  listOfAllPictures = docx.getAllPictures();
280  } catch (Exception ex) {
281  // log internal Java and Apache errors as WARNING
282  logger.log(Level.WARNING, NbBundle.getMessage(this.getClass(), "EmbeddedFileExtractorIngestModule.ImageExtractor.processing.err", af.getName()), ex); //NON-NLS
283  return null;
284  }
285 
286  // if no images are extracted from the PPT, return null, else initialize
287  // the output folder for image extraction.
288  String outputFolderPath;
289  if (listOfAllPictures.isEmpty()) {
290  return null;
291  } else {
292  outputFolderPath = getOutputFolderPath(this.parentFileName);
293  }
294  if (outputFolderPath == null) {
295  logger.log(Level.WARNING, NbBundle.getMessage(this.getClass(), "EmbeddedFileExtractorIngestModule.ImageExtractor.extractImageFrom.outputPath.exception.msg", af.getName())); //NON-NLS
296  return null;
297  }
298  listOfExtractedImages = new ArrayList<>();
299  byte[] data = null;
300  for (XWPFPictureData xwpfPicture : listOfAllPictures) {
301  String fileName = xwpfPicture.getFileName();
302  try {
303  data = xwpfPicture.getData();
304  } catch (Exception ex) {
305  // log internal Java and Apache errors as WARNING
306  logger.log(Level.WARNING, NbBundle.getMessage(this.getClass(), "EmbeddedFileExtractorIngestModule.ImageExtractor.processing.err", af.getName()), ex); //NON-NLS
307  return null;
308  }
309  writeExtractedImage(Paths.get(outputFolderPath, fileName).toString(), data);
310  listOfExtractedImages.add(new ExtractedImage(fileName, getFileRelativePath(fileName), xwpfPicture.getData().length, af));
311  }
312  return listOfExtractedImages;
313  }
314 
323  private List<ExtractedImage> extractImagesFromPpt(AbstractFile af) {
324  List<ExtractedImage> listOfExtractedImages;
325  SlideShow ppt = null;
326  try {
327  ppt = new SlideShow(new ReadContentInputStream(af));
328  } catch (Throwable ex) {
329  // instantiating POI containers throw RuntimeExceptions
330  logger.log(Level.WARNING, NbBundle.getMessage(this.getClass(), "EmbeddedFileExtractorIngestModule.ImageExtractor.pptContainer.init.err", af.getName()), ex); //NON-NLS
331  return null;
332  }
333 
334  //extract all pictures contained in the presentation
335  PictureData[] listOfAllPictures = null;
336  try {
337  listOfAllPictures = ppt.getPictureData();
338  } catch (Exception ex) {
339  // log internal Java and Apache errors as WARNING
340  logger.log(Level.WARNING, NbBundle.getMessage(this.getClass(), "EmbeddedFileExtractorIngestModule.ImageExtractor.processing.err", af.getName()), ex); //NON-NLS
341  return null;
342  }
343 
344  // if no images are extracted from the PPT, return null, else initialize
345  // the output folder for image extraction.
346  String outputFolderPath;
347  if (listOfAllPictures.length == 0) {
348  return null;
349  } else {
350  outputFolderPath = getOutputFolderPath(this.parentFileName);
351  }
352  if (outputFolderPath == null) {
353  logger.log(Level.WARNING, NbBundle.getMessage(this.getClass(), "EmbeddedFileExtractorIngestModule.ImageExtractor.extractImageFrom.outputPath.exception.msg", af.getName())); //NON-NLS
354  return null;
355  }
356 
357  // extract the images to the above initialized outputFolder.
358  // extraction path - outputFolder/image_number.ext
359  int i = 0;
360  listOfExtractedImages = new ArrayList<>();
361  byte[] data = null;
362  for (PictureData pictureData : listOfAllPictures) {
363 
364  // Get image extension, generate image name, write image to the module
365  // output folder, add it to the listOfExtractedImageAbstractFiles
366  int type = pictureData.getType();
367  String ext;
368  switch (type) {
369  case Picture.JPEG:
370  ext = ".jpg"; //NON-NLS
371  break;
372  case Picture.PNG:
373  ext = ".png"; //NON-NLS
374  break;
375  case Picture.WMF:
376  ext = ".wmf"; //NON-NLS
377  break;
378  case Picture.EMF:
379  ext = ".emf"; //NON-NLS
380  break;
381  case Picture.PICT:
382  ext = ".pict"; //NON-NLS
383  break;
384  default:
385  continue;
386  }
387  String imageName = UNKNOWN_NAME_PREFIX + i + ext; //NON-NLS
388  try {
389  data = pictureData.getData();
390  } catch (Exception ex) {
391  // log internal Java and Apache errors as WARNING
392  logger.log(Level.WARNING, NbBundle.getMessage(this.getClass(), "EmbeddedFileExtractorIngestModule.ImageExtractor.processing.err", af.getName()), ex); //NON-NLS
393  return null;
394  }
395  writeExtractedImage(Paths.get(outputFolderPath, imageName).toString(), data);
396  listOfExtractedImages.add(new ExtractedImage(imageName, getFileRelativePath(imageName), pictureData.getData().length, af));
397  i++;
398  }
399  return listOfExtractedImages;
400  }
401 
410  private List<ExtractedImage> extractImagesFromPptx(AbstractFile af) {
411  List<ExtractedImage> listOfExtractedImages;
412  XMLSlideShow pptx;
413  try {
414  pptx = new XMLSlideShow(new ReadContentInputStream(af));
415  } catch (Throwable ex) {
416  // instantiating POI containers throw RuntimeExceptions
417  logger.log(Level.WARNING, NbBundle.getMessage(this.getClass(), "EmbeddedFileExtractorIngestModule.ImageExtractor.pptxContainer.init.err", af.getName()), ex); //NON-NLS
418  return null;
419  }
420  List<XSLFPictureData> listOfAllPictures = null;
421  try {
422  listOfAllPictures = pptx.getAllPictures();
423  } catch (Exception ex) {
424  // log internal Java and Apache errors as WARNING
425  logger.log(Level.WARNING, NbBundle.getMessage(this.getClass(), "EmbeddedFileExtractorIngestModule.ImageExtractor.processing.err", af.getName()), ex); //NON-NLS
426  return null;
427  }
428 
429  // if no images are extracted from the PPT, return null, else initialize
430  // the output folder for image extraction.
431  String outputFolderPath;
432  if (listOfAllPictures.isEmpty()) {
433  return null;
434  } else {
435  outputFolderPath = getOutputFolderPath(this.parentFileName);
436  }
437  if (outputFolderPath == null) {
438  logger.log(Level.WARNING, NbBundle.getMessage(this.getClass(), "EmbeddedFileExtractorIngestModule.ImageExtractor.extractImageFrom.outputPath.exception.msg", af.getName())); //NON-NLS
439  return null;
440  }
441 
442  listOfExtractedImages = new ArrayList<>();
443  byte[] data = null;
444  for (XSLFPictureData xslsPicture : listOfAllPictures) {
445 
446  // get image file name, write it to the module outputFolder, and add
447  // it to the listOfExtractedImageAbstractFiles.
448  String fileName = xslsPicture.getFileName();
449  try {
450  data = xslsPicture.getData();
451  } catch (Exception ex) {
452  // log internal Java and Apache errors as WARNING
453  logger.log(Level.WARNING, NbBundle.getMessage(this.getClass(), "EmbeddedFileExtractorIngestModule.ImageExtractor.processing.err", af.getName()), ex); //NON-NLS
454  return null;
455  }
456  writeExtractedImage(Paths.get(outputFolderPath, fileName).toString(), data);
457  listOfExtractedImages.add(new ExtractedImage(fileName, getFileRelativePath(fileName), xslsPicture.getData().length, af));
458 
459  }
460 
461  return listOfExtractedImages;
462 
463  }
464 
473  private List<ExtractedImage> extractImagesFromXls(AbstractFile af) {
474  List<ExtractedImage> listOfExtractedImages;
475 
476  Workbook xls;
477  try {
478  xls = new HSSFWorkbook(new ReadContentInputStream(af));
479  } catch (Throwable ex) {
480  // instantiating POI containers throw RuntimeExceptions
481  logger.log(Level.WARNING, String.format("%s%s", NbBundle.getMessage(this.getClass(), "EmbeddedFileExtractorIngestModule.ImageExtractor.xlsContainer.init.err", af.getName()), af.getName()), ex); //NON-NLS
482  return null;
483  }
484 
485  List<? extends org.apache.poi.ss.usermodel.PictureData> listOfAllPictures = null;
486  try {
487  listOfAllPictures = xls.getAllPictures();
488  } catch (Exception ex) {
489  // log internal Java and Apache errors as WARNING
490  logger.log(Level.WARNING, NbBundle.getMessage(this.getClass(), "EmbeddedFileExtractorIngestModule.ImageExtractor.processing.err", af.getName()), ex); //NON-NLS
491  return null;
492  }
493 
494  // if no images are extracted from the PPT, return null, else initialize
495  // the output folder for image extraction.
496  String outputFolderPath;
497  if (listOfAllPictures.isEmpty()) {
498  return null;
499  } else {
500  outputFolderPath = getOutputFolderPath(this.parentFileName);
501  }
502  if (outputFolderPath == null) {
503  logger.log(Level.WARNING, NbBundle.getMessage(this.getClass(), "EmbeddedFileExtractorIngestModule.ImageExtractor.extractImageFrom.outputPath.exception.msg", af.getName())); //NON-NLS
504  return null;
505  }
506 
507  int i = 0;
508  listOfExtractedImages = new ArrayList<>();
509  byte[] data = null;
510  for (org.apache.poi.ss.usermodel.PictureData pictureData : listOfAllPictures) {
511  String imageName = UNKNOWN_NAME_PREFIX + i + "." + pictureData.suggestFileExtension(); //NON-NLS
512  try {
513  data = pictureData.getData();
514  } catch (Exception ex) {
515  // log internal Java and Apache errors as WARNING
516  logger.log(Level.WARNING, NbBundle.getMessage(this.getClass(), "EmbeddedFileExtractorIngestModule.ImageExtractor.processing.err", af.getName()), ex); //NON-NLS
517  return null;
518  }
519  writeExtractedImage(Paths.get(outputFolderPath, imageName).toString(), data);
520  listOfExtractedImages.add(new ExtractedImage(imageName, getFileRelativePath(imageName), pictureData.getData().length, af));
521  i++;
522  }
523  return listOfExtractedImages;
524 
525  }
526 
535  private List<ExtractedImage> extractImagesFromXlsx(AbstractFile af) {
536  List<ExtractedImage> listOfExtractedImages;
537  Workbook xlsx;
538  try {
539  xlsx = new XSSFWorkbook(new ReadContentInputStream(af));
540  } catch (Throwable ex) {
541  // instantiating POI containers throw RuntimeExceptions
542  logger.log(Level.WARNING, NbBundle.getMessage(this.getClass(), "EmbeddedFileExtractorIngestModule.ImageExtractor.xlsxContainer.init.err", af.getName()), ex); //NON-NLS
543  return null;
544  }
545 
546  List<? extends org.apache.poi.ss.usermodel.PictureData> listOfAllPictures = null;
547  try {
548  listOfAllPictures = xlsx.getAllPictures();
549  } catch (Exception ex) {
550  // log internal Java and Apache errors as WARNING
551  logger.log(Level.WARNING, NbBundle.getMessage(this.getClass(), "EmbeddedFileExtractorIngestModule.ImageExtractor.processing.err", af.getName()), ex); //NON-NLS
552  return null;
553  }
554 
555  // if no images are extracted from the PPT, return null, else initialize
556  // the output folder for image extraction.
557  String outputFolderPath;
558  if (listOfAllPictures.isEmpty()) {
559  return null;
560  } else {
561  outputFolderPath = getOutputFolderPath(this.parentFileName);
562  }
563  if (outputFolderPath == null) {
564  logger.log(Level.WARNING, NbBundle.getMessage(this.getClass(), "EmbeddedFileExtractorIngestModule.ImageExtractor.extractImageFrom.outputPath.exception.msg", af.getName())); //NON-NLS
565  return null;
566  }
567 
568  int i = 0;
569  listOfExtractedImages = new ArrayList<>();
570  byte[] data = null;
571  for (org.apache.poi.ss.usermodel.PictureData pictureData : listOfAllPictures) {
572  String imageName = UNKNOWN_NAME_PREFIX + i + "." + pictureData.suggestFileExtension();
573  try {
574  data = pictureData.getData();
575  } catch (Exception ex) {
576  // log internal Java and Apache errors as WARNING
577  logger.log(Level.WARNING, NbBundle.getMessage(this.getClass(), "EmbeddedFileExtractorIngestModule.ImageExtractor.processing.err", af.getName()), ex); //NON-NLS
578  return null;
579  }
580  writeExtractedImage(Paths.get(outputFolderPath, imageName).toString(), data);
581  listOfExtractedImages.add(new ExtractedImage(imageName, getFileRelativePath(imageName), pictureData.getData().length, af));
582  i++;
583  }
584  return listOfExtractedImages;
585 
586  }
587 
595  private void writeExtractedImage(String outputPath, byte[] data) {
596  try (EncodedFileOutputStream fos = new EncodedFileOutputStream(new FileOutputStream(outputPath), TskData.EncodingType.XOR1)) {
597  fos.write(data);
598  } catch (IOException ex) {
599  logger.log(Level.WARNING, "Could not write to the provided location: " + outputPath, ex); //NON-NLS
600  }
601  }
602 
612  private String getOutputFolderPath(String parentFileName) {
613  String outputFolderPath = moduleDirAbsolute + File.separator + parentFileName;
614  File outputFilePath = new File(outputFolderPath);
615  if (!outputFilePath.exists()) {
616  try {
617  outputFilePath.mkdirs();
618  } catch (SecurityException ex) {
619  logger.log(Level.WARNING, NbBundle.getMessage(this.getClass(), "EmbeddedFileExtractorIngestModule.ImageExtractor.getOutputFolderPath.exception.msg", parentFileName), ex);
620  return null;
621  }
622  }
623  return outputFolderPath;
624  }
625 
635  private String getFileRelativePath(String fileName) {
636  // Used explicit FWD slashes to maintain DB consistency across operating systems.
637  return "/" + moduleDirRelative + "/" + this.parentFileName + "/" + fileName; //NON-NLS
638  }
639 
645  private static class ExtractedImage {
646  //String fileName, String localPath, long size, long ctime, long crtime,
647  //long atime, long mtime, boolean isFile, AbstractFile parentFile, String rederiveDetails, String toolName, String toolVersion, String otherDetails
648 
649  private final String fileName;
650  private final String localPath;
651  private final long size;
652  private final long ctime;
653  private final long crtime;
654  private final long atime;
655  private final long mtime;
656  private final AbstractFile parentFile;
657 
658  ExtractedImage(String fileName, String localPath, long size, AbstractFile parentFile) {
659  this(fileName, localPath, size, 0, 0, 0, 0, parentFile);
660  }
661 
662  ExtractedImage(String fileName, String localPath, long size, long ctime, long crtime, long atime, long mtime, AbstractFile parentFile) {
663  this.fileName = fileName;
664  this.localPath = localPath;
665  this.size = size;
666  this.ctime = ctime;
667  this.crtime = crtime;
668  this.atime = atime;
669  this.mtime = mtime;
670  this.parentFile = parentFile;
671  }
672 
673  public String getFileName() {
674  return fileName;
675  }
676 
677  public String getLocalPath() {
678  return localPath;
679  }
680 
681  public long getSize() {
682  return size;
683  }
684 
685  public long getCtime() {
686  return ctime;
687  }
688 
689  public long getCrtime() {
690  return crtime;
691  }
692 
693  public long getAtime() {
694  return atime;
695  }
696 
697  public long getMtime() {
698  return mtime;
699  }
700 
702  return parentFile;
703  }
704  }
705 }

Copyright © 2012-2016 Basis Technology. Generated on: Mon Apr 24 2017
This work is licensed under a Creative Commons Attribution-Share Alike 3.0 United States License.