mirror of
https://github.com/overcuriousity/autopsy-flatpak.git
synced 2025-07-17 10:17:41 +00:00
Merge branch 'develop' of https://github.com/sleuthkit/autopsy into vm_detection
This commit is contained in:
commit
c27b8655f7
@ -429,6 +429,7 @@ public class ImageUtils {
|
|||||||
String cacheDirectory = Case.getCurrentCase().getCacheDirectory();
|
String cacheDirectory = Case.getCurrentCase().getCacheDirectory();
|
||||||
return Paths.get(cacheDirectory, "thumbnails", fileID + ".png").toFile(); //NOI18N
|
return Paths.get(cacheDirectory, "thumbnails", fileID + ".png").toFile(); //NOI18N
|
||||||
} catch (IllegalStateException e) {
|
} catch (IllegalStateException e) {
|
||||||
|
LOGGER.log(Level.WARNING, "Could not get cached thumbnail location. No case is open.");
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -656,6 +657,10 @@ public class ImageUtils {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected javafx.scene.image.Image call() throws Exception {
|
protected javafx.scene.image.Image call() throws Exception {
|
||||||
|
if (isGIF(file)) {
|
||||||
|
return readImage();
|
||||||
|
}
|
||||||
|
|
||||||
// If a thumbnail file is already saved locally, just read that.
|
// If a thumbnail file is already saved locally, just read that.
|
||||||
if (cacheFile != null && cacheFile.exists()) {
|
if (cacheFile != null && cacheFile.exists()) {
|
||||||
try {
|
try {
|
||||||
@ -670,18 +675,21 @@ public class ImageUtils {
|
|||||||
|
|
||||||
//There was no correctly-sized cached thumbnail so make one.
|
//There was no correctly-sized cached thumbnail so make one.
|
||||||
BufferedImage thumbnail = null;
|
BufferedImage thumbnail = null;
|
||||||
|
|
||||||
if (VideoUtils.isVideoThumbnailSupported(file)) {
|
if (VideoUtils.isVideoThumbnailSupported(file)) {
|
||||||
if (openCVLoaded) {
|
if (openCVLoaded) {
|
||||||
updateMessage(Bundle.GetOrGenerateThumbnailTask_generatingPreviewFor(file.getName()));
|
updateMessage(Bundle.GetOrGenerateThumbnailTask_generatingPreviewFor(file.getName()));
|
||||||
thumbnail = VideoUtils.generateVideoThumbnail(file, iconSize);
|
thumbnail = VideoUtils.generateVideoThumbnail(file, iconSize);
|
||||||
} else if (defaultOnFailure) {
|
|
||||||
thumbnail = DEFAULT_THUMBNAIL;
|
|
||||||
} else {
|
|
||||||
throw new IIOException("Failed to read image for thumbnail generation.");
|
|
||||||
}
|
}
|
||||||
|
if (null == thumbnail) {
|
||||||
|
if (defaultOnFailure) {
|
||||||
|
thumbnail = DEFAULT_THUMBNAIL;
|
||||||
|
} else {
|
||||||
|
throw new IIOException("Failed to generate thumbnail for video file.");
|
||||||
|
}
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
//read the image into abuffered image.
|
//read the image into a buffered image.
|
||||||
BufferedImage bufferedImage = SwingFXUtils.fromFXImage(readImage(), null);
|
BufferedImage bufferedImage = SwingFXUtils.fromFXImage(readImage(), null);
|
||||||
if (null == bufferedImage) {
|
if (null == bufferedImage) {
|
||||||
LOGGER.log(Level.WARNING, FAILED_TO_READ_IMAGE_FOR_THUMBNAIL_GENERATION);
|
LOGGER.log(Level.WARNING, FAILED_TO_READ_IMAGE_FOR_THUMBNAIL_GENERATION);
|
||||||
@ -717,9 +725,10 @@ public class ImageUtils {
|
|||||||
updateProgress(-1, 1);
|
updateProgress(-1, 1);
|
||||||
|
|
||||||
//if we got a valid thumbnail save it
|
//if we got a valid thumbnail save it
|
||||||
if (cacheFile != null && nonNull(thumbnail) && DEFAULT_THUMBNAIL != thumbnail) {
|
if ((cacheFile != null) && nonNull(thumbnail) && DEFAULT_THUMBNAIL != thumbnail) {
|
||||||
saveThumbnail(thumbnail);
|
saveThumbnail(thumbnail);
|
||||||
}
|
}
|
||||||
|
|
||||||
return SwingFXUtils.toFXImage(thumbnail, null);
|
return SwingFXUtils.toFXImage(thumbnail, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -783,7 +792,7 @@ public class ImageUtils {
|
|||||||
*/
|
*/
|
||||||
static private abstract class ReadImageTaskBase extends Task<javafx.scene.image.Image> implements IIOReadProgressListener {
|
static private abstract class ReadImageTaskBase extends Task<javafx.scene.image.Image> implements IIOReadProgressListener {
|
||||||
|
|
||||||
private static final String IMAGE_IO_COULD_NOT_READ_UNSUPPORTE_OR_CORRUPT = "ImageIO could not read {0}. It may be unsupported or corrupt"; //NOI18N
|
private static final String IMAGE_UTILS_COULD_NOT_READ_UNSUPPORTE_OR_CORRUPT = "ImageUtils could not read {0}. It may be unsupported or corrupt"; //NOI18N
|
||||||
final AbstractFile file;
|
final AbstractFile file;
|
||||||
private ImageReader reader;
|
private ImageReader reader;
|
||||||
|
|
||||||
@ -830,7 +839,7 @@ public class ImageUtils {
|
|||||||
}
|
}
|
||||||
} catch (IOException iOException) {
|
} catch (IOException iOException) {
|
||||||
// Ignore this exception or display a warning or similar, for exceptions happening during decoding
|
// Ignore this exception or display a warning or similar, for exceptions happening during decoding
|
||||||
LOGGER.log(Level.WARNING, IMAGE_IO_COULD_NOT_READ_UNSUPPORTE_OR_CORRUPT + ": " + iOException.toString(), ImageUtils.getContentPathSafe(file)); //NOI18N
|
LOGGER.log(Level.WARNING, IMAGE_UTILS_COULD_NOT_READ_UNSUPPORTE_OR_CORRUPT + ": " + iOException.toString(), ImageUtils.getContentPathSafe(file)); //NOI18N
|
||||||
} finally {
|
} finally {
|
||||||
reader.removeIIOReadProgressListener(this);
|
reader.removeIIOReadProgressListener(this);
|
||||||
reader.dispose();
|
reader.dispose();
|
||||||
@ -859,11 +868,11 @@ public class ImageUtils {
|
|||||||
try {
|
try {
|
||||||
javafx.scene.image.Image fxImage = get();
|
javafx.scene.image.Image fxImage = get();
|
||||||
if (fxImage == null) {
|
if (fxImage == null) {
|
||||||
LOGGER.log(Level.WARNING, IMAGE_IO_COULD_NOT_READ_UNSUPPORTE_OR_CORRUPT, ImageUtils.getContentPathSafe(file));
|
LOGGER.log(Level.WARNING, IMAGE_UTILS_COULD_NOT_READ_UNSUPPORTE_OR_CORRUPT, ImageUtils.getContentPathSafe(file));
|
||||||
} else {
|
} else {
|
||||||
if (fxImage.isError()) {
|
if (fxImage.isError()) {
|
||||||
//if there was somekind of error, log it
|
//if there was somekind of error, log it
|
||||||
LOGGER.log(Level.WARNING, IMAGE_IO_COULD_NOT_READ_UNSUPPORTE_OR_CORRUPT + ": " + ObjectUtils.toString(fxImage.getException()), ImageUtils.getContentPathSafe(file));
|
LOGGER.log(Level.WARNING, IMAGE_UTILS_COULD_NOT_READ_UNSUPPORTE_OR_CORRUPT + ": " + ObjectUtils.toString(fxImage.getException()), ImageUtils.getContentPathSafe(file));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} catch (InterruptedException | ExecutionException ex) {
|
} catch (InterruptedException | ExecutionException ex) {
|
||||||
@ -874,7 +883,7 @@ public class ImageUtils {
|
|||||||
@Override
|
@Override
|
||||||
protected void failed() {
|
protected void failed() {
|
||||||
super.failed();
|
super.failed();
|
||||||
LOGGER.log(Level.WARNING, IMAGE_IO_COULD_NOT_READ_UNSUPPORTE_OR_CORRUPT + ": " + ObjectUtils.toString(getException()), ImageUtils.getContentPathSafe(file));
|
LOGGER.log(Level.WARNING, IMAGE_UTILS_COULD_NOT_READ_UNSUPPORTE_OR_CORRUPT + ": " + ObjectUtils.toString(getException()), ImageUtils.getContentPathSafe(file));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -43,8 +43,8 @@ import org.sleuthkit.datamodel.AbstractFile;
|
|||||||
*/
|
*/
|
||||||
public class VideoUtils {
|
public class VideoUtils {
|
||||||
|
|
||||||
private static final List<String> SUPPORTED_VIDEO_EXTENSIONS
|
private static final List<String> SUPPORTED_VIDEO_EXTENSIONS =
|
||||||
= Arrays.asList("mov", "m4v", "flv", "mp4", "3gp", "avi", "mpg",
|
Arrays.asList("mov", "m4v", "flv", "mp4", "3gp", "avi", "mpg",
|
||||||
"mpeg", "asf", "divx", "rm", "moov", "wmv", "vob", "dat",
|
"mpeg", "asf", "divx", "rm", "moov", "wmv", "vob", "dat",
|
||||||
"m1v", "m2v", "m4v", "mkv", "mpe", "yop", "vqa", "xmv",
|
"m1v", "m2v", "m4v", "mkv", "mpe", "yop", "vqa", "xmv",
|
||||||
"mve", "wtv", "webm", "vivo", "vc1", "seq", "thp", "san",
|
"mve", "wtv", "webm", "vivo", "vc1", "seq", "thp", "san",
|
||||||
@ -58,7 +58,7 @@ public class VideoUtils {
|
|||||||
"flm", "tmv", "4xm"); //NON-NLS
|
"flm", "tmv", "4xm"); //NON-NLS
|
||||||
|
|
||||||
private static final SortedSet<String> SUPPORTED_VIDEO_MIME_TYPES = new TreeSet<>(
|
private static final SortedSet<String> SUPPORTED_VIDEO_MIME_TYPES = new TreeSet<>(
|
||||||
Arrays.asList("application/x-shockwave-flash", "video/x-m4v", "video/quicktime", "video/avi", "video/msvideo", "video/x-msvideo",
|
Arrays.asList("application/x-shockwave-flash", "video/x-m4v", "video/x-flv", "video/quicktime", "video/avi", "video/msvideo", "video/x-msvideo",
|
||||||
"video/mp4", "video/x-ms-wmv", "video/mpeg", "video/asf")); //NON-NLS
|
"video/mp4", "video/x-ms-wmv", "video/mpeg", "video/asf")); //NON-NLS
|
||||||
|
|
||||||
private static final List<String> CONDITIONAL_MIME_TYPES = Arrays.asList("application/octet-stream");
|
private static final List<String> CONDITIONAL_MIME_TYPES = Arrays.asList("application/octet-stream");
|
||||||
@ -160,6 +160,6 @@ public class VideoUtils {
|
|||||||
|
|
||||||
videoFile.release(); // close the file
|
videoFile.release(); // close the file
|
||||||
|
|
||||||
return bufferedImage == null ? bufferedImage : ScalrWrapper.resizeFast(bufferedImage, iconSize);
|
return bufferedImage == null ? null : ScalrWrapper.resizeFast(bufferedImage, iconSize);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -26,7 +26,7 @@ import org.controlsfx.control.action.Action;
|
|||||||
import org.openide.util.NbBundle;
|
import org.openide.util.NbBundle;
|
||||||
import org.sleuthkit.autopsy.datamodel.FileNode;
|
import org.sleuthkit.autopsy.datamodel.FileNode;
|
||||||
import org.sleuthkit.autopsy.directorytree.ExternalViewerAction;
|
import org.sleuthkit.autopsy.directorytree.ExternalViewerAction;
|
||||||
import org.sleuthkit.datamodel.AbstractFile;
|
import org.sleuthkit.autopsy.imagegallery.datamodel.DrawableFile;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Wraps {@link ExternalViewerAction} in a ControlsFX {@link Action} with
|
* Wraps {@link ExternalViewerAction} in a ControlsFX {@link Action} with
|
||||||
@ -38,14 +38,14 @@ public class OpenExternalViewerAction extends Action {
|
|||||||
private static final Image EXTERNAL = new Image(OpenExternalViewerAction.class.getResource("/org/sleuthkit/autopsy/imagegallery/images/external.png").toExternalForm());
|
private static final Image EXTERNAL = new Image(OpenExternalViewerAction.class.getResource("/org/sleuthkit/autopsy/imagegallery/images/external.png").toExternalForm());
|
||||||
private static final ActionEvent ACTION_EVENT = new ActionEvent(OpenExternalViewerAction.class, ActionEvent.ACTION_PERFORMED, ""); //Swing ActionEvent //NOI18N
|
private static final ActionEvent ACTION_EVENT = new ActionEvent(OpenExternalViewerAction.class, ActionEvent.ACTION_PERFORMED, ""); //Swing ActionEvent //NOI18N
|
||||||
|
|
||||||
public OpenExternalViewerAction(AbstractFile file) {
|
public OpenExternalViewerAction(DrawableFile<?> file) {
|
||||||
super("External Viewer");
|
super("External Viewer");
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* TODO: why is the name passed to the action? it means we duplicate
|
* TODO: why is the name passed to the action? it means we duplicate
|
||||||
* this string all over the place -jm
|
* this string all over the place -jm
|
||||||
*/
|
*/
|
||||||
ExternalViewerAction externalViewerAction = new ExternalViewerAction(Bundle.MediaViewImagePanel_externalViewerButton_text(), new FileNode(file));
|
ExternalViewerAction externalViewerAction = new ExternalViewerAction(Bundle.MediaViewImagePanel_externalViewerButton_text(), new FileNode(file.getAbstractFile()));
|
||||||
|
|
||||||
setLongText(Bundle.MediaViewImagePanel_externalViewerButton_text());
|
setLongText(Bundle.MediaViewImagePanel_externalViewerButton_text());
|
||||||
setEventHandler(actionEvent -> //fx ActionEvent
|
setEventHandler(actionEvent -> //fx ActionEvent
|
||||||
|
@ -204,7 +204,16 @@ public class CategoryManager {
|
|||||||
* @param listener
|
* @param listener
|
||||||
*/
|
*/
|
||||||
public void unregisterListener(Object listener) {
|
public void unregisterListener(Object listener) {
|
||||||
categoryEventBus.unregister(listener);
|
|
||||||
|
try {
|
||||||
|
categoryEventBus.unregister(listener);
|
||||||
|
} catch (IllegalArgumentException e) {
|
||||||
|
if (e.getMessage().contains("missing event subscriber for an annotated method. Is " + listener + " registered?")) {
|
||||||
|
LOGGER.log(Level.WARNING, "Attempted to unregister {0} for category change events, but it was not registered.", listener.toString());
|
||||||
|
} else {
|
||||||
|
throw e;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -220,7 +220,7 @@ public abstract class DrawableTileBase extends DrawableUIBase {
|
|||||||
});
|
});
|
||||||
menuItems.add(contentViewer);
|
menuItems.add(contentViewer);
|
||||||
|
|
||||||
OpenExternalViewerAction openExternalViewerAction = new OpenExternalViewerAction(file.getAbstractFile());
|
OpenExternalViewerAction openExternalViewerAction = new OpenExternalViewerAction(file);
|
||||||
MenuItem externalViewer = ActionUtils.createMenuItem(openExternalViewerAction);
|
MenuItem externalViewer = ActionUtils.createMenuItem(openExternalViewerAction);
|
||||||
externalViewer.textProperty().unbind();
|
externalViewer.textProperty().unbind();
|
||||||
externalViewer.textProperty().bind(openExternalViewerAction.longTextProperty());
|
externalViewer.textProperty().bind(openExternalViewerAction.longTextProperty());
|
||||||
|
@ -46,7 +46,6 @@ import org.sleuthkit.autopsy.coreutils.ThreadConfined;
|
|||||||
import org.sleuthkit.autopsy.imagegallery.ImageGalleryController;
|
import org.sleuthkit.autopsy.imagegallery.ImageGalleryController;
|
||||||
import org.sleuthkit.autopsy.imagegallery.actions.OpenExternalViewerAction;
|
import org.sleuthkit.autopsy.imagegallery.actions.OpenExternalViewerAction;
|
||||||
import org.sleuthkit.autopsy.imagegallery.datamodel.DrawableFile;
|
import org.sleuthkit.autopsy.imagegallery.datamodel.DrawableFile;
|
||||||
import org.sleuthkit.datamodel.AbstractFile;
|
|
||||||
import org.sleuthkit.datamodel.TskCoreException;
|
import org.sleuthkit.datamodel.TskCoreException;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -207,7 +206,7 @@ abstract public class DrawableUIBase extends AnchorPane implements DrawableView
|
|||||||
}
|
}
|
||||||
|
|
||||||
@ThreadConfined(type = ThreadConfined.ThreadType.JFX)
|
@ThreadConfined(type = ThreadConfined.ThreadType.JFX)
|
||||||
void showErrorNode(String errorMessage, AbstractFile file) {
|
void showErrorNode(String errorMessage, DrawableFile<?> file) {
|
||||||
Button createButton = ActionUtils.createButton(new OpenExternalViewerAction(file));
|
Button createButton = ActionUtils.createButton(new OpenExternalViewerAction(file));
|
||||||
|
|
||||||
VBox vBox = new VBox(10, new Label(errorMessage), createButton);
|
VBox vBox = new VBox(10, new Label(errorMessage), createButton);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user