/*
 * This file is part of gtkD.
 *
 * gtkD is free software; you can redistribute it and/or modify
 * it under the terms of the GNU Lesser General Public License
 * as published by the Free Software Foundation; either version 3
 * of the License, or (at your option) any later version, with
 * some exceptions, please read the COPYING file.
 *
 * gtkD 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 Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public License
 * along with gtkD; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110, USA
 */

// generated automatically - do not change
// find conversion definition on APILookup.txt
// implement new conversion functionalities the gir-to-d pakage


module gio.FileEnumerator;

private import gio.AsyncResultIF;
private import gio.Cancellable;
private import gio.FileIF;
private import gio.FileInfo;
private import gio.c.functions;
public  import gio.c.types;
private import glib.ErrorG;
private import glib.GException;
private import glib.ListG;
private import gobject.ObjectG;


/**
 * `GFileEnumerator` allows you to operate on a set of [iface@Gio.File] objects,
 * returning a [class@Gio.FileInfo] structure for each file enumerated (e.g.
 * [method@Gio.File.enumerate_children] will return a `GFileEnumerator` for each
 * of the children within a directory).
 * 
 * To get the next file's information from a `GFileEnumerator`, use
 * [method@Gio.FileEnumerator.next_file] or its asynchronous version,
 * [method@Gio.FileEnumerator.next_files_async]. Note that the asynchronous
 * version will return a list of [class@Gio.FileInfo] objects, whereas the
 * synchronous will only return the next file in the enumerator.
 * 
 * The ordering of returned files is unspecified for non-Unix
 * platforms; for more information, see [method@GLib.Dir.read_name].  On Unix,
 * when operating on local files, returned files will be sorted by
 * inode number.  Effectively you can assume that the ordering of
 * returned files will be stable between successive calls (and
 * applications) assuming the directory is unchanged.
 * 
 * If your application needs a specific ordering, such as by name or
 * modification time, you will have to implement that in your
 * application code.
 * 
 * To close a `GFileEnumerator`, use [method@Gio.FileEnumerator.close], or
 * its asynchronous version, [method@Gio.FileEnumerator.close_async]. Once
 * a `GFileEnumerator` is closed, no further actions may be performed
 * on it, and it should be freed with [method@GObject.Object.unref].
 */
public class FileEnumerator : ObjectG
{
	/** the main Gtk struct */
	protected GFileEnumerator* gFileEnumerator;

	/** Get the main Gtk struct */
	public GFileEnumerator* getFileEnumeratorStruct(bool transferOwnership = false)
	{
		if (transferOwnership)
			ownedRef = false;
		return gFileEnumerator;
	}

	/** the main Gtk struct as a void* */
	protected override void* getStruct()
	{
		return cast(void*)gFileEnumerator;
	}

	/**
	 * Sets our main struct and passes it to the parent class.
	 */
	public this (GFileEnumerator* gFileEnumerator, bool ownedRef = false)
	{
		this.gFileEnumerator = gFileEnumerator;
		super(cast(GObject*)gFileEnumerator, ownedRef);
	}


	/** */
	public static GType getType()
	{
		return g_file_enumerator_get_type();
	}

	/**
	 * Releases all resources used by this enumerator, making the
	 * enumerator return %G_IO_ERROR_CLOSED on all calls.
	 *
	 * This will be automatically called when the last reference
	 * is dropped, but you might want to call this function to make
	 * sure resources are released as early as possible.
	 *
	 * Params:
	 *     cancellable = optional #GCancellable object, %NULL to ignore.
	 *
	 * Returns: #TRUE on success or #FALSE on error.
	 *
	 * Throws: GException on failure.
	 */
	public bool close(Cancellable cancellable)
	{
		GError* err = null;

		auto __p = g_file_enumerator_close(gFileEnumerator, (cancellable is null) ? null : cancellable.getCancellableStruct(), &err) != 0;

		if (err !is null)
		{
			throw new GException( new ErrorG(err) );
		}

		return __p;
	}

	/**
	 * Asynchronously closes the file enumerator.
	 *
	 * If @cancellable is not %NULL, then the operation can be cancelled by
	 * triggering the cancellable object from another thread. If the operation
	 * was cancelled, the error %G_IO_ERROR_CANCELLED will be returned in
	 * g_file_enumerator_close_finish().
	 *
	 * Params:
	 *     ioPriority = the [I/O priority](iface.AsyncResult.html#io-priority) of the request
	 *     cancellable = optional #GCancellable object, %NULL to ignore.
	 *     callback = a #GAsyncReadyCallback
	 *         to call when the request is satisfied
	 *     userData = the data to pass to callback function
	 */
	public void closeAsync(int ioPriority, Cancellable cancellable, GAsyncReadyCallback callback, void* userData)
	{
		g_file_enumerator_close_async(gFileEnumerator, ioPriority, (cancellable is null) ? null : cancellable.getCancellableStruct(), callback, userData);
	}

	/**
	 * Finishes closing a file enumerator, started from g_file_enumerator_close_async().
	 *
	 * If the file enumerator was already closed when g_file_enumerator_close_async()
	 * was called, then this function will report %G_IO_ERROR_CLOSED in @error, and
	 * return %FALSE. If the file enumerator had pending operation when the close
	 * operation was started, then this function will report %G_IO_ERROR_PENDING, and
	 * return %FALSE.  If @cancellable was not %NULL, then the operation may have been
	 * cancelled by triggering the cancellable object from another thread. If the operation
	 * was cancelled, the error %G_IO_ERROR_CANCELLED will be set, and %FALSE will be
	 * returned.
	 *
	 * Params:
	 *     result = a #GAsyncResult.
	 *
	 * Returns: %TRUE if the close operation has finished successfully.
	 *
	 * Throws: GException on failure.
	 */
	public bool closeFinish(AsyncResultIF result)
	{
		GError* err = null;

		auto __p = g_file_enumerator_close_finish(gFileEnumerator, (result is null) ? null : result.getAsyncResultStruct(), &err) != 0;

		if (err !is null)
		{
			throw new GException( new ErrorG(err) );
		}

		return __p;
	}

	/**
	 * Return a new #GFile which refers to the file named by @info in the source
	 * directory of @enumerator.  This function is primarily intended to be used
	 * inside loops with g_file_enumerator_next_file().
	 *
	 * To use this, %G_FILE_ATTRIBUTE_STANDARD_NAME must have been listed in the
	 * attributes list used when creating the #GFileEnumerator.
	 *
	 * This is a convenience method that's equivalent to:
	 * |[<!-- language="C" -->
	 * gchar *name = g_file_info_get_name (info);
	 * GFile *child = g_file_get_child (g_file_enumerator_get_container (enumr),
	 * name);
	 * ]|
	 *
	 * Params:
	 *     info = a #GFileInfo gotten from g_file_enumerator_next_file()
	 *         or the async equivalents.
	 *
	 * Returns: a #GFile for the #GFileInfo passed it.
	 *
	 * Since: 2.36
	 */
	public FileIF getChild(FileInfo info)
	{
		auto __p = g_file_enumerator_get_child(gFileEnumerator, (info is null) ? null : info.getFileInfoStruct());

		if(__p is null)
		{
			return null;
		}

		return ObjectG.getDObject!(FileIF)(cast(GFile*) __p, true);
	}

	/**
	 * Get the #GFile container which is being enumerated.
	 *
	 * Returns: the #GFile which is being enumerated.
	 *
	 * Since: 2.18
	 */
	public FileIF getContainer()
	{
		auto __p = g_file_enumerator_get_container(gFileEnumerator);

		if(__p is null)
		{
			return null;
		}

		return ObjectG.getDObject!(FileIF)(cast(GFile*) __p);
	}

	/**
	 * Checks if the file enumerator has pending operations.
	 *
	 * Returns: %TRUE if the @enumerator has pending operations.
	 */
	public bool hasPending()
	{
		return g_file_enumerator_has_pending(gFileEnumerator) != 0;
	}

	/**
	 * Checks if the file enumerator has been closed.
	 *
	 * Returns: %TRUE if the @enumerator is closed.
	 */
	public bool isClosed()
	{
		return g_file_enumerator_is_closed(gFileEnumerator) != 0;
	}

	/**
	 * This is a version of g_file_enumerator_next_file() that's easier to
	 * use correctly from C programs.  With g_file_enumerator_next_file(),
	 * the gboolean return value signifies "end of iteration or error", which
	 * requires allocation of a temporary #GError.
	 *
	 * In contrast, with this function, a %FALSE return from
	 * g_file_enumerator_iterate() *always* means
	 * "error".  End of iteration is signaled by @out_info or @out_child being %NULL.
	 *
	 * Another crucial difference is that the references for @out_info and
	 * @out_child are owned by @direnum (they are cached as hidden
	 * properties).  You must not unref them in your own code.  This makes
	 * memory management significantly easier for C code in combination
	 * with loops.
	 *
	 * Finally, this function optionally allows retrieving a #GFile as
	 * well.
	 *
	 * You must specify at least one of @out_info or @out_child.
	 *
	 * The code pattern for correctly using g_file_enumerator_iterate() from C
	 * is:
	 *
	 * |[
	 * direnum = g_file_enumerate_children (file, ...);
	 * while (TRUE)
	 * {
	 * GFileInfo *info;
	 * if (!g_file_enumerator_iterate (direnum, &info, NULL, cancellable, error))
	 * goto out;
	 * if (!info)
	 * break;
	 * ... do stuff with "info"; do not unref it! ...
	 * }
	 *
	 * out:
	 * g_object_unref (direnum); // Note: frees the last @info
	 * ]|
	 *
	 * Params:
	 *     outInfo = Output location for the next #GFileInfo, or %NULL
	 *     outChild = Output location for the next #GFile, or %NULL
	 *     cancellable = a #GCancellable
	 *
	 * Since: 2.44
	 *
	 * Throws: GException on failure.
	 */
	public bool iterate(out FileInfo outInfo, out FileIF outChild, Cancellable cancellable)
	{
		GFileInfo* outoutInfo = null;
		GFile* outoutChild = null;
		GError* err = null;

		auto __p = g_file_enumerator_iterate(gFileEnumerator, &outoutInfo, &outoutChild, (cancellable is null) ? null : cancellable.getCancellableStruct(), &err) != 0;

		if (err !is null)
		{
			throw new GException( new ErrorG(err) );
		}

		outInfo = ObjectG.getDObject!(FileInfo)(outoutInfo);
		outChild = ObjectG.getDObject!(FileIF)(outoutChild);

		return __p;
	}

	/**
	 * Returns information for the next file in the enumerated object.
	 * Will block until the information is available. The #GFileInfo
	 * returned from this function will contain attributes that match the
	 * attribute string that was passed when the #GFileEnumerator was created.
	 *
	 * See the documentation of #GFileEnumerator for information about the
	 * order of returned files.
	 *
	 * On error, returns %NULL and sets @error to the error. If the
	 * enumerator is at the end, %NULL will be returned and @error will
	 * be unset.
	 *
	 * Params:
	 *     cancellable = optional #GCancellable object, %NULL to ignore.
	 *
	 * Returns: A #GFileInfo or %NULL on error
	 *     or end of enumerator.  Free the returned object with
	 *     g_object_unref() when no longer needed.
	 *
	 * Throws: GException on failure.
	 */
	public FileInfo nextFile(Cancellable cancellable)
	{
		GError* err = null;

		auto __p = g_file_enumerator_next_file(gFileEnumerator, (cancellable is null) ? null : cancellable.getCancellableStruct(), &err);

		if (err !is null)
		{
			throw new GException( new ErrorG(err) );
		}

		if(__p is null)
		{
			return null;
		}

		return ObjectG.getDObject!(FileInfo)(cast(GFileInfo*) __p, true);
	}

	/**
	 * 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
	 * the requested information.
	 *
	 * See the documentation of #GFileEnumerator for information about the
	 * order of returned files.
	 *
	 * 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
	 * be executed before an outstanding request with lower priority. Default
	 * priority is %G_PRIORITY_DEFAULT.
	 *
	 * Params:
	 *     numFiles = the number of file info objects to request
	 *     ioPriority = the [I/O priority](iface.AsyncResult.html#io-priority) of the request
	 *     cancellable = optional #GCancellable object, %NULL to ignore.
	 *     callback = a #GAsyncReadyCallback
	 *         to call when the request is satisfied
	 *     userData = the data to pass to callback function
	 */
	public void nextFilesAsync(int numFiles, int ioPriority, Cancellable cancellable, GAsyncReadyCallback callback, void* userData)
	{
		g_file_enumerator_next_files_async(gFileEnumerator, numFiles, ioPriority, (cancellable is null) ? null : cancellable.getCancellableStruct(), callback, userData);
	}

	/**
	 * Finishes the asynchronous operation started with g_file_enumerator_next_files_async().
	 *
	 * Params:
	 *     result = a #GAsyncResult.
	 *
	 * Returns: a #GList of #GFileInfos. You must free the list with
	 *     g_list_free() and unref the infos with g_object_unref() when you're
	 *     done with them.
	 *
	 * Throws: GException on failure.
	 */
	public ListG nextFilesFinish(AsyncResultIF result)
	{
		GError* err = null;

		auto __p = g_file_enumerator_next_files_finish(gFileEnumerator, (result is null) ? null : result.getAsyncResultStruct(), &err);

		if (err !is null)
		{
			throw new GException( new ErrorG(err) );
		}

		if(__p is null)
		{
			return null;
		}

		return new ListG(cast(GList*) __p, true);
	}

	/**
	 * Sets the file enumerator as having pending operations.
	 *
	 * Params:
	 *     pending = a boolean value.
	 */
	public void setPending(bool pending)
	{
		g_file_enumerator_set_pending(gFileEnumerator, pending);
	}
}
