summaryrefslogtreecommitdiff
path: root/src/nautilus-autorun-software.c
diff options
context:
space:
mode:
authorAlexander Larsson <alexl@redhat.com>2008-01-17 13:45:27 +0000
committerAlexander Larsson <alexl@src.gnome.org>2008-01-17 13:45:27 +0000
commitdcd068fecdcf874399057bb9edbac9df5abfd7f0 (patch)
treecbc1fff12faa6729dda8ad8e178e4d18aad3d88e /src/nautilus-autorun-software.c
parent74a104f8190a6d2c62a0be1d7bcd6a8043b8ca07 (diff)
downloadnautilus-dcd068fecdcf874399057bb9edbac9df5abfd7f0.tar.gz
Add GMount attribute to NautilusFile. (not implemented yet)
2008-01-17 Alexander Larsson <alexl@redhat.com> * libnautilus-private/nautilus-file.[ch]: * libnautilus-private/nautilus-file-attributes.h: * libnautilus-private/nautilus-file-private.h: Add GMount attribute to NautilusFile. (not implemented yet) * Makefile.am: * configure.in: * data/nautilus.xml.in: * libnautilus-private/apps_nautilus_preferences.schemas.in: * libnautilus-private/nautilus-autorun.[ch]: * libnautilus-private/nautilus-global-preferences.c: * libnautilus-private/nautilus-global-preferences.h: * libnautilus-private/nautilus-program-choosing.c: * src/Makefile.am: * src/file-manager/fm-directory-view.c: * src/nautilus-application.c: * src/nautilus-autorun-software.c: Added. * src/nautilus-file-management-properties.c: * src/nautilus-file-management-properties.glade: * src/nautilus-window-manage-views.c: * src/nautilus-x-content-bar.[ch]: Added. More work on autorun and x-content types from David Zeuthen svn path=/trunk/; revision=13616
Diffstat (limited to 'src/nautilus-autorun-software.c')
-rw-r--r--src/nautilus-autorun-software.c254
1 files changed, 254 insertions, 0 deletions
diff --git a/src/nautilus-autorun-software.c b/src/nautilus-autorun-software.c
new file mode 100644
index 000000000..7c1b5a533
--- /dev/null
+++ b/src/nautilus-autorun-software.c
@@ -0,0 +1,254 @@
+/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
+
+/* Nautilus
+
+ Copyright (C) 2008 Red Hat, Inc.
+
+ The Gnome Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public License as
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
+
+ The Gnome Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public
+ License along with the Gnome Library; see the file COPYING.LIB. If not,
+ write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA.
+
+ Author: David Zeuthen <davidz@redhat.com>
+*/
+
+#include <config.h>
+
+#include <unistd.h>
+#include <string.h>
+#include <time.h>
+#include <gtk/gtk.h>
+#include <gio/gio.h>
+
+#include <glib/gi18n.h>
+
+#include <libgnome/gnome-program.h>
+#include <libgnomeui/gnome-ui-init.h>
+#include <libnautilus-private/nautilus-module.h>
+#include <libnautilus-private/nautilus-icon-info.h>
+
+typedef struct
+{
+ GtkWidget *dialog;
+ GMount *mount;
+} AutorunSoftwareDialogData;
+
+static void autorun_software_dialog_mount_unmounted (GMount *mount, AutorunSoftwareDialogData *data);
+
+static void
+autorun_software_dialog_destroy (AutorunSoftwareDialogData *data)
+{
+ g_signal_handlers_disconnect_by_func (G_OBJECT (data->mount),
+ G_CALLBACK (autorun_software_dialog_mount_unmounted),
+ data);
+
+ gtk_widget_destroy (GTK_WIDGET (data->dialog));
+ g_object_unref (data->mount);
+ g_free (data);
+}
+
+static void
+autorun_software_dialog_mount_unmounted (GMount *mount, AutorunSoftwareDialogData *data)
+{
+ autorun_software_dialog_destroy (data);
+}
+
+static gboolean
+_check_file (GFile *mount_root, const char *file_path, gboolean must_be_executable)
+{
+ GFile *file;
+ GFileInfo *file_info;
+ gboolean ret;
+
+ ret = FALSE;
+
+ file = g_file_get_child (mount_root, file_path);
+ file_info = g_file_query_info (file,
+ G_FILE_ATTRIBUTE_ACCESS_CAN_EXECUTE,
+ G_FILE_QUERY_INFO_NONE,
+ NULL,
+ NULL);
+ if (file_info != NULL) {
+ if (must_be_executable) {
+ if (g_file_info_get_attribute_boolean (file_info, G_FILE_ATTRIBUTE_ACCESS_CAN_EXECUTE))
+ ret = TRUE;
+ } else {
+ ret = TRUE;
+ }
+ g_object_unref (file_info);
+ }
+ g_object_unref (file);
+
+ return ret;
+}
+
+static void
+autorun (GMount *mount)
+{
+ GFile *root;
+ GFile *program_to_spawn;
+ char *path_to_spawn;
+ char *cwd_for_program;
+
+ root = g_mount_get_root (mount);
+
+ /* Careful here, according to
+ *
+ * http://standards.freedesktop.org/autostart-spec/autostart-spec-latest.html
+ *
+ * the ordering does matter.
+ */
+
+ program_to_spawn = NULL;
+ path_to_spawn = NULL;
+
+ if (_check_file (root, ".autorun", TRUE)) {
+ program_to_spawn = g_file_get_child (root, ".autorun");
+ } else if (_check_file (root, "autorun", TRUE)) {
+ program_to_spawn = g_file_get_child (root, "autorun");
+ } else if (_check_file (root, "autorun.sh", TRUE)) {
+ program_to_spawn = g_file_get_child (root, "autorun.sh");
+ } else if (_check_file (root, "autorun.exe", TRUE)) {
+ /* TODO */
+ } else if (_check_file (root, "AUTORUN.EXE", TRUE)) {
+ /* TODO */
+ } else if (_check_file (root, "autorun.inf", FALSE)) {
+ /* TODO */
+ } else if (_check_file (root, "AUTORUN.INF", FALSE)) {
+ /* TODO */
+ }
+
+ if (program_to_spawn != NULL)
+ path_to_spawn = g_file_get_path (program_to_spawn);
+
+ cwd_for_program = g_file_get_path (root);
+
+ if (path_to_spawn != NULL && cwd_for_program != NULL) {
+ if (chdir (cwd_for_program) == 0) {
+ execl (path_to_spawn, path_to_spawn, NULL);
+ g_warning ("Error execing program: %m");
+ }
+ g_warning ("Error chdir to '%s': %m", cwd_for_program);
+ }
+ g_warning ("Cannot find path for program to spawn");
+
+ if (program_to_spawn != NULL)
+ g_object_unref (program_to_spawn);
+ g_free (path_to_spawn);
+ g_free (cwd_for_program);
+}
+
+static void
+present_autorun_for_software_dialog (GMount *mount)
+{
+ GIcon *icon;
+ int icon_size;
+ NautilusIconInfo *icon_info;
+ GdkPixbuf *pixbuf;
+ GtkWidget *image;
+ char *mount_name;
+ GtkWidget *dialog;
+ AutorunSoftwareDialogData *data;
+
+ mount_name = g_mount_get_name (mount);
+
+ dialog = gtk_message_dialog_new_with_markup (NULL, /* TODO: parent window? */
+ 0,
+ GTK_MESSAGE_OTHER,
+ GTK_BUTTONS_CANCEL,
+ _("<big><b>This media contains software intended to be automatically started. Would you like to run it?</b></big>"));
+ gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog),
+ _("The software will run directly from the media \"%s\". "
+ "You should never run software that you don't trust.\n"
+ "\n"
+ "If in doubt, press Cancel."),
+ mount_name);
+
+ /* TODO: in a star trek future add support for verifying
+ * software on media (e.g. if it has a certificate, check it
+ * etc.)
+ */
+
+
+ icon = g_mount_get_icon (mount);
+ icon_size = nautilus_get_icon_size_for_stock_size (GTK_ICON_SIZE_DIALOG);
+ icon_info = nautilus_icon_info_lookup (icon, icon_size);
+ pixbuf = nautilus_icon_info_get_pixbuf_at_size (icon_info, icon_size);
+ image = gtk_image_new_from_pixbuf (pixbuf);
+ gtk_misc_set_alignment (GTK_MISC (image), 0.5, 0.0);
+
+ gtk_message_dialog_set_image (GTK_MESSAGE_DIALOG (dialog), image);
+
+ gtk_window_set_title (GTK_WINDOW (dialog), mount_name);
+ gtk_window_set_icon (GTK_WINDOW (dialog), pixbuf);
+
+ data = g_new0 (AutorunSoftwareDialogData, 1);
+ data->dialog = dialog;
+ data->mount = g_object_ref (mount);
+
+ g_signal_connect (G_OBJECT (mount),
+ "unmounted",
+ G_CALLBACK (autorun_software_dialog_mount_unmounted),
+ data);
+
+ gtk_dialog_add_button (GTK_DIALOG (dialog),
+ _("_Run"),
+ GTK_RESPONSE_OK);
+
+ gtk_widget_show_all (dialog);
+
+ if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_OK) {
+ autorun (mount);
+ }
+
+ g_object_unref (icon_info);
+ g_object_unref (pixbuf);
+ g_free (mount_name);
+}
+
+int
+main (int argc, char *argv[])
+{
+ GVolumeMonitor *monitor;
+ GFile *file;
+ GMount *mount;
+
+ bindtextdomain (GETTEXT_PACKAGE, GNOMELOCALEDIR);
+ bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8");
+ textdomain (GETTEXT_PACKAGE);
+
+ gnome_program_init ("nautilus-autorun-software", VERSION,
+ LIBGNOMEUI_MODULE, argc, argv,
+ NULL, NULL);
+
+ if (argc != 2)
+ goto out;
+
+ /* instantiate monitor so we get the "unmounted" signal properly */
+ monitor = g_volume_monitor_get ();
+ if (monitor == NULL)
+ goto out;
+
+ file = g_file_new_for_commandline_arg (argv[1]);
+ if (file == NULL)
+ goto out;
+
+ mount = g_file_find_enclosing_mount (file, NULL, NULL);
+ if (mount == NULL)
+ goto out;
+
+ present_autorun_for_software_dialog (mount);
+
+out:
+ return 0;
+}