19 package org.sleuthkit.autopsy.datamodel;
21 import java.io.FileOutputStream;
22 import java.io.IOException;
23 import java.io.InputStream;
24 import java.text.SimpleDateFormat;
25 import java.util.TimeZone;
26 import java.util.concurrent.Future;
27 import java.util.function.Supplier;
28 import java.util.logging.Level;
29 import java.util.prefs.PreferenceChangeEvent;
30 import java.util.prefs.PreferenceChangeListener;
31 import javax.swing.SwingWorker;
32 import org.netbeans.api.progress.ProgressHandle;
33 import org.openide.util.NbBundle;
47 import org.
sleuthkit.datamodel.ReadContentInputStream.ReadContentInputStreamException;
59 private static final SimpleDateFormat
dateFormatter =
new SimpleDateFormat(
"yyyy-MM-dd HH:mm:ss z");
60 private static final SimpleDateFormat
dateFormatterISO8601 =
new SimpleDateFormat(
"yyyy-MM-dd'T'HH:mm:ss'Z'");
65 public void preferenceChange(PreferenceChangeEvent evt) {
77 throw new AssertionError();
89 String time =
"0000-00-00 00:00:00";
90 if (epochSeconds != 0) {
92 dateFormatter.setTimeZone(tzone);
93 time = dateFormatter.format(
new java.util.Date(epochSeconds * 1000));
108 String time =
"0000-00-00T00:00:00Z";
109 if (epochSeconds != 0) {
111 dateFormatterISO8601.setTimeZone(tzone);
112 time = dateFormatterISO8601.format(
new java.util.Date(epochSeconds * 1000));
148 return TimeZone.getTimeZone(
"GMT");
150 final Content dataSource = content.getDataSource();
151 if ((dataSource != null) && (dataSource instanceof Image)) {
152 Image image = (Image) dataSource;
153 return TimeZone.getTimeZone(image.getTimeZone());
156 return TimeZone.getDefault();
159 }
catch (TskCoreException ex) {
160 return TimeZone.getDefault();
173 return content.accept(systemName);
187 return cntnt.getName() +
":" + Long.toString(cntnt.getId());
210 public static <T>
long writeToFile(Content content, java.io.File outputFile,
211 ProgressHandle progress, Future<T> worker,
boolean source)
throws IOException {
212 InputStream in =
new ReadContentInputStream(content);
215 int unit = (int) (content.getSize() / 100);
218 try (FileOutputStream out =
new FileOutputStream(outputFile,
false)) {
220 int len = in.read(buffer);
223 if (worker != null && worker.isCancelled()) {
226 out.write(buffer, 0, len);
227 len = in.read(buffer);
231 if (progress != null && source && totalRead >= TO_FILE_BUFFER_SIZE) {
232 int totalProgress = (int) (totalRead / unit);
233 progress.progress(content.getName(), totalProgress);
235 }
else if (progress != null && !source) {
236 progress.progress(content.getName());
253 public static void writeToFile(Content content, java.io.File outputFile) throws IOException {
254 writeToFile(content, outputFile, null, null,
false);
271 public static long writeToFile(Content content, java.io.File outputFile,
272 Supplier<Boolean> cancelCheck)
throws IOException {
273 InputStream in =
new ReadContentInputStream(content);
276 try (FileOutputStream out =
new FileOutputStream(outputFile,
false)) {
278 int len = in.read(buffer);
280 out.write(buffer, 0, len);
282 if (cancelCheck.get()) {
285 len = in.read(buffer);
301 String name = dir.getName();
302 return name.equals(
".") || name.equals(
"..");
313 ProgressHandle progress;
314 SwingWorker<T, V> worker;
315 boolean source =
false;
330 ProgressHandle progress, SwingWorker<T, V> worker,
boolean source) {
332 this.progress = progress;
333 this.worker = worker;
334 this.source = source;
345 public static <T, V>
void extract(Content cntnt, java.io.File dest, ProgressHandle progress, SwingWorker<T, V> worker) {
353 }
catch (ReadContentInputStreamException ex) {
354 logger.log(Level.WARNING,
355 String.format(
"Error reading file '%s' (id=%d).",
356 file.getName(), file.getId()), ex);
357 }
catch (IOException ex) {
358 logger.log(Level.SEVERE,
359 String.format(
"Error extracting file '%s' (id=%d) to '%s'.",
360 file.getName(), file.getId(), dest.getAbsolutePath()), ex);
366 public Void
visit(LayoutFile file) {
369 }
catch (ReadContentInputStreamException ex) {
370 logger.log(Level.WARNING,
371 String.format(
"Error reading file '%s' (id=%d).",
372 file.getName(), file.getId()), ex);
373 }
catch (IOException ex) {
374 logger.log(Level.SEVERE,
375 String.format(
"Error extracting unallocated content file '%s' (id=%d) to '%s'.",
376 file.getName(), file.getId(), dest.getAbsolutePath()), ex);
382 public Void
visit(DerivedFile file) {
385 }
catch (ReadContentInputStreamException ex) {
386 logger.log(Level.WARNING,
387 String.format(
"Error reading file '%s' (id=%d).",
388 file.getName(), file.getId()), ex);
389 }
catch (IOException ex) {
390 logger.log(Level.SEVERE,
391 String.format(
"Error extracting derived file '%s' (id=%d) to '%s'.",
392 file.getName(), file.getId(), dest.getAbsolutePath()), ex);
401 }
catch (ReadContentInputStreamException ex) {
402 logger.log(Level.WARNING,
403 String.format(
"Error reading file '%s' (id=%d).",
404 file.getName(), file.getId()), ex);
405 }
catch (IOException ex) {
406 logger.log(Level.SEVERE,
407 String.format(
"Error extracting local file '%s' (id=%d) to '%s'.",
408 file.getName(), file.getId(), dest.getAbsolutePath()), ex);
417 }
catch (ReadContentInputStreamException ex) {
418 logger.log(Level.WARNING,
419 String.format(
"Error reading file '%s' (id=%d).",
420 file.getName(), file.getId()), ex);
421 }
catch (IOException ex) {
422 logger.log(Level.SEVERE,
423 String.format(
"Error extracting slack file '%s' (id=%d) to '%s'.",
424 file.getName(), file.getId(), dest.getAbsolutePath()), ex);
435 public Void
visit(VirtualDirectory dir) {
440 public Void
visit(LocalDirectory dir) {
445 String path = dest.getAbsolutePath() + java.io.File.separator
447 return new java.io.File(path);
460 int numProcessed = 0;
462 for (Content child : dir.getChildren()) {
463 if (child instanceof AbstractFile) {
470 if (worker != null && worker.isCancelled()) {
473 if (progress != null && source) {
474 progress.progress(child.getName(), numProcessed);
476 child.accept(childVisitor);
480 }
catch (TskCoreException ex) {
481 logger.log(Level.SEVERE,
482 "Trouble fetching children to extract.", ex);
490 throw new UnsupportedOperationException(NbBundle.getMessage(
this.getClass(),
491 "ContentUtils.exception.msg",
492 content.getClass().getSimpleName()));
static String getStringTime(long epochSeconds, TimeZone tzone)
static final SimpleDateFormat dateFormatter
String defaultVisit(Content cntnt)
static boolean shouldDisplayTimesInLocalTime()
static final Logger logger
static< T > long writeToFile(Content content, java.io.File outputFile, ProgressHandle progress, Future< T > worker, boolean source)
static final int TO_FILE_BUFFER_SIZE
static String getSystemName(Content content)
static String getStringTime(long epochSeconds, Content content)
static TimeZone getTimeZone(Content content)
static String getStringTimeISO8601(long epochSeconds, TimeZone tzone)
static final SimpleDateFormat dateFormatterISO8601
static final String DISPLAY_TIMES_IN_LOCAL_TIME
static final SystemNameVisitor systemName
synchronized static Logger getLogger(String name)
static String getStringTimeISO8601(long epochSeconds, Content c)
static void addChangeListener(PreferenceChangeListener listener)
static boolean displayTimesInLocalTime
static void writeToFile(Content content, java.io.File outputFile)
static boolean displayTimesInLocalTime()
static long writeToFile(Content content, java.io.File outputFile, Supplier< Boolean > cancelCheck)
static boolean isDotDirectory(AbstractFile dir)