diff options
Diffstat (limited to 'src/eom-util.c')
-rw-r--r-- | src/eom-util.c | 348 |
1 files changed, 348 insertions, 0 deletions
diff --git a/src/eom-util.c b/src/eom-util.c new file mode 100644 index 0000000..2d74305 --- /dev/null +++ b/src/eom-util.c @@ -0,0 +1,348 @@ +/* Eye Of Mate - General Utilities + * + * Copyright (C) 2006 The Free Software Foundation + * + * Author: Lucas Rocha <[email protected]> + * + * Based on code by: + * - Jens Finke <[email protected]> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include <sys/time.h> +#ifdef HAVE_STRPTIME +#define _XOPEN_SOURCE +#endif /* HAVE_STRPTIME */ + +#include <time.h> + +#include "eom-util.h" + +#include <errno.h> +#include <string.h> +#include <glib.h> +#include <glib/gprintf.h> +#include <glib/gstdio.h> +#include <gtk/gtk.h> +#include <gio/gio.h> +#include <glib/gi18n.h> + +void +eom_util_show_help (const gchar *section, GtkWindow *parent) +{ + GError *error = NULL; + gchar *uri = NULL; + + if (section) + uri = g_strdup_printf ("ghelp:eom?%s", section); + + gtk_show_uri (NULL, ((uri != NULL) ? uri : "ghelp:eom"), + gtk_get_current_event_time (), &error); + + g_free (uri); + + if (error) { + GtkWidget *dialog; + + dialog = gtk_message_dialog_new (parent, + 0, + GTK_MESSAGE_ERROR, + GTK_BUTTONS_OK, + _("Could not display help for Eye of MATE")); + + gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog), + "%s", error->message); + + g_signal_connect_swapped (dialog, "response", + G_CALLBACK (gtk_widget_destroy), + dialog); + gtk_widget_show (dialog); + + g_error_free (error); + } +} + +gchar * +eom_util_make_valid_utf8 (const gchar *str) +{ + GString *string; + const char *remainder, *invalid; + int remaining_bytes, valid_bytes; + + string = NULL; + remainder = str; + remaining_bytes = strlen (str); + + while (remaining_bytes != 0) { + if (g_utf8_validate (remainder, remaining_bytes, &invalid)) { + break; + } + + valid_bytes = invalid - remainder; + + if (string == NULL) { + string = g_string_sized_new (remaining_bytes); + } + + g_string_append_len (string, remainder, valid_bytes); + g_string_append_c (string, '?'); + + remaining_bytes -= valid_bytes + 1; + remainder = invalid + 1; + } + + if (string == NULL) { + return g_strdup (str); + } + + g_string_append (string, remainder); + g_string_append (string, _(" (invalid Unicode)")); + + g_assert (g_utf8_validate (string->str, -1, NULL)); + + return g_string_free (string, FALSE); +} + +GSList* +eom_util_parse_uri_string_list_to_file_list (const gchar *uri_list) +{ + GSList* file_list = NULL; + gsize i = 0; + gchar **uris; + + uris = g_uri_list_extract_uris (uri_list); + + while (uris[i] != NULL) { + file_list = g_slist_append (file_list, g_file_new_for_uri (uris[i])); + i++; + } + + g_strfreev (uris); + + return file_list; +} + +GSList* +eom_util_string_list_to_file_list (GSList *string_list) +{ + GSList *it = NULL; + GSList *file_list = NULL; + + for (it = string_list; it != NULL; it = it->next) { + char *uri_str; + + uri_str = (gchar *) it->data; + + file_list = g_slist_prepend (file_list, + g_file_new_for_uri (uri_str)); + } + + return g_slist_reverse (file_list); +} + +#ifdef HAVE_DBUS +GSList* +eom_util_strings_to_file_list (gchar **strings) +{ + int i; + GSList *file_list = NULL; + + for (i = 0; strings[i]; i++) { + file_list = g_slist_prepend (file_list, + g_file_new_for_uri (strings[i])); + } + + return g_slist_reverse (file_list); +} +#endif + +GSList* +eom_util_string_array_to_list (const gchar **files, gboolean create_uri) +{ + gint i; + GSList *list = NULL; + + if (files == NULL) return list; + + for (i = 0; files[i]; i++) { + char *str; + + if (create_uri) { + GFile *file; + + file = g_file_new_for_commandline_arg (files[i]); + str = g_file_get_uri (file); + + g_object_unref (file); + } else { + str = g_strdup (files[i]); + } + + if (str) { + list = g_slist_prepend (list, g_strdup (str)); + g_free (str); + } + } + + return g_slist_reverse (list); +} + +gchar ** +eom_util_string_array_make_absolute (gchar **files) +{ + int i; + int size; + gchar **abs_files; + GFile *file; + + if (files == NULL) + return NULL; + + size = g_strv_length (files); + + /* Ensure new list is NULL-terminated */ + abs_files = g_new0 (gchar *, size+1); + + for (i = 0; i < size; i++) { + file = g_file_new_for_commandline_arg (files[i]); + abs_files[i] = g_file_get_uri (file); + + g_object_unref (file); + } + + return abs_files; +} + +static gchar *dot_dir = NULL; + +static gboolean +ensure_dir_exists (const char *dir) +{ + if (g_file_test (dir, G_FILE_TEST_IS_DIR)) + return TRUE; + + if (g_mkdir_with_parents (dir, 0700) == 0) + return TRUE; + + if (errno == EEXIST) + return g_file_test (dir, G_FILE_TEST_IS_DIR); + + g_warning ("Failed to create directory %s: %s", dir, strerror (errno)); + return FALSE; +} + +const gchar * +eom_util_dot_dir (void) +{ + if (dot_dir == NULL) { + gboolean exists; + + dot_dir = g_build_filename (g_get_home_dir (), + ".mate2", + "eom", + NULL); + + exists = ensure_dir_exists (dot_dir); + + if (G_UNLIKELY (!exists)) { + static gboolean printed_warning = FALSE; + + if (!printed_warning) { + g_warning ("EOM could not save some of your preferences in its settings directory due to a file with the same name (%s) blocking its creation. Please remove that file, or move it away.", dot_dir); + printed_warning = TRUE; + } + dot_dir = NULL; + return NULL; + } + } + + return dot_dir; +} + +/* Based on eel_filename_strip_extension() */ + +/** + * eom_util_filename_get_extension: + * @filename: a filename + * + * Returns a reasonably good guess of the file extension of @filename. + * + * Returns: a newly allocated string with the file extension of @filename. + **/ +char * +eom_util_filename_get_extension (const char * filename) +{ + char *begin, *begin2; + + if (filename == NULL) { + return NULL; + } + + begin = strrchr (filename, '.'); + + if (begin && begin != filename) { + if (strcmp (begin, ".gz") == 0 || + strcmp (begin, ".bz2") == 0 || + strcmp (begin, ".sit") == 0 || + strcmp (begin, ".Z") == 0) { + begin2 = begin - 1; + while (begin2 > filename && + *begin2 != '.') { + begin2--; + } + if (begin2 != filename) { + begin = begin2; + } + } + begin ++; + } else { + return NULL; + } + + return g_strdup (begin); +} + + +/** + * eom_util_file_is_persistent: + * @file: a #GFile + * + * Checks whether @file is a non-removable local mount. + * + * Returns: %TRUE if @file is in a non-removable mount, + * %FALSE otherwise or when it is remote. + **/ +gboolean +eom_util_file_is_persistent (GFile *file) +{ + GMount *mount; + + if (!g_file_is_native (file)) + return FALSE; + + mount = g_file_find_enclosing_mount (file, NULL, NULL); + if (mount) { + if (g_mount_can_unmount (mount)) { + return FALSE; + } + } + + return TRUE; +} |