static GList * get_description_files (GFile *dir) { GFileEnumerator *enumerator; GFileInfo *info; GFile *desc_file; GList *files; const gchar *name; enumerator = g_file_enumerate_children (dir, G_FILE_ATTRIBUTE_STANDARD_NAME, G_FILE_QUERY_INFO_NONE, NULL, NULL); if (!enumerator) { return NULL; } files = NULL; while ((info = g_file_enumerator_next_file (enumerator, NULL, NULL)) != NULL) { name = g_file_info_get_name (info); if (g_str_has_suffix (name, ".description")) { desc_file = g_file_enumerator_get_child (enumerator, info); files = g_list_insert_sorted (files, desc_file, compare_files); } g_object_unref (info); } g_object_unref (enumerator); return files; }
static void directory_foreach (GFile *file, gchar *suffix, GFunc func, gpointer user_data) { GFileEnumerator *enumerator; GFileInfo *info; GFile *child; enumerator = g_file_enumerate_children (file, G_FILE_ATTRIBUTE_STANDARD_NAME, G_FILE_QUERY_INFO_NONE, NULL, NULL); if (!enumerator) { return; } while ((info = g_file_enumerator_next_file (enumerator, NULL, NULL)) != NULL) { if (!suffix || g_str_has_suffix (g_file_info_get_name (info), suffix)) { child = g_file_enumerator_get_child (enumerator, info); (func) (child, user_data); g_object_unref (child); } g_object_unref (info); } g_object_unref (enumerator); }
static gboolean find_metatests_in_directory (GFile *directory, GPtrArray *results, GError **error) { GFileEnumerator *enumerator = g_file_enumerate_children (directory, "standard::name,standard::type", G_FILE_QUERY_INFO_NONE, NULL, error); if (!enumerator) return FALSE; while (*error == NULL) { GFileInfo *info = g_file_enumerator_next_file (enumerator, NULL, error); if (info == NULL) break; GFile *child = g_file_enumerator_get_child (enumerator, info); switch (g_file_info_get_file_type (info)) { case G_FILE_TYPE_REGULAR: { const char *name = g_file_info_get_name (info); if (g_str_has_suffix (name, ".metatest")) g_ptr_array_add (results, g_file_get_path (child)); break; } case G_FILE_TYPE_DIRECTORY: find_metatests_in_directory (child, results, error); break; default: break; } g_object_unref (child); g_object_unref (info); } { GError *tmp_error = NULL; if (!g_file_enumerator_close (enumerator, NULL, &tmp_error)) { if (*error != NULL) g_clear_error (&tmp_error); else g_propagate_error (error, tmp_error); } } g_object_unref (enumerator); return *error == NULL; }
static gboolean strip_components_into (GFile *dest, GFile *src, int level, GError **error) { g_autoptr(GFileEnumerator) dir_enum = NULL; g_autoptr(GFileInfo) child_info = NULL; GError *temp_error = NULL; dir_enum = g_file_enumerate_children (src, "standard::name,standard::type", G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS, NULL, error); if (!dir_enum) return FALSE; while ((child_info = g_file_enumerator_next_file (dir_enum, NULL, &temp_error))) { g_autoptr(GFile) child = NULL; g_autoptr(GFile) dest_child = NULL; child = g_file_enumerator_get_child (dir_enum, child_info); if (g_file_info_get_file_type (child_info) == G_FILE_TYPE_DIRECTORY && level > 0) { if (!strip_components_into (dest, child, level - 1, error)) return FALSE; g_clear_object (&child_info); continue; } dest_child = g_file_get_child (dest, g_file_info_get_name (child_info)); if (!g_file_move (child, dest_child, G_FILE_COPY_NONE, NULL, NULL, NULL, error)) return FALSE; g_clear_object (&child_info); } if (temp_error != NULL) { g_propagate_error (error, temp_error); return FALSE; } return g_file_delete (src, NULL, error); }
void gis_prepare_eula_page (GisDriver *driver) { gchar *eulas_dir_path; GFile *eulas_dir; GError *error = NULL; GFileEnumerator *enumerator = NULL; GFileInfo *info; eulas_dir_path = g_build_filename (PKGDATADIR, "eulas", NULL); eulas_dir = g_file_new_for_path (eulas_dir_path); g_free (eulas_dir_path); if (!g_file_query_exists (eulas_dir, NULL)) goto out; enumerator = g_file_enumerate_children (eulas_dir, G_FILE_ATTRIBUTE_STANDARD_NAME, G_FILE_QUERY_INFO_NONE, NULL, &error); if (error != NULL) goto out; while ((info = g_file_enumerator_next_file (enumerator, NULL, &error)) != NULL) { GFile *eula = g_file_enumerator_get_child (enumerator, info); gis_driver_add_page (driver, g_object_new (GIS_TYPE_EULA_PAGE, "driver", driver, "eula", eula, NULL)); g_object_unref (eula); } if (error != NULL) goto out; out: if (error != NULL) { g_printerr ("Error while parsing eulas: %s", error->message); g_error_free (error); } g_object_unref (eulas_dir); g_clear_object (&enumerator); }
static void load_installed_portals (void) { const char *portal_dir = PKGDATADIR "/portals"; g_autoptr(GFile) dir = g_file_new_for_path (portal_dir); g_autoptr(GFileEnumerator) enumerator = NULL; enumerator = g_file_enumerate_children (dir, "*", G_FILE_QUERY_INFO_NONE, NULL, NULL); if (enumerator == NULL) return; while (TRUE) { g_autoptr(GFileInfo) info = g_file_enumerator_next_file (enumerator, NULL, NULL); g_autoptr(GFile) child = NULL; g_autofree char *path = NULL; const char *name; g_autoptr(GError) error = NULL; if (info == NULL) break; name = g_file_info_get_name (info); if (!g_str_has_suffix (name, ".portal")) continue; child = g_file_enumerator_get_child (enumerator, info); path = g_file_get_path (child); if (!register_portal (path, &error)) { g_warning ("Error loading %s: %s", path, error->message); continue; } } }
static void gimp_module_db_load_directory (GimpModuleDB *db, GFile *directory) { GFileEnumerator *enumerator; enumerator = g_file_enumerate_children (directory, G_FILE_ATTRIBUTE_STANDARD_NAME "," G_FILE_ATTRIBUTE_STANDARD_IS_HIDDEN "," G_FILE_ATTRIBUTE_STANDARD_TYPE, G_FILE_QUERY_INFO_NONE, NULL, NULL); if (enumerator) { GFileInfo *info; while ((info = g_file_enumerator_next_file (enumerator, NULL, NULL))) { GFileType file_type = g_file_info_get_file_type (info); if (file_type == G_FILE_TYPE_REGULAR && ! g_file_info_get_is_hidden (info)) { GFile *child = g_file_enumerator_get_child (enumerator, info); gimp_module_db_load_module (db, child); g_object_unref (child); } g_object_unref (info); } g_object_unref (enumerator); } }
static gboolean dump_files (GFile *dir, struct archive *archive, GCancellable *cancellable, char *parent, GError **error) { g_autoptr(GFileEnumerator) fe = NULL; gboolean ret = TRUE; GFileType type; fe = g_file_enumerate_children (dir, "standard::name,standard::type,standard::is-symlink,standard::symlink-target,unix::mode,time::*", G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS, cancellable, error); if (fe == NULL) return FALSE; while (TRUE) { g_autoptr(GFileInfo) info = g_file_enumerator_next_file (fe, cancellable, error); g_autofree char *path = NULL; g_autoptr(GFile) child = NULL; guint32 mode; g_autoptr(archive_entry_t) entry = archive_entry_new2 (archive); if (!info) { if (error && *error != NULL) ret = FALSE; break; } type = g_file_info_get_file_type (info); mode = g_file_info_get_attribute_uint32 (info, "unix::mode"); path = g_build_filename (parent, g_file_info_get_name (info), NULL); child = g_file_enumerator_get_child (fe, info); archive_entry_set_pathname (entry, path); archive_entry_set_uid(entry, 0); archive_entry_set_gid(entry, 0); archive_entry_set_perm(entry, mode & 0777); archive_entry_set_mtime(entry, 0, 0); switch (type) { case G_FILE_TYPE_SYMBOLIC_LINK: archive_entry_set_filetype (entry, AE_IFLNK); archive_entry_set_symlink (entry, g_file_info_get_symlink_target (info)); break; case G_FILE_TYPE_REGULAR: archive_entry_set_filetype (entry, AE_IFREG); archive_entry_set_size(entry, g_file_info_get_size (info)); break; case G_FILE_TYPE_DIRECTORY: archive_entry_set_filetype (entry, AE_IFDIR); break; default: g_error ("Unhandled type %d\n", type); break; } if (archive_write_header (archive, entry) < ARCHIVE_OK) return xdg_app_fail (error, "Can't write tar header"); if (type == G_FILE_TYPE_REGULAR) { if (!dump_data (child, archive, cancellable, error)) return FALSE; } if (archive_write_finish_entry (archive) < ARCHIVE_OK) return xdg_app_fail (error, "Can't finish tar entry"); if (type == G_FILE_TYPE_DIRECTORY) { if (!dump_files (child, archive, cancellable, path, error)) return FALSE; } } return ret; }
/* * Recurse the path to create a list of files. Return a GList of the files found. */ static GList * read_directory_recursively (GList *file_list, GFileEnumerator *dir_enumerator, gboolean recurse) { GError *error = NULL; GFileInfo *info; const char *file_name; gboolean is_hidden; GFileType type; g_return_val_if_fail (dir_enumerator != NULL, file_list); while ((info = g_file_enumerator_next_file (dir_enumerator, NULL, &error)) != NULL) { if (Main_Stop_Button_Pressed) { g_object_unref (info); return file_list; } file_name = g_file_info_get_name (info); is_hidden = g_file_info_get_is_hidden (info); type = g_file_info_get_file_type (info); /* Hidden directory like '.mydir' will also be browsed if allowed. */ if (!is_hidden || (g_settings_get_boolean (MainSettings, "browse-show-hidden") && is_hidden)) { if (type == G_FILE_TYPE_DIRECTORY) { if (recurse) { /* Searching for files recursively. */ GFile *child_dir = g_file_enumerator_get_child (dir_enumerator, info); GFileEnumerator *childdir_enumerator; GError *child_error = NULL; childdir_enumerator = g_file_enumerate_children (child_dir, G_FILE_ATTRIBUTE_STANDARD_NAME "," G_FILE_ATTRIBUTE_STANDARD_TYPE "," G_FILE_ATTRIBUTE_STANDARD_IS_HIDDEN, G_FILE_QUERY_INFO_NONE, NULL, &child_error); if (!childdir_enumerator) { gchar *child_path; gchar *display_path; child_path = g_file_get_path (child_dir); display_path = g_filename_display_name (child_path); Log_Print (LOG_ERROR, _("Error opening directory ‘%s’: %s"), display_path, child_error->message); g_free (display_path); g_free (child_path); g_error_free (child_error); g_object_unref (child_dir); g_object_unref (info); continue; } file_list = read_directory_recursively (file_list, childdir_enumerator, recurse); g_object_unref (child_dir); g_file_enumerator_close (childdir_enumerator, NULL, &error); g_object_unref (childdir_enumerator); } } else if (type == G_FILE_TYPE_REGULAR && et_file_is_supported (file_name)) { GFile *file = g_file_enumerator_get_child (dir_enumerator, info); file_list = g_list_append (file_list, file); } // Just to not block X events while (gtk_events_pending()) gtk_main_iteration(); } g_object_unref (info); } if (error) { Log_Print (LOG_ERROR, _("Cannot read directory ‘%s’"), error->message); g_error_free (error); } return file_list; }
void icon_themes_init (Gimp *gimp) { GimpGuiConfig *config; g_return_if_fail (GIMP_IS_GIMP (gimp)); config = GIMP_GUI_CONFIG (gimp->config); icon_themes_hash = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_object_unref); if (config->icon_theme_path) { GList *path; GList *list; path = gimp_config_path_expand_to_files (config->icon_theme_path, NULL); for (list = path; list; list = g_list_next (list)) { GFile *dir = list->data; GFileEnumerator *enumerator; enumerator = g_file_enumerate_children (dir, G_FILE_ATTRIBUTE_STANDARD_NAME "," G_FILE_ATTRIBUTE_STANDARD_IS_HIDDEN "," G_FILE_ATTRIBUTE_STANDARD_TYPE, G_FILE_QUERY_INFO_NONE, NULL, NULL); if (enumerator) { GFileInfo *info; while ((info = g_file_enumerator_next_file (enumerator, NULL, NULL))) { if (! g_file_info_get_is_hidden (info) && g_file_info_get_file_type (info) == G_FILE_TYPE_DIRECTORY) { GFile *file; GFile *index_theme; file = g_file_enumerator_get_child (enumerator, info); /* make sure there is a hicolor/index.theme file */ index_theme = g_file_get_child (file, "index.theme"); if (g_file_query_exists (index_theme, NULL)) { const gchar *name; gchar *basename; name = gimp_file_get_utf8_name (file); basename = g_path_get_basename (name); if (strcmp ("hicolor", basename)) { if (gimp->be_verbose) g_print ("Adding icon theme '%s' (%s)\n", basename, name); g_hash_table_insert (icon_themes_hash, basename, g_object_ref (file)); } else { g_free (basename); } } g_object_unref (index_theme); g_object_unref (file); } g_object_unref (info); } g_object_unref (enumerator); } } g_list_free_full (path, (GDestroyNotify) g_object_unref); } g_signal_connect (config, "notify::icon-theme", G_CALLBACK (icons_theme_change_notify), gimp); icons_theme_change_notify (config, NULL, gimp); }