GInputStream * webkit_soup_directory_input_stream_new (GFileEnumerator *enumerator, SoupURI *uri) { GInputStream *stream; g_return_val_if_fail (G_IS_FILE_ENUMERATOR (enumerator), NULL); g_return_val_if_fail (uri != NULL, NULL); stream = g_object_new (WEBKIT_TYPE_SOUP_DIRECTORY_INPUT_STREAM, NULL); WEBKIT_SOUP_DIRECTORY_INPUT_STREAM (stream)->enumerator = g_object_ref (enumerator); WEBKIT_SOUP_DIRECTORY_INPUT_STREAM (stream)->uri = soup_uri_to_string (uri, FALSE); return stream; }
static void enumerate_dir (MpdStorageDevice *self) { MpdStorageDevicePrivate *priv = GET_PRIVATE (self); GFileEnumerator *enumerator; GFileInfo *info; GError *error = NULL; g_return_if_fail (priv->dir_stack); enumerator = G_FILE_ENUMERATOR (priv->dir_stack->data); g_return_if_fail (G_IS_FILE_ENUMERATOR (enumerator)); while (NULL != (info = g_file_enumerator_next_file (enumerator, NULL, &error))) { char const *content_type = g_file_info_get_content_type (info); char const *name = g_file_info_get_name (info); /* Debug */ char *indent = g_strnfill (g_slist_length (priv->dir_stack), ' '); g_debug ("%s%s %s", indent, name, content_type); g_free (indent); /* Do not recurse into "dot" directories, they are use for trash. */ if (0 == g_strcmp0 ("inode/directory", content_type) && name[0] != '.') { char const *path = g_object_get_data (G_OBJECT (enumerator), "path"); char *subpath = g_build_filename (path, name, NULL); GFile *subdir = file_new_for_path (subpath); /* Push and recurse. */ push_dir_async (self, subdir); file_destroy (subdir); g_free (subpath); break; } else if (g_str_has_prefix (content_type, "audio/") || g_str_has_prefix (content_type, "image/") || g_str_has_prefix (content_type, "video/")) { /* Media found. */ char const *path = g_object_get_data (G_OBJECT (enumerator), "path"); char *filename = g_build_filename (path, name, NULL); priv->media_files = g_slist_prepend (priv->media_files, filename); priv->media_files_size += g_file_info_get_size (info); } g_object_unref (info); } if (info) { /* Broke out of loop, not done yet. */ g_object_unref (info); } else { /* Directory finished, pop. */ g_object_unref (enumerator); priv->dir_stack = g_slist_delete_link (priv->dir_stack, priv->dir_stack); if (priv->dir_stack) { enumerate_dir (self); } else { /* Done iterating. */ g_signal_emit_by_name (self, "has-media", (bool) priv->media_files); } } if (error) { g_critical ("%s : %s", G_STRLOC, error->message); g_clear_error (&error); } }