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 javax.swing.SwingWorker;
30 import org.netbeans.api.progress.ProgressHandle;
31 import org.openide.util.NbBundle;
55 private static final SimpleDateFormat
dateFormatter =
new SimpleDateFormat(
"yyyy-MM-dd HH:mm:ss z");
56 private static final SimpleDateFormat
dateFormatterISO8601 =
new SimpleDateFormat(
"yyyy-MM-dd'T'HH:mm:ss'Z'");
62 throw new AssertionError();
75 String time =
"0000-00-00 00:00:00";
76 if (epochSeconds != 0) {
78 dateFormatter.setTimeZone(tzone);
79 time = dateFormatter.format(
new java.util.Date(epochSeconds * 1000));
95 String time =
"0000-00-00T00:00:00Z";
96 if (epochSeconds != 0) {
98 dateFormatterISO8601.setTimeZone(tzone);
99 time = dateFormatterISO8601.format(
new java.util.Date(epochSeconds * 1000));
151 return TimeZone.getDefault();
164 return content.
accept(systemName);
178 return cntnt.
getName() +
":" + Long.toString(cntnt.
getId());
202 ProgressHandle progress, Future<T> worker,
boolean source)
throws IOException {
206 int unit = (int) (content.getSize() / 100);
209 try (FileOutputStream out =
new FileOutputStream(outputFile,
false)) {
211 int len = in.read(buffer);
214 if (worker != null && worker.isCancelled()) {
217 out.write(buffer, 0, len);
218 len = in.read(buffer);
222 if (progress != null && source && totalRead >= TO_FILE_BUFFER_SIZE) {
223 int totalProgress = (int) (totalRead / unit);
224 progress.progress(content.getName(), totalProgress);
226 }
else if (progress != null && !source) {
227 progress.progress(content.getName());
245 writeToFile(content, outputFile, null, null,
false);
263 Supplier<Boolean> cancelCheck)
throws IOException {
267 try (FileOutputStream out =
new FileOutputStream(outputFile,
false)) {
269 int len = in.read(buffer);
271 out.write(buffer, 0, len);
273 if (cancelCheck.get()) {
276 len = in.read(buffer);
301 Supplier<Boolean> cancelCheck,
long startingOffset,
long endingOffset)
throws IOException {
305 try (FileOutputStream out =
new FileOutputStream(outputFile,
false)) {
306 long offsetSkipped = in.skip(startingOffset);
307 if (offsetSkipped != startingOffset) {
309 throw new IOException(String.format(
"Skipping file to starting offset {0} was not successful only skipped to offset {1}.", startingOffset, offsetSkipped));
312 int len = in.read(buffer);
313 long writeFileLength = endingOffset - startingOffset;
315 while (len != -1 && writeFileLength != 0) {
316 out.write(buffer, 0, len);
318 if (cancelCheck.get()) {
321 if (writeFileLength > TO_FILE_BUFFER_SIZE) {
322 len = in.read(buffer);
325 int writeLength = (int)writeFileLength;
326 byte[] lastBuffer =
new byte[writeLength];
327 len = in.read(lastBuffer);
328 out.write(lastBuffer, 0, len);
349 return name.equals(
".") || name.equals(
"..");
360 ProgressHandle progress;
361 SwingWorker<T, V> worker;
362 boolean source =
false;
377 ProgressHandle progress, SwingWorker<T, V> worker,
boolean source) {
379 this.progress = progress;
380 this.worker = worker;
381 this.source = source;
392 public static <T, V>
void extract(
Content cntnt, java.io.File dest, ProgressHandle progress, SwingWorker<T, V> worker) {
410 protected void writeFile(
Content file, java.io.File dest, ProgressHandle progress, SwingWorker<T, V> worker,
boolean source)
throws IOException {
422 writeFile(file, dest, progress, worker, source);
424 logger.log(Level.WARNING,
425 String.format(
"Error reading file '%s' (id=%d).",
427 }
catch (IOException ex) {
428 logger.log(Level.SEVERE,
429 String.format(
"Error extracting %s '%s' (id=%d) to '%s'.",
430 fileType, file.
getName(), file.
getId(), dest.getAbsolutePath()), ex);
442 return visitFile(file,
"unallocated content file");
476 String path = dest.getAbsolutePath() + java.io.
File.separator
478 return new java.io.File(path);
505 int numProcessed = 0;
514 if (worker != null && worker.isCancelled()) {
517 if (progress != null && source) {
518 progress.progress(child.getName(), numProcessed);
520 child.accept(childVisitor);
525 logger.log(Level.SEVERE,
526 "Trouble fetching children to extract.", ex);
534 throw new UnsupportedOperationException(NbBundle.getMessage(
this.getClass(),
535 "ContentUtils.exception.msg",
536 content.getClass().getSimpleName()));
static String getStringTime(long epochSeconds, TimeZone tzone)
List< Content > getChildren()
File(SleuthkitCase db, long objId, long fsObjId, TSK_FS_ATTR_TYPE_ENUM attrType, short attrId, String name, long metaAddr, int metaSeq, TSK_FS_NAME_TYPE_ENUM dirType, TSK_FS_META_TYPE_ENUM metaType, TSK_FS_NAME_FLAG_ENUM dirFlag, short metaFlags, long size, long ctime, long crtime, long atime, long mtime, short modes, int uid, int gid, String md5Hash, FileKnown knownState, String parentPath)
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 long writeToFile(Content content, java.io.File outputFile, Supplier< Boolean > cancelCheck, long startingOffset, long endingOffset)
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 SystemNameVisitor systemName
synchronized static Logger getLogger(String name)
static String getTimeZoneForDisplays()
static String getStringTimeISO8601(long epochSeconds, Content c)
public< T > T accept(ContentVisitor< T > v)
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)