*/
#include "config.h"
+#ifdef HAVE_SPLICE
+#include <sys/stat.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <errno.h>
+#endif
#include <string.h>
#include <sys/types.h>
#ifdef HAVE_PWD_H
#include "gioscheduler.h"
#include "gsimpleasyncresult.h"
#include "gfileattribute-priv.h"
+#include "gfiledescriptorbased.h"
#include "gpollfilemonitor.h"
#include "gappinfo.h"
#include "gfileinputstream.h"
#include "gfileoutputstream.h"
+#include "glocalfileoutputstream.h"
+#include "glocalfileiostream.h"
#include "gcancellable.h"
#include "gasyncresult.h"
#include "gioerror.h"
#include "glibintl.h"
-#include "gioalias.h"
/**
* SECTION:gfile
* g_file_new_for_path() if you have a path.
* g_file_new_for_uri() if you have a URI.
* g_file_new_for_commandline_arg() for a command line argument.
+ * g_file_new_tmp() to create a temporary file from a template.
* g_file_parse_name() from a utf8 string gotten from g_file_get_parse_name().
*
* One way to think of a #GFile is as an abstraction of a pathname. For normal
*
* This call does no blocking i/o.
*
- * Returns: a new #GFile that is a duplicate of the given #GFile.
+ * Returns: (transfer full): a new #GFile that is a duplicate of the given #GFile.
**/
GFile *
g_file_dup (GFile *file)
/**
* g_file_hash:
- * @file: #gconstpointer to a #GFile.
+ * @file: (type GFile): #gconstpointer to a #GFile.
*
* Creates a hash value for a #GFile.
*
* This call does no blocking i/o.
- *
+ *
+ * Virtual: hash
* Returns: 0 if @file is not a valid #GFile, otherwise an
* integer that can be used as hash value for the #GFile.
* This function is intended for easily hashing a #GFile to
*
* This call does no blocking i/o.
*
- * Returns: a #GFile structure to the parent of the given
+ * Returns: (transfer full): a #GFile structure to the parent of the given
* #GFile or %NULL if there is no parent.
* Free the returned object with g_object_unref().
**/
*
* This call does no blocking i/o.
*
- * Returns: a #GFile to a child specified by @name.
+ * Returns: (transfer full): a #GFile to a child specified by @name.
* Free the returned object with g_object_unref().
**/
GFile *
*
* This call does no blocking i/o.
*
- * Returns: a #GFile to the specified child, or
+ * Returns: (transfer full): a #GFile to the specified child, or
* %NULL if the display name couldn't be converted.
* Free the returned object with g_object_unref().
**/
* @prefix: input #GFile.
*
* Checks whether @file has the prefix specified by @prefix. In other word,
- * if the names of inital elements of @file<!-- -->s pathname match @prefix.
+ * if the names of initial elements of @file<!-- -->s pathname match @prefix.
* Only full pathname elements are matched, so a path like /foo is not
* considered a prefix of /foobar, only of /foo/bar.
*
* filesystem point of view), because the prefix of @file is an alias
* of @prefix.
*
+ * Virtual: prefix_matches
* Returns: %TRUE if the @files's parent, grandparent, etc is @prefix.
* %FALSE otherwise.
**/
*
* This call does no blocking i/o.
*
- * Returns: #GFile to the resolved path. %NULL if @relative_path
+ * Returns: (transfer full): #GFile to the resolved path. %NULL if @relative_path
* is %NULL or if @file is invalid.
* Free the returned object with g_object_unref().
**/
* @file: input #GFile.
* @attributes: an attribute query string.
* @flags: a set of #GFileQueryInfoFlags.
- * @cancellable: optional #GCancellable object, %NULL to ignore.
+ * @cancellable: (allow-none): optional #GCancellable object, %NULL to ignore.
* @error: #GError for error reporting.
*
* Gets the requested information about the files in a directory. The result
* is a #GFileEnumerator object that will give out #GFileInfo objects for
* all the files in the directory.
*
- * The @attribute value is a string that specifies the file attributes that
+ * The @attributes value is a string that specifies the file attributes that
* should be gathered. It is not an error if it's not possible to read a particular
- * requested attribute from a file - it just won't be set. @attribute should
- * be a comma-separated list of attribute or attribute wildcards. The wildcard "*"
+ * requested attribute from a file - it just won't be set. @attributes should
+ * be a comma-separated list of attributes or attribute wildcards. The wildcard "*"
* means all attributes, and a wildcard like "standard::*" means all attributes in the standard
* namespace. An example attribute query be "standard::*,owner::user".
* The standard attributes are available as defines, like #G_FILE_ATTRIBUTE_STANDARD_NAME.
* If the file is not a directory, the G_FILE_ERROR_NOTDIR error will be returned.
* Other errors are possible too.
*
- * Returns: A #GFileEnumerator if successful, %NULL on error.
+ * Returns: (transfer full): A #GFileEnumerator if successful, %NULL on error.
* Free the returned object with g_object_unref().
**/
GFileEnumerator *
* @flags: a set of #GFileQueryInfoFlags.
* @io_priority: the <link linkend="io-priority">I/O priority</link>
* of the request.
- * @cancellable: optional #GCancellable object, %NULL to ignore.
- * @callback: a #GAsyncReadyCallback to call when the request is satisfied
- * @user_data: the data to pass to callback function
+ * @cancellable: (allow-none): optional #GCancellable object, %NULL to ignore.
+ * @callback: (scope async): a #GAsyncReadyCallback to call when the
+ * request is satisfied
+ * @user_data: (closure): the data to pass to callback function
*
* Asynchronously gets the requested information about the files in a directory. The result
* is a #GFileEnumerator object that will give out #GFileInfo objects for
* Finishes an async enumerate children operation.
* See g_file_enumerate_children_async().
*
- * Returns: a #GFileEnumerator or %NULL if an error occurred.
+ * Returns: (transfer full): a #GFileEnumerator or %NULL if an error occurred.
* Free the returned object with g_object_unref().
**/
GFileEnumerator *
/**
* g_file_query_exists:
* @file: input #GFile.
- * @cancellable: optional #GCancellable object, %NULL to ignore.
+ * @cancellable: (allow-none): optional #GCancellable object, %NULL to ignore.
*
* Utility function to check if a particular file exists. This is
* implemented using g_file_query_info() and as such does blocking I/O.
* g_file_query_file_type:
* @file: input #GFile.
* @flags: a set of #GFileQueryInfoFlags passed to g_file_query_info().
- * @cancellable: optional #GCancellable object, %NULL to ignore.
+ * @cancellable: (allow-none): optional #GCancellable object, %NULL to ignore.
*
* Utility function to inspect the #GFileType of a file. This is
* implemented using g_file_query_info() and as such does blocking I/O.
* @file: input #GFile.
* @attributes: an attribute query string.
* @flags: a set of #GFileQueryInfoFlags.
- * @cancellable: optional #GCancellable object, %NULL to ignore.
+ * @cancellable: (allow-none): optional #GCancellable object, %NULL to ignore.
* @error: a #GError.
*
* Gets the requested information about specified @file. The result
* is a #GFileInfo object that contains key-value attributes (such as
* the type or size of the file).
*
- * The @attribute value is a string that specifies the file attributes that
+ * The @attributes value is a string that specifies the file attributes that
* should be gathered. It is not an error if it's not possible to read a particular
- * requested attribute from a file - it just won't be set. @attribute should
- * be a comma-separated list of attribute or attribute wildcards. The wildcard "*"
+ * requested attribute from a file - it just won't be set. @attributes should
+ * be a comma-separated list of attributes or attribute wildcards. The wildcard "*"
* means all attributes, and a wildcard like "standard::*" means all attributes in the standard
* namespace. An example attribute query be "standard::*,owner::user".
* The standard attributes are available as defines, like #G_FILE_ATTRIBUTE_STANDARD_NAME.
* If the file does not exist, the G_IO_ERROR_NOT_FOUND error will be returned.
* Other errors are possible too, and depend on what kind of filesystem the file is on.
*
- * Returns: a #GFileInfo for the given @file, or %NULL on error.
+ * Returns: (transfer full): a #GFileInfo for the given @file, or %NULL on error.
* Free the returned object with g_object_unref().
**/
GFileInfo *
* @flags: a set of #GFileQueryInfoFlags.
* @io_priority: the <link linkend="io-priority">I/O priority</link>
* of the request.
- * @cancellable: optional #GCancellable object, %NULL to ignore.
- * @callback: a #GAsyncReadyCallback to call when the request is satisfied
- * @user_data: the data to pass to callback function
+ * @cancellable: (allow-none): optional #GCancellable object, %NULL to ignore.
+ * @callback: (scope async): a #GAsyncReadyCallback to call when the request is satisfied
+ * @user_data: (closure): the data to pass to callback function
*
* Asynchronously gets the requested information about specified @file. The result
* is a #GFileInfo object that contains key-value attributes (such as type or size
* Finishes an asynchronous file info query.
* See g_file_query_info_async().
*
- * Returns: #GFileInfo for given @file or %NULL on error.
+ * Returns: (transfer full): #GFileInfo for given @file or %NULL on error.
* Free the returned object with g_object_unref().
**/
GFileInfo *
* g_file_query_filesystem_info:
* @file: input #GFile.
* @attributes: an attribute query string.
- * @cancellable: optional #GCancellable object, %NULL to ignore.
+ * @cancellable: (allow-none): optional #GCancellable object, %NULL to ignore.
* @error: a #GError.
*
* Similar to g_file_query_info(), but obtains information
* For instance the amount of space available and the type of
* the filesystem.
*
- * The @attribute value is a string that specifies the file attributes that
+ * The @attributes value is a string that specifies the file attributes that
* should be gathered. It is not an error if it's not possible to read a particular
- * requested attribute from a file - it just won't be set. @attribute should
- * be a comma-separated list of attribute or attribute wildcards. The wildcard "*"
- * means all attributes, and a wildcard like "fs:*" means all attributes in the fs
- * namespace. The standard namespace for filesystem attributes is "fs".
+ * requested attribute from a file - it just won't be set. @attributes should
+ * be a comma-separated list of attributes or attribute wildcards. The wildcard "*"
+ * means all attributes, and a wildcard like "filesystem::*" means all attributes in the
+ * filesystem namespace. The standard namespace for filesystem attributes is "filesystem".
* Common attributes of interest are #G_FILE_ATTRIBUTE_FILESYSTEM_SIZE
* (the total size of the filesystem in bytes), #G_FILE_ATTRIBUTE_FILESYSTEM_FREE (number of
* bytes available), and #G_FILE_ATTRIBUTE_FILESYSTEM_TYPE (type of the filesystem).
* If the file does not exist, the G_IO_ERROR_NOT_FOUND error will be returned.
* Other errors are possible too, and depend on what kind of filesystem the file is on.
*
- * Returns: a #GFileInfo or %NULL if there was an error.
+ * Returns: (transfer full): a #GFileInfo or %NULL if there was an error.
* Free the returned object with g_object_unref().
**/
GFileInfo *
* @attributes: an attribute query string.
* @io_priority: the <link linkend="io-priority">I/O priority</link>
* of the request.
- * @cancellable: optional #GCancellable object, %NULL to ignore.
- * @callback: a #GAsyncReadyCallback to call when the request is satisfied
- * @user_data: the data to pass to callback function
+ * @cancellable: (allow-none): optional #GCancellable object, %NULL to ignore.
+ * @callback: (scope async): a #GAsyncReadyCallback to call when the request is satisfied
+ * @user_data: (closure): the data to pass to callback function
*
* Asynchronously gets the requested information about the filesystem
* that the specified @file is on. The result is a #GFileInfo object
* Finishes an asynchronous filesystem info query. See
* g_file_query_filesystem_info_async().
*
- * Returns: #GFileInfo for given @file or %NULL on error.
+ * Returns: (transfer full): #GFileInfo for given @file or %NULL on error.
* Free the returned object with g_object_unref().
**/
GFileInfo *
/**
* g_file_find_enclosing_mount:
* @file: input #GFile.
- * @cancellable: optional #GCancellable object, %NULL to ignore.
+ * @cancellable: (allow-none): optional #GCancellable object, %NULL to ignore.
* @error: a #GError.
*
* Gets a #GMount for the #GFile.
* triggering the cancellable object from another thread. If the operation
* was cancelled, the error %G_IO_ERROR_CANCELLED will be returned.
*
- * Returns: a #GMount where the @file is located or %NULL on error.
+ * Returns: (transfer full): a #GMount where the @file is located or %NULL on error.
* Free the returned object with g_object_unref().
**/
GMount *
* @file: a #GFile
* @io_priority: the <link linkend="io-priority">I/O priority</link>
* of the request.
- * @cancellable: optional #GCancellable object, %NULL to ignore.
- * @callback: a #GAsyncReadyCallback to call when the request is satisfied
- * @user_data: the data to pass to callback function
+ * @cancellable: (allow-none): optional #GCancellable object, %NULL to ignore.
+ * @callback: (scope async): a #GAsyncReadyCallback to call when the request is satisfied
+ * @user_data: (closure): the data to pass to callback function
*
* Asynchronously gets the mount for the file.
*
* Finishes an asynchronous find mount request.
* See g_file_find_enclosing_mount_async().
*
- * Returns: #GMount for given @file or %NULL on error.
+ * Returns: (transfer full): #GMount for given @file or %NULL on error.
* Free the returned object with g_object_unref().
**/
GMount *
/**
* g_file_read:
* @file: #GFile to read.
- * @cancellable: a #GCancellable
+ * @cancellable: (allow-none): a #GCancellable
* @error: a #GError, or %NULL
*
* Opens a file for reading. The result is a #GFileInputStream that
* If the file is a directory, the G_IO_ERROR_IS_DIRECTORY error will be returned.
* Other errors are possible too, and depend on what kind of filesystem the file is on.
*
- * Returns: #GFileInputStream or %NULL on error.
+ * Virtual: read_fn
+ * Returns: (transfer full): #GFileInputStream or %NULL on error.
* Free the returned object with g_object_unref().
**/
GFileInputStream *
* g_file_append_to:
* @file: input #GFile.
* @flags: a set of #GFileCreateFlags.
- * @cancellable: optional #GCancellable object, %NULL to ignore.
+ * @cancellable: (allow-none): optional #GCancellable object, %NULL to ignore.
* @error: a #GError, or %NULL
*
* Gets an output stream for appending data to the file. If
* returned. Other errors are possible too, and depend on what kind of
* filesystem the file is on.
*
- * Returns: a #GFileOutputStream, or %NULL on error.
+ * Returns: (transfer full): a #GFileOutputStream, or %NULL on error.
* Free the returned object with g_object_unref().
**/
GFileOutputStream *
* g_file_create:
* @file: input #GFile.
* @flags: a set of #GFileCreateFlags.
- * @cancellable: optional #GCancellable object, %NULL to ignore.
+ * @cancellable: (allow-none): optional #GCancellable object, %NULL to ignore.
* @error: a #GError, or %NULL
*
* Creates a new file and returns an output stream for writing to it.
* Other errors are possible too, and depend on what kind of
* filesystem the file is on.
*
- * Returns: a #GFileOutputStream for the newly created file, or
+ * Returns: (transfer full): a #GFileOutputStream for the newly created file, or
* %NULL on error.
* Free the returned object with g_object_unref().
**/
/**
* g_file_replace:
* @file: input #GFile.
- * @etag: an optional <link linkend="gfile-etag">entity tag</link> for the
+ * @etag: (allow-none): an optional <link linkend="gfile-etag">entity tag</link> for the
* current #GFile, or #NULL to ignore.
* @make_backup: %TRUE if a backup should be created.
* @flags: a set of #GFileCreateFlags.
- * @cancellable: optional #GCancellable object, %NULL to ignore.
+ * @cancellable: (allow-none): optional #GCancellable object, %NULL to ignore.
* @error: a #GError, or %NULL
*
* Returns an output stream for overwriting the file, possibly
* Other errors are possible too, and depend on what kind of
* filesystem the file is on.
*
- * Returns: a #GFileOutputStream or %NULL on error.
+ * Returns: (transfer full): a #GFileOutputStream or %NULL on error.
* Free the returned object with g_object_unref().
**/
GFileOutputStream *
/**
* g_file_open_readwrite:
* @file: #GFile to open
- * @cancellable: a #GCancellable
+ * @cancellable: (allow-none): a #GCancellable
* @error: a #GError, or %NULL
*
* Opens an existing file for reading and writing. The result is
* so make sure you really need to do read and write streaming, rather than
* just opening for reading or writing.
*
- * Returns: #GFileIOStream or %NULL on error.
+ * Returns: (transfer full): #GFileIOStream or %NULL on error.
* Free the returned object with g_object_unref().
*
* Since: 2.22
* g_file_create_readwrite:
* @file: a #GFile
* @flags: a set of #GFileCreateFlags
- * @cancellable: optional #GCancellable object, %NULL to ignore
+ * @cancellable: (allow-none): optional #GCancellable object, %NULL to ignore
* @error: return location for a #GError, or %NULL
*
* Creates a new file and returns a stream for reading and writing to it.
* supported, so make sure you really need to do read and write streaming,
* rather than just opening for reading or writing.
*
- * Returns: a #GFileIOStream for the newly created file, or %NULL on error.
+ * Returns: (transfer full): a #GFileIOStream for the newly created file, or %NULL on error.
* Free the returned object with g_object_unref().
*
* Since: 2.22
/**
* g_file_replace_readwrite:
* @file: a #GFile
- * @etag: an optional <link linkend="gfile-etag">entity tag</link> for the
+ * @etag: (allow-none): an optional <link linkend="gfile-etag">entity tag</link> for the
* current #GFile, or #NULL to ignore
* @make_backup: %TRUE if a backup should be created
* @flags: a set of #GFileCreateFlags
- * @cancellable: optional #GCancellable object, %NULL to ignore
+ * @cancellable: (allow-none): optional #GCancellable object, %NULL to ignore
* @error: return location for a #GError, or %NULL
*
* Returns an output stream for overwriting the file in readwrite mode,
* supported, so make sure you really need to do read and write streaming,
* rather than just opening for reading or writing.
*
- * Returns: a #GFileIOStream or %NULL on error.
+ * Returns: (transfer full): a #GFileIOStream or %NULL on error.
* Free the returned object with g_object_unref().
*
* Since: 2.22
* @file: input #GFile
* @io_priority: the <link linkend="io-priority">I/O priority</link>
* of the request.
- * @cancellable: optional #GCancellable object, %NULL to ignore.
- * @callback: a #GAsyncReadyCallback to call when the request is satisfied
- * @user_data: the data to pass to callback function
+ * @cancellable: (allow-none): optional #GCancellable object, %NULL to ignore.
+ * @callback: (scope async): a #GAsyncReadyCallback to call when the request is satisfied
+ * @user_data: (closure): the data to pass to callback function
*
* Asynchronously opens @file for reading.
*
* Finishes an asynchronous file read operation started with
* g_file_read_async().
*
- * Returns: a #GFileInputStream or %NULL on error.
+ * Returns: (transfer full): a #GFileInputStream or %NULL on error.
* Free the returned object with g_object_unref().
**/
GFileInputStream *
* @flags: a set of #GFileCreateFlags.
* @io_priority: the <link linkend="io-priority">I/O priority</link>
* of the request.
- * @cancellable: optional #GCancellable object, %NULL to ignore.
- * @callback: a #GAsyncReadyCallback to call when the request is satisfied
- * @user_data: the data to pass to callback function
+ * @cancellable: (allow-none): optional #GCancellable object, %NULL to ignore.
+ * @callback: (scope async): a #GAsyncReadyCallback to call when the request is satisfied
+ * @user_data: (closure): the data to pass to callback function
*
* Asynchronously opens @file for appending.
*
* Finishes an asynchronous file append operation started with
* g_file_append_to_async().
*
- * Returns: a valid #GFileOutputStream or %NULL on error.
+ * Returns: (transfer full): a valid #GFileOutputStream or %NULL on error.
* Free the returned object with g_object_unref().
**/
GFileOutputStream *
* @flags: a set of #GFileCreateFlags.
* @io_priority: the <link linkend="io-priority">I/O priority</link>
* of the request.
- * @cancellable: optional #GCancellable object, %NULL to ignore.
- * @callback: a #GAsyncReadyCallback to call when the request is satisfied
- * @user_data: the data to pass to callback function
+ * @cancellable: (allow-none): optional #GCancellable object, %NULL to ignore.
+ * @callback: (scope async): a #GAsyncReadyCallback to call when the request is satisfied
+ * @user_data: (closure): the data to pass to callback function
*
* Asynchronously creates a new file and returns an output stream for writing to it.
* The file must not already exist.
* Finishes an asynchronous file create operation started with
* g_file_create_async().
*
- * Returns: a #GFileOutputStream or %NULL on error.
+ * Returns: (transfer full): a #GFileOutputStream or %NULL on error.
* Free the returned object with g_object_unref().
**/
GFileOutputStream *
/**
* g_file_replace_async:
* @file: input #GFile.
- * @etag: an <link linkend="gfile-etag">entity tag</link> for the
+ * @etag: (allow-none): an <link linkend="gfile-etag">entity tag</link> for the
* current #GFile, or NULL to ignore.
* @make_backup: %TRUE if a backup should be created.
* @flags: a set of #GFileCreateFlags.
* @io_priority: the <link linkend="io-priority">I/O priority</link>
* of the request.
- * @cancellable: optional #GCancellable object, %NULL to ignore.
- * @callback: a #GAsyncReadyCallback to call when the request is satisfied
- * @user_data: the data to pass to callback function
+ * @cancellable: (allow-none): optional #GCancellable object, %NULL to ignore.
+ * @callback: (scope async): a #GAsyncReadyCallback to call when the request is satisfied
+ * @user_data: (closure): the data to pass to callback function
*
* Asynchronously overwrites the file, replacing the contents, possibly
* creating a backup copy of the file first.
* Finishes an asynchronous file replace operation started with
* g_file_replace_async().
*
- * Returns: a #GFileOutputStream, or %NULL on error.
+ * Returns: (transfer full): a #GFileOutputStream, or %NULL on error.
* Free the returned object with g_object_unref().
**/
GFileOutputStream *
if (g_simple_async_result_propagate_error (simple, error))
return NULL;
}
-
+
iface = G_FILE_GET_IFACE (file);
return (* iface->replace_finish) (file, res, error);
}
* @file: input #GFile.
* @io_priority: the <link linkend="io-priority">I/O priority</link>
* of the request.
- * @cancellable: optional #GCancellable object, %NULL to ignore.
- * @callback: a #GAsyncReadyCallback to call when the request is satisfied
- * @user_data: the data to pass to callback function
+ * @cancellable: (allow-none): optional #GCancellable object, %NULL to ignore.
+ * @callback: (scope async): a #GAsyncReadyCallback to call when the request is satisfied
+ * @user_data: (closure): the data to pass to callback function
*
* Asynchronously opens @file for reading and writing.
*
* Finishes an asynchronous file read operation started with
* g_file_open_readwrite_async().
*
- * Returns: a #GFileIOStream or %NULL on error.
+ * Returns: (transfer full): a #GFileIOStream or %NULL on error.
* Free the returned object with g_object_unref().
*
* Since: 2.22
* @flags: a set of #GFileCreateFlags
* @io_priority: the <link linkend="io-priority">I/O priority</link>
* of the request
- * @cancellable: optional #GCancellable object, %NULL to ignore
- * @callback: a #GAsyncReadyCallback to call when the request is satisfied
- * @user_data: the data to pass to callback function
+ * @cancellable: (allow-none): optional #GCancellable object, %NULL to ignore
+ * @callback: (scope async): a #GAsyncReadyCallback to call when the request is satisfied
+ * @user_data: (closure): the data to pass to callback function
*
* Asynchronously creates a new file and returns a stream for reading and
* writing to it. The file must not already exist.
* Finishes an asynchronous file create operation started with
* g_file_create_readwrite_async().
*
- * Returns: a #GFileIOStream or %NULL on error.
+ * Returns: (transfer full): a #GFileIOStream or %NULL on error.
* Free the returned object with g_object_unref().
*
* Since: 2.22
/**
* g_file_replace_readwrite_async:
* @file: input #GFile.
- * @etag: an <link linkend="gfile-etag">entity tag</link> for the
+ * @etag: (allow-none): an <link linkend="gfile-etag">entity tag</link> for the
* current #GFile, or NULL to ignore.
* @make_backup: %TRUE if a backup should be created.
* @flags: a set of #GFileCreateFlags.
* @io_priority: the <link linkend="io-priority">I/O priority</link>
* of the request.
- * @cancellable: optional #GCancellable object, %NULL to ignore.
- * @callback: a #GAsyncReadyCallback to call when the request is satisfied
- * @user_data: the data to pass to callback function
+ * @cancellable: (allow-none): optional #GCancellable object, %NULL to ignore.
+ * @callback: (scope async): a #GAsyncReadyCallback to call when the request is satisfied
+ * @user_data: (closure): the data to pass to callback function
*
* Asynchronously overwrites the file in read-write mode, replacing the
* contents, possibly creating a backup copy of the file first.
* Finishes an asynchronous file replace operation started with
* g_file_replace_readwrite_async().
*
- * Returns: a #GFileIOStream, or %NULL on error.
+ * Returns: (transfer full): a #GFileIOStream, or %NULL on error.
* Free the returned object with g_object_unref().
*
* Since: 2.22
info = g_file_query_info (destination, G_FILE_ATTRIBUTE_STANDARD_TYPE,
G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS,
cancellable, &my_error);
- if (info != NULL)
+ if (info != NULL &&
+ g_file_info_has_attribute (info, G_FILE_ATTRIBUTE_STANDARD_TYPE))
{
file_type = g_file_info_get_file_type (info);
g_object_unref (info);
/* Error getting info from target, return that error
* (except for NOT_FOUND, which is no error here)
*/
- if (my_error->domain != G_IO_ERROR && my_error->code != G_IO_ERROR_NOT_FOUND)
+ if (my_error != NULL && !g_error_matches (my_error, G_IO_ERROR, G_IO_ERROR_NOT_FOUND))
{
g_propagate_error (error, my_error);
return NULL;
}
- g_error_free (my_error);
+ g_clear_error (&my_error);
}
g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_WOULD_RECURSE,
* @source: a #GFile with attributes.
* @destination: a #GFile to copy attributes to.
* @flags: a set of #GFileCopyFlags.
- * @cancellable: optional #GCancellable object, %NULL to ignore.
+ * @cancellable: (allow-none): optional #GCancellable object, %NULL to ignore.
* @error: a #GError, %NULL to ignore.
*
* Copies the file attributes from @source to @destination.
return res;
}
-/* Closes the streams */
static gboolean
copy_stream_with_progress (GInputStream *in,
GOutputStream *out,
progress_callback (current_size, total_size, progress_callback_data);
}
- if (!res)
- error = NULL; /* Ignore further errors */
-
/* Make sure we send full copied size */
if (progress_callback)
progress_callback (current_size, total_size, progress_callback_data);
-
- /* Don't care about errors in source here */
- g_input_stream_close (in, cancellable, NULL);
- /* But write errors on close are bad! */
- if (!g_output_stream_close (out, cancellable, error))
- res = FALSE;
+ return res;
+}
+
+#ifdef HAVE_SPLICE
+
+static gboolean
+do_splice (int fd_in,
+ loff_t *off_in,
+ int fd_out,
+ loff_t *off_out,
+ size_t len,
+ long *bytes_transferd,
+ GError **error)
+{
+ long result;
+
+retry:
+ result = splice (fd_in, off_in, fd_out, off_out, len, SPLICE_F_MORE);
+
+ if (result == -1)
+ {
+ int errsv = errno;
+
+ if (errsv == EINTR)
+ goto retry;
+ else if (errsv == ENOSYS || errsv == EINVAL)
+ g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED,
+ _("Splice not supported"));
+ else
+ g_set_error (error, G_IO_ERROR,
+ g_io_error_from_errno (errsv),
+ _("Error splicing file: %s"),
+ g_strerror (errsv));
+
+ return FALSE;
+ }
+
+ *bytes_transferd = result;
+ return TRUE;
+}
+
+static gboolean
+splice_stream_with_progress (GInputStream *in,
+ GOutputStream *out,
+ GCancellable *cancellable,
+ GFileProgressCallback progress_callback,
+ gpointer progress_callback_data,
+ GError **error)
+{
+ int buffer[2];
+ gboolean res;
+ goffset total_size;
+ loff_t offset_in;
+ loff_t offset_out;
+ int fd_in, fd_out;
+
+ fd_in = g_file_descriptor_based_get_fd (G_FILE_DESCRIPTOR_BASED (in));
+ fd_out = g_file_descriptor_based_get_fd (G_FILE_DESCRIPTOR_BASED (out));
+
+ if (pipe (buffer) != 0)
+ {
+ g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED,
+ "Pipe creation failed");
+ return FALSE;
+ }
+
+ total_size = -1;
+ /* avoid performance impact of querying total size when it's not needed */
+ if (progress_callback)
+ {
+ struct stat sbuf;
+
+ if (fstat (fd_in, &sbuf) == 0)
+ total_size = sbuf.st_size;
+ }
+
+ if (total_size == -1)
+ total_size = 0;
+
+ offset_in = offset_out = 0;
+ res = FALSE;
+ while (TRUE)
+ {
+ long n_read;
+ long n_written;
+
+ if (g_cancellable_set_error_if_cancelled (cancellable, error))
+ break;
+
+ if (!do_splice (fd_in, &offset_in, buffer[1], NULL, 1024*64, &n_read, error))
+ break;
+
+ if (n_read == 0)
+ {
+ res = TRUE;
+ break;
+ }
+
+ while (n_read > 0)
+ {
+ if (g_cancellable_set_error_if_cancelled (cancellable, error))
+ goto out;
+
+ if (!do_splice (buffer[0], NULL, fd_out, &offset_out, n_read, &n_written, error))
+ goto out;
+
+ n_read -= n_written;
+ }
+
+ if (progress_callback)
+ progress_callback (offset_in, total_size, progress_callback_data);
+ }
+
+ /* Make sure we send full copied size */
+ if (progress_callback)
+ progress_callback (offset_in, total_size, progress_callback_data);
+
+ out:
+ close (buffer[0]);
+ close (buffer[1]);
- g_object_unref (in);
- g_object_unref (out);
-
return res;
}
+#endif
static gboolean
file_copy_fallback (GFile *source,
GOutputStream *out;
GFileInfo *info;
const char *target;
+ gboolean result;
+#ifdef HAVE_SPLICE
+ gboolean fallback = TRUE;
+#endif
/* need to know the file type */
info = g_file_query_info (source,
return FALSE;
}
- if (!copy_stream_with_progress (in, out, source, cancellable,
- progress_callback, progress_callback_data,
- error))
+#ifdef HAVE_SPLICE
+ if (G_IS_FILE_DESCRIPTOR_BASED (in) && G_IS_FILE_DESCRIPTOR_BASED (out))
+ {
+ GError *splice_err = NULL;
+
+ result = splice_stream_with_progress (in, out, cancellable,
+ progress_callback, progress_callback_data,
+ &splice_err);
+
+ if (result || !g_error_matches (splice_err, G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED))
+ {
+ fallback = FALSE;
+ if (!result)
+ g_propagate_error (error, splice_err);
+ }
+ else
+ g_clear_error (&splice_err);
+ }
+
+ if (fallback)
+#endif
+ result = copy_stream_with_progress (in, out, source, cancellable,
+ progress_callback, progress_callback_data,
+ error);
+
+ /* Don't care about errors in source here */
+ g_input_stream_close (in, cancellable, NULL);
+
+ /* But write errors on close are bad! */
+ if (!g_output_stream_close (out, cancellable, result ? error : NULL))
+ result = FALSE;
+
+ g_object_unref (in);
+ g_object_unref (out);
+
+ if (result == FALSE)
return FALSE;
copied_file:
-
/* Ignore errors here. Failure to copy metadata is not a hard error */
g_file_copy_attributes (source, destination,
flags, cancellable, NULL);
* @source: input #GFile.
* @destination: destination #GFile
* @flags: set of #GFileCopyFlags
- * @cancellable: optional #GCancellable object, %NULL to ignore.
- * @progress_callback: function to callback with progress information
- * @progress_callback_data: user data to pass to @progress_callback
+ * @cancellable: (allow-none): optional #GCancellable object, %NULL to ignore
+ * @progress_callback: (allow-none) (scope call): function to callback with
+ * progress information, or %NULL if progress information is not needed
+ * @progress_callback_data: (closure): user data to pass to @progress_callback
* @error: #GError to set on error, or %NULL
*
* Copies the file @source to the location specified by @destination.
*
* 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.
- *
+ * was cancelled, the error %G_IO_ERROR_CANCELLED will be returned.
+ *
* If @progress_callback is not %NULL, then the operation can be monitored by
* setting this to a #GFileProgressCallback function. @progress_callback_data
* will be passed to this function. It is guaranteed that this callback will
* be called after all data has been transferred with the total number of bytes
* copied during the operation.
- *
+ *
* If the @source file does not exist then the G_IO_ERROR_NOT_FOUND
* error is returned, independent on the status of the @destination.
*
* error is returned. If trying to overwrite a directory with a directory the
* G_IO_ERROR_WOULD_MERGE error is returned.
*
- * If the source is a directory and the target does not exist, or #G_FILE_COPY_OVERWRITE is
- * specified and the target is a file, then the G_IO_ERROR_WOULD_RECURSE error
- * is returned.
+ * If the source is a directory and the target does not exist, or
+ * #G_FILE_COPY_OVERWRITE is specified and the target is a file, then the
+ * G_IO_ERROR_WOULD_RECURSE error is returned.
*
* If you are interested in copying the #GFile object itself (not the on-disk
* file), see g_file_dup().
}
/**
- * g_file_copy_async:
+ * g_file_copy_async: (skip)
* @source: input #GFile.
* @destination: destination #GFile
* @flags: set of #GFileCopyFlags
- * @io_priority: the <link linkend="io-priority">I/O priority</link>
- * of the request.
- * @cancellable: optional #GCancellable object, %NULL to ignore.
- * @progress_callback: function to callback with progress information
- * @progress_callback_data: user data to pass to @progress_callback
+ * @io_priority: the <link linkend="io-priority">I/O priority</link>
+ * of the request
+ * @cancellable: (allow-none): optional #GCancellable object, %NULL to ignore
+ * @progress_callback: (allow-none): function to callback with progress
+ * information, or %NULL if progress information is not needed
+ * @progress_callback_data: (closure): user data to pass to @progress_callback
* @callback: a #GAsyncReadyCallback to call when the request is satisfied
* @user_data: the data to pass to callback function
*
- * Copies the file @source to the location specified by @destination
+ * Copies the file @source to the location specified by @destination
* asynchronously. For details of the behaviour, see g_file_copy().
*
* If @progress_callback is not %NULL, then that function that will be called
* @source: #GFile pointing to the source location.
* @destination: #GFile pointing to the destination location.
* @flags: set of #GFileCopyFlags.
- * @cancellable: optional #GCancellable object, %NULL to ignore.
- * @progress_callback: #GFileProgressCallback function for updates.
- * @progress_callback_data: gpointer to user data for the callback function.
+ * @cancellable: (allow-none): optional #GCancellable object, %NULL to ignore.
+ * @progress_callback: (scope call): #GFileProgressCallback function for updates.
+ * @progress_callback_data: (closure): gpointer to user data for the callback function.
* @error: #GError for returning error conditions, or %NULL
*
*
/**
* g_file_make_directory
* @file: input #GFile.
- * @cancellable: optional #GCancellable object, %NULL to ignore.
+ * @cancellable: (allow-none): optional #GCancellable object, %NULL to ignore.
* @error: a #GError, or %NULL
*
* Creates a directory. Note that this will only create a child directory of
/**
* g_file_make_directory_with_parents:
* @file: input #GFile.
- * @cancellable: optional #GCancellable object, %NULL to ignore.
+ * @cancellable: (allow-none): optional #GCancellable object, %NULL to ignore.
* @error: a #GError, or %NULL
*
* Creates a directory and any parent directories that may not exist similar to
* 'mkdir -p'. If the file system does not support creating directories, this
- * function will fail, setting @error to %G_IO_ERROR_NOT_SUPPORTED.
+ * function will fail, setting @error to %G_IO_ERROR_NOT_SUPPORTED. If the
+ * directory itself already exists, this function will fail setting @error
+ * to %G_IO_ERROR_EXISTS, unlike the similar g_mkdir_with_parents().
*
* For a local #GFile the newly created directories will have the default
* (current) ownership and permissions of the current process.
/**
* g_file_make_symbolic_link:
- * @file: input #GFile.
- * @symlink_value: a string with the value of the new symlink.
- * @cancellable: optional #GCancellable object, %NULL to ignore.
- * @error: a #GError.
- *
- * Creates a symbolic link.
+ * @file: a #GFile with the name of the symlink to create
+ * @symlink_value: a string with the path for the target of the new symlink
+ * @cancellable: (allow-none): optional #GCancellable object, %NULL to ignore.
+ * @error: a #GError.
+ *
+ * Creates a symbolic link named @file which contains the string
+ * @symlink_value.
*
* 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.
- *
+ * was cancelled, the error %G_IO_ERROR_CANCELLED will be returned.
+ *
* Returns: %TRUE on the creation of a new symlink, %FALSE otherwise.
- **/
+ */
gboolean
g_file_make_symbolic_link (GFile *file,
const char *symlink_value,
/**
* g_file_delete:
* @file: input #GFile.
- * @cancellable: optional #GCancellable object, %NULL to ignore.
+ * @cancellable: (allow-none): optional #GCancellable object, %NULL to ignore.
* @error: a #GError, or %NULL
*
* Deletes a file. If the @file is a directory, it will only be deleted if it
* 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.
- *
+ *
+ * Virtual: delete_file
* Returns: %TRUE if the file was deleted. %FALSE otherwise.
**/
gboolean
/**
* g_file_trash:
* @file: #GFile to send to trash.
- * @cancellable: optional #GCancellable object, %NULL to ignore.
+ * @cancellable: (allow-none): optional #GCancellable object, %NULL to ignore.
* @error: a #GError, or %NULL
*
* Sends @file to the "Trashcan", if possible. This is similar to
* g_file_set_display_name:
* @file: input #GFile.
* @display_name: a string.
- * @cancellable: optional #GCancellable object, %NULL to ignore.
+ * @cancellable: (allow-none): optional #GCancellable object, %NULL to ignore.
* @error: a #GError, or %NULL
*
* Renames @file to the specified display name.
* triggering the cancellable object from another thread. If the operation
* was cancelled, the error %G_IO_ERROR_CANCELLED will be returned.
*
- * Returns: a #GFile specifying what @file was renamed to, or %NULL
+ * Returns: (transfer full): a #GFile specifying what @file was renamed to, or %NULL
* if there was an error.
* Free the returned object with g_object_unref().
**/
* @display_name: a string.
* @io_priority: the <link linkend="io-priority">I/O priority</link>
* of the request.
- * @cancellable: optional #GCancellable object, %NULL to ignore.
- * @callback: a #GAsyncReadyCallback to call when the request is satisfied
- * @user_data: the data to pass to callback function
+ * @cancellable: (allow-none): optional #GCancellable object, %NULL to ignore.
+ * @callback: (scope async): a #GAsyncReadyCallback to call when the request is satisfied
+ * @user_data: (closure): the data to pass to callback function
*
* Asynchronously sets the display name for a given #GFile.
*
* Finishes setting a display name started with
* g_file_set_display_name_async().
*
- * Returns: a #GFile or %NULL on error.
+ * Returns: (transfer full): a #GFile or %NULL on error.
* Free the returned object with g_object_unref().
**/
GFile *
/**
* g_file_query_settable_attributes:
* @file: input #GFile.
- * @cancellable: optional #GCancellable object, %NULL to ignore.
+ * @cancellable: (allow-none): optional #GCancellable object, %NULL to ignore.
* @error: a #GError, or %NULL
*
* Obtain the list of settable attributes for the file.
/**
* g_file_query_writable_namespaces:
* @file: input #GFile.
- * @cancellable: optional #GCancellable object, %NULL to ignore.
+ * @cancellable: (allow-none): optional #GCancellable object, %NULL to ignore.
* @error: a #GError, or %NULL
*
* Obtain the list of attribute namespaces where new attributes
* @file: input #GFile.
* @attribute: a string containing the attribute's name.
* @type: The type of the attribute
- * @value_p: a pointer to the value (or the pointer itself if the type is a pointer type)
+ * @value_p: (allow-none): a pointer to the value (or the pointer itself if the type is a pointer type)
* @flags: a set of #GFileQueryInfoFlags.
- * @cancellable: optional #GCancellable object, %NULL to ignore.
+ * @cancellable: (allow-none): optional #GCancellable object, %NULL to ignore.
* @error: a #GError, or %NULL
*
* Sets an attribute in the file with attribute name @attribute to @value.
+ *
+ * Some attributes can be unset by setting @attribute to
+ * %G_FILE_ATTRIBUTE_TYPE_INVALID and @value_p to %NULL.
*
* If @cancellable is not %NULL, then the operation can be cancelled by
* triggering the cancellable object from another thread. If the operation
* @file: input #GFile.
* @info: a #GFileInfo.
* @flags: #GFileQueryInfoFlags
- * @cancellable: optional #GCancellable object, %NULL to ignore.
+ * @cancellable: (allow-none): optional #GCancellable object, %NULL to ignore.
* @error: a #GError, or %NULL
*
* Tries to set all attributes in the #GFileInfo on the target values,
* @flags: a #GFileQueryInfoFlags.
* @io_priority: the <link linkend="io-priority">I/O priority</link>
* of the request.
- * @cancellable: optional #GCancellable object, %NULL to ignore.
- * @callback: a #GAsyncReadyCallback.
- * @user_data: a #gpointer.
+ * @cancellable: (allow-none): optional #GCancellable object, %NULL to ignore.
+ * @callback: (scope async): a #GAsyncReadyCallback.
+ * @user_data: (closure): a #gpointer.
*
* Asynchronously sets the attributes of @file with @info.
*
* g_file_set_attributes_finish:
* @file: input #GFile.
* @result: a #GAsyncResult.
- * @info: a #GFileInfo.
+ * @info: (out) (transfer full): a #GFileInfo.
* @error: a #GError, or %NULL
*
* Finishes setting an attribute started in g_file_set_attributes_async().
* @attribute: a string containing the attribute's name.
* @value: a string containing the attribute's value.
* @flags: #GFileQueryInfoFlags.
- * @cancellable: optional #GCancellable object, %NULL to ignore.
+ * @cancellable: (allow-none): optional #GCancellable object, %NULL to ignore.
* @error: a #GError, or %NULL
*
* Sets @attribute of type %G_FILE_ATTRIBUTE_TYPE_STRING to @value.
* @attribute: a string containing the attribute's name.
* @value: a string containing the attribute's new value.
* @flags: a #GFileQueryInfoFlags.
- * @cancellable: optional #GCancellable object, %NULL to ignore.
+ * @cancellable: (allow-none): optional #GCancellable object, %NULL to ignore.
* @error: a #GError, or %NULL
*
* Sets @attribute of type %G_FILE_ATTRIBUTE_TYPE_BYTE_STRING to @value.
* @attribute: a string containing the attribute's name.
* @value: a #guint32 containing the attribute's new value.
* @flags: a #GFileQueryInfoFlags.
- * @cancellable: optional #GCancellable object, %NULL to ignore.
+ * @cancellable: (allow-none): optional #GCancellable object, %NULL to ignore.
* @error: a #GError, or %NULL
*
* Sets @attribute of type %G_FILE_ATTRIBUTE_TYPE_UINT32 to @value.
* @attribute: a string containing the attribute's name.
* @value: a #gint32 containing the attribute's new value.
* @flags: a #GFileQueryInfoFlags.
- * @cancellable: optional #GCancellable object, %NULL to ignore.
+ * @cancellable: (allow-none): optional #GCancellable object, %NULL to ignore.
* @error: a #GError, or %NULL
*
* Sets @attribute of type %G_FILE_ATTRIBUTE_TYPE_INT32 to @value.
* @attribute: a string containing the attribute's name.
* @value: a #guint64 containing the attribute's new value.
* @flags: a #GFileQueryInfoFlags.
- * @cancellable: optional #GCancellable object, %NULL to ignore.
+ * @cancellable: (allow-none): optional #GCancellable object, %NULL to ignore.
* @error: a #GError, or %NULL
*
* Sets @attribute of type %G_FILE_ATTRIBUTE_TYPE_UINT64 to @value.
* @attribute: a string containing the attribute's name.
* @value: a #guint64 containing the attribute's new value.
* @flags: a #GFileQueryInfoFlags.
- * @cancellable: optional #GCancellable object, %NULL to ignore.
+ * @cancellable: (allow-none): optional #GCancellable object, %NULL to ignore.
* @error: a #GError, or %NULL
*
* Sets @attribute of type %G_FILE_ATTRIBUTE_TYPE_INT64 to @value.
* @file: input #GFile.
* @flags: flags affecting the operation
* @mount_operation: a #GMountOperation, or %NULL to avoid user interaction.
- * @cancellable: optional #GCancellable object, %NULL to ignore.
- * @callback: a #GAsyncReadyCallback to call when the request is satisfied, or %NULL.
- * @user_data: the data to pass to callback function
+ * @cancellable: (allow-none): optional #GCancellable object, %NULL to ignore.
+ * @callback: (scope async): a #GAsyncReadyCallback to call when the request is satisfied, or %NULL.
+ * @user_data: (closure): the data to pass to callback function
*
* Mounts a file of type G_FILE_TYPE_MOUNTABLE.
* Using @mount_operation, you can request callbacks when, for instance,
* Finish an asynchronous mount operation that was started
* with g_file_mount_mountable().
*
- * Returns: a #GFile or %NULL on error.
+ * Returns: (transfer full): a #GFile or %NULL on error.
* Free the returned object with g_object_unref().
**/
GFile *
* g_file_unmount_mountable:
* @file: input #GFile.
* @flags: flags affecting the operation
- * @cancellable: optional #GCancellable object, %NULL to ignore.
- * @callback: a #GAsyncReadyCallback to call when the request is satisfied, or %NULL.
- * @user_data: the data to pass to callback function
+ * @cancellable: (allow-none): optional #GCancellable object, %NULL to ignore.
+ * @callback: (scope async): a #GAsyncReadyCallback to call when the request is satisfied, or %NULL.
+ * @user_data: (closure): the data to pass to callback function
*
* Unmounts a file of type G_FILE_TYPE_MOUNTABLE.
*
* @file: input #GFile.
* @flags: flags affecting the operation
* @mount_operation: a #GMountOperation, or %NULL to avoid user interaction.
- * @cancellable: optional #GCancellable object, %NULL to ignore.
- * @callback: a #GAsyncReadyCallback to call when the request is satisfied, or %NULL.
- * @user_data: the data to pass to callback function
+ * @cancellable: (allow-none): optional #GCancellable object, %NULL to ignore.
+ * @callback: (scope async): a #GAsyncReadyCallback to call when the request is satisfied, or %NULL.
+ * @user_data: (closure): the data to pass to callback function
*
* Unmounts a file of type G_FILE_TYPE_MOUNTABLE.
*
* g_file_eject_mountable:
* @file: input #GFile.
* @flags: flags affecting the operation
- * @cancellable: optional #GCancellable object, %NULL to ignore.
- * @callback: a #GAsyncReadyCallback to call when the request is satisfied, or %NULL.
- * @user_data: the data to pass to callback function
+ * @cancellable: (allow-none): optional #GCancellable object, %NULL to ignore.
+ * @callback: (scope async): a #GAsyncReadyCallback to call when the request is satisfied, or %NULL.
+ * @user_data: (closure): the data to pass to callback function
*
* Starts an asynchronous eject on a mountable.
* When this operation has completed, @callback will be called with
* @file: input #GFile.
* @flags: flags affecting the operation
* @mount_operation: a #GMountOperation, or %NULL to avoid user interaction.
- * @cancellable: optional #GCancellable object, %NULL to ignore.
- * @callback: a #GAsyncReadyCallback to call when the request is satisfied, or %NULL.
- * @user_data: the data to pass to callback function
+ * @cancellable: (allow-none): optional #GCancellable object, %NULL to ignore.
+ * @callback: (scope async): a #GAsyncReadyCallback to call when the request is satisfied, or %NULL.
+ * @user_data: (closure): the data to pass to callback function
*
* Starts an asynchronous eject on a mountable.
* When this operation has completed, @callback will be called with
* g_file_monitor_directory:
* @file: input #GFile.
* @flags: a set of #GFileMonitorFlags.
- * @cancellable: optional #GCancellable object, %NULL to ignore.
+ * @cancellable: (allow-none): optional #GCancellable object, %NULL to ignore.
* @error: a #GError, or %NULL.
*
* Obtains a directory monitor for the given file.
* 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.
- *
- * Returns: a #GFileMonitor for the given @file, or %NULL on error.
+ *
+ * Virtual: monitor_dir
+ * Returns: (transfer full): a #GFileMonitor for the given @file, or %NULL on error.
* Free the returned object with g_object_unref().
**/
GFileMonitor*
* g_file_monitor_file:
* @file: input #GFile.
* @flags: a set of #GFileMonitorFlags.
- * @cancellable: optional #GCancellable object, %NULL to ignore.
+ * @cancellable: (allow-none): optional #GCancellable object, %NULL to ignore.
* @error: a #GError, or %NULL.
*
* Obtains a file monitor for the given file. If no file notification
* triggering the cancellable object from another thread. If the operation
* was cancelled, the error %G_IO_ERROR_CANCELLED will be returned.
*
- * Returns: a #GFileMonitor for the given @file, or %NULL on error.
+ * Returns: (transfer full): a #GFileMonitor for the given @file, or %NULL on error.
* Free the returned object with g_object_unref().
**/
GFileMonitor*
* g_file_monitor:
* @file: input #GFile
* @flags: a set of #GFileMonitorFlags
- * @cancellable: optional #GCancellable object, %NULL to ignore
+ * @cancellable: (allow-none): optional #GCancellable object, %NULL to ignore
* @error: a #GError, or %NULL
*
* Obtains a file or directory monitor for the given file, depending
* triggering the cancellable object from another thread. If the operation
* was cancelled, the error %G_IO_ERROR_CANCELLED will be returned.
*
- * Returns: a #GFileMonitor for the given @file, or %NULL on error.
+ * Returns: (transfer full): a #GFileMonitor for the given @file, or %NULL on error.
* Free the returned object with g_object_unref().
*
* Since: 2.18
info = g_file_query_info (G_FILE (object), data->attributes, data->flags, cancellable, &error);
if (info == NULL)
- {
- g_simple_async_result_set_from_error (res, error);
- g_error_free (error);
- }
+ g_simple_async_result_take_error (res, error);
else
data->info = info;
}
info = g_file_query_filesystem_info (G_FILE (object), data->attributes, cancellable, &error);
if (info == NULL)
- {
- g_simple_async_result_set_from_error (res, error);
- g_error_free (error);
- }
+ g_simple_async_result_take_error (res, error);
else
data->info = info;
}
enumerator = g_file_enumerate_children (G_FILE (object), data->attributes, data->flags, cancellable, &error);
if (enumerator == NULL)
- {
- g_simple_async_result_set_from_error (res, error);
- g_error_free (error);
- }
+ g_simple_async_result_take_error (res, error);
else
data->enumerator = enumerator;
}
G_IO_ERROR_NOT_SUPPORTED,
_("Operation not supported"));
- g_simple_async_result_set_from_error (res, error);
- g_error_free (error);
+ g_simple_async_result_take_error (res, error);
return;
}
stream = iface->read_fn (G_FILE (object), cancellable, &error);
if (stream == NULL)
- {
- g_simple_async_result_set_from_error (res, error);
- g_error_free (error);
- }
+ g_simple_async_result_take_error (res, error);
else
g_simple_async_result_set_op_res_gpointer (res, stream, g_object_unref);
}
stream = iface->append_to (G_FILE (object), *data, cancellable, &error);
if (stream == NULL)
- {
- g_simple_async_result_set_from_error (res, error);
- g_error_free (error);
- }
+ g_simple_async_result_take_error (res, error);
else
g_simple_async_result_set_op_res_gpointer (res, stream, g_object_unref);
}
stream = iface->create (G_FILE (object), *data, cancellable, &error);
if (stream == NULL)
- {
- g_simple_async_result_set_from_error (res, error);
- g_error_free (error);
- }
+ g_simple_async_result_take_error (res, error);
else
g_simple_async_result_set_op_res_gpointer (res, stream, g_object_unref);
}
&error);
if (stream == NULL)
- {
- g_simple_async_result_set_from_error (res, error);
- g_error_free (error);
- }
+ g_simple_async_result_take_error (res, error);
else
data->stream = stream;
}
G_IO_ERROR_NOT_SUPPORTED,
_("Operation not supported"));
- g_simple_async_result_set_from_error (res, error);
- g_error_free (error);
+ g_simple_async_result_take_error (res, error);
return;
}
stream = iface->open_readwrite (G_FILE (object), cancellable, &error);
if (stream == NULL)
- {
- g_simple_async_result_set_from_error (res, error);
- g_error_free (error);
- }
+ g_simple_async_result_take_error (res, error);
else
g_simple_async_result_set_op_res_gpointer (res, stream, g_object_unref);
}
G_IO_ERROR_NOT_SUPPORTED,
_("Operation not supported"));
- g_simple_async_result_set_from_error (res, error);
- g_error_free (error);
+ g_simple_async_result_take_error (res, error);
return;
}
stream = iface->create_readwrite (G_FILE (object), *data, cancellable, &error);
if (stream == NULL)
- {
- g_simple_async_result_set_from_error (res, error);
- g_error_free (error);
- }
+ g_simple_async_result_take_error (res, error);
else
g_simple_async_result_set_op_res_gpointer (res, stream, g_object_unref);
}
&error);
if (stream == NULL)
- {
- g_simple_async_result_set_from_error (res, error);
- g_error_free (error);
- }
+ g_simple_async_result_take_error (res, error);
else
data->stream = stream;
}
file = g_file_set_display_name (G_FILE (object), data->name, cancellable, &error);
if (file == NULL)
- {
- g_simple_async_result_set_from_error (res, error);
- g_error_free (error);
- }
+ g_simple_async_result_take_error (res, error);
else
data->file = file;
}
mount = g_file_find_enclosing_mount (G_FILE (object), cancellable, &error);
if (mount == NULL)
- {
- g_simple_async_result_set_from_error (res, error);
- g_error_free (error);
- }
+ g_simple_async_result_take_error (res, error);
else
g_simple_async_result_set_op_res_gpointer (res, mount, (GDestroyNotify)g_object_unref);
}
NULL, NULL);
if (!result)
- {
- g_simple_async_result_set_from_error (res, error);
- g_error_free (error);
- }
+ g_simple_async_result_take_error (res, error);
g_simple_async_result_complete_in_idle (res);
/**
* g_file_new_for_path:
- * @path: a string containing a relative or absolute path.
+ * @path: a string containing a relative or absolute path. The string
+ * must be encoded in the glib filename encoding.
*
* Constructs a #GFile for a given path. This operation never
* fails, but the returned object might not support any I/O
* operation if @path is malformed.
*
- * Returns: a new #GFile for the given @path.
+ * Returns: (transfer full): a new #GFile for the given @path.
+ * Free the returned object with g_object_unref().
**/
GFile *
g_file_new_for_path (const char *path)
/**
* g_file_new_for_uri:
- * @uri: a string containing a URI.
+ * @uri: a UTF8 string containing a URI.
*
* Constructs a #GFile for a given URI. This operation never
* fails, but the returned object might not support any I/O
* operation if @uri is malformed or if the uri type is
* not supported.
*
- * Returns: a #GFile for the given @uri.
+ * Returns: (transfer full): a new #GFile for the given @uri.
+ * Free the returned object with g_object_unref().
**/
GFile *
g_file_new_for_uri (const char *uri)
return g_vfs_get_file_for_uri (g_vfs_get_default (), uri);
}
-
+
+/**
+ * g_file_new_tmp:
+ * @tmpl: (type filename) (allow-none): Template for the file
+ * name, as in g_file_open_tmp(), or %NULL for a default template.
+ * @iostream: (out): on return, a #GFileIOStream for the created file.
+ * @error: a #GError, or %NULL
+ *
+ * Opens a file in the preferred directory for temporary files (as
+ * returned by g_get_tmp_dir()) and returns a #GFile and
+ * #GFileIOStream pointing to it.
+ *
+ * @template should be a string in the GLib file name encoding
+ * containing a sequence of six 'X' characters, and containing no
+ * directory components. If it is %NULL, a default template is used.
+ *
+ * Unlike the other #GFile constructors, this will return %NULL if
+ * a temporary file could not be created.
+ *
+ * Returns: (transfer full): a new #GFile.
+ * Free the returned object with g_object_unref().
+ **/
+GFile *
+g_file_new_tmp (const char *tmpl,
+ GFileIOStream **iostream,
+ GError **error)
+{
+ gint fd;
+ gchar *path;
+ GFile *file;
+ GFileOutputStream *output;
+
+ g_return_val_if_fail (tmpl != NULL, NULL);
+ g_return_val_if_fail (iostream != NULL, NULL);
+
+ fd = g_file_open_tmp (tmpl, &path, error);
+ if (fd == -1)
+ return NULL;
+
+ file = g_file_new_for_path (path);
+
+ output = _g_local_file_output_stream_new (fd);
+ *iostream = _g_local_file_io_stream_new (G_LOCAL_FILE_OUTPUT_STREAM (output));
+
+ g_object_unref (output);
+ g_free (path);
+
+ return file;
+}
+
/**
* g_file_parse_name:
* @parse_name: a file name or path to be parsed.
* This operation never fails, but the returned object might not support any I/O
* operation if the @parse_name cannot be parsed.
*
- * Returns: a new #GFile.
+ * Returns: (transfer full): a new #GFile.
**/
GFile *
g_file_parse_name (const char *parse_name)
* This operation never fails, but the returned object might not support any
* I/O operation if @arg points to a malformed path.
*
- * Returns: a new #GFile.
+ * Returns: (transfer full): a new #GFile.
+ * Free the returned object with g_object_unref().
**/
GFile *
g_file_new_for_commandline_arg (const char *arg)
* triggering the cancellable object from another thread. If the operation
* was cancelled, the error %G_IO_ERROR_CANCELLED will be returned.
*
- * Returns: a #GAppInfo if the handle was found, %NULL if there were errors.
+ * Returns: (transfer full): a #GAppInfo if the handle was found, %NULL if there were errors.
* When you are done with it, release it with g_object_unref()
**/
GAppInfo *
content_type = g_file_info_get_content_type (info);
if (content_type)
{
- /* Don't use is_native(), as we want to support fuse paths if availible */
+ /* Don't use is_native(), as we want to support fuse paths if available */
path = g_file_get_path (file);
appinfo = g_app_info_get_default_for_type (content_type,
path == NULL);
* g_file_load_contents:
* @file: input #GFile.
* @cancellable: optional #GCancellable object, %NULL to ignore.
- * @contents: a location to place the contents of the file.
- * @length: a location to place the length of the contents of the file,
+ * @contents: (out) (transfer full) (element-type guint8) (array length=length): a location to place the contents of the file.
+ * @length: (out) (allow-none): a location to place the length of the contents of the file,
* or %NULL if the length is not needed
- * @etag_out: a location to place the current entity tag for the file,
+ * @etag_out: (out) (allow-none): a location to place the current entity tag for the file,
* or %NULL if the entity tag is not needed
* @error: a #GError, or %NULL
*
}
else
{
- res = g_simple_async_result_new_from_error (G_OBJECT (data->file),
+ res = g_simple_async_result_new_take_error (G_OBJECT (data->file),
data->callback,
data->user_data,
error);
g_simple_async_result_complete (res);
- g_error_free (error);
load_contents_data_free (data);
g_object_unref (res);
}
}
/**
- * g_file_load_partial_contents_async:
+ * g_file_load_partial_contents_async: (skip)
* @file: input #GFile.
* @cancellable: optional #GCancellable object, %NULL to ignore.
* @read_more_callback: a #GFileReadMoreCallback to receive partial data and to specify whether further data should be read.
* g_file_load_partial_contents_finish:
* @file: input #GFile.
* @res: a #GAsyncResult.
- * @contents: a location to place the contents of the file.
- * @length: a location to place the length of the contents of the file,
+ * @contents: (out) (transfer full) (element-type guint8) (array length=length): a location to place the contents of the file.
+ * @length: (out) (allow-none): a location to place the length of the contents of the file,
* or %NULL if the length is not needed
- * @etag_out: a location to place the current entity tag for the file,
+ * @etag_out: (out) (allow-none): a location to place the current entity tag for the file,
* or %NULL if the entity tag is not needed
* @error: a #GError, or %NULL
*
* g_file_load_contents_finish:
* @file: input #GFile.
* @res: a #GAsyncResult.
- * @contents: a location to place the contents of the file.
- * @length: a location to place the length of the contents of the file,
+ * @contents: (out) (transfer full) (element-type guint8) (array length=length): a location to place the contents of the file.
+ * @length: (out) (allow-none): a location to place the length of the contents of the file,
* or %NULL if the length is not needed
- * @etag_out: a location to place the current entity tag for the file,
+ * @etag_out: (out) (allow-none): a location to place the current entity tag for the file,
* or %NULL if the entity tag is not needed
* @error: a #GError, or %NULL
*
/**
* g_file_replace_contents:
* @file: input #GFile.
- * @contents: a string containing the new contents for @file.
+ * @contents: (element-type guint8) (array length=length): a string containing the new contents for @file.
* @length: the length of @contents in bytes.
- * @etag: the old <link linkend="gfile-etag">entity tag</link>
+ * @etag: (allow-none): the old <link linkend="gfile-etag">entity tag</link>
* for the document, or %NULL
* @make_backup: %TRUE if a backup should be created.
* @flags: a set of #GFileCreateFlags.
- * @new_etag: a location to a new <link linkend="gfile-etag">entity tag</link>
+ * @new_etag: (allow-none) (out): a location to a new <link linkend="gfile-etag">entity tag</link>
* for the document. This should be freed with g_free() when no longer
* needed, or %NULL
* @cancellable: optional #GCancellable object, %NULL to ignore.
}
else
{
- res = g_simple_async_result_new_from_error (G_OBJECT (data->file),
+ res = g_simple_async_result_new_take_error (G_OBJECT (data->file),
data->callback,
data->user_data,
error);
g_simple_async_result_complete (res);
- g_error_free (error);
replace_contents_data_free (data);
g_object_unref (res);
}
/**
* g_file_replace_contents_async:
* @file: input #GFile.
- * @contents: string of contents to replace the file with.
+ * @contents: (element-type guint8) (array length=length): string of contents to replace the file with.
* @length: the length of @contents in bytes.
- * @etag: a new <link linkend="gfile-etag">entity tag</link> for the @file, or %NULL
+ * @etag: (allow-none): a new <link linkend="gfile-etag">entity tag</link> for the @file, or %NULL
* @make_backup: %TRUE if a backup should be created.
* @flags: a set of #GFileCreateFlags.
* @cancellable: optional #GCancellable object, %NULL to ignore.
* g_file_replace_contents_finish:
* @file: input #GFile.
* @res: a #GAsyncResult.
- * @new_etag: a location of a new <link linkend="gfile-etag">entity tag</link>
+ * @new_etag: (out) (allow-none): a location of a new <link linkend="gfile-etag">entity tag</link>
* for the document. This should be freed with g_free() when it is no
* longer needed, or %NULL
* @error: a #GError, or %NULL
iface = G_FILE_GET_IFACE (file);
return iface->supports_thread_contexts;
}
-
-#define __G_FILE_C__
-#include "gioaliasdef.c"