diff options
author | Alexander Larsson <alexl@redhat.com> | 2008-01-17 13:45:27 +0000 |
---|---|---|
committer | Alexander Larsson <alexl@src.gnome.org> | 2008-01-17 13:45:27 +0000 |
commit | dcd068fecdcf874399057bb9edbac9df5abfd7f0 (patch) | |
tree | cbc1fff12faa6729dda8ad8e178e4d18aad3d88e /src/nautilus-autorun-software.c | |
parent | 74a104f8190a6d2c62a0be1d7bcd6a8043b8ca07 (diff) | |
download | nautilus-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.c | 254 |
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; +} |