diff options
Diffstat (limited to 'gio/gfileenumerator.c')
-rw-r--r-- | gio/gfileenumerator.c | 59 |
1 files changed, 52 insertions, 7 deletions
diff --git a/gio/gfileenumerator.c b/gio/gfileenumerator.c index 6fd03eb44..c4b44d1ce 100644 --- a/gio/gfileenumerator.c +++ b/gio/gfileenumerator.c @@ -318,22 +318,67 @@ next_async_callback_wrapper (GObject *source_object, * @user_data: (closure): the data to pass to callback function * * Request information for a number of files from the enumerator asynchronously. - * When all i/o for the operation is finished the @callback will be called with + * When all I/O for the operation is finished the @callback will be called with * the requested information. * * See the documentation of #GFileEnumerator for information about the * order of returned files. * - * The callback can be called with less than @num_files files in case of error - * or at the end of the enumerator. In case of a partial error the callback will - * be called with any succeeding items and no error, and on the next request the - * error will be reported. If a request is cancelled the callback will be called - * with %G_IO_ERROR_CANCELLED. + * Once the end of the enumerator is reached, or if an error occurs, the + * @callback will be called with an empty list. In this case, the previous call + * to g_file_enumerator_next_files_async() will typically have returned fewer + * than @num_files items. + * + * If a request is cancelled the callback will be called with + * %G_IO_ERROR_CANCELLED. + * + * This leads to the following pseudo-code usage: + * |[ + * g_autoptr(GFile) dir = get_directory (); + * g_autoptr(GFileEnumerator) enumerator = NULL; + * g_autolist(GFileInfo) files = NULL; + * g_autoptr(GError) local_error = NULL; + * + * enumerator = yield g_file_enumerate_children_async (dir, + * G_FILE_ATTRIBUTE_STANDARD_NAME "," + * G_FILE_ATTRIBUTE_STANDARD_TYPE, + * G_FILE_QUERY_INFO_NONE, + * G_PRIORITY_DEFAULT, + * cancellable, + * …, + * &local_error); + * if (enumerator == NULL) + * g_error ("Error enumerating: %s", local_error->message); + * + * // Loop until no files are returned, either because the end of the enumerator + * // has been reached, or an error was returned. + * do + * { + * files = yield g_file_enumerator_next_files_async (enumerator, + * 5, // number of files to request + * G_PRIORITY_DEFAULT, + * cancellable, + * …, + * &local_error); + * + * // Process the returned files, but don’t assume that exactly 5 were returned. + * for (GList *l = files; l != NULL; l = l->next) + * { + * GFileInfo *info = l->data; + * handle_file_info (info); + * } + * } + * while (files != NULL); + * + * if (local_error != NULL && + * !g_error_matches (local_error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) + * g_error ("Error while enumerating: %s", local_error->message); + * ]| * * During an async request no other sync and async calls are allowed, and will * result in %G_IO_ERROR_PENDING errors. * - * Any outstanding i/o request with higher priority (lower numerical value) will + * Any outstanding I/O request with higher priority (lower numerical value) will * be executed before an outstanding request with lower priority. Default * priority is %G_PRIORITY_DEFAULT. **/ |