1 /* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */ 2 3 /* GIO - GLib Input, Output and Streaming Library 4 * 5 * Copyright (C) 2006-2007 Red Hat, Inc. 6 * 7 * This library is free software; you can redistribute it and/or 8 * modify it under the terms of the GNU Lesser General Public 9 * License as published by the Free Software Foundation; either 10 * version 2 of the License, or (at your option) any later version. 11 * 12 * This library is distributed in the hope that it will be useful, 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 15 * Lesser General Public License for more details. 16 * 17 * You should have received a copy of the GNU Lesser General 18 * Public License along with this library; if not, write to the 19 * Free Software Foundation, Inc., 59 Temple Place, Suite 330, 20 * Boston, MA 02111-1307, USA. 21 * 22 * Author: Alexander Larsson <alexl (at) redhat.com> 23 */ 24 25 #include "config.h" 26 #include <string.h> 27 #include <sys/types.h> 28 #ifdef HAVE_PWD_H 29 #include <pwd.h> 30 #endif 31 #include "gfile.h" 32 #include "gvfs.h" 33 #include "gioscheduler.h" 34 #include "glocalfile.h" 35 #include "gsimpleasyncresult.h" 36 #include "gfileattribute-priv.h" 37 #include "gpollfilemonitor.h" 38 #include "gappinfo.h" 39 #include "gfileinputstream.h" 40 #include "gfileoutputstream.h" 41 #include "gcancellable.h" 42 #include "gasyncresult.h" 43 #include "gioerror.h" 44 #include "glibintl.h" 45 46 #include "gioalias.h" 47 48 /** 49 * SECTION:gfile 50 * @short_description: File and Directory Handling 51 * @include: gio/gio.h 52 * @see_also: #GFileInfo, #GFileEnumerator 53 * 54 * #GFile is a high level abstraction for manipulating files on a 55 * virtual file system. #GFile<!-- -->s are lightweight, immutable 56 * objects that do no I/O upon creation. It is necessary to understand that 57 * #GFile objects do not represent files, merely an identifier for a file. All 58 * file content I/O is implemented as streaming operations (see #GInputStream and 59 * #GOutputStream). 60 * 61 * To construct a #GFile, you can use: 62 * g_file_new_for_path() if you have a path. 63 * g_file_new_for_uri() if you have a URI. 64 * g_file_new_for_commandline_arg() for a command line argument. 65 * g_file_parse_name() from a utf8 string gotten from g_file_get_parse_name(). 66 * 67 * One way to think of a #GFile is as an abstraction of a pathname. For normal 68 * files the system pathname is what is stored internally, but as #GFile<!-- -->s 69 * are extensible it could also be something else that corresponds to a pathname 70 * in a userspace implementation of a filesystem. 71 * 72 * #GFile<!-- -->s make up hierarchies of directories and files that correspond to the 73 * files on a filesystem. You can move through the file system with #GFile using 74 * g_file_get_parent() to get an identifier for the parent directory, g_file_get_child() 75 * to get a child within a directory, g_file_resolve_relative_path() to resolve a relative 76 * path between two #GFile<!-- -->s. There can be multiple hierarchies, so you may not 77 * end up at the same root if you repeatedly call g_file_get_parent() on two different 78 * files. 79 * 80 * All #GFile<!-- -->s have a basename (get with g_file_get_basename()). These names 81 * are byte strings that are used to identify the file on the filesystem (relative to 82 * its parent directory) and there is no guarantees that they have any particular charset 83 * encoding or even make any sense at all. If you want to use filenames in a user 84 * interface you should use the display name that you can get by requesting the 85 * %G_FILE_ATTRIBUTE_STANDARD_DISPLAY_NAME attribute with g_file_query_info(). 86 * This is guaranteed to be in utf8 and can be used in a user interface. But always 87 * store the real basename or the #GFile to use to actually access the file, because 88 * there is no way to go from a display name to the actual name. 89 * 90 * Using #GFile as an identifier has the same weaknesses as using a path in that 91 * there may be multiple aliases for the same file. For instance, hard or 92 * soft links may cause two different #GFile<!-- -->s to refer to the same file. 93 * Other possible causes for aliases are: case insensitive filesystems, short 94 * and long names on Fat/NTFS, or bind mounts in Linux. If you want to check if 95 * two #GFile<!-- -->s point to the same file you can query for the 96 * %G_FILE_ATTRIBUTE_ID_FILE attribute. Note that #GFile does some trivial 97 * canonicalization of pathnames passed in, so that trivial differences in the 98 * path string used at creation (duplicated slashes, slash at end of path, "." 99 * or ".." path segments, etc) does not create different #GFile<!-- -->s. 100 * 101 * Many #GFile operations have both synchronous and asynchronous versions 102 * to suit your application. Asynchronous versions of synchronous functions 103 * simply have _async() appended to their function names. The asynchronous 104 * I/O functions call a #GAsyncReadyCallback which is then used to finalize 105 * the operation, producing a GAsyncResult which is then passed to the 106 * function's matching _finish() operation. 107 * 108 * Some #GFile operations do not have synchronous analogs, as they may 109 * take a very long time to finish, and blocking may leave an application 110 * unusable. Notable cases include: 111 * g_file_mount_mountable() to mount a mountable file. 112 * g_file_unmount_mountable() to unmount a mountable file. 113 * g_file_eject_mountable() to eject a mountable file. 114 * 115 * <para id="gfile-etag"><indexterm><primary>entity tag</primary></indexterm> 116 * One notable feature of #GFile<!-- -->s are entity tags, or "etags" for 117 * short. Entity tags are somewhat like a more abstract version of the 118 * traditional mtime, and can be used to quickly determine if the file has 119 * been modified from the version on the file system. See the HTTP 1.1 120 * <ulink url="http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html">specification</ulink> 121 * for HTTP Etag headers, which are a very similar concept. 122 * </para> 123 **/ 124 125 static void g_file_base_init (gpointer g_class); 126 static void g_file_class_init (gpointer g_class, 127 gpointer class_data); 128 129 static void g_file_real_query_info_async (GFile *file, 130 const char *attributes, 131 GFileQueryInfoFlags flags, 132 int io_priority, 133 GCancellable *cancellable, 134 GAsyncReadyCallback callback, 135 gpointer user_data); 136 static GFileInfo * g_file_real_query_info_finish (GFile *file, 137 GAsyncResult *res, 138 GError **error); 139 static void g_file_real_query_filesystem_info_async (GFile *file, 140 const char *attributes, 141 int io_priority, 142 GCancellable *cancellable, 143 GAsyncReadyCallback callback, 144 gpointer user_data); 145 static GFileInfo * g_file_real_query_filesystem_info_finish (GFile *file, 146 GAsyncResult *res, 147 GError **error); 148 static void g_file_real_enumerate_children_async (GFile *file, 149 const char *attributes, 150 GFileQueryInfoFlags flags, 151 int io_priority, 152 GCancellable *cancellable, 153 GAsyncReadyCallback callback, 154 gpointer user_data); 155 static GFileEnumerator * g_file_real_enumerate_children_finish (GFile *file, 156 GAsyncResult *res, 157 GError **error); 158 static void g_file_real_read_async (GFile *file, 159 int io_priority, 160 GCancellable *cancellable, 161 GAsyncReadyCallback callback, 162 gpointer user_data); 163 static GFileInputStream * g_file_real_read_finish (GFile *file, 164 GAsyncResult *res, 165 GError **error); 166 static void g_file_real_append_to_async (GFile *file, 167 GFileCreateFlags flags, 168 int io_priority, 169 GCancellable *cancellable, 170 GAsyncReadyCallback callback, 171 gpointer user_data); 172 static GFileOutputStream *g_file_real_append_to_finish (GFile *file, 173 GAsyncResult *res, 174 GError **error); 175 static void g_file_real_create_async (GFile *file, 176 GFileCreateFlags flags, 177 int io_priority, 178 GCancellable *cancellable, 179 GAsyncReadyCallback callback, 180 gpointer user_data); 181 static GFileOutputStream *g_file_real_create_finish (GFile *file, 182 GAsyncResult *res, 183 GError **error); 184 static void g_file_real_replace_async (GFile *file, 185 const char *etag, 186 gboolean make_backup, 187 GFileCreateFlags flags, 188 int io_priority, 189 GCancellable *cancellable, 190 GAsyncReadyCallback callback, 191 gpointer user_data); 192 static GFileOutputStream *g_file_real_replace_finish (GFile *file, 193 GAsyncResult *res, 194 GError **error); 195 static gboolean g_file_real_set_attributes_from_info (GFile *file, 196 GFileInfo *info, 197 GFileQueryInfoFlags flags, 198 GCancellable *cancellable, 199 GError **error); 200 static void g_file_real_set_display_name_async (GFile *file, 201 const char *display_name, 202 int io_priority, 203 GCancellable *cancellable, 204 GAsyncReadyCallback callback, 205 gpointer user_data); 206 static GFile * g_file_real_set_display_name_finish (GFile *file, 207 GAsyncResult *res, 208 GError **error); 209 static void g_file_real_set_attributes_async (GFile *file, 210 GFileInfo *info, 211 GFileQueryInfoFlags flags, 212 int io_priority, 213 GCancellable *cancellable, 214 GAsyncReadyCallback callback, 215 gpointer user_data); 216 static gboolean g_file_real_set_attributes_finish (GFile *file, 217 GAsyncResult *res, 218 GFileInfo **info, 219 GError **error); 220 static void g_file_real_find_enclosing_mount_async (GFile *file, 221 int io_priority, 222 GCancellable *cancellable, 223 GAsyncReadyCallback callback, 224 gpointer user_data); 225 static GMount * g_file_real_find_enclosing_mount_finish (GFile *file, 226 GAsyncResult *res, 227 GError **error); 228 static void g_file_real_copy_async (GFile *source, 229 GFile *destination, 230 GFileCopyFlags flags, 231 int io_priority, 232 GCancellable *cancellable, 233 GFileProgressCallback progress_callback, 234 gpointer progress_callback_data, 235 GAsyncReadyCallback callback, 236 gpointer user_data); 237 static gboolean g_file_real_copy_finish (GFile *file, 238 GAsyncResult *res, 239 GError **error); 240 241 GType 242 g_file_get_type (void) 243 { 244 static volatile gsize g_define_type_id__volatile = 0; 245 246 if (g_once_init_enter (&g_define_type_id__volatile)) 247 { 248 const GTypeInfo file_info = 249 { 250 sizeof (GFileIface), /* class_size */ 251 g_file_base_init, /* base_init */ 252 NULL, /* base_finalize */ 253 g_file_class_init, 254 NULL, /* class_finalize */ 255 NULL, /* class_data */ 256 0, 257 0, /* n_preallocs */ 258 NULL 259 }; 260 GType g_define_type_id = 261 g_type_register_static (G_TYPE_INTERFACE, I_("GFile"), 262 &file_info, 0); 263 264 g_type_interface_add_prerequisite (g_define_type_id, G_TYPE_OBJECT); 265 266 g_once_init_leave (&g_define_type_id__volatile, g_define_type_id); 267 } 268 269 return g_define_type_id__volatile; 270 } 271 272 static void 273 g_file_class_init (gpointer g_class, 274 gpointer class_data) 275 { 276 GFileIface *iface = g_class; 277 278 iface->enumerate_children_async = g_file_real_enumerate_children_async; 279 iface->enumerate_children_finish = g_file_real_enumerate_children_finish; 280 iface->set_display_name_async = g_file_real_set_display_name_async; 281 iface->set_display_name_finish = g_file_real_set_display_name_finish; 282 iface->query_info_async = g_file_real_query_info_async; 283 iface->query_info_finish = g_file_real_query_info_finish; 284 iface->query_filesystem_info_async = g_file_real_query_filesystem_info_async; 285 iface->query_filesystem_info_finish = g_file_real_query_filesystem_info_finish; 286 iface->set_attributes_async = g_file_real_set_attributes_async; 287 iface->set_attributes_finish = g_file_real_set_attributes_finish; 288 iface->read_async = g_file_real_read_async; 289 iface->read_finish = g_file_real_read_finish; 290 iface->append_to_async = g_file_real_append_to_async; 291 iface->append_to_finish = g_file_real_append_to_finish; 292 iface->create_async = g_file_real_create_async; 293 iface->create_finish = g_file_real_create_finish; 294 iface->replace_async = g_file_real_replace_async; 295 iface->replace_finish = g_file_real_replace_finish; 296 iface->find_enclosing_mount_async = g_file_real_find_enclosing_mount_async; 297 iface->find_enclosing_mount_finish = g_file_real_find_enclosing_mount_finish; 298 iface->set_attributes_from_info = g_file_real_set_attributes_from_info; 299 iface->copy_async = g_file_real_copy_async; 300 iface->copy_finish = g_file_real_copy_finish; 301 } 302 303 static void 304 g_file_base_init (gpointer g_class) 305 { 306 } 307 308 309 /** 310 * g_file_is_native: 311 * @file: input #GFile. 312 * 313 * Checks to see if a file is native to the platform. 314 * 315 * A native file s one expressed in the platform-native filename format, 316 * e.g. "C:\Windows" or "/usr/bin/". This does not mean the file is local, 317 * as it might be on a locally mounted remote filesystem. 318 * 319 * On some systems non-native files may be available using 320 * the native filesystem via a userspace filesystem (FUSE), in 321 * these cases this call will return %FALSE, but g_file_get_path() 322 * will still return a native path. 323 * 324 * This call does no blocking i/o. 325 * 326 * Returns: %TRUE if file is native. 327 **/ 328 gboolean 329 g_file_is_native (GFile *file) 330 { 331 GFileIface *iface; 332 333 g_return_val_if_fail (G_IS_FILE (file), FALSE); 334 335 iface = G_FILE_GET_IFACE (file); 336 337 return (* iface->is_native) (file); 338 } 339 340 341 /** 342 * g_file_has_uri_scheme: 343 * @file: input #GFile. 344 * @uri_scheme: a string containing a URI scheme. 345 * 346 * Checks to see if a #GFile has a given URI scheme. 347 * 348 * This call does no blocking i/o. 349 * 350 * Returns: %TRUE if #GFile's backend supports the 351 * given URI scheme, %FALSE if URI scheme is %NULL, 352 * not supported, or #GFile is invalid. 353 **/ 354 gboolean 355 g_file_has_uri_scheme (GFile *file, 356 const char *uri_scheme) 357 { 358 GFileIface *iface; 359 360 g_return_val_if_fail (G_IS_FILE (file), FALSE); 361 g_return_val_if_fail (uri_scheme != NULL, FALSE); 362 363 iface = G_FILE_GET_IFACE (file); 364 365 return (* iface->has_uri_scheme) (file, uri_scheme); 366 } 367 368 369 /** 370 * g_file_get_uri_scheme: 371 * @file: input #GFile. 372 * 373 * Gets the URI scheme for a #GFile. 374 * RFC 3986 decodes the scheme as: 375 * <programlisting> 376 * URI = scheme ":" hier-part [ "?" query ] [ "#" fragment ] 377 * </programlisting> 378 * Common schemes include "file", "http", "ftp", etc. 379 * 380 * This call does no blocking i/o. 381 * 382 * Returns: a string containing the URI scheme for the given 383 * #GFile. The returned string should be freed with g_free() 384 * when no longer needed. 385 **/ 386 char * 387 g_file_get_uri_scheme (GFile *file) 388 { 389 GFileIface *iface; 390 391 g_return_val_if_fail (G_IS_FILE (file), NULL); 392 393 iface = G_FILE_GET_IFACE (file); 394 395 return (* iface->get_uri_scheme) (file); 396 } 397 398 399 /** 400 * g_file_get_basename: 401 * @file: input #GFile. 402 * 403 * Gets the base name (the last component of the path) for a given #GFile. 404 * 405 * If called for the top level of a system (such as the filesystem root 406 * or a uri like sftp://host/) it will return a single directory separator 407 * (and on Windows, possibly a drive letter). 408 * 409 * The base name is a byte string (*not* UTF-8). It has no defined encoding 410 * or rules other than it may not contain zero bytes. If you want to use 411 * filenames in a user interface you should use the display name that you 412 * can get by requesting the %G_FILE_ATTRIBUTE_STANDARD_DISPLAY_NAME 413 * attribute with g_file_query_info(). 414 * 415 * This call does no blocking i/o. 416 * 417 * Returns: string containing the #GFile's base name, or %NULL 418 * if given #GFile is invalid. The returned string should be 419 * freed with g_free() when no longer needed. 420 **/ 421 char * 422 g_file_get_basename (GFile *file) 423 { 424 GFileIface *iface; 425 426 g_return_val_if_fail (G_IS_FILE (file), NULL); 427 428 iface = G_FILE_GET_IFACE (file); 429 430 return (* iface->get_basename) (file); 431 } 432 433 /** 434 * g_file_get_path: 435 * @file: input #GFile. 436 * 437 * Gets the local pathname for #GFile, if one exists. 438 * 439 * This call does no blocking i/o. 440 * 441 * Returns: string containing the #GFile's path, or %NULL if 442 * no such path exists. The returned string should be 443 * freed with g_free() when no longer needed. 444 **/ 445 char * 446 g_file_get_path (GFile *file) 447 { 448 GFileIface *iface; 449 450 g_return_val_if_fail (G_IS_FILE (file), NULL); 451 452 iface = G_FILE_GET_IFACE (file); 453 454 return (* iface->get_path) (file); 455 } 456 457 /** 458 * g_file_get_uri: 459 * @file: input #GFile. 460 * 461 * Gets the URI for the @file. 462 * 463 * This call does no blocking i/o. 464 * 465 * Returns: a string containing the #GFile's URI. 466 * The returned string should be freed with g_free() when no longer needed. 467 **/ 468 char * 469 g_file_get_uri (GFile *file) 470 { 471 GFileIface *iface; 472 473 g_return_val_if_fail (G_IS_FILE (file), NULL); 474 475 iface = G_FILE_GET_IFACE (file); 476 477 return (* iface->get_uri) (file); 478 } 479 480 /** 481 * g_file_get_parse_name: 482 * @file: input #GFile. 483 * 484 * Gets the parse name of the @file. 485 * A parse name is a UTF-8 string that describes the 486 * file such that one can get the #GFile back using 487 * g_file_parse_name(). 488 * 489 * This is generally used to show the #GFile as a nice 490 * full-pathname kind of string in a user interface, 491 * like in a location entry. 492 * 493 * For local files with names that can safely be converted 494 * to UTF8 the pathname is used, otherwise the IRI is used 495 * (a form of URI that allows UTF8 characters unescaped). 496 * 497 * This call does no blocking i/o. 498 * 499 * Returns: a string containing the #GFile's parse name. The returned 500 * string should be freed with g_free() when no longer needed. 501 **/ 502 char * 503 g_file_get_parse_name (GFile *file) 504 { 505 GFileIface *iface; 506 507 g_return_val_if_fail (G_IS_FILE (file), NULL); 508 509 iface = G_FILE_GET_IFACE (file); 510 511 return (* iface->get_parse_name) (file); 512 } 513 514 /** 515 * g_file_dup: 516 * @file: input #GFile. 517 * 518 * Duplicates a #GFile handle. This operation does not duplicate 519 * the actual file or directory represented by the #GFile; see 520 * g_file_copy() if attempting to copy a file. 521 * 522 * This call does no blocking i/o. 523 * 524 * Returns: a new #GFile that is a duplicate of the given #GFile. 525 **/ 526 GFile * 527 g_file_dup (GFile *file) 528 { 529 GFileIface *iface; 530 531 g_return_val_if_fail (G_IS_FILE (file), NULL); 532 533 iface = G_FILE_GET_IFACE (file); 534 535 return (* iface->dup) (file); 536 } 537 538 /** 539 * g_file_hash: 540 * @file: #gconstpointer to a #GFile. 541 * 542 * Creates a hash value for a #GFile. 543 * 544 * This call does no blocking i/o. 545 * 546 * Returns: 0 if @file is not a valid #GFile, otherwise an 547 * integer that can be used as hash value for the #GFile. 548 * This function is intended for easily hashing a #GFile to 549 * add to a #GHashTable or similar data structure. 550 **/ 551 guint 552 g_file_hash (gconstpointer file) 553 { 554 GFileIface *iface; 555 556 g_return_val_if_fail (G_IS_FILE (file), 0); 557 558 iface = G_FILE_GET_IFACE (file); 559 560 return (* iface->hash) ((GFile *)file); 561 } 562 563 /** 564 * g_file_equal: 565 * @file1: the first #GFile. 566 * @file2: the second #GFile. 567 * 568 * Checks equality of two given #GFile<!-- -->s. Note that two 569 * #GFile<!-- -->s that differ can still refer to the same 570 * file on the filesystem due to various forms of filename 571 * aliasing. 572 * 573 * This call does no blocking i/o. 574 * 575 * Returns: %TRUE if @file1 and @file2 are equal. 576 * %FALSE if either is not a #GFile. 577 **/ 578 gboolean 579 g_file_equal (GFile *file1, 580 GFile *file2) 581 { 582 GFileIface *iface; 583 584 g_return_val_if_fail (G_IS_FILE (file1), FALSE); 585 g_return_val_if_fail (G_IS_FILE (file2), FALSE); 586 587 if (G_TYPE_FROM_INSTANCE (file1) != G_TYPE_FROM_INSTANCE (file2)) 588 return FALSE; 589 590 iface = G_FILE_GET_IFACE (file1); 591 592 return (* iface->equal) (file1, file2); 593 } 594 595 596 /** 597 * g_file_get_parent: 598 * @file: input #GFile. 599 * 600 * Gets the parent directory for the @file. 601 * If the @file represents the root directory of the 602 * file system, then %NULL will be returned. 603 * 604 * This call does no blocking i/o. 605 * 606 * Returns: a #GFile structure to the parent of the given 607 * #GFile or %NULL if there is no parent. 608 * Free the returned object with g_object_unref(). 609 **/ 610 GFile * 611 g_file_get_parent (GFile *file) 612 { 613 GFileIface *iface; 614 615 g_return_val_if_fail (G_IS_FILE (file), NULL); 616 617 iface = G_FILE_GET_IFACE (file); 618 619 return (* iface->get_parent) (file); 620 } 621 622 /** 623 * g_file_get_child: 624 * @file: input #GFile. 625 * @name: string containing the child's basename. 626 * 627 * Gets a child of @file with basename equal to @name. 628 * 629 * Note that the file with that specific name might not exist, but 630 * you can still have a #GFile that points to it. You can use this 631 * for instance to create that file. 632 * 633 * This call does no blocking i/o. 634 * 635 * Returns: a #GFile to a child specified by @name. 636 * Free the returned object with g_object_unref(). 637 **/ 638 GFile * 639 g_file_get_child (GFile *file, 640 const char *name) 641 { 642 g_return_val_if_fail (G_IS_FILE (file), NULL); 643 g_return_val_if_fail (name != NULL, NULL); 644 645 return g_file_resolve_relative_path (file, name); 646 } 647 648 /** 649 * g_file_get_child_for_display_name: 650 * @file: input #GFile. 651 * @display_name: string to a possible child. 652 * @error: #GError. 653 * 654 * Gets the child of @file for a given @display_name (i.e. a UTF8 655 * version of the name). If this function fails, it returns %NULL and @error will be 656 * set. This is very useful when constructing a GFile for a new file 657 * and the user entered the filename in the user interface, for instance 658 * when you select a directory and type a filename in the file selector. 659 * 660 * This call does no blocking i/o. 661 * 662 * Returns: a #GFile to the specified child, or 663 * %NULL if the display name couldn't be converted. 664 * Free the returned object with g_object_unref(). 665 **/ 666 GFile * 667 g_file_get_child_for_display_name (GFile *file, 668 const char *display_name, 669 GError **error) 670 { 671 GFileIface *iface; 672 673 g_return_val_if_fail (G_IS_FILE (file), NULL); 674 g_return_val_if_fail (display_name != NULL, NULL); 675 676 iface = G_FILE_GET_IFACE (file); 677 678 return (* iface->get_child_for_display_name) (file, display_name, error); 679 } 680 681 /** 682 * g_file_has_prefix: 683 * @file: input #GFile. 684 * @prefix: input #GFile. 685 * 686 * Checks whether @file has the prefix specified by @prefix. In other word, 687 * if the names of inital elements of @file<!-- -->s pathname match @prefix. 688 * Only full pathname elements are matched, so a path like /foo is not 689 * considered a prefix of /foobar, only of /foo/bar. 690 * 691 * This call does no i/o, as it works purely on names. As such it can 692 * sometimes return %FALSE even if @file is inside a @prefix (from a 693 * filesystem point of view), because the prefix of @file is an alias 694 * of @prefix. 695 * 696 * Returns: %TRUE if the @files's parent, grandparent, etc is @prefix. 697 * %FALSE otherwise. 698 **/ 699 gboolean 700 g_file_has_prefix (GFile *file, 701 GFile *prefix) 702 { 703 GFileIface *iface; 704 705 g_return_val_if_fail (G_IS_FILE (file), FALSE); 706 g_return_val_if_fail (G_IS_FILE (prefix), FALSE); 707 708 if (G_TYPE_FROM_INSTANCE (file) != G_TYPE_FROM_INSTANCE (prefix)) 709 return FALSE; 710 711 iface = G_FILE_GET_IFACE (file); 712 713 /* The vtable function differs in arg order since we're 714 using the old contains_file call */ 715 return (* iface->prefix_matches) (prefix, file); 716 } 717 718 /** 719 * g_file_get_relative_path: 720 * @parent: input #GFile. 721 * @descendant: input #GFile. 722 * 723 * Gets the path for @descendant relative to @parent. 724 * 725 * This call does no blocking i/o. 726 * 727 * Returns: string with the relative path from @descendant 728 * to @parent, or %NULL if @descendant doesn't have @parent as prefix. 729 * The returned string should be freed with g_free() when no longer needed. 730 **/ 731 char * 732 g_file_get_relative_path (GFile *parent, 733 GFile *descendant) 734 { 735 GFileIface *iface; 736 737 g_return_val_if_fail (G_IS_FILE (parent), NULL); 738 g_return_val_if_fail (G_IS_FILE (descendant), NULL); 739 740 if (G_TYPE_FROM_INSTANCE (parent) != G_TYPE_FROM_INSTANCE (descendant)) 741 return NULL; 742 743 iface = G_FILE_GET_IFACE (parent); 744 745 return (* iface->get_relative_path) (parent, descendant); 746 } 747 748 /** 749 * g_file_resolve_relative_path: 750 * @file: input #GFile. 751 * @relative_path: a given relative path string. 752 * 753 * Resolves a relative path for @file to an absolute path. 754 * 755 * This call does no blocking i/o. 756 * 757 * Returns: #GFile to the resolved path. %NULL if @relative_path 758 * is %NULL or if @file is invalid. 759 * Free the returned object with g_object_unref(). 760 **/ 761 GFile * 762 g_file_resolve_relative_path (GFile *file, 763 const char *relative_path) 764 { 765 GFileIface *iface; 766 767 g_return_val_if_fail (G_IS_FILE (file), NULL); 768 g_return_val_if_fail (relative_path != NULL, NULL); 769 770 iface = G_FILE_GET_IFACE (file); 771 772 return (* iface->resolve_relative_path) (file, relative_path); 773 } 774 775 /** 776 * g_file_enumerate_children: 777 * @file: input #GFile. 778 * @attributes: an attribute query string. 779 * @flags: a set of #GFileQueryInfoFlags. 780 * @cancellable: optional #GCancellable object, %NULL to ignore. 781 * @error: #GError for error reporting. 782 * 783 * Gets the requested information about the files in a directory. The result 784 * is a #GFileEnumerator object that will give out #GFileInfo objects for 785 * all the files in the directory. 786 * 787 * The @attribute value is a string that specifies the file attributes that 788 * should be gathered. It is not an error if it's not possible to read a particular 789 * requested attribute from a file - it just won't be set. @attribute should 790 * be a comma-separated list of attribute or attribute wildcards. The wildcard "*" 791 * means all attributes, and a wildcard like "standard::*" means all attributes in the standard 792 * namespace. An example attribute query be "standard::*,owner::user". 793 * The standard attributes are available as defines, like #G_FILE_ATTRIBUTE_STANDARD_NAME. 794 * 795 * If @cancellable is not %NULL, then the operation can be cancelled by 796 * triggering the cancellable object from another thread. If the operation 797 * was cancelled, the error %G_IO_ERROR_CANCELLED will be returned. 798 * 799 * If the file does not exist, the G_IO_ERROR_NOT_FOUND error will be returned. 800 * If the file is not a directory, the G_FILE_ERROR_NOTDIR error will be returned. 801 * Other errors are possible too. 802 * 803 * Returns: A #GFileEnumerator if successful, %NULL on error. 804 * Free the returned object with g_object_unref(). 805 **/ 806 GFileEnumerator * 807 g_file_enumerate_children (GFile *file, 808 const char *attributes, 809 GFileQueryInfoFlags flags, 810 GCancellable *cancellable, 811 GError **error) 812 813 { 814 GFileIface *iface; 815 816 g_return_val_if_fail (G_IS_FILE (file), NULL); 817 818 if (g_cancellable_set_error_if_cancelled (cancellable, error)) 819 return NULL; 820 821 iface = G_FILE_GET_IFACE (file); 822 823 if (iface->enumerate_children == NULL) 824 { 825 g_set_error_literal (error, G_IO_ERROR, 826 G_IO_ERROR_NOT_SUPPORTED, 827 _("Operation not supported")); 828 return NULL; 829 } 830 831 return (* iface->enumerate_children) (file, attributes, flags, 832 cancellable, error); 833 } 834 835 /** 836 * g_file_enumerate_children_async: 837 * @file: input #GFile. 838 * @attributes: an attribute query string. 839 * @flags: a set of #GFileQueryInfoFlags. 840 * @io_priority: the <link linkend="io-priority">I/O priority</link> 841 * of the request. 842 * @cancellable: optional #GCancellable object, %NULL to ignore. 843 * @callback: a #GAsyncReadyCallback to call when the request is satisfied 844 * @user_data: the data to pass to callback function 845 * 846 * Asynchronously gets the requested information about the files in a directory. The result 847 * is a #GFileEnumerator object that will give out #GFileInfo objects for 848 * all the files in the directory. 849 * 850 * For more details, see g_file_enumerate_children() which is 851 * the synchronous version of this call. 852 * 853 * When the operation is finished, @callback will be called. You can then call 854 * g_file_enumerate_children_finish() to get the result of the operation. 855 **/ 856 void 857 g_file_enumerate_children_async (GFile *file, 858 const char *attributes, 859 GFileQueryInfoFlags flags, 860 int io_priority, 861 GCancellable *cancellable, 862 GAsyncReadyCallback callback, 863 gpointer user_data) 864 { 865 GFileIface *iface; 866 867 g_return_if_fail (G_IS_FILE (file)); 868 869 iface = G_FILE_GET_IFACE (file); 870 (* iface->enumerate_children_async) (file, 871 attributes, 872 flags, 873 io_priority, 874 cancellable, 875 callback, 876 user_data); 877 } 878 879 /** 880 * g_file_enumerate_children_finish: 881 * @file: input #GFile. 882 * @res: a #GAsyncResult. 883 * @error: a #GError. 884 * 885 * Finishes an async enumerate children operation. 886 * See g_file_enumerate_children_async(). 887 * 888 * Returns: a #GFileEnumerator or %NULL if an error occurred. 889 * Free the returned object with g_object_unref(). 890 **/ 891 GFileEnumerator * 892 g_file_enumerate_children_finish (GFile *file, 893 GAsyncResult *res, 894 GError **error) 895 { 896 GFileIface *iface; 897 898 g_return_val_if_fail (G_IS_FILE (file), NULL); 899 g_return_val_if_fail (G_IS_ASYNC_RESULT (res), NULL); 900 901 if (G_IS_SIMPLE_ASYNC_RESULT (res)) 902 { 903 GSimpleAsyncResult *simple = G_SIMPLE_ASYNC_RESULT (res); 904 if (g_simple_async_result_propagate_error (simple, error)) 905 return NULL; 906 } 907 908 iface = G_FILE_GET_IFACE (file); 909 return (* iface->enumerate_children_finish) (file, res, error); 910 } 911 912 /** 913 * g_file_query_exists: 914 * @file: input #GFile. 915 * @cancellable: optional #GCancellable object, %NULL to ignore. 916 * 917 * Utility function to check if a particular file exists. This is 918 * implemented using g_file_query_info() and as such does blocking I/O. 919 * 920 * Note that in many cases it is racy to first check for file existence 921 * and then execute something based on the outcome of that, because the 922 * file might have been created or removed in between the operations. The 923 * general approach to handling that is to not check, but just do the 924 * operation and handle the errors as they come. 925 * 926 * As an example of race-free checking, take the case of reading a file, and 927 * if it doesn't exist, creating it. There are two racy versions: read it, and 928 * on error create it; and: check if it exists, if not create it. These 929 * can both result in two processes creating the file (with perhaps a partially 930 * written file as the result). The correct approach is to always try to create 931 * the file with g_file_create() which will either atomically create the file 932 * or fail with a G_IO_ERROR_EXISTS error. 933 * 934 * However, in many cases an existence check is useful in a user 935 * interface, for instance to make a menu item sensitive/insensitive, so that 936 * you don't have to fool users that something is possible and then just show 937 * and error dialog. If you do this, you should make sure to also handle the 938 * errors that can happen due to races when you execute the operation. 939 * 940 * Returns: %TRUE if the file exists (and can be detected without error), %FALSE otherwise (or if cancelled). 941 */ 942 gboolean 943 g_file_query_exists (GFile *file, 944 GCancellable *cancellable) 945 { 946 GFileInfo *info; 947 948 g_return_val_if_fail (G_IS_FILE(file), FALSE); 949 950 info = g_file_query_info (file, G_FILE_ATTRIBUTE_STANDARD_TYPE, 951 G_FILE_QUERY_INFO_NONE, cancellable, NULL); 952 if (info != NULL) 953 { 954 g_object_unref (info); 955 return TRUE; 956 } 957 958 return FALSE; 959 } 960 961 /** 962 * g_file_query_file_type: 963 * @file: input #GFile. 964 * @flags: a set of #GFileQueryInfoFlags passed to g_file_query_info(). 965 * @cancellable: optional #GCancellable object, %NULL to ignore. 966 * 967 * Utility function to inspect the #GFileType of a file. This is 968 * implemented using g_file_query_info() and as such does blocking I/O. 969 * 970 * The primary use case of this method is to check if a file is a regular file, 971 * directory, or symlink. 972 * 973 * Returns: The #GFileType of the file and #G_FILE_TYPE_UNKNOWN if the file 974 * does not exist 975 * 976 * Since: 2.18 977 */ 978 GFileType 979 g_file_query_file_type (GFile *file, 980 GFileQueryInfoFlags flags, 981 GCancellable *cancellable) 982 { 983 GFileInfo *info; 984 GFileType file_type; 985 986 g_return_val_if_fail (G_IS_FILE(file), G_FILE_TYPE_UNKNOWN); 987 info = g_file_query_info (file, G_FILE_ATTRIBUTE_STANDARD_TYPE, flags, 988 cancellable, NULL); 989 if (info != NULL) 990 { 991 file_type = g_file_info_get_file_type (info); 992 g_object_unref (info); 993 } 994 else 995 file_type = G_FILE_TYPE_UNKNOWN; 996 997 return file_type; 998 } 999 1000 /** 1001 * g_file_query_info: 1002 * @file: input #GFile. 1003 * @attributes: an attribute query string. 1004 * @flags: a set of #GFileQueryInfoFlags. 1005 * @cancellable: optional #GCancellable object, %NULL to ignore. 1006 * @error: a #GError. 1007 * 1008 * Gets the requested information about specified @file. The result 1009 * is a #GFileInfo object that contains key-value attributes (such as 1010 * the type or size of the file). 1011 * 1012 * The @attribute value is a string that specifies the file attributes that 1013 * should be gathered. It is not an error if it's not possible to read a particular 1014 * requested attribute from a file - it just won't be set. @attribute should 1015 * be a comma-separated list of attribute or attribute wildcards. The wildcard "*" 1016 * means all attributes, and a wildcard like "standard::*" means all attributes in the standard 1017 * namespace. An example attribute query be "standard::*,owner::user". 1018 * The standard attributes are available as defines, like #G_FILE_ATTRIBUTE_STANDARD_NAME. 1019 * 1020 * If @cancellable is not %NULL, then the operation can be cancelled by 1021 * triggering the cancellable object from another thread. If the operation 1022 * was cancelled, the error %G_IO_ERROR_CANCELLED will be returned. 1023 * 1024 * For symlinks, normally the information about the target of the 1025 * symlink is returned, rather than information about the symlink itself. 1026 * However if you pass #G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS in @flags the 1027 * information about the symlink itself will be returned. Also, for symlinks 1028 * that point to non-existing files the information about the symlink itself 1029 * will be returned. 1030 * 1031 * If the file does not exist, the G_IO_ERROR_NOT_FOUND error will be returned. 1032 * Other errors are possible too, and depend on what kind of filesystem the file is on. 1033 * 1034 * Returns: a #GFileInfo for the given @file, or %NULL on error. 1035 * Free the returned object with g_object_unref(). 1036 **/ 1037 GFileInfo * 1038 g_file_query_info (GFile *file, 1039 const char *attributes, 1040 GFileQueryInfoFlags flags, 1041 GCancellable *cancellable, 1042 GError **error) 1043 { 1044 GFileIface *iface; 1045 1046 g_return_val_if_fail (G_IS_FILE (file), NULL); 1047 1048 if (g_cancellable_set_error_if_cancelled (cancellable, error)) 1049 return NULL; 1050 1051 iface = G_FILE_GET_IFACE (file); 1052 1053 if (iface->query_info == NULL) 1054 { 1055 g_set_error_literal (error, G_IO_ERROR, 1056 G_IO_ERROR_NOT_SUPPORTED, 1057 _("Operation not supported")); 1058 return NULL; 1059 } 1060 1061 return (* iface->query_info) (file, attributes, flags, cancellable, error); 1062 } 1063 1064 /** 1065 * g_file_query_info_async: 1066 * @file: input #GFile. 1067 * @attributes: an attribute query string. 1068 * @flags: a set of #GFileQueryInfoFlags. 1069 * @io_priority: the <link linkend="io-priority">I/O priority</link> 1070 * of the request. 1071 * @cancellable: optional #GCancellable object, %NULL to ignore. 1072 * @callback: a #GAsyncReadyCallback to call when the request is satisfied 1073 * @user_data: the data to pass to callback function 1074 * 1075 * Asynchronously gets the requested information about specified @file. The result 1076 * is a #GFileInfo object that contains key-value attributes (such as type or size 1077 * for the file). 1078 * 1079 * For more details, see g_file_query_info() which is 1080 * the synchronous version of this call. 1081 * 1082 * When the operation is finished, @callback will be called. You can then call 1083 * g_file_query_info_finish() to get the result of the operation. 1084 **/ 1085 void 1086 g_file_query_info_async (GFile *file, 1087 const char *attributes, 1088 GFileQueryInfoFlags flags, 1089 int io_priority, 1090 GCancellable *cancellable, 1091 GAsyncReadyCallback callback, 1092 gpointer user_data) 1093 { 1094 GFileIface *iface; 1095 1096 g_return_if_fail (G_IS_FILE (file)); 1097 1098 iface = G_FILE_GET_IFACE (file); 1099 (* iface->query_info_async) (file, 1100 attributes, 1101 flags, 1102 io_priority, 1103 cancellable, 1104 callback, 1105 user_data); 1106 } 1107 1108 /** 1109 * g_file_query_info_finish: 1110 * @file: input #GFile. 1111 * @res: a #GAsyncResult. 1112 * @error: a #GError. 1113 * 1114 * Finishes an asynchronous file info query. 1115 * See g_file_query_info_async(). 1116 * 1117 * Returns: #GFileInfo for given @file or %NULL on error. 1118 * Free the returned object with g_object_unref(). 1119 **/ 1120 GFileInfo * 1121 g_file_query_info_finish (GFile *file, 1122 GAsyncResult *res, 1123 GError **error) 1124 { 1125 GFileIface *iface; 1126 1127 g_return_val_if_fail (G_IS_FILE (file), NULL); 1128 g_return_val_if_fail (G_IS_ASYNC_RESULT (res), NULL); 1129 1130 if (G_IS_SIMPLE_ASYNC_RESULT (res)) 1131 { 1132 GSimpleAsyncResult *simple = G_SIMPLE_ASYNC_RESULT (res); 1133 if (g_simple_async_result_propagate_error (simple, error)) 1134 return NULL; 1135 } 1136 1137 iface = G_FILE_GET_IFACE (file); 1138 return (* iface->query_info_finish) (file, res, error); 1139 } 1140 1141 /** 1142 * g_file_query_filesystem_info: 1143 * @file: input #GFile. 1144 * @attributes: an attribute query string. 1145 * @cancellable: optional #GCancellable object, %NULL to ignore. 1146 * @error: a #GError. 1147 * 1148 * Similar to g_file_query_info(), but obtains information 1149 * about the filesystem the @file is on, rather than the file itself. 1150 * For instance the amount of space available and the type of 1151 * the filesystem. 1152 * 1153 * The @attribute value is a string that specifies the file attributes that 1154 * should be gathered. It is not an error if it's not possible to read a particular 1155 * requested attribute from a file - it just won't be set. @attribute should 1156 * be a comma-separated list of attribute or attribute wildcards. The wildcard "*" 1157 * means all attributes, and a wildcard like "fs:*" means all attributes in the fs 1158 * namespace. The standard namespace for filesystem attributes is "fs". 1159 * Common attributes of interest are #G_FILE_ATTRIBUTE_FILESYSTEM_SIZE 1160 * (the total size of the filesystem in bytes), #G_FILE_ATTRIBUTE_FILESYSTEM_FREE (number of 1161 * bytes available), and #G_FILE_ATTRIBUTE_FILESYSTEM_TYPE (type of the filesystem). 1162 * 1163 * If @cancellable is not %NULL, then the operation can be cancelled by 1164 * triggering the cancellable object from another thread. If the operation 1165 * was cancelled, the error %G_IO_ERROR_CANCELLED will be returned. 1166 * 1167 * If the file does not exist, the G_IO_ERROR_NOT_FOUND error will be returned. 1168 * Other errors are possible too, and depend on what kind of filesystem the file is on. 1169 * 1170 * Returns: a #GFileInfo or %NULL if there was an error. 1171 * Free the returned object with g_object_unref(). 1172 **/ 1173 GFileInfo * 1174 g_file_query_filesystem_info (GFile *file, 1175 const char *attributes, 1176 GCancellable *cancellable, 1177 GError **error) 1178 { 1179 GFileIface *iface; 1180 1181 g_return_val_if_fail (G_IS_FILE (file), NULL); 1182 1183 if (g_cancellable_set_error_if_cancelled (cancellable, error)) 1184 return NULL; 1185 1186 iface = G_FILE_GET_IFACE (file); 1187 1188 if (iface->query_filesystem_info == NULL) 1189 { 1190 g_set_error_literal (error, G_IO_ERROR, 1191 G_IO_ERROR_NOT_SUPPORTED, 1192 _("Operation not supported")); 1193 return NULL; 1194 } 1195 1196 return (* iface->query_filesystem_info) (file, attributes, cancellable, error); 1197 } 1198 1199 /** 1200 * g_file_query_filesystem_info_async: 1201 * @file: input #GFile. 1202 * @attributes: an attribute query string. 1203 * @io_priority: the <link linkend="io-priority">I/O priority</link> 1204 * of the request. 1205 * @cancellable: optional #GCancellable object, %NULL to ignore. 1206 * @callback: a #GAsyncReadyCallback to call when the request is satisfied 1207 * @user_data: the data to pass to callback function 1208 * 1209 * Asynchronously gets the requested information about the filesystem 1210 * that the specified @file is on. The result is a #GFileInfo object 1211 * that contains key-value attributes (such as type or size for the 1212 * file). 1213 * 1214 * For more details, see g_file_query_filesystem_info() which is the 1215 * synchronous version of this call. 1216 * 1217 * When the operation is finished, @callback will be called. You can 1218 * then call g_file_query_info_finish() to get the result of the 1219 * operation. 1220 **/ 1221 void 1222 g_file_query_filesystem_info_async (GFile *file, 1223 const char *attributes, 1224 int io_priority, 1225 GCancellable *cancellable, 1226 GAsyncReadyCallback callback, 1227 gpointer user_data) 1228 { 1229 GFileIface *iface; 1230 1231 g_return_if_fail (G_IS_FILE (file)); 1232 1233 iface = G_FILE_GET_IFACE (file); 1234 (* iface->query_filesystem_info_async) (file, 1235 attributes, 1236 io_priority, 1237 cancellable, 1238 callback, 1239 user_data); 1240 } 1241 1242 /** 1243 * g_file_query_filesystem_info_finish: 1244 * @file: input #GFile. 1245 * @res: a #GAsyncResult. 1246 * @error: a #GError. 1247 * 1248 * Finishes an asynchronous filesystem info query. See 1249 * g_file_query_filesystem_info_async(). 1250 * 1251 * Returns: #GFileInfo for given @file or %NULL on error. 1252 * Free the returned object with g_object_unref(). 1253 **/ 1254 GFileInfo * 1255 g_file_query_filesystem_info_finish (GFile *file, 1256 GAsyncResult *res, 1257 GError **error) 1258 { 1259 GFileIface *iface; 1260 1261 g_return_val_if_fail (G_IS_FILE (file), NULL); 1262 g_return_val_if_fail (G_IS_ASYNC_RESULT (res), NULL); 1263 1264 if (G_IS_SIMPLE_ASYNC_RESULT (res)) 1265 { 1266 GSimpleAsyncResult *simple = G_SIMPLE_ASYNC_RESULT (res); 1267 if (g_simple_async_result_propagate_error (simple, error)) 1268 return NULL; 1269 } 1270 1271 iface = G_FILE_GET_IFACE (file); 1272 return (* iface->query_filesystem_info_finish) (file, res, error); 1273 } 1274 1275 /** 1276 * g_file_find_enclosing_mount: 1277 * @file: input #GFile. 1278 * @cancellable: optional #GCancellable object, %NULL to ignore. 1279 * @error: a #GError. 1280 * 1281 * Gets a #GMount for the #GFile. 1282 * 1283 * If the #GFileIface for @file does not have a mount (e.g. possibly a 1284 * remote share), @error will be set to %G_IO_ERROR_NOT_FOUND and %NULL 1285 * will be returned. 1286 * 1287 * If @cancellable is not %NULL, then the operation can be cancelled by 1288 * triggering the cancellable object from another thread. If the operation 1289 * was cancelled, the error %G_IO_ERROR_CANCELLED will be returned. 1290 * 1291 * Returns: a #GMount where the @file is located or %NULL on error. 1292 * Free the returned object with g_object_unref(). 1293 **/ 1294 GMount * 1295 g_file_find_enclosing_mount (GFile *file, 1296 GCancellable *cancellable, 1297 GError **error) 1298 { 1299 GFileIface *iface; 1300 1301 g_return_val_if_fail (G_IS_FILE (file), NULL); 1302 1303 if (g_cancellable_set_error_if_cancelled (cancellable, error)) 1304 return NULL; 1305 1306 iface = G_FILE_GET_IFACE (file); 1307 if (iface->find_enclosing_mount == NULL) 1308 { 1309 1310 g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_NOT_FOUND, 1311 /* Translators: This is an error message when trying to find the 1312 * enclosing (user visible) mount of a file, but none exists. */ 1313 _("Containing mount does not exist")); 1314 return NULL; 1315 } 1316 1317 return (* iface->find_enclosing_mount) (file, cancellable, error); 1318 } 1319 1320 /** 1321 * g_file_find_enclosing_mount_async: 1322 * @file: a #GFile 1323 * @io_priority: the <link linkend="io-priority">I/O priority</link> 1324 * of the request. 1325 * @cancellable: optional #GCancellable object, %NULL to ignore. 1326 * @callback: a #GAsyncReadyCallback to call when the request is satisfied 1327 * @user_data: the data to pass to callback function 1328 * 1329 * Asynchronously gets the mount for the file. 1330 * 1331 * For more details, see g_file_find_enclosing_mount() which is 1332 * the synchronous version of this call. 1333 * 1334 * When the operation is finished, @callback will be called. You can then call 1335 * g_file_find_enclosing_mount_finish() to get the result of the operation. 1336 */ 1337 void 1338 g_file_find_enclosing_mount_async (GFile *file, 1339 int io_priority, 1340 GCancellable *cancellable, 1341 GAsyncReadyCallback callback, 1342 gpointer user_data) 1343 { 1344 GFileIface *iface; 1345 1346 g_return_if_fail (G_IS_FILE (file)); 1347 1348 iface = G_FILE_GET_IFACE (file); 1349 (* iface->find_enclosing_mount_async) (file, 1350 io_priority, 1351 cancellable, 1352 callback, 1353 user_data); 1354 } 1355 1356 /** 1357 * g_file_find_enclosing_mount_finish: 1358 * @file: a #GFile 1359 * @res: a #GAsyncResult 1360 * @error: a #GError 1361 * 1362 * Finishes an asynchronous find mount request. 1363 * See g_file_find_enclosing_mount_async(). 1364 * 1365 * Returns: #GMount for given @file or %NULL on error. 1366 * Free the returned object with g_object_unref(). 1367 **/ 1368 GMount * 1369 g_file_find_enclosing_mount_finish (GFile *file, 1370 GAsyncResult *res, 1371 GError **error) 1372 { 1373 GFileIface *iface; 1374 1375 g_return_val_if_fail (G_IS_FILE (file), NULL); 1376 g_return_val_if_fail (G_IS_ASYNC_RESULT (res), NULL); 1377 1378 if (G_IS_SIMPLE_ASYNC_RESULT (res)) 1379 { 1380 GSimpleAsyncResult *simple = G_SIMPLE_ASYNC_RESULT (res); 1381 if (g_simple_async_result_propagate_error (simple, error)) 1382 return NULL; 1383 } 1384 1385 iface = G_FILE_GET_IFACE (file); 1386 return (* iface->find_enclosing_mount_finish) (file, res, error); 1387 } 1388 1389 1390 /** 1391 * g_file_read: 1392 * @file: #GFile to read. 1393 * @cancellable: a #GCancellable 1394 * @error: a #GError, or %NULL 1395 * 1396 * Opens a file for reading. The result is a #GFileInputStream that 1397 * can be used to read the contents of the file. 1398 * 1399 * If @cancellable is not %NULL, then the operation can be cancelled by 1400 * triggering the cancellable object from another thread. If the operation 1401 * was cancelled, the error %G_IO_ERROR_CANCELLED will be returned. 1402 * 1403 * If the file does not exist, the G_IO_ERROR_NOT_FOUND error will be returned. 1404 * If the file is a directory, the G_IO_ERROR_IS_DIRECTORY error will be returned. 1405 * Other errors are possible too, and depend on what kind of filesystem the file is on. 1406 * 1407 * Returns: #GFileInputStream or %NULL on error. 1408 * Free the returned object with g_object_unref(). 1409 **/ 1410 GFileInputStream * 1411 g_file_read (GFile *file, 1412 GCancellable *cancellable, 1413 GError **error) 1414 { 1415 GFileIface *iface; 1416 1417 g_return_val_if_fail (G_IS_FILE (file), NULL); 1418 1419 if (g_cancellable_set_error_if_cancelled (cancellable, error)) 1420 return NULL; 1421 1422 iface = G_FILE_GET_IFACE (file); 1423 1424 if (iface->read_fn == NULL) 1425 { 1426 g_set_error_literal (error, G_IO_ERROR, 1427 G_IO_ERROR_NOT_SUPPORTED, 1428 _("Operation not supported")); 1429 return NULL; 1430 } 1431 1432 return (* iface->read_fn) (file, cancellable, error); 1433 } 1434 1435 /** 1436 * g_file_append_to: 1437 * @file: input #GFile. 1438 * @flags: a set of #GFileCreateFlags. 1439 * @cancellable: optional #GCancellable object, %NULL to ignore. 1440 * @error: a #GError, or %NULL 1441 * 1442 * Gets an output stream for appending data to the file. If 1443 * the file doesn't already exist it is created. 1444 * 1445 * By default files created are generally readable by everyone, 1446 * but if you pass #G_FILE_CREATE_PRIVATE in @flags the file 1447 * will be made readable only to the current user, to the level that 1448 * is supported on the target filesystem. 1449 * 1450 * If @cancellable is not %NULL, then the operation can be cancelled by 1451 * triggering the cancellable object from another thread. If the operation 1452 * was cancelled, the error %G_IO_ERROR_CANCELLED will be returned. 1453 * 1454 * Some file systems don't allow all file names, and may 1455 * return an %G_IO_ERROR_INVALID_FILENAME error. 1456 * If the file is a directory the %G_IO_ERROR_IS_DIRECTORY error will be 1457 * returned. Other errors are possible too, and depend on what kind of 1458 * filesystem the file is on. 1459 * 1460 * Returns: a #GFileOutputStream, or %NULL on error. 1461 * Free the returned object with g_object_unref(). 1462 **/ 1463 GFileOutputStream * 1464 g_file_append_to (GFile *file, 1465 GFileCreateFlags flags, 1466 GCancellable *cancellable, 1467 GError **error) 1468 { 1469 GFileIface *iface; 1470 1471 g_return_val_if_fail (G_IS_FILE (file), NULL); 1472 1473 if (g_cancellable_set_error_if_cancelled (cancellable, error)) 1474 return NULL; 1475 1476 iface = G_FILE_GET_IFACE (file); 1477 1478 if (iface->append_to == NULL) 1479 { 1480 g_set_error_literal (error, G_IO_ERROR, 1481 G_IO_ERROR_NOT_SUPPORTED, 1482 _("Operation not supported")); 1483 return NULL; 1484 } 1485 1486 return (* iface->append_to) (file, flags, cancellable, error); 1487 } 1488 1489 /** 1490 * g_file_create: 1491 * @file: input #GFile. 1492 * @flags: a set of #GFileCreateFlags. 1493 * @cancellable: optional #GCancellable object, %NULL to ignore. 1494 * @error: a #GError, or %NULL 1495 * 1496 * Creates a new file and returns an output stream for writing to it. 1497 * The file must not already exist. 1498 * 1499 * By default files created are generally readable by everyone, 1500 * but if you pass #G_FILE_CREATE_PRIVATE in @flags the file 1501 * will be made readable only to the current user, to the level that 1502 * is supported on the target filesystem. 1503 * 1504 * If @cancellable is not %NULL, then the operation can be cancelled by 1505 * triggering the cancellable object from another thread. If the operation 1506 * was cancelled, the error %G_IO_ERROR_CANCELLED will be returned. 1507 * 1508 * If a file or directory with this name already exists the G_IO_ERROR_EXISTS 1509 * error will be returned. 1510 * Some file systems don't allow all file names, and may 1511 * return an G_IO_ERROR_INVALID_FILENAME error, and if the name 1512 * is to long G_IO_ERROR_FILENAME_TOO_LONG will be returned. 1513 * Other errors are possible too, and depend on what kind of 1514 * filesystem the file is on. 1515 * 1516 * Returns: a #GFileOutputStream for the newly created file, or 1517 * %NULL on error. 1518 * Free the returned object with g_object_unref(). 1519 **/ 1520 GFileOutputStream * 1521 g_file_create (GFile *file, 1522 GFileCreateFlags flags, 1523 GCancellable *cancellable, 1524 GError **error) 1525 { 1526 GFileIface *iface; 1527 1528 g_return_val_if_fail (G_IS_FILE (file), NULL); 1529 1530 if (g_cancellable_set_error_if_cancelled (cancellable, error)) 1531 return NULL; 1532 1533 iface = G_FILE_GET_IFACE (file); 1534 1535 if (iface->create == NULL) 1536 { 1537 g_set_error_literal (error, G_IO_ERROR, 1538 G_IO_ERROR_NOT_SUPPORTED, 1539 _("Operation not supported")); 1540 return NULL; 1541 } 1542 1543 return (* iface->create) (file, flags, cancellable, error); 1544 } 1545 1546 /** 1547 * g_file_replace: 1548 * @file: input #GFile. 1549 * @etag: an optional <link linkend="gfile-etag">entity tag</link> for the 1550 * current #GFile, or #NULL to ignore. 1551 * @make_backup: %TRUE if a backup should be created. 1552 * @flags: a set of #GFileCreateFlags. 1553 * @cancellable: optional #GCancellable object, %NULL to ignore. 1554 * @error: a #GError, or %NULL 1555 * 1556 * Returns an output stream for overwriting the file, possibly 1557 * creating a backup copy of the file first. If the file doesn't exist, 1558 * it will be created. 1559 * 1560 * This will try to replace the file in the safest way possible so 1561 * that any errors during the writing will not affect an already 1562 * existing copy of the file. For instance, for local files it 1563 * may write to a temporary file and then atomically rename over 1564 * the destination when the stream is closed. 1565 * 1566 * By default files created are generally readable by everyone, 1567 * but if you pass #G_FILE_CREATE_PRIVATE in @flags the file 1568 * will be made readable only to the current user, to the level that 1569 * is supported on the target filesystem. 1570 * 1571 * If @cancellable is not %NULL, then the operation can be cancelled by 1572 * triggering the cancellable object from another thread. If the operation 1573 * was cancelled, the error %G_IO_ERROR_CANCELLED will be returned. 1574 * 1575 * If you pass in a non-#NULL @etag value, then this value is 1576 * compared to the current entity tag of the file, and if they differ 1577 * an G_IO_ERROR_WRONG_ETAG error is returned. This generally means 1578 * that the file has been changed since you last read it. You can get 1579 * the new etag from g_file_output_stream_get_etag() after you've 1580 * finished writing and closed the #GFileOutputStream. When you load 1581 * a new file you can use g_file_input_stream_query_info() to get 1582 * the etag of the file. 1583 * 1584 * If @make_backup is %TRUE, this function will attempt to make a backup 1585 * of the current file before overwriting it. If this fails a G_IO_ERROR_CANT_CREATE_BACKUP 1586 * error will be returned. If you want to replace anyway, try again with 1587 * @make_backup set to %FALSE. 1588 * 1589 * If the file is a directory the G_IO_ERROR_IS_DIRECTORY error will be returned, 1590 * and if the file is some other form of non-regular file then a 1591 * G_IO_ERROR_NOT_REGULAR_FILE error will be returned. 1592 * Some file systems don't allow all file names, and may 1593 * return an G_IO_ERROR_INVALID_FILENAME error, and if the name 1594 * is to long G_IO_ERROR_FILENAME_TOO_LONG will be returned. 1595 * Other errors are possible too, and depend on what kind of 1596 * filesystem the file is on. 1597 * 1598 * Returns: a #GFileOutputStream or %NULL on error. 1599 * Free the returned object with g_object_unref(). 1600 **/ 1601 GFileOutputStream * 1602 g_file_replace (GFile *file, 1603 const char *etag, 1604 gboolean make_backup, 1605 GFileCreateFlags flags, 1606 GCancellable *cancellable, 1607 GError **error) 1608 { 1609 GFileIface *iface; 1610 1611 g_return_val_if_fail (G_IS_FILE (file), NULL); 1612 1613 if (g_cancellable_set_error_if_cancelled (cancellable, error)) 1614 return NULL; 1615 1616 iface = G_FILE_GET_IFACE (file); 1617 1618 if (iface->replace == NULL) 1619 { 1620 g_set_error_literal (error, G_IO_ERROR, 1621 G_IO_ERROR_NOT_SUPPORTED, 1622 _("Operation not supported")); 1623 return NULL; 1624 } 1625 1626 1627 /* Handle empty tag string as NULL in consistent way. */ 1628 if (etag && *etag == 0) 1629 etag = NULL; 1630 1631 return (* iface->replace) (file, etag, make_backup, flags, cancellable, error); 1632 } 1633 1634 /** 1635 * g_file_read_async: 1636 * @file: input #GFile. 1637 * @io_priority: the <link linkend="io-priority">I/O priority</link> 1638 * of the request. 1639 * @cancellable: optional #GCancellable object, %NULL to ignore. 1640 * @callback: a #GAsyncReadyCallback to call when the request is satisfied 1641 * @user_data: the data to pass to callback function 1642 * 1643 * Asynchronously opens @file for reading. 1644 * 1645 * For more details, see g_file_read() which is 1646 * the synchronous version of this call. 1647 * 1648 * When the operation is finished, @callback will be called. You can then call 1649 * g_file_read_finish() to get the result of the operation. 1650 **/ 1651 void 1652 g_file_read_async (GFile *file, 1653 int io_priority, 1654 GCancellable *cancellable, 1655 GAsyncReadyCallback callback, 1656 gpointer user_data) 1657 { 1658 GFileIface *iface; 1659 1660 g_return_if_fail (G_IS_FILE (file)); 1661 1662 iface = G_FILE_GET_IFACE (file); 1663 (* iface->read_async) (file, 1664 io_priority, 1665 cancellable, 1666 callback, 1667 user_data); 1668 } 1669 1670 /** 1671 * g_file_read_finish: 1672 * @file: input #GFile. 1673 * @res: a #GAsyncResult. 1674 * @error: a #GError, or %NULL 1675 * 1676 * Finishes an asynchronous file read operation started with 1677 * g_file_read_async(). 1678 * 1679 * Returns: a #GFileInputStream or %NULL on error. 1680 * Free the returned object with g_object_unref(). 1681 **/ 1682 GFileInputStream * 1683 g_file_read_finish (GFile *file, 1684 GAsyncResult *res, 1685 GError **error) 1686 { 1687 GFileIface *iface; 1688 1689 g_return_val_if_fail (G_IS_FILE (file), NULL); 1690 g_return_val_if_fail (G_IS_ASYNC_RESULT (res), NULL); 1691 1692 if (G_IS_SIMPLE_ASYNC_RESULT (res)) 1693 { 1694 GSimpleAsyncResult *simple = G_SIMPLE_ASYNC_RESULT (res); 1695 if (g_simple_async_result_propagate_error (simple, error)) 1696 return NULL; 1697 } 1698 1699 iface = G_FILE_GET_IFACE (file); 1700 return (* iface->read_finish) (file, res, error); 1701 } 1702 1703 /** 1704 * g_file_append_to_async: 1705 * @file: input #GFile. 1706 * @flags: a set of #GFileCreateFlags. 1707 * @io_priority: the <link linkend="io-priority">I/O priority</link> 1708 * of the request. 1709 * @cancellable: optional #GCancellable object, %NULL to ignore. 1710 * @callback: a #GAsyncReadyCallback to call when the request is satisfied 1711 * @user_data: the data to pass to callback function 1712 * 1713 * Asynchronously opens @file for appending. 1714 * 1715 * For more details, see g_file_append_to() which is 1716 * the synchronous version of this call. 1717 * 1718 * When the operation is finished, @callback will be called. You can then call 1719 * g_file_append_to_finish() to get the result of the operation. 1720 **/ 1721 void 1722 g_file_append_to_async (GFile *file, 1723 GFileCreateFlags flags, 1724 int io_priority, 1725 GCancellable *cancellable, 1726 GAsyncReadyCallback callback, 1727 gpointer user_data) 1728 { 1729 GFileIface *iface; 1730 1731 g_return_if_fail (G_IS_FILE (file)); 1732 1733 iface = G_FILE_GET_IFACE (file); 1734 (* iface->append_to_async) (file, 1735 flags, 1736 io_priority, 1737 cancellable, 1738 callback, 1739 user_data); 1740 } 1741 1742 /** 1743 * g_file_append_to_finish: 1744 * @file: input #GFile. 1745 * @res: #GAsyncResult 1746 * @error: a #GError, or %NULL 1747 * 1748 * Finishes an asynchronous file append operation started with 1749 * g_file_append_to_async(). 1750 * 1751 * Returns: a valid #GFileOutputStream or %NULL on error. 1752 * Free the returned object with g_object_unref(). 1753 **/ 1754 GFileOutputStream * 1755 g_file_append_to_finish (GFile *file, 1756 GAsyncResult *res, 1757 GError **error) 1758 { 1759 GFileIface *iface; 1760 1761 g_return_val_if_fail (G_IS_FILE (file), NULL); 1762 g_return_val_if_fail (G_IS_ASYNC_RESULT (res), NULL); 1763 1764 if (G_IS_SIMPLE_ASYNC_RESULT (res)) 1765 { 1766 GSimpleAsyncResult *simple = G_SIMPLE_ASYNC_RESULT (res); 1767 if (g_simple_async_result_propagate_error (simple, error)) 1768 return NULL; 1769 } 1770 1771 iface = G_FILE_GET_IFACE (file); 1772 return (* iface->append_to_finish) (file, res, error); 1773 } 1774 1775 /** 1776 * g_file_create_async: 1777 * @file: input #GFile. 1778 * @flags: a set of #GFileCreateFlags. 1779 * @io_priority: the <link linkend="io-priority">I/O priority</link> 1780 * of the request. 1781 * @cancellable: optional #GCancellable object, %NULL to ignore. 1782 * @callback: a #GAsyncReadyCallback to call when the request is satisfied 1783 * @user_data: the data to pass to callback function 1784 * 1785 * Asynchronously creates a new file and returns an output stream for writing to it. 1786 * The file must not already exist. 1787 * 1788 * For more details, see g_file_create() which is 1789 * the synchronous version of this call. 1790 * 1791 * When the operation is finished, @callback will be called. You can then call 1792 * g_file_create_finish() to get the result of the operation. 1793 **/ 1794 void 1795 g_file_create_async (GFile *file, 1796 GFileCreateFlags flags, 1797 int io_priority, 1798 GCancellable *cancellable, 1799 GAsyncReadyCallback callback, 1800 gpointer user_data) 1801 { 1802 GFileIface *iface; 1803 1804 g_return_if_fail (G_IS_FILE (file)); 1805 1806 iface = G_FILE_GET_IFACE (file); 1807 (* iface->create_async) (file, 1808 flags, 1809 io_priority, 1810 cancellable, 1811 callback, 1812 user_data); 1813 } 1814 1815 /** 1816 * g_file_create_finish: 1817 * @file: input #GFile. 1818 * @res: a #GAsyncResult. 1819 * @error: a #GError, or %NULL 1820 * 1821 * Finishes an asynchronous file create operation started with 1822 * g_file_create_async(). 1823 * 1824 * Returns: a #GFileOutputStream or %NULL on error. 1825 * Free the returned object with g_object_unref(). 1826 **/ 1827 GFileOutputStream * 1828 g_file_create_finish (GFile *file, 1829 GAsyncResult *res, 1830 GError **error) 1831 { 1832 GFileIface *iface; 1833 1834 g_return_val_if_fail (G_IS_FILE (file), NULL); 1835 g_return_val_if_fail (G_IS_ASYNC_RESULT (res), NULL); 1836 1837 if (G_IS_SIMPLE_ASYNC_RESULT (res)) 1838 { 1839 GSimpleAsyncResult *simple = G_SIMPLE_ASYNC_RESULT (res); 1840 if (g_simple_async_result_propagate_error (simple, error)) 1841 return NULL; 1842 } 1843 1844 iface = G_FILE_GET_IFACE (file); 1845 return (* iface->create_finish) (file, res, error); 1846 } 1847 1848 /** 1849 * g_file_replace_async: 1850 * @file: input #GFile. 1851 * @etag: an <link linkend="gfile-etag">entity tag</link> for the 1852 * current #GFile, or NULL to ignore. 1853 * @make_backup: %TRUE if a backup should be created. 1854 * @flags: a set of #GFileCreateFlags. 1855 * @io_priority: the <link linkend="io-priority">I/O priority</link> 1856 * of the request. 1857 * @cancellable: optional #GCancellable object, %NULL to ignore. 1858 * @callback: a #GAsyncReadyCallback to call when the request is satisfied 1859 * @user_data: the data to pass to callback function 1860 * 1861 * Asynchronously overwrites the file, replacing the contents, possibly 1862 * creating a backup copy of the file first. 1863 * 1864 * For more details, see g_file_replace() which is 1865 * the synchronous version of this call. 1866 * 1867 * When the operation is finished, @callback will be called. You can then call 1868 * g_file_replace_finish() to get the result of the operation. 1869 **/ 1870 void 1871 g_file_replace_async (GFile *file, 1872 const char *etag, 1873 gboolean make_backup, 1874 GFileCreateFlags flags, 1875 int io_priority, 1876 GCancellable *cancellable, 1877 GAsyncReadyCallback callback, 1878 gpointer user_data) 1879 { 1880 GFileIface *iface; 1881 1882 g_return_if_fail (G_IS_FILE (file)); 1883 1884 iface = G_FILE_GET_IFACE (file); 1885 (* iface->replace_async) (file, 1886 etag, 1887 make_backup, 1888 flags, 1889 io_priority, 1890 cancellable, 1891 callback, 1892 user_data); 1893 } 1894 1895 /** 1896 * g_file_replace_finish: 1897 * @file: input #GFile. 1898 * @res: a #GAsyncResult. 1899 * @error: a #GError, or %NULL 1900 * 1901 * Finishes an asynchronous file replace operation started with 1902 * g_file_replace_async(). 1903 * 1904 * Returns: a #GFileOutputStream, or %NULL on error. 1905 * Free the returned object with g_object_unref(). 1906 **/ 1907 GFileOutputStream * 1908 g_file_replace_finish (GFile *file, 1909 GAsyncResult *res, 1910 GError **error) 1911 { 1912 GFileIface *iface; 1913 1914 g_return_val_if_fail (G_IS_FILE (file), NULL); 1915 g_return_val_if_fail (G_IS_ASYNC_RESULT (res), NULL); 1916 1917 if (G_IS_SIMPLE_ASYNC_RESULT (res)) 1918 { 1919 GSimpleAsyncResult *simple = G_SIMPLE_ASYNC_RESULT (res); 1920 if (g_simple_async_result_propagate_error (simple, error)) 1921 return NULL; 1922 } 1923 1924 iface = G_FILE_GET_IFACE (file); 1925 return (* iface->replace_finish) (file, res, error); 1926 } 1927 1928 static gboolean 1929 copy_symlink (GFile *destination, 1930 GFileCopyFlags flags, 1931 GCancellable *cancellable, 1932 const char *target, 1933 GError **error) 1934 { 1935 GError *my_error; 1936 gboolean tried_delete; 1937 GFileInfo *info; 1938 GFileType file_type; 1939 1940 tried_delete = FALSE; 1941 1942 retry: 1943 my_error = NULL; 1944 if (!g_file_make_symbolic_link (destination, target, cancellable, &my_error)) 1945 { 1946 /* Maybe it already existed, and we want to overwrite? */ 1947 if (!tried_delete && (flags & G_FILE_COPY_OVERWRITE) && 1948 my_error->domain == G_IO_ERROR && my_error->code == G_IO_ERROR_EXISTS) 1949 { 1950 g_error_free (my_error); 1951 1952 1953 /* Don't overwrite if the destination is a directory */ 1954 info = g_file_query_info (destination, G_FILE_ATTRIBUTE_STANDARD_TYPE, 1955 G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS, 1956 cancellable, &my_error); 1957 if (info != NULL) 1958 { 1959 file_type = g_file_info_get_file_type (info); 1960 g_object_unref (info); 1961 1962 if (file_type == G_FILE_TYPE_DIRECTORY) 1963 { 1964 g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_IS_DIRECTORY, 1965 _("Can't copy over directory")); 1966 return FALSE; 1967 } 1968 } 1969 1970 if (!g_file_delete (destination, cancellable, error)) 1971 return FALSE; 1972 1973 tried_delete = TRUE; 1974 goto retry; 1975 } 1976 /* Nah, fail */ 1977 g_propagate_error (error, my_error); 1978 return FALSE; 1979 } 1980 1981 return TRUE; 1982 } 1983 1984 static GInputStream * 1985 open_source_for_copy (GFile *source, 1986 GFile *destination, 1987 GFileCopyFlags flags, 1988 GCancellable *cancellable, 1989 GError **error) 1990 { 1991 GError *my_error; 1992 GInputStream *in; 1993 GFileInfo *info; 1994 GFileType file_type; 1995 1996 my_error = NULL; 1997 in = (GInputStream *)g_file_read (source, cancellable, &my_error); 1998 if (in != NULL) 1999 return in; 2000 2001 /* There was an error opening the source, try to set a good error for it: */ 2002 2003 if (my_error->domain == G_IO_ERROR && my_error->code == G_IO_ERROR_IS_DIRECTORY) 2004 { 2005 /* The source is a directory, don't fail with WOULD_RECURSE immediately, 2006 * as that is less useful to the app. Better check for errors on the 2007 * target instead. 2008 */ 2009 g_error_free (my_error); 2010 my_error = NULL; 2011 2012 info = g_file_query_info (destination, G_FILE_ATTRIBUTE_STANDARD_TYPE, 2013 G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS, 2014 cancellable, &my_error); 2015 if (info != NULL) 2016 { 2017 file_type = g_file_info_get_file_type (info); 2018 g_object_unref (info); 2019 2020 if (flags & G_FILE_COPY_OVERWRITE) 2021 { 2022 if (file_type == G_FILE_TYPE_DIRECTORY) 2023 { 2024 g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_WOULD_MERGE, 2025 _("Can't copy directory over directory")); 2026 return NULL; 2027 } 2028 /* continue to would_recurse error */ 2029 } 2030 else 2031 { 2032 g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_EXISTS, 2033 _("Target file exists")); 2034 return NULL; 2035 } 2036 } 2037 else 2038 { 2039 /* Error getting info from target, return that error 2040 * (except for NOT_FOUND, which is no error here) 2041 */ 2042 if (my_error->domain != G_IO_ERROR && my_error->code != G_IO_ERROR_NOT_FOUND) 2043 { 2044 g_propagate_error (error, my_error); 2045 return NULL; 2046 } 2047 g_error_free (my_error); 2048 } 2049 2050 g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_WOULD_RECURSE, 2051 _("Can't recursively copy directory")); 2052 return NULL; 2053 } 2054 2055 g_propagate_error (error, my_error); 2056 return NULL; 2057 } 2058 2059 static gboolean 2060 should_copy (GFileAttributeInfo *info, 2061 gboolean as_move, 2062 gboolean skip_perms) 2063 { 2064 if (skip_perms && strcmp(info->name, "unix::mode") == 0) 2065 return FALSE; 2066 2067 if (as_move) 2068 return info->flags & G_FILE_ATTRIBUTE_INFO_COPY_WHEN_MOVED; 2069 return info->flags & G_FILE_ATTRIBUTE_INFO_COPY_WITH_FILE; 2070 } 2071 2072 static char * 2073 build_attribute_list_for_copy (GFileAttributeInfoList *attributes, 2074 GFileAttributeInfoList *namespaces, 2075 gboolean as_move, 2076 gboolean skip_perms) 2077 { 2078 GString *s; 2079 gboolean first; 2080 int i; 2081 2082 first = TRUE; 2083 s = g_string_new (""); 2084 2085 if (attributes) 2086 { 2087 for (i = 0; i < attributes->n_infos; i++) 2088 { 2089 if (should_copy (&attributes->infos[i], as_move, skip_perms)) 2090 { 2091 if (first) 2092 first = FALSE; 2093 else 2094 g_string_append_c (s, ','); 2095 2096 g_string_append (s, attributes->infos[i].name); 2097 } 2098 } 2099 } 2100 2101 if (namespaces) 2102 { 2103 for (i = 0; i < namespaces->n_infos; i++) 2104 { 2105 if (should_copy (&namespaces->infos[i], as_move, FALSE)) 2106 { 2107 if (first) 2108 first = FALSE; 2109 else 2110 g_string_append_c (s, ','); 2111 2112 g_string_append (s, namespaces->infos[i].name); 2113 g_string_append (s, ":*"); 2114 } 2115 } 2116 } 2117 2118 return g_string_free (s, FALSE); 2119 } 2120 2121 /** 2122 * g_file_copy_attributes: 2123 * @source: a #GFile with attributes. 2124 * @destination: a #GFile to copy attributes to. 2125 * @flags: a set of #GFileCopyFlags. 2126 * @cancellable: optional #GCancellable object, %NULL to ignore. 2127 * @error: a #GError, %NULL to ignore. 2128 * 2129 * Copies the file attributes from @source to @destination. 2130 * 2131 * Normally only a subset of the file attributes are copied, 2132 * those that are copies in a normal file copy operation 2133 * (which for instance does not include e.g. owner). However 2134 * if #G_FILE_COPY_ALL_METADATA is specified in @flags, then 2135 * all the metadata that is possible to copy is copied. This 2136 * is useful when implementing move by copy + delete source. 2137 * 2138 * Returns: %TRUE if the attributes were copied successfully, %FALSE otherwise. 2139 **/ 2140 gboolean 2141 g_file_copy_attributes (GFile *source, 2142 GFile *destination, 2143 GFileCopyFlags flags, 2144 GCancellable *cancellable, 2145 GError **error) 2146 { 2147 GFileAttributeInfoList *attributes, *namespaces; 2148 char *attrs_to_read; 2149 gboolean res; 2150 GFileInfo *info; 2151 gboolean as_move; 2152 gboolean source_nofollow_symlinks; 2153 gboolean skip_perms; 2154 2155 as_move = flags & G_FILE_COPY_ALL_METADATA; 2156 source_nofollow_symlinks = flags & G_FILE_COPY_NOFOLLOW_SYMLINKS; 2157 skip_perms = (flags & G_FILE_COPY_TARGET_DEFAULT_PERMS) != 0; 2158 2159 /* Ignore errors here, if the target supports no attributes there is nothing to copy */ 2160 attributes = g_file_query_settable_attributes (destination, cancellable, NULL); 2161 namespaces = g_file_query_writable_namespaces (destination, cancellable, NULL); 2162 2163 if (attributes == NULL && namespaces == NULL) 2164 return TRUE; 2165 2166 attrs_to_read = build_attribute_list_for_copy (attributes, namespaces, as_move, skip_perms); 2167 2168 /* Ignore errors here, if we can't read some info (e.g. if it doesn't exist) 2169 * we just don't copy it. 2170 */ 2171 info = g_file_query_info (source, attrs_to_read, 2172 source_nofollow_symlinks ? G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS:0, 2173 cancellable, 2174 NULL); 2175 2176 g_free (attrs_to_read); 2177 2178 res = TRUE; 2179 if (info) 2180 { 2181 res = g_file_set_attributes_from_info (destination, 2182 info, 2183 G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS, 2184 cancellable, 2185 error); 2186 g_object_unref (info); 2187 } 2188 2189 g_file_attribute_info_list_unref (attributes); 2190 g_file_attribute_info_list_unref (namespaces); 2191 2192 return res; 2193 } 2194 2195 /* Closes the streams */ 2196 static gboolean 2197 copy_stream_with_progress (GInputStream *in, 2198 GOutputStream *out, 2199 GFile *source, 2200 GCancellable *cancellable, 2201 GFileProgressCallback progress_callback, 2202 gpointer progress_callback_data, 2203 GError **error) 2204 { 2205 gssize n_read, n_written; 2206 goffset current_size; 2207 char buffer[1024*64], *p; 2208 gboolean res; 2209 goffset total_size; 2210 GFileInfo *info; 2211 2212 total_size = -1; 2213 info = g_file_input_stream_query_info (G_FILE_INPUT_STREAM (in), 2214 G_FILE_ATTRIBUTE_STANDARD_SIZE, 2215 cancellable, NULL); 2216 if (info) 2217 { 2218 if (g_file_info_has_attribute (info, G_FILE_ATTRIBUTE_STANDARD_SIZE)) 2219 total_size = g_file_info_get_size (info); 2220 g_object_unref (info); 2221 } 2222 2223 if (total_size == -1) 2224 { 2225 info = g_file_query_info (source, 2226 G_FILE_ATTRIBUTE_STANDARD_SIZE, 2227 G_FILE_QUERY_INFO_NONE, 2228 cancellable, NULL); 2229 if (info) 2230 { 2231 if (g_file_info_has_attribute (info, G_FILE_ATTRIBUTE_STANDARD_SIZE)) 2232 total_size = g_file_info_get_size (info); 2233 g_object_unref (info); 2234 } 2235 } 2236 2237 if (total_size == -1) 2238 total_size = 0; 2239 2240 current_size = 0; 2241 res = TRUE; 2242 while (TRUE) 2243 { 2244 n_read = g_input_stream_read (in, buffer, sizeof (buffer), cancellable, error); 2245 if (n_read == -1) 2246 { 2247 res = FALSE; 2248 break; 2249 } 2250 2251 if (n_read == 0) 2252 break; 2253 2254 current_size += n_read; 2255 2256 p = buffer; 2257 while (n_read > 0) 2258 { 2259 n_written = g_output_stream_write (out, p, n_read, cancellable, error); 2260 if (n_written == -1) 2261 { 2262 res = FALSE; 2263 break; 2264 } 2265 2266 p += n_written; 2267 n_read -= n_written; 2268 } 2269 2270 if (!res) 2271 break; 2272 2273 if (progress_callback) 2274 progress_callback (current_size, total_size, progress_callback_data); 2275 } 2276 2277 if (!res) 2278 error = NULL; /* Ignore further errors */ 2279 2280 /* Make sure we send full copied size */ 2281 if (progress_callback) 2282 progress_callback (current_size, total_size, progress_callback_data); 2283 2284 /* Don't care about errors in source here */ 2285 g_input_stream_close (in, cancellable, NULL); 2286 2287 /* But write errors on close are bad! */ 2288 if (!g_output_stream_close (out, cancellable, error)) 2289 res = FALSE; 2290 2291 g_object_unref (in); 2292 g_object_unref (out); 2293 2294 return res; 2295 } 2296 2297 static gboolean 2298 file_copy_fallback (GFile *source, 2299 GFile *destination, 2300 GFileCopyFlags flags, 2301 GCancellable *cancellable, 2302 GFileProgressCallback progress_callback, 2303 gpointer progress_callback_data, 2304 GError **error) 2305 { 2306 GInputStream *in; 2307 GOutputStream *out; 2308 GFileInfo *info; 2309 const char *target; 2310 2311 /* need to know the file type */ 2312 info = g_file_query_info (source, 2313 G_FILE_ATTRIBUTE_STANDARD_TYPE "," G_FILE_ATTRIBUTE_STANDARD_SYMLINK_TARGET, 2314 G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS, 2315 cancellable, 2316 error); 2317 2318 if (info == NULL) 2319 return FALSE; 2320 2321 /* Maybe copy the symlink? */ 2322 if ((flags & G_FILE_COPY_NOFOLLOW_SYMLINKS) && 2323 g_file_info_get_file_type (info) == G_FILE_TYPE_SYMBOLIC_LINK) 2324 { 2325 target = g_file_info_get_symlink_target (info); 2326 if (target) 2327 { 2328 if (!copy_symlink (destination, flags, cancellable, target, error)) 2329 { 2330 g_object_unref (info); 2331 return FALSE; 2332 } 2333 2334 g_object_unref (info); 2335 goto copied_file; 2336 } 2337 /* ... else fall back on a regular file copy */ 2338 g_object_unref (info); 2339 } 2340 /* Handle "special" files (pipes, device nodes, ...)? */ 2341 else if (g_file_info_get_file_type (info) == G_FILE_TYPE_SPECIAL) 2342 { 2343 /* FIXME: could try to recreate device nodes and others? */ 2344 2345 g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED, 2346 _("Can't copy special file")); 2347 g_object_unref (info); 2348 return FALSE; 2349 } 2350 /* Everything else should just fall back on a regular copy. */ 2351 else 2352 g_object_unref (info); 2353 2354 in = open_source_for_copy (source, destination, flags, cancellable, error); 2355 if (in == NULL) 2356 return FALSE; 2357 2358 if (flags & G_FILE_COPY_OVERWRITE) 2359 { 2360 out = (GOutputStream *)g_file_replace (destination, 2361 NULL, 2362 flags & G_FILE_COPY_BACKUP, 2363 G_FILE_CREATE_REPLACE_DESTINATION, 2364 cancellable, error); 2365 } 2366 else 2367 { 2368 out = (GOutputStream *)g_file_create (destination, 0, cancellable, error); 2369 } 2370 2371 if (out == NULL) 2372 { 2373 g_object_unref (in); 2374 return FALSE; 2375 } 2376 2377 if (!copy_stream_with_progress (in, out, source, cancellable, 2378 progress_callback, progress_callback_data, 2379 error)) 2380 return FALSE; 2381 2382 copied_file: 2383 2384 /* Ignore errors here. Failure to copy metadata is not a hard error */ 2385 g_file_copy_attributes (source, destination, 2386 flags, cancellable, NULL); 2387 2388 return TRUE; 2389 } 2390 2391 /** 2392 * g_file_copy: 2393 * @source: input #GFile. 2394 * @destination: destination #GFile 2395 * @flags: set of #GFileCopyFlags 2396 * @cancellable: optional #GCancellable object, %NULL to ignore. 2397 * @progress_callback: function to callback with progress information 2398 * @progress_callback_data: user data to pass to @progress_callback 2399 * @error: #GError to set on error, or %NULL 2400 * 2401 * Copies the file @source to the location specified by @destination. 2402 * Can not handle recursive copies of directories. 2403 * 2404 * If the flag #G_FILE_COPY_OVERWRITE is specified an already 2405 * existing @destination file is overwritten. 2406 * 2407 * If the flag #G_FILE_COPY_NOFOLLOW_SYMLINKS is specified then symlinks 2408 * will be copied as symlinks, otherwise the target of the 2409 * @source symlink will be copied. 2410 * 2411 * If @cancellable is not %NULL, then the operation can be cancelled by 2412 * triggering the cancellable object from another thread. If the operation 2413 * was cancelled, the error %G_IO_ERROR_CANCELLED will be returned. 2414 * 2415 * If @progress_callback is not %NULL, then the operation can be monitored by 2416 * setting this to a #GFileProgressCallback function. @progress_callback_data 2417 * will be passed to this function. It is guaranteed that this callback will 2418 * be called after all data has been transferred with the total number of bytes 2419 * copied during the operation. 2420 * 2421 * If the @source file does not exist then the G_IO_ERROR_NOT_FOUND 2422 * error is returned, independent on the status of the @destination. 2423 * 2424 * If #G_FILE_COPY_OVERWRITE is not specified and the target exists, then the 2425 * error G_IO_ERROR_EXISTS is returned. 2426 * 2427 * If trying to overwrite a file over a directory the G_IO_ERROR_IS_DIRECTORY 2428 * error is returned. If trying to overwrite a directory with a directory the 2429 * G_IO_ERROR_WOULD_MERGE error is returned. 2430 * 2431 * If the source is a directory and the target does not exist, or #G_FILE_COPY_OVERWRITE is 2432 * specified and the target is a file, then the G_IO_ERROR_WOULD_RECURSE error 2433 * is returned. 2434 * 2435 * If you are interested in copying the #GFile object itself (not the on-disk 2436 * file), see g_file_dup(). 2437 * 2438 * Returns: %TRUE on success, %FALSE otherwise. 2439 **/ 2440 gboolean 2441 g_file_copy (GFile *source, 2442 GFile *destination, 2443 GFileCopyFlags flags, 2444 GCancellable *cancellable, 2445 GFileProgressCallback progress_callback, 2446 gpointer progress_callback_data, 2447 GError **error) 2448 { 2449 GFileIface *iface; 2450 GError *my_error; 2451 gboolean res; 2452 2453 g_return_val_if_fail (G_IS_FILE (source), FALSE); 2454 g_return_val_if_fail (G_IS_FILE (destination), FALSE); 2455 2456 if (g_cancellable_set_error_if_cancelled (cancellable, error)) 2457 return FALSE; 2458 2459 iface = G_FILE_GET_IFACE (destination); 2460 if (iface->copy) 2461 { 2462 my_error = NULL; 2463 res = (* iface->copy) (source, destination, 2464 flags, cancellable, 2465 progress_callback, progress_callback_data, 2466 &my_error); 2467 2468 if (res) 2469 return TRUE; 2470 2471 if (my_error->domain != G_IO_ERROR || my_error->code != G_IO_ERROR_NOT_SUPPORTED) 2472 { 2473 g_propagate_error (error, my_error); 2474 return FALSE; 2475 } 2476 else 2477 g_clear_error (&my_error); 2478 } 2479 2480 /* If the types are different, and the destination method failed 2481 also try the source method */ 2482 if (G_OBJECT_TYPE (source) != G_OBJECT_TYPE (destination)) 2483 { 2484 iface = G_FILE_GET_IFACE (source); 2485 2486 if (iface->copy) 2487 { 2488 my_error = NULL; 2489 res = (* iface->copy) (source, destination, 2490 flags, cancellable, 2491 progress_callback, progress_callback_data, 2492 &my_error); 2493 2494 if (res) 2495 return TRUE; 2496 2497 if (my_error->domain != G_IO_ERROR || my_error->code != G_IO_ERROR_NOT_SUPPORTED) 2498 { 2499 g_propagate_error (error, my_error); 2500 return FALSE; 2501 } 2502 else 2503 g_clear_error (&my_error); 2504 } 2505 } 2506 2507 return file_copy_fallback (source, destination, flags, cancellable, 2508 progress_callback, progress_callback_data, 2509 error); 2510 } 2511 2512 /** 2513 * g_file_copy_async: 2514 * @source: input #GFile. 2515 * @destination: destination #GFile 2516 * @flags: set of #GFileCopyFlags 2517 * @io_priority: the <link linkend="io-priority">I/O priority</link> 2518 * of the request. 2519 * @cancellable: optional #GCancellable object, %NULL to ignore. 2520 * @progress_callback: function to callback with progress information 2521 * @progress_callback_data: user data to pass to @progress_callback 2522 * @callback: a #GAsyncReadyCallback to call when the request is satisfied 2523 * @user_data: the data to pass to callback function 2524 * 2525 * Copies the file @source to the location specified by @destination 2526 * asynchronously. For details of the behaviour, see g_file_copy(). 2527 * 2528 * If @progress_callback is not %NULL, then that function that will be called 2529 * just like in g_file_copy(), however the callback will run in the main loop, 2530 * not in the thread that is doing the I/O operation. 2531 * 2532 * When the operation is finished, @callback will be called. You can then call 2533 * g_file_copy_finish() to get the result of the operation. 2534 **/ 2535 void 2536 g_file_copy_async (GFile *source, 2537 GFile *destination, 2538 GFileCopyFlags flags, 2539 int io_priority, 2540 GCancellable *cancellable, 2541 GFileProgressCallback progress_callback, 2542 gpointer progress_callback_data, 2543 GAsyncReadyCallback callback, 2544 gpointer user_data) 2545 { 2546 GFileIface *iface; 2547 2548 g_return_if_fail (G_IS_FILE (source)); 2549 g_return_if_fail (G_IS_FILE (destination)); 2550 2551 iface = G_FILE_GET_IFACE (source); 2552 (* iface->copy_async) (source, 2553 destination, 2554 flags, 2555 io_priority, 2556 cancellable, 2557 progress_callback, 2558 progress_callback_data, 2559 callback, 2560 user_data); 2561 } 2562 2563 /** 2564 * g_file_copy_finish: 2565 * @file: input #GFile. 2566 * @res: a #GAsyncResult. 2567 * @error: a #GError, or %NULL 2568 * 2569 * Finishes copying the file started with 2570 * g_file_copy_async(). 2571 * 2572 * Returns: a %TRUE on success, %FALSE on error. 2573 **/ 2574 gboolean 2575 g_file_copy_finish (GFile *file, 2576 GAsyncResult *res, 2577 GError **error) 2578 { 2579 GFileIface *iface; 2580 2581 g_return_val_if_fail (G_IS_FILE (file), FALSE); 2582 g_return_val_if_fail (G_IS_ASYNC_RESULT (res), FALSE); 2583 2584 if (G_IS_SIMPLE_ASYNC_RESULT (res)) 2585 { 2586 GSimpleAsyncResult *simple = G_SIMPLE_ASYNC_RESULT (res); 2587 2588 if (g_simple_async_result_propagate_error (simple, error)) 2589 return FALSE; 2590 } 2591 2592 iface = G_FILE_GET_IFACE (file); 2593 return (* iface->copy_finish) (file, res, error); 2594 } 2595 2596 /** 2597 * g_file_move: 2598 * @source: #GFile pointing to the source location. 2599 * @destination: #GFile pointing to the destination location. 2600 * @flags: set of #GFileCopyFlags. 2601 * @cancellable: optional #GCancellable object, %NULL to ignore. 2602 * @progress_callback: #GFileProgressCallback function for updates. 2603 * @progress_callback_data: gpointer to user data for the callback function. 2604 * @error: #GError for returning error conditions, or %NULL 2605 * 2606 * 2607 * Tries to move the file or directory @source to the location specified by @destination. 2608 * If native move operations are supported then this is used, otherwise a copy + delete 2609 * fallback is used. The native implementation may support moving directories (for instance 2610 * on moves inside the same filesystem), but the fallback code does not. 2611 * 2612 * If the flag #G_FILE_COPY_OVERWRITE is specified an already 2613 * existing @destination file is overwritten. 2614 * 2615 * If the flag #G_FILE_COPY_NOFOLLOW_SYMLINKS is specified then symlinks 2616 * will be copied as symlinks, otherwise the target of the 2617 * @source symlink will be copied. 2618 * 2619 * If @cancellable is not %NULL, then the operation can be cancelled by 2620 * triggering the cancellable object from another thread. If the operation 2621 * was cancelled, the error %G_IO_ERROR_CANCELLED will be returned. 2622 * 2623 * If @progress_callback is not %NULL, then the operation can be monitored by 2624 * setting this to a #GFileProgressCallback function. @progress_callback_data 2625 * will be passed to this function. It is guaranteed that this callback will 2626 * be called after all data has been transferred with the total number of bytes 2627 * copied during the operation. 2628 * 2629 * If the @source file does not exist then the G_IO_ERROR_NOT_FOUND 2630 * error is returned, independent on the status of the @destination. 2631 * 2632 * If #G_FILE_COPY_OVERWRITE is not specified and the target exists, then the 2633 * error G_IO_ERROR_EXISTS is returned. 2634 * 2635 * If trying to overwrite a file over a directory the G_IO_ERROR_IS_DIRECTORY 2636 * error is returned. If trying to overwrite a directory with a directory the 2637 * G_IO_ERROR_WOULD_MERGE error is returned. 2638 * 2639 * If the source is a directory and the target does not exist, or #G_FILE_COPY_OVERWRITE is 2640 * specified and the target is a file, then the G_IO_ERROR_WOULD_RECURSE error 2641 * may be returned (if the native move operation isn't available). 2642 * 2643 * Returns: %TRUE on successful move, %FALSE otherwise. 2644 **/ 2645 gboolean 2646 g_file_move (GFile *source, 2647 GFile *destination, 2648 GFileCopyFlags flags, 2649 GCancellable *cancellable, 2650 GFileProgressCallback progress_callback, 2651 gpointer progress_callback_data, 2652 GError **error) 2653 { 2654 GFileIface *iface; 2655 GError *my_error; 2656 gboolean res; 2657 2658 g_return_val_if_fail (G_IS_FILE (source), FALSE); 2659 g_return_val_if_fail (G_IS_FILE (destination), FALSE); 2660 2661 if (g_cancellable_set_error_if_cancelled (cancellable, error)) 2662 return FALSE; 2663 2664 iface = G_FILE_GET_IFACE (destination); 2665 if (iface->move) 2666 { 2667 my_error = NULL; 2668 res = (* iface->move) (source, destination, 2669 flags, cancellable, 2670 progress_callback, progress_callback_data, 2671 &my_error); 2672 2673 if (res) 2674 return TRUE; 2675 2676 if (my_error->domain != G_IO_ERROR || my_error->code != G_IO_ERROR_NOT_SUPPORTED) 2677 { 2678 g_propagate_error (error, my_error); 2679 return FALSE; 2680 } 2681 } 2682 2683 /* If the types are different, and the destination method failed 2684 also try the source method */ 2685 if (G_OBJECT_TYPE (source) != G_OBJECT_TYPE (destination)) 2686 { 2687 iface = G_FILE_GET_IFACE (source); 2688 2689 if (iface->move) 2690 { 2691 my_error = NULL; 2692 res = (* iface->move) (source, destination, 2693 flags, cancellable, 2694 progress_callback, progress_callback_data, 2695 &my_error); 2696 2697 if (res) 2698 return TRUE; 2699 2700 if (my_error->domain != G_IO_ERROR || my_error->code != G_IO_ERROR_NOT_SUPPORTED) 2701 { 2702 g_propagate_error (error, my_error); 2703 return FALSE; 2704 } 2705 } 2706 } 2707 2708 if (flags & G_FILE_COPY_NO_FALLBACK_FOR_MOVE) 2709 { 2710 g_set_error_literal (error, G_IO_ERROR, 2711 G_IO_ERROR_NOT_SUPPORTED, 2712 _("Operation not supported")); 2713 return FALSE; 2714 } 2715 2716 flags |= G_FILE_COPY_ALL_METADATA; 2717 if (!g_file_copy (source, destination, flags, cancellable, 2718 progress_callback, progress_callback_data, 2719 error)) 2720 return FALSE; 2721 2722 return g_file_delete (source, cancellable, error); 2723 } 2724 2725 /** 2726 * g_file_make_directory 2727 * @file: input #GFile. 2728 * @cancellable: optional #GCancellable object, %NULL to ignore. 2729 * @error: a #GError, or %NULL 2730 * 2731 * Creates a directory. Note that this will only create a child directory of 2732 * the immediate parent directory of the path or URI given by the #GFile. To 2733 * recursively create directories, see g_file_make_directory_with_parents(). 2734 * This function will fail if the parent directory does not exist, setting 2735 * @error to %G_IO_ERROR_NOT_FOUND. If the file system doesn't support creating 2736 * directories, this function will fail, setting @error to 2737 * %G_IO_ERROR_NOT_SUPPORTED. 2738 * 2739 * For a local #GFile the newly created directory will have the default 2740 * (current) ownership and permissions of the current process. 2741 * 2742 * If @cancellable is not %NULL, then the operation can be cancelled by 2743 * triggering the cancellable object from another thread. If the operation 2744 * was cancelled, the error %G_IO_ERROR_CANCELLED will be returned. 2745 * 2746 * Returns: %TRUE on successful creation, %FALSE otherwise. 2747 **/ 2748 gboolean 2749 g_file_make_directory (GFile *file, 2750 GCancellable *cancellable, 2751 GError **error) 2752 { 2753 GFileIface *iface; 2754 2755 g_return_val_if_fail (G_IS_FILE (file), FALSE); 2756 2757 if (g_cancellable_set_error_if_cancelled (cancellable, error)) 2758 return FALSE; 2759 2760 iface = G_FILE_GET_IFACE (file); 2761 2762 if (iface->make_directory == NULL) 2763 { 2764 g_set_error_literal (error, G_IO_ERROR, 2765 G_IO_ERROR_NOT_SUPPORTED, 2766 _("Operation not supported")); 2767 return FALSE; 2768 } 2769 2770 return (* iface->make_directory) (file, cancellable, error); 2771 } 2772 2773 /** 2774 * g_file_make_directory_with_parents: 2775 * @file: input #GFile. 2776 * @cancellable: optional #GCancellable object, %NULL to ignore. 2777 * @error: a #GError, or %NULL 2778 * 2779 * Creates a directory and any parent directories that may not exist similar to 2780 * 'mkdir -p'. If the file system does not support creating directories, this 2781 * function will fail, setting @error to %G_IO_ERROR_NOT_SUPPORTED. 2782 * 2783 * For a local #GFile the newly created directories will have the default 2784 * (current) ownership and permissions of the current process. 2785 * 2786 * If @cancellable is not %NULL, then the operation can be cancelled by 2787 * triggering the cancellable object from another thread. If the operation 2788 * was cancelled, the error %G_IO_ERROR_CANCELLED will be returned. 2789 * 2790 * Returns: %TRUE if all directories have been successfully created, %FALSE 2791 * otherwise. 2792 * 2793 * Since: 2.18 2794 **/ 2795 gboolean 2796 g_file_make_directory_with_parents (GFile *file, 2797 GCancellable *cancellable, 2798 GError **error) 2799 { 2800 gboolean result; 2801 GFile *parent_file, *work_file; 2802 GList *list = NULL, *l; 2803 GError *my_error = NULL; 2804 2805 if (g_cancellable_set_error_if_cancelled (cancellable, error)) 2806 return FALSE; 2807 2808 result = g_file_make_directory (file, cancellable, &my_error); 2809 if (result || my_error->code != G_IO_ERROR_NOT_FOUND) 2810 { 2811 if (my_error) 2812 g_propagate_error (error, my_error); 2813 return result; 2814 } 2815 2816 work_file = file; 2817 2818 while (!result && my_error->code == G_IO_ERROR_NOT_FOUND) 2819 { 2820 g_clear_error (&my_error); 2821 2822 parent_file = g_file_get_parent (work_file); 2823 if (parent_file == NULL) 2824 break; 2825 result = g_file_make_directory (parent_file, cancellable, &my_error); 2826 2827 if (!result && my_error->code == G_IO_ERROR_NOT_FOUND) 2828 list = g_list_prepend (list, parent_file); 2829 2830 work_file = parent_file; 2831 } 2832 2833 for (l = list; result && l; l = l->next) 2834 { 2835 result = g_file_make_directory ((GFile *) l->data, cancellable, &my_error); 2836 } 2837 2838 /* Clean up */ 2839 while (list != NULL) 2840 { 2841 g_object_unref ((GFile *) list->data); 2842 list = g_list_remove (list, list->data); 2843 } 2844 2845 if (!result) 2846 { 2847 g_propagate_error (error, my_error); 2848 return result; 2849 } 2850 2851 return g_file_make_directory (file, cancellable, error); 2852 } 2853 2854 /** 2855 * g_file_make_symbolic_link: 2856 * @file: input #GFile. 2857 * @symlink_value: a string with the value of the new symlink. 2858 * @cancellable: optional #GCancellable object, %NULL to ignore. 2859 * @error: a #GError. 2860 * 2861 * Creates a symbolic link. 2862 * 2863 * If @cancellable is not %NULL, then the operation can be cancelled by 2864 * triggering the cancellable object from another thread. If the operation 2865 * was cancelled, the error %G_IO_ERROR_CANCELLED will be returned. 2866 * 2867 * Returns: %TRUE on the creation of a new symlink, %FALSE otherwise. 2868 **/ 2869 gboolean 2870 g_file_make_symbolic_link (GFile *file, 2871 const char *symlink_value, 2872 GCancellable *cancellable, 2873 GError **error) 2874 { 2875 GFileIface *iface; 2876 2877 g_return_val_if_fail (G_IS_FILE (file), FALSE); 2878 g_return_val_if_fail (symlink_value != NULL, FALSE); 2879 2880 if (g_cancellable_set_error_if_cancelled (cancellable, error)) 2881 return FALSE; 2882 2883 if (*symlink_value == '\0') 2884 { 2885 g_set_error_literal (error, G_IO_ERROR, 2886 G_IO_ERROR_INVALID_ARGUMENT, 2887 _("Invalid symlink value given")); 2888 return FALSE; 2889 } 2890 2891 iface = G_FILE_GET_IFACE (file); 2892 2893 if (iface->make_symbolic_link == NULL) 2894 { 2895 g_set_error_literal (error, G_IO_ERROR, 2896 G_IO_ERROR_NOT_SUPPORTED, 2897 _("Operation not supported")); 2898 return FALSE; 2899 } 2900 2901 return (* iface->make_symbolic_link) (file, symlink_value, cancellable, error); 2902 } 2903 2904 /** 2905 * g_file_delete: 2906 * @file: input #GFile. 2907 * @cancellable: optional #GCancellable object, %NULL to ignore. 2908 * @error: a #GError, or %NULL 2909 * 2910 * Deletes a file. If the @file is a directory, it will only be deleted if it 2911 * is empty. 2912 * 2913 * If @cancellable is not %NULL, then the operation can be cancelled by 2914 * triggering the cancellable object from another thread. If the operation 2915 * was cancelled, the error %G_IO_ERROR_CANCELLED will be returned. 2916 * 2917 * Returns: %TRUE if the file was deleted. %FALSE otherwise. 2918 **/ 2919 gboolean 2920 g_file_delete (GFile *file, 2921 GCancellable *cancellable, 2922 GError **error) 2923 { 2924 GFileIface *iface; 2925 2926 g_return_val_if_fail (G_IS_FILE (file), FALSE); 2927 2928 if (g_cancellable_set_error_if_cancelled (cancellable, error)) 2929 return FALSE; 2930 2931 iface = G_FILE_GET_IFACE (file); 2932 2933 if (iface->delete_file == NULL) 2934 { 2935 g_set_error_literal (error, G_IO_ERROR, 2936 G_IO_ERROR_NOT_SUPPORTED, 2937 _("Operation not supported")); 2938 return FALSE; 2939 } 2940 2941 return (* iface->delete_file) (file, cancellable, error); 2942 } 2943 2944 /** 2945 * g_file_trash: 2946 * @file: #GFile to send to trash. 2947 * @cancellable: optional #GCancellable object, %NULL to ignore. 2948 * @error: a #GError, or %NULL 2949 * 2950 * Sends @file to the "Trashcan", if possible. This is similar to 2951 * deleting it, but the user can recover it before emptying the trashcan. 2952 * Not all file systems support trashing, so this call can return the 2953 * %G_IO_ERROR_NOT_SUPPORTED error. 2954 * 2955 * 2956 * If @cancellable is not %NULL, then the operation can be cancelled by 2957 * triggering the cancellable object from another thread. If the operation 2958 * was cancelled, the error %G_IO_ERROR_CANCELLED will be returned. 2959 * 2960 * Returns: %TRUE on successful trash, %FALSE otherwise. 2961 **/ 2962 gboolean 2963 g_file_trash (GFile *file, 2964 GCancellable *cancellable, 2965 GError **error) 2966 { 2967 GFileIface *iface; 2968 2969 g_return_val_if_fail (G_IS_FILE (file), FALSE); 2970 2971 if (g_cancellable_set_error_if_cancelled (cancellable, error)) 2972 return FALSE; 2973 2974 iface = G_FILE_GET_IFACE (file); 2975 2976 if (iface->trash == NULL) 2977 { 2978 g_set_error_literal (error, 2979 G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED, 2980 _("Trash not supported")); 2981 return FALSE; 2982 } 2983 2984 return (* iface->trash) (file, cancellable, error); 2985 } 2986 2987 /** 2988 * g_file_set_display_name: 2989 * @file: input #GFile. 2990 * @display_name: a string. 2991 * @cancellable: optional #GCancellable object, %NULL to ignore. 2992 * @error: a #GError, or %NULL 2993 * 2994 * Renames @file to the specified display name. 2995 * 2996 * The display name is converted from UTF8 to the correct encoding for the target 2997 * filesystem if possible and the @file is renamed to this. 2998 * 2999 * If you want to implement a rename operation in the user interface the edit name 3000 * (#G_FILE_ATTRIBUTE_STANDARD_EDIT_NAME) should be used as the initial value in the rename 3001 * widget, and then the result after editing should be passed to g_file_set_display_name(). 3002 * 3003 * On success the resulting converted filename is returned. 3004 * 3005 * If @cancellable is not %NULL, then the operation can be cancelled by 3006 * triggering the cancellable object from another thread. If the operation 3007 * was cancelled, the error %G_IO_ERROR_CANCELLED will be returned. 3008 * 3009 * Returns: a #GFile specifying what @file was renamed to, or %NULL 3010 * if there was an error. 3011 * Free the returned object with g_object_unref(). 3012 **/ 3013 GFile * 3014 g_file_set_display_name (GFile *file, 3015 const char *display_name, 3016 GCancellable *cancellable, 3017 GError **error) 3018 { 3019 GFileIface *iface; 3020 3021 g_return_val_if_fail (G_IS_FILE (file), NULL); 3022 g_return_val_if_fail (display_name != NULL, NULL); 3023 3024 if (strchr (display_name, G_DIR_SEPARATOR) != NULL) 3025 { 3026 g_set_error (error, 3027 G_IO_ERROR, 3028 G_IO_ERROR_INVALID_ARGUMENT, 3029 _("File names cannot contain '%c'"), G_DIR_SEPARATOR); 3030 return NULL; 3031 } 3032 3033 if (g_cancellable_set_error_if_cancelled (cancellable, error)) 3034 return NULL; 3035 3036 iface = G_FILE_GET_IFACE (file); 3037 3038 return (* iface->set_display_name) (file, display_name, cancellable, error); 3039 } 3040 3041 /** 3042 * g_file_set_display_name_async: 3043 * @file: input #GFile. 3044 * @display_name: a string. 3045 * @io_priority: the <link linkend="io-priority">I/O priority</link> 3046 * of the request. 3047 * @cancellable: optional #GCancellable object, %NULL to ignore. 3048 * @callback: a #GAsyncReadyCallback to call when the request is satisfied 3049 * @user_data: the data to pass to callback function 3050 * 3051 * Asynchronously sets the display name for a given #GFile. 3052 * 3053 * For more details, see g_file_set_display_name() which is 3054 * the synchronous version of this call. 3055 * 3056 * When the operation is finished, @callback will be called. You can then call 3057 * g_file_set_display_name_finish() to get the result of the operation. 3058 **/ 3059 void 3060 g_file_set_display_name_async (GFile *file, 3061 const char *display_name, 3062 int io_priority, 3063 GCancellable *cancellable, 3064 GAsyncReadyCallback callback, 3065 gpointer user_data) 3066 { 3067 GFileIface *iface; 3068 3069 g_return_if_fail (G_IS_FILE (file)); 3070 g_return_if_fail (display_name != NULL); 3071 3072 iface = G_FILE_GET_IFACE (file); 3073 (* iface->set_display_name_async) (file, 3074 display_name, 3075 io_priority, 3076 cancellable, 3077 callback, 3078 user_data); 3079 } 3080 3081 /** 3082 * g_file_set_display_name_finish: 3083 * @file: input #GFile. 3084 * @res: a #GAsyncResult. 3085 * @error: a #GError, or %NULL 3086 * 3087 * Finishes setting a display name started with 3088 * g_file_set_display_name_async(). 3089 * 3090 * Returns: a #GFile or %NULL on error. 3091 * Free the returned object with g_object_unref(). 3092 **/ 3093 GFile * 3094 g_file_set_display_name_finish (GFile *file, 3095 GAsyncResult *res, 3096 GError **error) 3097 { 3098 GFileIface *iface; 3099 3100 g_return_val_if_fail (G_IS_FILE (file), NULL); 3101 g_return_val_if_fail (G_IS_ASYNC_RESULT (res), NULL); 3102 3103 if (G_IS_SIMPLE_ASYNC_RESULT (res)) 3104 { 3105 GSimpleAsyncResult *simple = G_SIMPLE_ASYNC_RESULT (res); 3106 if (g_simple_async_result_propagate_error (simple, error)) 3107 return NULL; 3108 } 3109 3110 iface = G_FILE_GET_IFACE (file); 3111 return (* iface->set_display_name_finish) (file, res, error); 3112 } 3113 3114 /** 3115 * g_file_query_settable_attributes: 3116 * @file: input #GFile. 3117 * @cancellable: optional #GCancellable object, %NULL to ignore. 3118 * @error: a #GError, or %NULL 3119 * 3120 * Obtain the list of settable attributes for the file. 3121 * 3122 * Returns the type and full attribute name of all the attributes 3123 * that can be set on this file. This doesn't mean setting it will always 3124 * succeed though, you might get an access failure, or some specific 3125 * file may not support a specific attribute. 3126 * 3127 * If @cancellable is not %NULL, then the operation can be cancelled by 3128 * triggering the cancellable object from another thread. If the operation 3129 * was cancelled, the error %G_IO_ERROR_CANCELLED will be returned. 3130 * 3131 * Returns: a #GFileAttributeInfoList describing the settable attributes. 3132 * When you are done with it, release it with g_file_attribute_info_list_unref() 3133 **/ 3134 GFileAttributeInfoList * 3135 g_file_query_settable_attributes (GFile *file, 3136 GCancellable *cancellable, 3137 GError **error) 3138 { 3139 GFileIface *iface; 3140 GError *my_error; 3141 GFileAttributeInfoList *list; 3142 3143 g_return_val_if_fail (G_IS_FILE (file), NULL); 3144 3145 if (g_cancellable_set_error_if_cancelled (cancellable, error)) 3146 return NULL; 3147 3148 iface = G_FILE_GET_IFACE (file); 3149 3150 if (iface->query_settable_attributes == NULL) 3151 return g_file_attribute_info_list_new (); 3152 3153 my_error = NULL; 3154 list = (* iface->query_settable_attributes) (file, cancellable, &my_error); 3155 3156 if (list == NULL) 3157 { 3158 if (my_error->domain == G_IO_ERROR && my_error->code == G_IO_ERROR_NOT_SUPPORTED) 3159 { 3160 list = g_file_attribute_info_list_new (); 3161 g_error_free (my_error); 3162 } 3163 else 3164 g_propagate_error (error, my_error); 3165 } 3166 3167 return list; 3168 } 3169 3170 /** 3171 * g_file_query_writable_namespaces: 3172 * @file: input #GFile. 3173 * @cancellable: optional #GCancellable object, %NULL to ignore. 3174 * @error: a #GError, or %NULL 3175 * 3176 * Obtain the list of attribute namespaces where new attributes 3177 * can be created by a user. An example of this is extended 3178 * attributes (in the "xattr" namespace). 3179 * 3180 * If @cancellable is not %NULL, then the operation can be cancelled by 3181 * triggering the cancellable object from another thread. If the operation 3182 * was cancelled, the error %G_IO_ERROR_CANCELLED will be returned. 3183 * 3184 * Returns: a #GFileAttributeInfoList describing the writable namespaces. 3185 * When you are done with it, release it with g_file_attribute_info_list_unref() 3186 **/ 3187 GFileAttributeInfoList * 3188 g_file_query_writable_namespaces (GFile *file, 3189 GCancellable *cancellable, 3190 GError **error) 3191 { 3192 GFileIface *iface; 3193 GError *my_error; 3194 GFileAttributeInfoList *list; 3195 3196 g_return_val_if_fail (G_IS_FILE (file), NULL); 3197 3198 if (g_cancellable_set_error_if_cancelled (cancellable, error)) 3199 return NULL; 3200 3201 iface = G_FILE_GET_IFACE (file); 3202 3203 if (iface->query_writable_namespaces == NULL) 3204 return g_file_attribute_info_list_new (); 3205 3206 my_error = NULL; 3207 list = (* iface->query_writable_namespaces) (file, cancellable, &my_error); 3208 3209 if (list == NULL) 3210 { 3211 if (my_error->domain == G_IO_ERROR && my_error->code == G_IO_ERROR_NOT_SUPPORTED) 3212 { 3213 list = g_file_attribute_info_list_new (); 3214 g_error_free (my_error); 3215 } 3216 else 3217 g_propagate_error (error, my_error); 3218 } 3219 3220 return list; 3221 } 3222 3223 /** 3224 * g_file_set_attribute: 3225 * @file: input #GFile. 3226 * @attribute: a string containing the attribute's name. 3227 * @type: The type of the attribute 3228 * @value_p: a pointer to the value (or the pointer itself if the type is a pointer type) 3229 * @flags: a set of #GFileQueryInfoFlags. 3230 * @cancellable: optional #GCancellable object, %NULL to ignore. 3231 * @error: a #GError, or %NULL 3232 * 3233 * Sets an attribute in the file with attribute name @attribute to @value. 3234 * 3235 * If @cancellable is not %NULL, then the operation can be cancelled by 3236 * triggering the cancellable object from another thread. If the operation 3237 * was cancelled, the error %G_IO_ERROR_CANCELLED will be returned. 3238 * 3239 * Returns: %TRUE if the attribute was set, %FALSE otherwise. 3240 **/ 3241 gboolean 3242 g_file_set_attribute (GFile *file, 3243 const char *attribute, 3244 GFileAttributeType type, 3245 gpointer value_p, 3246 GFileQueryInfoFlags flags, 3247 GCancellable *cancellable, 3248 GError **error) 3249 { 3250 GFileIface *iface; 3251 3252 g_return_val_if_fail (G_IS_FILE (file), FALSE); 3253 g_return_val_if_fail (attribute != NULL && *attribute != '\0', FALSE); 3254 3255 if (g_cancellable_set_error_if_cancelled (cancellable, error)) 3256 return FALSE; 3257 3258 iface = G_FILE_GET_IFACE (file); 3259 3260 if (iface->set_attribute == NULL) 3261 { 3262 g_set_error_literal (error, G_IO_ERROR, 3263 G_IO_ERROR_NOT_SUPPORTED, 3264 _("Operation not supported")); 3265 return FALSE; 3266 } 3267 3268 return (* iface->set_attribute) (file, attribute, type, value_p, flags, cancellable, error); 3269 } 3270 3271 /** 3272 * g_file_set_attributes_from_info: 3273 * @file: input #GFile. 3274 * @info: a #GFileInfo. 3275 * @flags: #GFileQueryInfoFlags 3276 * @cancellable: optional #GCancellable object, %NULL to ignore. 3277 * @error: a #GError, or %NULL 3278 * 3279 * Tries to set all attributes in the #GFileInfo on the target values, 3280 * not stopping on the first error. 3281 * 3282 * If there is any error during this operation then @error will be set to 3283 * the first error. Error on particular fields are flagged by setting 3284 * the "status" field in the attribute value to 3285 * %G_FILE_ATTRIBUTE_STATUS_ERROR_SETTING, which means you can also detect 3286 * further errors. 3287 * 3288 * If @cancellable is not %NULL, then the operation can be cancelled by 3289 * triggering the cancellable object from another thread. If the operation 3290 * was cancelled, the error %G_IO_ERROR_CANCELLED will be returned. 3291 * 3292 * Returns: %TRUE if there was any error, %FALSE otherwise. 3293 **/ 3294 gboolean 3295 g_file_set_attributes_from_info (GFile *file, 3296 GFileInfo *info, 3297 GFileQueryInfoFlags flags, 3298 GCancellable *cancellable, 3299 GError **error) 3300 { 3301 GFileIface *iface; 3302 3303 g_return_val_if_fail (G_IS_FILE (file), FALSE); 3304 g_return_val_if_fail (G_IS_FILE_INFO (info), FALSE); 3305 3306 if (g_cancellable_set_error_if_cancelled (cancellable, error)) 3307 return FALSE; 3308 3309 g_file_info_clear_status (info); 3310 3311 iface = G_FILE_GET_IFACE (file); 3312 3313 return (* iface->set_attributes_from_info) (file, 3314 info, 3315 flags, 3316 cancellable, 3317 error); 3318 } 3319 3320 3321 static gboolean 3322 g_file_real_set_attributes_from_info (GFile *file, 3323 GFileInfo *info, 3324 GFileQueryInfoFlags flags, 3325 GCancellable *cancellable, 3326 GError **error) 3327 { 3328 char **attributes; 3329 int i; 3330 gboolean res; 3331 GFileAttributeValue *value; 3332 3333 res = TRUE; 3334 3335 attributes = g_file_info_list_attributes (info, NULL); 3336 3337 for (i = 0; attributes[i] != NULL; i++) 3338 { 3339 value = _g_file_info_get_attribute_value (info, attributes[i]); 3340 3341 if (value->status != G_FILE_ATTRIBUTE_STATUS_UNSET) 3342 continue; 3343 3344 if (!g_file_set_attribute (file, attributes[i], 3345 value->type, _g_file_attribute_value_peek_as_pointer (value), 3346 flags, cancellable, error)) 3347 { 3348 value->status = G_FILE_ATTRIBUTE_STATUS_ERROR_SETTING; 3349 res = FALSE; 3350 /* Don't set error multiple times */ 3351 error = NULL; 3352 } 3353 else 3354 value->status = G_FILE_ATTRIBUTE_STATUS_SET; 3355 } 3356 3357 g_strfreev (attributes); 3358 3359 return res; 3360 } 3361 3362 /** 3363 * g_file_set_attributes_async: 3364 * @file: input #GFile. 3365 * @info: a #GFileInfo. 3366 * @flags: a #GFileQueryInfoFlags. 3367 * @io_priority: the <link linkend="io-priority">I/O priority</link> 3368 * of the request. 3369 * @cancellable: optional #GCancellable object, %NULL to ignore. 3370 * @callback: a #GAsyncReadyCallback. 3371 * @user_data: a #gpointer. 3372 * 3373 * Asynchronously sets the attributes of @file with @info. 3374 * 3375 * For more details, see g_file_set_attributes_from_info() which is 3376 * the synchronous version of this call. 3377 * 3378 * When the operation is finished, @callback will be called. You can then call 3379 * g_file_set_attributes_finish() to get the result of the operation. 3380 **/ 3381 void 3382 g_file_set_attributes_async (GFile *file, 3383 GFileInfo *info, 3384 GFileQueryInfoFlags flags, 3385 int io_priority, 3386 GCancellable *cancellable, 3387 GAsyncReadyCallback callback, 3388 gpointer user_data) 3389 { 3390 GFileIface *iface; 3391 3392 g_return_if_fail (G_IS_FILE (file)); 3393 g_return_if_fail (G_IS_FILE_INFO (info)); 3394 3395 iface = G_FILE_GET_IFACE (file); 3396 (* iface->set_attributes_async) (file, 3397 info, 3398 flags, 3399 io_priority, 3400 cancellable, 3401 callback, 3402 user_data); 3403 } 3404 3405 /** 3406 * g_file_set_attributes_finish: 3407 * @file: input #GFile. 3408 * @result: a #GAsyncResult. 3409 * @info: a #GFileInfo. 3410 * @error: a #GError, or %NULL 3411 * 3412 * Finishes setting an attribute started in g_file_set_attributes_async(). 3413 * 3414 * Returns: %TRUE if the attributes were set correctly, %FALSE otherwise. 3415 **/ 3416 gboolean 3417 g_file_set_attributes_finish (GFile *file, 3418 GAsyncResult *result, 3419 GFileInfo **info, 3420 GError **error) 3421 { 3422 GFileIface *iface; 3423 3424 g_return_val_if_fail (G_IS_FILE (file), FALSE); 3425 g_return_val_if_fail (G_IS_ASYNC_RESULT (result), FALSE); 3426 3427 /* No standard handling of errors here, as we must set info even 3428 * on errors 3429 */ 3430 iface = G_FILE_GET_IFACE (file); 3431 return (* iface->set_attributes_finish) (file, result, info, error); 3432 } 3433 3434 /** 3435 * g_file_set_attribute_string: 3436 * @file: input #GFile. 3437 * @attribute: a string containing the attribute's name. 3438 * @value: a string containing the attribute's value. 3439 * @flags: #GFileQueryInfoFlags. 3440 * @cancellable: optional #GCancellable object, %NULL to ignore. 3441 * @error: a #GError, or %NULL 3442 * 3443 * Sets @attribute of type %G_FILE_ATTRIBUTE_TYPE_STRING to @value. 3444 * If @attribute is of a different type, this operation will fail. 3445 * 3446 * If @cancellable is not %NULL, then the operation can be cancelled by 3447 * triggering the cancellable object from another thread. If the operation 3448 * was cancelled, the error %G_IO_ERROR_CANCELLED will be returned. 3449 * 3450 * Returns: %TRUE if the @attribute was successfully set, %FALSE otherwise. 3451 **/ 3452 gboolean 3453 g_file_set_attribute_string (GFile *file, 3454 const char *attribute, 3455 const char *value, 3456 GFileQueryInfoFlags flags, 3457 GCancellable *cancellable, 3458 GError **error) 3459 { 3460 return g_file_set_attribute (file, attribute, 3461 G_FILE_ATTRIBUTE_TYPE_STRING, (gpointer)value, 3462 flags, cancellable, error); 3463 } 3464 3465 /** 3466 * g_file_set_attribute_byte_string: 3467 * @file: input #GFile. 3468 * @attribute: a string containing the attribute's name. 3469 * @value: a string containing the attribute's new value. 3470 * @flags: a #GFileQueryInfoFlags. 3471 * @cancellable: optional #GCancellable object, %NULL to ignore. 3472 * @error: a #GError, or %NULL 3473 * 3474 * Sets @attribute of type %G_FILE_ATTRIBUTE_TYPE_BYTE_STRING to @value. 3475 * If @attribute is of a different type, this operation will fail, 3476 * returning %FALSE. 3477 * 3478 * If @cancellable is not %NULL, then the operation can be cancelled by 3479 * triggering the cancellable object from another thread. If the operation 3480 * was cancelled, the error %G_IO_ERROR_CANCELLED will be returned. 3481 * 3482 * Returns: %TRUE if the @attribute was successfully set to @value 3483 * in the @file, %FALSE otherwise. 3484 **/ 3485 gboolean 3486 g_file_set_attribute_byte_string (GFile *file, 3487 const char *attribute, 3488 const char *value, 3489 GFileQueryInfoFlags flags, 3490 GCancellable *cancellable, 3491 GError **error) 3492 { 3493 return g_file_set_attribute (file, attribute, 3494 G_FILE_ATTRIBUTE_TYPE_BYTE_STRING, (gpointer)value, 3495 flags, cancellable, error); 3496 } 3497 3498 /** 3499 * g_file_set_attribute_uint32: 3500 * @file: input #GFile. 3501 * @attribute: a string containing the attribute's name. 3502 * @value: a #guint32 containing the attribute's new value. 3503 * @flags: a #GFileQueryInfoFlags. 3504 * @cancellable: optional #GCancellable object, %NULL to ignore. 3505 * @error: a #GError, or %NULL 3506 * 3507 * Sets @attribute of type %G_FILE_ATTRIBUTE_TYPE_UINT32 to @value. 3508 * If @attribute is of a different type, this operation will fail. 3509 * 3510 * If @cancellable is not %NULL, then the operation can be cancelled by 3511 * triggering the cancellable object from another thread. If the operation 3512 * was cancelled, the error %G_IO_ERROR_CANCELLED will be returned. 3513 * 3514 * Returns: %TRUE if the @attribute was successfully set to @value 3515 * in the @file, %FALSE otherwise. 3516 **/ 3517 gboolean 3518 g_file_set_attribute_uint32 (GFile *file, 3519 const char *attribute, 3520 guint32 value, 3521 GFileQueryInfoFlags flags, 3522 GCancellable *cancellable, 3523 GError **error) 3524 { 3525 return g_file_set_attribute (file, attribute, 3526 G_FILE_ATTRIBUTE_TYPE_UINT32, &value, 3527 flags, cancellable, error); 3528 } 3529 3530 /** 3531 * g_file_set_attribute_int32: 3532 * @file: input #GFile. 3533 * @attribute: a string containing the attribute's name. 3534 * @value: a #gint32 containing the attribute's new value. 3535 * @flags: a #GFileQueryInfoFlags. 3536 * @cancellable: optional #GCancellable object, %NULL to ignore. 3537 * @error: a #GError, or %NULL 3538 * 3539 * Sets @attribute of type %G_FILE_ATTRIBUTE_TYPE_INT32 to @value. 3540 * If @attribute is of a different type, this operation will fail. 3541 * 3542 * If @cancellable is not %NULL, then the operation can be cancelled by 3543 * triggering the cancellable object from another thread. If the operation 3544 * was cancelled, the error %G_IO_ERROR_CANCELLED will be returned. 3545 * 3546 * Returns: %TRUE if the @attribute was successfully set to @value 3547 * in the @file, %FALSE otherwise. 3548 **/ 3549 gboolean 3550 g_file_set_attribute_int32 (GFile *file, 3551 const char *attribute, 3552 gint32 value, 3553 GFileQueryInfoFlags flags, 3554 GCancellable *cancellable, 3555 GError **error) 3556 { 3557 return g_file_set_attribute (file, attribute, 3558 G_FILE_ATTRIBUTE_TYPE_INT32, &value, 3559 flags, cancellable, error); 3560 } 3561 3562 /** 3563 * g_file_set_attribute_uint64: 3564 * @file: input #GFile. 3565 * @attribute: a string containing the attribute's name. 3566 * @value: a #guint64 containing the attribute's new value. 3567 * @flags: a #GFileQueryInfoFlags. 3568 * @cancellable: optional #GCancellable object, %NULL to ignore. 3569 * @error: a #GError, or %NULL 3570 * 3571 * Sets @attribute of type %G_FILE_ATTRIBUTE_TYPE_UINT64 to @value. 3572 * If @attribute is of a different type, this operation will fail. 3573 * 3574 * If @cancellable is not %NULL, then the operation can be cancelled by 3575 * triggering the cancellable object from another thread. If the operation 3576 * was cancelled, the error %G_IO_ERROR_CANCELLED will be returned. 3577 * 3578 * Returns: %TRUE if the @attribute was successfully set to @value 3579 * in the @file, %FALSE otherwise. 3580 **/ 3581 gboolean 3582 g_file_set_attribute_uint64 (GFile *file, 3583 const char *attribute, 3584 guint64 value, 3585 GFileQueryInfoFlags flags, 3586 GCancellable *cancellable, 3587 GError **error) 3588 { 3589 return g_file_set_attribute (file, attribute, 3590 G_FILE_ATTRIBUTE_TYPE_UINT64, &value, 3591 flags, cancellable, error); 3592 } 3593 3594 /** 3595 * g_file_set_attribute_int64: 3596 * @file: input #GFile. 3597 * @attribute: a string containing the attribute's name. 3598 * @value: a #guint64 containing the attribute's new value. 3599 * @flags: a #GFileQueryInfoFlags. 3600 * @cancellable: optional #GCancellable object, %NULL to ignore. 3601 * @error: a #GError, or %NULL 3602 * 3603 * Sets @attribute of type %G_FILE_ATTRIBUTE_TYPE_INT64 to @value. 3604 * If @attribute is of a different type, this operation will fail. 3605 * 3606 * If @cancellable is not %NULL, then the operation can be cancelled by 3607 * triggering the cancellable object from another thread. If the operation 3608 * was cancelled, the error %G_IO_ERROR_CANCELLED will be returned. 3609 * 3610 * Returns: %TRUE if the @attribute was successfully set, %FALSE otherwise. 3611 **/ 3612 gboolean 3613 g_file_set_attribute_int64 (GFile *file, 3614 const char *attribute, 3615 gint64 value, 3616 GFileQueryInfoFlags flags, 3617 GCancellable *cancellable, 3618 GError **error) 3619 { 3620 return g_file_set_attribute (file, attribute, 3621 G_FILE_ATTRIBUTE_TYPE_INT64, &value, 3622 flags, cancellable, error); 3623 } 3624 3625 /** 3626 * g_file_mount_mountable: 3627 * @file: input #GFile. 3628 * @flags: flags affecting the operation 3629 * @mount_operation: a #GMountOperation, or %NULL to avoid user interaction. 3630 * @cancellable: optional #GCancellable object, %NULL to ignore. 3631 * @callback: a #GAsyncReadyCallback to call when the request is satisfied, or %NULL. 3632 * @user_data: the data to pass to callback function 3633 * 3634 * Mounts a file of type G_FILE_TYPE_MOUNTABLE. 3635 * Using @mount_operation, you can request callbacks when, for instance, 3636 * passwords are needed during authentication. 3637 * 3638 * If @cancellable is not %NULL, then the operation can be cancelled by 3639 * triggering the cancellable object from another thread. If the operation 3640 * was cancelled, the error %G_IO_ERROR_CANCELLED will be returned. 3641 * 3642 * When the operation is finished, @callback will be called. You can then call 3643 * g_file_mount_mountable_finish() to get the result of the operation. 3644 **/ 3645 void 3646 g_file_mount_mountable (GFile *file, 3647 GMountMountFlags flags, 3648 GMountOperation *mount_operation, 3649 GCancellable *cancellable, 3650 GAsyncReadyCallback callback, 3651 gpointer user_data) 3652 { 3653 GFileIface *iface; 3654 3655 g_return_if_fail (G_IS_FILE (file)); 3656 3657 iface = G_FILE_GET_IFACE (file); 3658 3659 if (iface->mount_mountable == NULL) 3660 { 3661 g_simple_async_report_error_in_idle (G_OBJECT (file), 3662 callback, 3663 user_data, 3664 G_IO_ERROR, 3665 G_IO_ERROR_NOT_SUPPORTED, 3666 _("Operation not supported")); 3667 return; 3668 } 3669 3670 (* iface->mount_mountable) (file, 3671 flags, 3672 mount_operation, 3673 cancellable, 3674 callback, 3675 user_data); 3676 } 3677 3678 /** 3679 * g_file_mount_mountable_finish: 3680 * @file: input #GFile. 3681 * @result: a #GAsyncResult. 3682 * @error: a #GError, or %NULL 3683 * 3684 * Finishes a mount operation. See g_file_mount_mountable() for details. 3685 * 3686 * Finish an asynchronous mount operation that was started 3687 * with g_file_mount_mountable(). 3688 * 3689 * Returns: a #GFile or %NULL on error. 3690 * Free the returned object with g_object_unref(). 3691 **/ 3692 GFile * 3693 g_file_mount_mountable_finish (GFile *file, 3694 GAsyncResult *result, 3695 GError **error) 3696 { 3697 GFileIface *iface; 3698 3699 g_return_val_if_fail (G_IS_FILE (file), NULL); 3700 g_return_val_if_fail (G_IS_ASYNC_RESULT (result), NULL); 3701 3702 if (G_IS_SIMPLE_ASYNC_RESULT (result)) 3703 { 3704 GSimpleAsyncResult *simple = G_SIMPLE_ASYNC_RESULT (result); 3705 if (g_simple_async_result_propagate_error (simple, error)) 3706 return NULL; 3707 } 3708 3709 iface = G_FILE_GET_IFACE (file); 3710 return (* iface->mount_mountable_finish) (file, result, error); 3711 } 3712 3713 /** 3714 * g_file_unmount_mountable: 3715 * @file: input #GFile. 3716 * @flags: flags affecting the operation 3717 * @cancellable: optional #GCancellable object, %NULL to ignore. 3718 * @callback: a #GAsyncReadyCallback to call when the request is satisfied, or %NULL. 3719 * @user_data: the data to pass to callback function 3720 * 3721 * Unmounts a file of type G_FILE_TYPE_MOUNTABLE. 3722 * 3723 * If @cancellable is not %NULL, then the operation can be cancelled by 3724 * triggering the cancellable object from another thread. If the operation 3725 * was cancelled, the error %G_IO_ERROR_CANCELLED will be returned. 3726 * 3727 * When the operation is finished, @callback will be called. You can then call 3728 * g_file_unmount_mountable_finish() to get the result of the operation. 3729 **/ 3730 void 3731 g_file_unmount_mountable (GFile *file, 3732 GMountUnmountFlags flags, 3733 GCancellable *cancellable, 3734 GAsyncReadyCallback callback, 3735 gpointer user_data) 3736 { 3737 GFileIface *iface; 3738 3739 g_return_if_fail (G_IS_FILE (file)); 3740 3741 iface = G_FILE_GET_IFACE (file); 3742 3743 if (iface->unmount_mountable == NULL) 3744 { 3745 g_simple_async_report_error_in_idle (G_OBJECT (file), 3746 callback, 3747 user_data, 3748 G_IO_ERROR, 3749 G_IO_ERROR_NOT_SUPPORTED, 3750 _("Operation not supported")); 3751 return; 3752 } 3753 3754 (* iface->unmount_mountable) (file, 3755 flags, 3756 cancellable, 3757 callback, 3758 user_data); 3759 } 3760 3761 /** 3762 * g_file_unmount_mountable_finish: 3763 * @file: input #GFile. 3764 * @result: a #GAsyncResult. 3765 * @error: a #GError, or %NULL 3766 * 3767 * Finishes an unmount operation, see g_file_unmount_mountable() for details. 3768 * 3769 * Finish an asynchronous unmount operation that was started 3770 * with g_file_unmount_mountable(). 3771 * 3772 * Returns: %TRUE if the operation finished successfully. %FALSE 3773 * otherwise. 3774 **/ 3775 gboolean 3776 g_file_unmount_mountable_finish (GFile *file, 3777 GAsyncResult *result, 3778 GError **error) 3779 { 3780 GFileIface *iface; 3781 3782 g_return_val_if_fail (G_IS_FILE (file), FALSE); 3783 g_return_val_if_fail (G_IS_ASYNC_RESULT (result), FALSE); 3784 3785 if (G_IS_SIMPLE_ASYNC_RESULT (result)) 3786 { 3787 GSimpleAsyncResult *simple = G_SIMPLE_ASYNC_RESULT (result); 3788 if (g_simple_async_result_propagate_error (simple, error)) 3789 return FALSE; 3790 } 3791 3792 iface = G_FILE_GET_IFACE (file); 3793 return (* iface->unmount_mountable_finish) (file, result, error); 3794 } 3795 3796 /** 3797 * g_file_eject_mountable: 3798 * @file: input #GFile. 3799 * @flags: flags affecting the operation 3800 * @cancellable: optional #GCancellable object, %NULL to ignore. 3801 * @callback: a #GAsyncReadyCallback to call when the request is satisfied, or %NULL. 3802 * @user_data: the data to pass to callback function 3803 * 3804 * Starts an asynchronous eject on a mountable. 3805 * When this operation has completed, @callback will be called with 3806 * @user_user data, and the operation can be finalized with 3807 * g_file_eject_mountable_finish(). 3808 * 3809 * If @cancellable is not %NULL, then the operation can be cancelled by 3810 * triggering the cancellable object from another thread. If the operation 3811 * was cancelled, the error %G_IO_ERROR_CANCELLED will be returned. 3812 **/ 3813 void 3814 g_file_eject_mountable (GFile *file, 3815 GMountUnmountFlags flags, 3816 GCancellable *cancellable, 3817 GAsyncReadyCallback callback, 3818 gpointer user_data) 3819 { 3820 GFileIface *iface; 3821 3822 g_return_if_fail (G_IS_FILE (file)); 3823 3824 iface = G_FILE_GET_IFACE (file); 3825 3826 if (iface->eject_mountable == NULL) 3827 { 3828 g_simple_async_report_error_in_idle (G_OBJECT (file), 3829 callback, 3830 user_data, 3831 G_IO_ERROR, 3832 G_IO_ERROR_NOT_SUPPORTED, 3833 _("Operation not supported")); 3834 return; 3835 } 3836 3837 (* iface->eject_mountable) (file, 3838 flags, 3839 cancellable, 3840 callback, 3841 user_data); 3842 } 3843 3844 /** 3845 * g_file_eject_mountable_finish: 3846 * @file: input #GFile. 3847 * @result: a #GAsyncResult. 3848 * @error: a #GError, or %NULL 3849 * 3850 * Finishes an asynchronous eject operation started by 3851 * g_file_eject_mountable(). 3852 * 3853 * Returns: %TRUE if the @file was ejected successfully. %FALSE 3854 * otherwise. 3855 **/ 3856 gboolean 3857 g_file_eject_mountable_finish (GFile *file, 3858 GAsyncResult *result, 3859 GError **error) 3860 { 3861 GFileIface *iface; 3862 3863 g_return_val_if_fail (G_IS_FILE (file), FALSE); 3864 g_return_val_if_fail (G_IS_ASYNC_RESULT (result), FALSE); 3865 3866 if (G_IS_SIMPLE_ASYNC_RESULT (result)) 3867 { 3868 GSimpleAsyncResult *simple = G_SIMPLE_ASYNC_RESULT (result); 3869 if (g_simple_async_result_propagate_error (simple, error)) 3870 return FALSE; 3871 } 3872 3873 iface = G_FILE_GET_IFACE (file); 3874 return (* iface->eject_mountable_finish) (file, result, error); 3875 } 3876 3877 /** 3878 * g_file_monitor_directory: 3879 * @file: input #GFile. 3880 * @flags: a set of #GFileMonitorFlags. 3881 * @cancellable: optional #GCancellable object, %NULL to ignore. 3882 * @error: a #GError, or %NULL. 3883 * 3884 * Obtains a directory monitor for the given file. 3885 * This may fail if directory monitoring is not supported. 3886 * 3887 * If @cancellable is not %NULL, then the operation can be cancelled by 3888 * triggering the cancellable object from another thread. If the operation 3889 * was cancelled, the error %G_IO_ERROR_CANCELLED will be returned. 3890 * 3891 * Returns: a #GFileMonitor for the given @file, or %NULL on error. 3892 * Free the returned object with g_object_unref(). 3893 **/ 3894 GFileMonitor* 3895 g_file_monitor_directory (GFile *file, 3896 GFileMonitorFlags flags, 3897 GCancellable *cancellable, 3898 GError **error) 3899 { 3900 GFileIface *iface; 3901 3902 g_return_val_if_fail (G_IS_FILE (file), NULL); 3903 3904 if (g_cancellable_set_error_if_cancelled (cancellable, error)) 3905 return NULL; 3906 3907 iface = G_FILE_GET_IFACE (file); 3908 3909 if (iface->monitor_dir == NULL) 3910 { 3911 g_set_error_literal (error, G_IO_ERROR, 3912 G_IO_ERROR_NOT_SUPPORTED, 3913 _("Operation not supported")); 3914 return NULL; 3915 } 3916 3917 return (* iface->monitor_dir) (file, flags, cancellable, error); 3918 } 3919 3920 /** 3921 * g_file_monitor_file: 3922 * @file: input #GFile. 3923 * @flags: a set of #GFileMonitorFlags. 3924 * @cancellable: optional #GCancellable object, %NULL to ignore. 3925 * @error: a #GError, or %NULL. 3926 * 3927 * Obtains a file monitor for the given file. If no file notification 3928 * mechanism exists, then regular polling of the file is used. 3929 * 3930 * If @cancellable is not %NULL, then the operation can be cancelled by 3931 * triggering the cancellable object from another thread. If the operation 3932 * was cancelled, the error %G_IO_ERROR_CANCELLED will be returned. 3933 * 3934 * Returns: a #GFileMonitor for the given @file, or %NULL on error. 3935 * Free the returned object with g_object_unref(). 3936 **/ 3937 GFileMonitor* 3938 g_file_monitor_file (GFile *file, 3939 GFileMonitorFlags flags, 3940 GCancellable *cancellable, 3941 GError **error) 3942 { 3943 GFileIface *iface; 3944 GFileMonitor *monitor; 3945 3946 g_return_val_if_fail (G_IS_FILE (file), NULL); 3947 3948 if (g_cancellable_set_error_if_cancelled (cancellable, error)) 3949 return NULL; 3950 3951 iface = G_FILE_GET_IFACE (file); 3952 3953 monitor = NULL; 3954 3955 if (iface->monitor_file) 3956 monitor = (* iface->monitor_file) (file, flags, cancellable, NULL); 3957 3958 /* Fallback to polling */ 3959 if (monitor == NULL) 3960 monitor = _g_poll_file_monitor_new (file); 3961 3962 return monitor; 3963 } 3964 3965 /** 3966 * g_file_monitor: 3967 * @file: input #GFile 3968 * @flags: a set of #GFileMonitorFlags 3969 * @cancellable: optional #GCancellable object, %NULL to ignore 3970 * @error: a #GError, or %NULL 3971 * 3972 * Obtains a file or directory monitor for the given file, depending 3973 * on the type of the file. 3974 * 3975 * If @cancellable is not %NULL, then the operation can be cancelled by 3976 * triggering the cancellable object from another thread. If the operation 3977 * was cancelled, the error %G_IO_ERROR_CANCELLED will be returned. 3978 * 3979 * Returns: a #GFileMonitor for the given @file, or %NULL on error. 3980 * Free the returned object with g_object_unref(). 3981 * 3982 * Since: 2.18 3983 */ 3984 GFileMonitor* 3985 g_file_monitor (GFile *file, 3986 GFileMonitorFlags flags, 3987 GCancellable *cancellable, 3988 GError **error) 3989 { 3990 if (g_file_query_file_type (file, 0, cancellable) == G_FILE_TYPE_DIRECTORY) 3991 return g_file_monitor_directory (file, flags, cancellable, error); 3992 else 3993 return g_file_monitor_file (file, flags, cancellable, error); 3994 } 3995 3996 /******************************************** 3997 * Default implementation of async ops * 3998 ********************************************/ 3999 4000 typedef struct { 4001 char *attributes; 4002 GFileQueryInfoFlags flags; 4003 GFileInfo *info; 4004 } QueryInfoAsyncData; 4005 4006 static void 4007 query_info_data_free (QueryInfoAsyncData *data) 4008 { 4009 if (data->info) 4010 g_object_unref (data->info); 4011 g_free (data->attributes); 4012 g_free (data); 4013 } 4014 4015 static void 4016 query_info_async_thread (GSimpleAsyncResult *res, 4017 GObject *object, 4018 GCancellable *cancellable) 4019 { 4020 GError *error = NULL; 4021 QueryInfoAsyncData *data; 4022 GFileInfo *info; 4023 4024 data = g_simple_async_result_get_op_res_gpointer (res); 4025 4026 info = g_file_query_info (G_FILE (object), data->attributes, data->flags, cancellable, &error); 4027 4028 if (info == NULL) 4029 { 4030 g_simple_async_result_set_from_error (res, error); 4031 g_error_free (error); 4032 } 4033 else 4034 data->info = info; 4035 } 4036 4037 static void 4038 g_file_real_query_info_async (GFile *file, 4039 const char *attributes, 4040 GFileQueryInfoFlags flags, 4041 int io_priority, 4042 GCancellable *cancellable, 4043 GAsyncReadyCallback callback, 4044 gpointer user_data) 4045 { 4046 GSimpleAsyncResult *res; 4047 QueryInfoAsyncData *data; 4048 4049 data = g_new0 (QueryInfoAsyncData, 1); 4050 data->attributes = g_strdup (attributes); 4051 data->flags = flags; 4052 4053 res = g_simple_async_result_new (G_OBJECT (file), callback, user_data, g_file_real_query_info_async); 4054 g_simple_async_result_set_op_res_gpointer (res, data, (GDestroyNotify)query_info_data_free); 4055 4056 g_simple_async_result_run_in_thread (res, query_info_async_thread, io_priority, cancellable); 4057 g_object_unref (res); 4058 } 4059 4060 static GFileInfo * 4061 g_file_real_query_info_finish (GFile *file, 4062 GAsyncResult *res, 4063 GError **error) 4064 { 4065 GSimpleAsyncResult *simple = G_SIMPLE_ASYNC_RESULT (res); 4066 QueryInfoAsyncData *data; 4067 4068 g_warn_if_fail (g_simple_async_result_get_source_tag (simple) == g_file_real_query_info_async); 4069 4070 data = g_simple_async_result_get_op_res_gpointer (simple); 4071 if (data->info) 4072 return g_object_ref (data->info); 4073 4074 return NULL; 4075 } 4076 4077 typedef struct { 4078 char *attributes; 4079 GFileInfo *info; 4080 } QueryFilesystemInfoAsyncData; 4081 4082 static void 4083 query_filesystem_info_data_free (QueryFilesystemInfoAsyncData *data) 4084 { 4085 if (data->info) 4086 g_object_unref (data->info); 4087 g_free (data->attributes); 4088 g_free (data); 4089 } 4090 4091 static void 4092 query_filesystem_info_async_thread (GSimpleAsyncResult *res, 4093 GObject *object, 4094 GCancellable *cancellable) 4095 { 4096 GError *error = NULL; 4097 QueryFilesystemInfoAsyncData *data; 4098 GFileInfo *info; 4099 4100 data = g_simple_async_result_get_op_res_gpointer (res); 4101 4102 info = g_file_query_filesystem_info (G_FILE (object), data->attributes, cancellable, &error); 4103 4104 if (info == NULL) 4105 { 4106 g_simple_async_result_set_from_error (res, error); 4107 g_error_free (error); 4108 } 4109 else 4110 data->info = info; 4111 } 4112 4113 static void 4114 g_file_real_query_filesystem_info_async (GFile *file, 4115 const char *attributes, 4116 int io_priority, 4117 GCancellable *cancellable, 4118 GAsyncReadyCallback callback, 4119 gpointer user_data) 4120 { 4121 GSimpleAsyncResult *res; 4122 QueryFilesystemInfoAsyncData *data; 4123 4124 data = g_new0 (QueryFilesystemInfoAsyncData, 1); 4125 data->attributes = g_strdup (attributes); 4126 4127 res = g_simple_async_result_new (G_OBJECT (file), callback, user_data, g_file_real_query_filesystem_info_async); 4128 g_simple_async_result_set_op_res_gpointer (res, data, (GDestroyNotify)query_filesystem_info_data_free); 4129 4130 g_simple_async_result_run_in_thread (res, query_filesystem_info_async_thread, io_priority, cancellable); 4131 g_object_unref (res); 4132 } 4133 4134 static GFileInfo * 4135 g_file_real_query_filesystem_info_finish (GFile *file, 4136 GAsyncResult *res, 4137 GError **error) 4138 { 4139 GSimpleAsyncResult *simple = G_SIMPLE_ASYNC_RESULT (res); 4140 QueryFilesystemInfoAsyncData *data; 4141 4142 g_warn_if_fail (g_simple_async_result_get_source_tag (simple) == g_file_real_query_filesystem_info_async); 4143 4144 data = g_simple_async_result_get_op_res_gpointer (simple); 4145 if (data->info) 4146 return g_object_ref (data->info); 4147 4148 return NULL; 4149 } 4150 4151 typedef struct { 4152 char *attributes; 4153 GFileQueryInfoFlags flags; 4154 GFileEnumerator *enumerator; 4155 } EnumerateChildrenAsyncData; 4156 4157 static void 4158 enumerate_children_data_free (EnumerateChildrenAsyncData *data) 4159 { 4160 if (data->enumerator) 4161 g_object_unref (data->enumerator); 4162 g_free (data->attributes); 4163 g_free (data); 4164 } 4165 4166 static void 4167 enumerate_children_async_thread (GSimpleAsyncResult *res, 4168 GObject *object, 4169 GCancellable *cancellable) 4170 { 4171 GError *error = NULL; 4172 EnumerateChildrenAsyncData *data; 4173 GFileEnumerator *enumerator; 4174 4175 data = g_simple_async_result_get_op_res_gpointer (res); 4176 4177 enumerator = g_file_enumerate_children (G_FILE (object), data->attributes, data->flags, cancellable, &error); 4178 4179 if (enumerator == NULL) 4180 { 4181 g_simple_async_result_set_from_error (res, error); 4182 g_error_free (error); 4183 } 4184 else 4185 data->enumerator = enumerator; 4186 } 4187 4188 static void 4189 g_file_real_enumerate_children_async (GFile *file, 4190 const char *attributes, 4191 GFileQueryInfoFlags flags, 4192 int io_priority, 4193 GCancellable *cancellable, 4194 GAsyncReadyCallback callback, 4195 gpointer user_data) 4196 { 4197 GSimpleAsyncResult *res; 4198 EnumerateChildrenAsyncData *data; 4199 4200 data = g_new0 (EnumerateChildrenAsyncData, 1); 4201 data->attributes = g_strdup (attributes); 4202 data->flags = flags; 4203 4204 res = g_simple_async_result_new (G_OBJECT (file), callback, user_data, g_file_real_enumerate_children_async); 4205 g_simple_async_result_set_op_res_gpointer (res, data, (GDestroyNotify)enumerate_children_data_free); 4206 4207 g_simple_async_result_run_in_thread (res, enumerate_children_async_thread, io_priority, cancellable); 4208 g_object_unref (res); 4209 } 4210 4211 static GFileEnumerator * 4212 g_file_real_enumerate_children_finish (GFile *file, 4213 GAsyncResult *res, 4214 GError **error) 4215 { 4216 GSimpleAsyncResult *simple = G_SIMPLE_ASYNC_RESULT (res); 4217 EnumerateChildrenAsyncData *data; 4218 4219 g_warn_if_fail (g_simple_async_result_get_source_tag (simple) == g_file_real_enumerate_children_async); 4220 4221 data = g_simple_async_result_get_op_res_gpointer (simple); 4222 if (data->enumerator) 4223 return g_object_ref (data->enumerator); 4224 4225 return NULL; 4226 } 4227 4228 static void 4229 open_read_async_thread (GSimpleAsyncResult *res, 4230 GObject *object, 4231 GCancellable *cancellable) 4232 { 4233 GFileIface *iface; 4234 GFileInputStream *stream; 4235 GError *error = NULL; 4236 4237 iface = G_FILE_GET_IFACE (object); 4238 4239 if (iface->read_fn == NULL) 4240 { 4241 g_set_error_literal (&error, G_IO_ERROR, 4242 G_IO_ERROR_NOT_SUPPORTED, 4243 _("Operation not supported")); 4244 4245 g_simple_async_result_set_from_error (res, error); 4246 g_error_free (error); 4247 4248 return; 4249 } 4250 4251 stream = iface->read_fn (G_FILE (object), cancellable, &error); 4252 4253 if (stream == NULL) 4254 { 4255 g_simple_async_result_set_from_error (res, error); 4256 g_error_free (error); 4257 } 4258 else 4259 g_simple_async_result_set_op_res_gpointer (res, stream, g_object_unref); 4260 } 4261 4262 static void 4263 g_file_real_read_async (GFile *file, 4264 int io_priority, 4265 GCancellable *cancellable, 4266 GAsyncReadyCallback callback, 4267 gpointer user_data) 4268 { 4269 GSimpleAsyncResult *res; 4270 4271 res = g_simple_async_result_new (G_OBJECT (file), callback, user_data, g_file_real_read_async); 4272 4273 g_simple_async_result_run_in_thread (res, open_read_async_thread, io_priority, cancellable); 4274 g_object_unref (res); 4275 } 4276 4277 static GFileInputStream * 4278 g_file_real_read_finish (GFile *file, 4279 GAsyncResult *res, 4280 GError **error) 4281 { 4282 GSimpleAsyncResult *simple = G_SIMPLE_ASYNC_RESULT (res); 4283 gpointer op; 4284 4285 g_warn_if_fail (g_simple_async_result_get_source_tag (simple) == g_file_real_read_async); 4286 4287 op = g_simple_async_result_get_op_res_gpointer (simple); 4288 if (op) 4289 return g_object_ref (op); 4290 4291 return NULL; 4292 } 4293 4294 static void 4295 append_to_async_thread (GSimpleAsyncResult *res, 4296 GObject *object, 4297 GCancellable *cancellable) 4298 { 4299 GFileIface *iface; 4300 GFileCreateFlags *data; 4301 GFileOutputStream *stream; 4302 GError *error = NULL; 4303 4304 iface = G_FILE_GET_IFACE (object); 4305 4306 data = g_simple_async_result_get_op_res_gpointer (res); 4307 4308 stream = iface->append_to (G_FILE (object), *data, cancellable, &error); 4309 4310 if (stream == NULL) 4311 { 4312 g_simple_async_result_set_from_error (res, error); 4313 g_error_free (error); 4314 } 4315 else 4316 g_simple_async_result_set_op_res_gpointer (res, stream, g_object_unref); 4317 } 4318 4319 static void 4320 g_file_real_append_to_async (GFile *file, 4321 GFileCreateFlags flags, 4322 int io_priority, 4323 GCancellable *cancellable, 4324 GAsyncReadyCallback callback, 4325 gpointer user_data) 4326 { 4327 GFileCreateFlags *data; 4328 GSimpleAsyncResult *res; 4329 4330 data = g_new0 (GFileCreateFlags, 1); 4331 *data = flags; 4332 4333 res = g_simple_async_result_new (G_OBJECT (file), callback, user_data, g_file_real_append_to_async); 4334 g_simple_async_result_set_op_res_gpointer (res, data, (GDestroyNotify)g_free); 4335 4336 g_simple_async_result_run_in_thread (res, append_to_async_thread, io_priority, cancellable); 4337 g_object_unref (res); 4338 } 4339 4340 static GFileOutputStream * 4341 g_file_real_append_to_finish (GFile *file, 4342 GAsyncResult *res, 4343 GError **error) 4344 { 4345 GSimpleAsyncResult *simple = G_SIMPLE_ASYNC_RESULT (res); 4346 gpointer op; 4347 4348 g_warn_if_fail (g_simple_async_result_get_source_tag (simple) == g_file_real_append_to_async); 4349 4350 op = g_simple_async_result_get_op_res_gpointer (simple); 4351 if (op) 4352 return g_object_ref (op); 4353 4354 return NULL; 4355 } 4356 4357 static void 4358 create_async_thread (GSimpleAsyncResult *res, 4359 GObject *object, 4360 GCancellable *cancellable) 4361 { 4362 GFileIface *iface; 4363 GFileCreateFlags *data; 4364 GFileOutputStream *stream; 4365 GError *error = NULL; 4366 4367 iface = G_FILE_GET_IFACE (object); 4368 4369 data = g_simple_async_result_get_op_res_gpointer (res); 4370 4371 stream = iface->create (G_FILE (object), *data, cancellable, &error); 4372 4373 if (stream == NULL) 4374 { 4375 g_simple_async_result_set_from_error (res, error); 4376 g_error_free (error); 4377 } 4378 else 4379 g_simple_async_result_set_op_res_gpointer (res, stream, g_object_unref); 4380 } 4381 4382 static void 4383 g_file_real_create_async (GFile *file, 4384 GFileCreateFlags flags, 4385 int io_priority, 4386 GCancellable *cancellable, 4387 GAsyncReadyCallback callback, 4388 gpointer user_data) 4389 { 4390 GFileCreateFlags *data; 4391 GSimpleAsyncResult *res; 4392 4393 data = g_new0 (GFileCreateFlags, 1); 4394 *data = flags; 4395 4396 res = g_simple_async_result_new (G_OBJECT (file), callback, user_data, g_file_real_create_async); 4397 g_simple_async_result_set_op_res_gpointer (res, data, (GDestroyNotify)g_free); 4398 4399 g_simple_async_result_run_in_thread (res, create_async_thread, io_priority, cancellable); 4400 g_object_unref (res); 4401 } 4402 4403 static GFileOutputStream * 4404 g_file_real_create_finish (GFile *file, 4405 GAsyncResult *res, 4406 GError **error) 4407 { 4408 GSimpleAsyncResult *simple = G_SIMPLE_ASYNC_RESULT (res); 4409 gpointer op; 4410 4411 g_warn_if_fail (g_simple_async_result_get_source_tag (simple) == g_file_real_create_async); 4412 4413 op = g_simple_async_result_get_op_res_gpointer (simple); 4414 if (op) 4415 return g_object_ref (op); 4416 4417 return NULL; 4418 } 4419 4420 typedef struct { 4421 GFileOutputStream *stream; 4422 char *etag; 4423 gboolean make_backup; 4424 GFileCreateFlags flags; 4425 } ReplaceAsyncData; 4426 4427 static void 4428 replace_async_data_free (ReplaceAsyncData *data) 4429 { 4430 if (data->stream) 4431 g_object_unref (data->stream); 4432 g_free (data->etag); 4433 g_free (data); 4434 } 4435 4436 static void 4437 replace_async_thread (GSimpleAsyncResult *res, 4438 GObject *object, 4439 GCancellable *cancellable) 4440 { 4441 GFileIface *iface; 4442 GFileOutputStream *stream; 4443 GError *error = NULL; 4444 ReplaceAsyncData *data; 4445 4446 iface = G_FILE_GET_IFACE (object); 4447 4448 data = g_simple_async_result_get_op_res_gpointer (res); 4449 4450 stream = iface->replace (G_FILE (object), 4451 data->etag, 4452 data->make_backup, 4453 data->flags, 4454 cancellable, 4455 &error); 4456 4457 if (stream == NULL) 4458 { 4459 g_simple_async_result_set_from_error (res, error); 4460 g_error_free (error); 4461 } 4462 else 4463 data->stream = stream; 4464 } 4465 4466 static void 4467 g_file_real_replace_async (GFile *file, 4468 const char *etag, 4469 gboolean make_backup, 4470 GFileCreateFlags flags, 4471 int io_priority, 4472 GCancellable *cancellable, 4473 GAsyncReadyCallback callback, 4474 gpointer user_data) 4475 { 4476 GSimpleAsyncResult *res; 4477 ReplaceAsyncData *data; 4478 4479 data = g_new0 (ReplaceAsyncData, 1); 4480 data->etag = g_strdup (etag); 4481 data->make_backup = make_backup; 4482 data->flags = flags; 4483 4484 res = g_simple_async_result_new (G_OBJECT (file), callback, user_data, g_file_real_replace_async); 4485 g_simple_async_result_set_op_res_gpointer (res, data, (GDestroyNotify)replace_async_data_free); 4486 4487 g_simple_async_result_run_in_thread (res, replace_async_thread, io_priority, cancellable); 4488 g_object_unref (res); 4489 } 4490 4491 static GFileOutputStream * 4492 g_file_real_replace_finish (GFile *file, 4493 GAsyncResult *res, 4494 GError **error) 4495 { 4496 GSimpleAsyncResult *simple = G_SIMPLE_ASYNC_RESULT (res); 4497 ReplaceAsyncData *data; 4498 4499 g_warn_if_fail (g_simple_async_result_get_source_tag (simple) == g_file_real_replace_async); 4500 4501 data = g_simple_async_result_get_op_res_gpointer (simple); 4502 if (data->stream) 4503 return g_object_ref (data->stream); 4504 4505 return NULL; 4506 } 4507 4508 typedef struct { 4509 char *name; 4510 GFile *file; 4511 } SetDisplayNameAsyncData; 4512 4513 static void 4514 set_display_name_data_free (SetDisplayNameAsyncData *data) 4515 { 4516 g_free (data->name); 4517 if (data->file) 4518 g_object_unref (data->file); 4519 g_free (data); 4520 } 4521 4522 static void 4523 set_display_name_async_thread (GSimpleAsyncResult *res, 4524 GObject *object, 4525 GCancellable *cancellable) 4526 { 4527 GError *error = NULL; 4528 SetDisplayNameAsyncData *data; 4529 GFile *file; 4530 4531 data = g_simple_async_result_get_op_res_gpointer (res); 4532 4533 file = g_file_set_display_name (G_FILE (object), data->name, cancellable, &error); 4534 4535 if (file == NULL) 4536 { 4537 g_simple_async_result_set_from_error (res, error); 4538 g_error_free (error); 4539 } 4540 else 4541 data->file = file; 4542 } 4543 4544 static void 4545 g_file_real_set_display_name_async (GFile *file, 4546 const char *display_name, 4547 int io_priority, 4548 GCancellable *cancellable, 4549 GAsyncReadyCallback callback, 4550 gpointer user_data) 4551 { 4552 GSimpleAsyncResult *res; 4553 SetDisplayNameAsyncData *data; 4554 4555 data = g_new0 (SetDisplayNameAsyncData, 1); 4556 data->name = g_strdup (display_name); 4557 4558 res = g_simple_async_result_new (G_OBJECT (file), callback, user_data, g_file_real_set_display_name_async); 4559 g_simple_async_result_set_op_res_gpointer (res, data, (GDestroyNotify)set_display_name_data_free); 4560 4561 g_simple_async_result_run_in_thread (res, set_display_name_async_thread, io_priority, cancellable); 4562 g_object_unref (res); 4563 } 4564 4565 static GFile * 4566 g_file_real_set_display_name_finish (GFile *file, 4567 GAsyncResult *res, 4568 GError **error) 4569 { 4570 GSimpleAsyncResult *simple = G_SIMPLE_ASYNC_RESULT (res); 4571 SetDisplayNameAsyncData *data; 4572 4573 g_warn_if_fail (g_simple_async_result_get_source_tag (simple) == g_file_real_set_display_name_async); 4574 4575 data = g_simple_async_result_get_op_res_gpointer (simple); 4576 if (data->file) 4577 return g_object_ref (data->file); 4578 4579 return NULL; 4580 } 4581 4582 typedef struct { 4583 GFileQueryInfoFlags flags; 4584 GFileInfo *info; 4585 gboolean res; 4586 GError *error; 4587 } SetInfoAsyncData; 4588 4589 static void 4590 set_info_data_free (SetInfoAsyncData *data) 4591 { 4592 if (data->info) 4593 g_object_unref (data->info); 4594 if (data->error) 4595 g_error_free (data->error); 4596 g_free (data); 4597 } 4598 4599 static void 4600 set_info_async_thread (GSimpleAsyncResult *res, 4601 GObject *object, 4602 GCancellable *cancellable) 4603 { 4604 SetInfoAsyncData *data; 4605 4606 data = g_simple_async_result_get_op_res_gpointer (res); 4607 4608 data->error = NULL; 4609 data->res = g_file_set_attributes_from_info (G_FILE (object), 4610 data->info, 4611 data->flags, 4612 cancellable, 4613 &data->error); 4614 } 4615 4616 static void 4617 g_file_real_set_attributes_async (GFile *file, 4618 GFileInfo *info, 4619 GFileQueryInfoFlags flags, 4620 int io_priority, 4621 GCancellable *cancellable, 4622 GAsyncReadyCallback callback, 4623 gpointer user_data) 4624 { 4625 GSimpleAsyncResult *res; 4626 SetInfoAsyncData *data; 4627 4628 data = g_new0 (SetInfoAsyncData, 1); 4629 data->info = g_file_info_dup (info); 4630 data->flags = flags; 4631 4632 res = g_simple_async_result_new (G_OBJECT (file), callback, user_data, g_file_real_set_attributes_async); 4633 g_simple_async_result_set_op_res_gpointer (res, data, (GDestroyNotify)set_info_data_free); 4634 4635 g_simple_async_result_run_in_thread (res, set_info_async_thread, io_priority, cancellable); 4636 g_object_unref (res); 4637 } 4638 4639 static gboolean 4640 g_file_real_set_attributes_finish (GFile *file, 4641 GAsyncResult *res, 4642 GFileInfo **info, 4643 GError **error) 4644 { 4645 GSimpleAsyncResult *simple = G_SIMPLE_ASYNC_RESULT (res); 4646 SetInfoAsyncData *data; 4647 4648 g_warn_if_fail (g_simple_async_result_get_source_tag (simple) == g_file_real_set_attributes_async); 4649 4650 data = g_simple_async_result_get_op_res_gpointer (simple); 4651 4652 if (info) 4653 *info = g_object_ref (data->info); 4654 4655 if (error != NULL && data->error) 4656 *error = g_error_copy (data->error); 4657 4658 return data->res; 4659 } 4660 4661 static void 4662 find_enclosing_mount_async_thread (GSimpleAsyncResult *res, 4663 GObject *object, 4664 GCancellable *cancellable) 4665 { 4666 GError *error = NULL; 4667 GMount *mount; 4668 4669 mount = g_file_find_enclosing_mount (G_FILE (object), cancellable, &error); 4670 4671 if (mount == NULL) 4672 { 4673 g_simple_async_result_set_from_error (res, error); 4674 g_error_free (error); 4675 } 4676 else 4677 g_simple_async_result_set_op_res_gpointer (res, mount, (GDestroyNotify)g_object_unref); 4678 } 4679 4680 static void 4681 g_file_real_find_enclosing_mount_async (GFile *file, 4682 int io_priority, 4683 GCancellable *cancellable, 4684 GAsyncReadyCallback callback, 4685 gpointer user_data) 4686 { 4687 GSimpleAsyncResult *res; 4688 4689 res = g_simple_async_result_new (G_OBJECT (file), callback, user_data, g_file_real_find_enclosing_mount_async); 4690 4691 g_simple_async_result_run_in_thread (res, find_enclosing_mount_async_thread, io_priority, cancellable); 4692 g_object_unref (res); 4693 } 4694 4695 static GMount * 4696 g_file_real_find_enclosing_mount_finish (GFile *file, 4697 GAsyncResult *res, 4698 GError **error) 4699 { 4700 GSimpleAsyncResult *simple = G_SIMPLE_ASYNC_RESULT (res); 4701 GMount *mount; 4702 4703 g_warn_if_fail (g_simple_async_result_get_source_tag (simple) == g_file_real_find_enclosing_mount_async); 4704 4705 mount = g_simple_async_result_get_op_res_gpointer (simple); 4706 return g_object_ref (mount); 4707 } 4708 4709 4710 typedef struct { 4711 GFile *source; 4712 GFile *destination; 4713 GFileCopyFlags flags; 4714 GFileProgressCallback progress_cb; 4715 gpointer progress_cb_data; 4716 GIOSchedulerJob *job; 4717 } CopyAsyncData; 4718 4719 static void 4720 copy_async_data_free (CopyAsyncData *data) 4721 { 4722 g_object_unref (data->source); 4723 g_object_unref (data->destination); 4724 g_free (data); 4725 } 4726 4727 typedef struct { 4728 CopyAsyncData *data; 4729 goffset current_num_bytes; 4730 goffset total_num_bytes; 4731 } ProgressData; 4732 4733 static gboolean 4734 copy_async_progress_in_main (gpointer user_data) 4735 { 4736 ProgressData *progress = user_data; 4737 CopyAsyncData *data = progress->data; 4738 4739 data->progress_cb (progress->current_num_bytes, 4740 progress->total_num_bytes, 4741 data->progress_cb_data); 4742 4743 return FALSE; 4744 } 4745 4746 static gboolean 4747 mainloop_barrier (gpointer user_data) 4748 { 4749 /* Does nothing, but ensures all queued idles before 4750 this are run */ 4751 return FALSE; 4752 } 4753 4754 4755 static void 4756 copy_async_progress_callback (goffset current_num_bytes, 4757 goffset total_num_bytes, 4758 gpointer user_data) 4759 { 4760 CopyAsyncData *data = user_data; 4761 ProgressData *progress; 4762 4763 progress = g_new (ProgressData, 1); 4764 progress->data = data; 4765 progress->current_num_bytes = current_num_bytes; 4766 progress->total_num_bytes = total_num_bytes; 4767 4768 g_io_scheduler_job_send_to_mainloop_async (data->job, 4769 copy_async_progress_in_main, 4770 progress, 4771 g_free); 4772 } 4773 4774 static gboolean 4775 copy_async_thread (GIOSchedulerJob *job, 4776 GCancellable *cancellable, 4777 gpointer user_data) 4778 { 4779 GSimpleAsyncResult *res; 4780 CopyAsyncData *data; 4781 gboolean result; 4782 GError *error; 4783 4784 res = user_data; 4785 data = g_simple_async_result_get_op_res_gpointer (res); 4786 4787 error = NULL; 4788 data->job = job; 4789 result = g_file_copy (data->source, 4790 data->destination, 4791 data->flags, 4792 cancellable, 4793 (data->progress_cb != NULL) ? copy_async_progress_callback : NULL, 4794 data, 4795 &error); 4796 4797 /* Ensure all progress callbacks are done running in main thread */ 4798 if (data->progress_cb != NULL) 4799 g_io_scheduler_job_send_to_mainloop (job, 4800 mainloop_barrier, 4801 NULL, NULL); 4802 4803 if (!result) 4804 { 4805 g_simple_async_result_set_from_error (res, error); 4806 g_error_free (error); 4807 } 4808 4809 g_simple_async_result_complete_in_idle (res); 4810 4811 return FALSE; 4812 } 4813 4814 static void 4815 g_file_real_copy_async (GFile *source, 4816 GFile *destination, 4817 GFileCopyFlags flags, 4818 int io_priority, 4819 GCancellable *cancellable, 4820 GFileProgressCallback progress_callback, 4821 gpointer progress_callback_data, 4822 GAsyncReadyCallback callback, 4823 gpointer user_data) 4824 { 4825 GSimpleAsyncResult *res; 4826 CopyAsyncData *data; 4827 4828 data = g_new0 (CopyAsyncData, 1); 4829 data->source = g_object_ref (source); 4830 data->destination = g_object_ref (destination); 4831 data->flags = flags; 4832 data->progress_cb = progress_callback; 4833 data->progress_cb_data = progress_callback_data; 4834 4835 res = g_simple_async_result_new (G_OBJECT (source), callback, user_data, g_file_real_copy_async); 4836 g_simple_async_result_set_op_res_gpointer (res, data, (GDestroyNotify)copy_async_data_free); 4837 4838 g_io_scheduler_push_job (copy_async_thread, res, g_object_unref, io_priority, cancellable); 4839 } 4840 4841 static gboolean 4842 g_file_real_copy_finish (GFile *file, 4843 GAsyncResult *res, 4844 GError **error) 4845 { 4846 /* Error handled in g_file_copy_finish() */ 4847 return TRUE; 4848 } 4849 4850 4851 /******************************************** 4852 * Default VFS operations * 4853 ********************************************/ 4854 4855 /** 4856 * g_file_new_for_path: 4857 * @path: a string containing a relative or absolute path. 4858 * 4859 * Constructs a #GFile for a given path. This operation never 4860 * fails, but the returned object might not support any I/O 4861 * operation if @path is malformed. 4862 * 4863 * Returns: a new #GFile for the given @path. 4864 **/ 4865 GFile * 4866 g_file_new_for_path (const char *path) 4867 { 4868 g_return_val_if_fail (path != NULL, NULL); 4869 4870 return g_vfs_get_file_for_path (g_vfs_get_default (), path); 4871 } 4872 4873 /** 4874 * g_file_new_for_uri: 4875 * @uri: a string containing a URI. 4876 * 4877 * Constructs a #GFile for a given URI. This operation never 4878 * fails, but the returned object might not support any I/O 4879 * operation if @uri is malformed or if the uri type is 4880 * not supported. 4881 * 4882 * Returns: a #GFile for the given @uri. 4883 **/ 4884 GFile * 4885 g_file_new_for_uri (const char *uri) 4886 { 4887 g_return_val_if_fail (uri != NULL, NULL); 4888 4889 return g_vfs_get_file_for_uri (g_vfs_get_default (), uri); 4890 } 4891 4892 /** 4893 * g_file_parse_name: 4894 * @parse_name: a file name or path to be parsed. 4895 * 4896 * Constructs a #GFile with the given @parse_name (i.e. something given by g_file_get_parse_name()). 4897 * This operation never fails, but the returned object might not support any I/O 4898 * operation if the @parse_name cannot be parsed. 4899 * 4900 * Returns: a new #GFile. 4901 **/ 4902 GFile * 4903 g_file_parse_name (const char *parse_name) 4904 { 4905 g_return_val_if_fail (parse_name != NULL, NULL); 4906 4907 return g_vfs_parse_name (g_vfs_get_default (), parse_name); 4908 } 4909 4910 static gboolean 4911 is_valid_scheme_character (char c) 4912 { 4913 return g_ascii_isalnum (c) || c == '+' || c == '-' || c == '.'; 4914 } 4915 4916 /* Following RFC 2396, valid schemes are built like: 4917 * scheme = alpha *( alpha | digit | "+" | "-" | "." ) 4918 */ 4919 static gboolean 4920 has_valid_scheme (const char *uri) 4921 { 4922 const char *p; 4923 4924 p = uri; 4925 4926 if (!g_ascii_isalpha (*p)) 4927 return FALSE; 4928 4929 do { 4930 p++; 4931 } while (is_valid_scheme_character (*p)); 4932 4933 return *p == ':'; 4934 } 4935 4936 /** 4937 * g_file_new_for_commandline_arg: 4938 * @arg: a command line string. 4939 * 4940 * Creates a #GFile with the given argument from the command line. The value of 4941 * @arg can be either a URI, an absolute path or a relative path resolved 4942 * relative to the current working directory. 4943 * This operation never fails, but the returned object might not support any 4944 * I/O operation if @arg points to a malformed path. 4945 * 4946 * Returns: a new #GFile. 4947 **/ 4948 GFile * 4949 g_file_new_for_commandline_arg (const char *arg) 4950 { 4951 GFile *file; 4952 char *filename; 4953 char *current_dir; 4954 4955 g_return_val_if_fail (arg != NULL, NULL); 4956 4957 if (g_path_is_absolute (arg)) 4958 return g_file_new_for_path (arg); 4959 4960 if (has_valid_scheme (arg)) 4961 return g_file_new_for_uri (arg); 4962 4963 current_dir = g_get_current_dir (); 4964 filename = g_build_filename (current_dir, arg, NULL); 4965 g_free (current_dir); 4966 4967 file = g_file_new_for_path (filename); 4968 g_free (filename); 4969 4970 return file; 4971 } 4972 4973 /** 4974 * g_file_mount_enclosing_volume: 4975 * @location: input #GFile. 4976 * @flags: flags affecting the operation 4977 * @mount_operation: a #GMountOperation or %NULL to avoid user interaction. 4978 * @cancellable: optional #GCancellable object, %NULL to ignore. 4979 * @callback: a #GAsyncReadyCallback to call when the request is satisfied, or %NULL. 4980 * @user_data: the data to pass to callback function 4981 * 4982 * Starts a @mount_operation, mounting the volume that contains the file @location. 4983 * 4984 * When this operation has completed, @callback will be called with 4985 * @user_user data, and the operation can be finalized with 4986 * g_file_mount_enclosing_volume_finish(). 4987 * 4988 * If @cancellable is not %NULL, then the operation can be cancelled by 4989 * triggering the cancellable object from another thread. If the operation 4990 * was cancelled, the error %G_IO_ERROR_CANCELLED will be returned. 4991 **/ 4992 void 4993 g_file_mount_enclosing_volume (GFile *location, 4994 GMountMountFlags flags, 4995 GMountOperation *mount_operation, 4996 GCancellable *cancellable, 4997 GAsyncReadyCallback callback, 4998 gpointer user_data) 4999 { 5000 GFileIface *iface; 5001 5002 g_return_if_fail (G_IS_FILE (location)); 5003 5004 iface = G_FILE_GET_IFACE (location); 5005 5006 if (iface->mount_enclosing_volume == NULL) 5007 { 5008 g_simple_async_report_error_in_idle (G_OBJECT (location), 5009 callback, user_data, 5010 G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED, 5011 _("volume doesn't implement mount")); 5012 5013 return; 5014 } 5015 5016 (* iface->mount_enclosing_volume) (location, flags, mount_operation, cancellable, callback, user_data); 5017 5018 } 5019 5020 /** 5021 * g_file_mount_enclosing_volume_finish: 5022 * @location: input #GFile. 5023 * @result: a #GAsyncResult. 5024 * @error: a #GError, or %NULL 5025 * 5026 * Finishes a mount operation started by g_file_mount_enclosing_volume(). 5027 * 5028 * Returns: %TRUE if successful. If an error 5029 * has occurred, this function will return %FALSE and set @error 5030 * appropriately if present. 5031 **/ 5032 gboolean 5033 g_file_mount_enclosing_volume_finish (GFile *location, 5034 GAsyncResult *result, 5035 GError **error) 5036 { 5037 GFileIface *iface; 5038 5039 g_return_val_if_fail (G_IS_FILE (location), FALSE); 5040 g_return_val_if_fail (G_IS_ASYNC_RESULT (result), FALSE); 5041 5042 if (G_IS_SIMPLE_ASYNC_RESULT (result)) 5043 { 5044 GSimpleAsyncResult *simple = G_SIMPLE_ASYNC_RESULT (result); 5045 if (g_simple_async_result_propagate_error (simple, error)) 5046 return FALSE; 5047 } 5048 5049 iface = G_FILE_GET_IFACE (location); 5050 5051 return (* iface->mount_enclosing_volume_finish) (location, result, error); 5052 } 5053 5054 /******************************************** 5055 * Utility functions * 5056 ********************************************/ 5057 5058 /** 5059 * g_file_query_default_handler: 5060 * @file: a #GFile to open. 5061 * @cancellable: optional #GCancellable object, %NULL to ignore. 5062 * @error: a #GError, or %NULL 5063 * 5064 * Returns the #GAppInfo that is registered as the default 5065 * application to handle the file specified by @file. 5066 * 5067 * If @cancellable is not %NULL, then the operation can be cancelled by 5068 * triggering the cancellable object from another thread. If the operation 5069 * was cancelled, the error %G_IO_ERROR_CANCELLED will be returned. 5070 * 5071 * Returns: a #GAppInfo if the handle was found, %NULL if there were errors. 5072 * When you are done with it, release it with g_object_unref() 5073 **/ 5074 GAppInfo * 5075 g_file_query_default_handler (GFile *file, 5076 GCancellable *cancellable, 5077 GError **error) 5078 { 5079 char *uri_scheme; 5080 const char *content_type; 5081 GAppInfo *appinfo; 5082 GFileInfo *info; 5083 char *path; 5084 5085 uri_scheme = g_file_get_uri_scheme (file); 5086 appinfo = g_app_info_get_default_for_uri_scheme (uri_scheme); 5087 g_free (uri_scheme); 5088 5089 if (appinfo != NULL) 5090 return appinfo; 5091 5092 info = g_file_query_info (file, 5093 G_FILE_ATTRIBUTE_STANDARD_CONTENT_TYPE, 5094 0, 5095 cancellable, 5096 error); 5097 if (info == NULL) 5098 return NULL; 5099 5100 appinfo = NULL; 5101 5102 content_type = g_file_info_get_content_type (info); 5103 if (content_type) 5104 { 5105 /* Don't use is_native(), as we want to support fuse paths if availible */ 5106 path = g_file_get_path (file); 5107 appinfo = g_app_info_get_default_for_type (content_type, 5108 path == NULL); 5109 g_free (path); 5110 } 5111 5112 g_object_unref (info); 5113 5114 if (appinfo != NULL) 5115 return appinfo; 5116 5117 g_set_error_literal (error, G_IO_ERROR, 5118 G_IO_ERROR_NOT_SUPPORTED, 5119 _("No application is registered as handling this file")); 5120 return NULL; 5121 5122 } 5123 5124 5125 #define GET_CONTENT_BLOCK_SIZE 8192 5126 5127 /** 5128 * g_file_load_contents: 5129 * @file: input #GFile. 5130 * @cancellable: optional #GCancellable object, %NULL to ignore. 5131 * @contents: a location to place the contents of the file. 5132 * @length: a location to place the length of the contents of the file, 5133 * or %NULL if the length is not needed 5134 * @etag_out: a location to place the current entity tag for the file, 5135 * or %NULL if the entity tag is not needed 5136 * @error: a #GError, or %NULL 5137 * 5138 * Loads the content of the file into memory. The data is always 5139 * zero-terminated, but this is not included in the resultant @length. 5140 * The returned @content should be freed with g_free() when no longer 5141 * needed. 5142 * 5143 * If @cancellable is not %NULL, then the operation can be cancelled by 5144 * triggering the cancellable object from another thread. If the operation 5145 * was cancelled, the error %G_IO_ERROR_CANCELLED will be returned. 5146 * 5147 * Returns: %TRUE if the @file's contents were successfully loaded. 5148 * %FALSE if there were errors. 5149 **/ 5150 gboolean 5151 g_file_load_contents (GFile *file, 5152 GCancellable *cancellable, 5153 char **contents, 5154 gsize *length, 5155 char **etag_out, 5156 GError **error) 5157 { 5158 GFileInputStream *in; 5159 GByteArray *content; 5160 gsize pos; 5161 gssize res; 5162 GFileInfo *info; 5163 5164 g_return_val_if_fail (G_IS_FILE (file), FALSE); 5165 g_return_val_if_fail (contents != NULL, FALSE); 5166 5167 in = g_file_read (file, cancellable, error); 5168 if (in == NULL) 5169 return FALSE; 5170 5171 content = g_byte_array_new (); 5172 pos = 0; 5173 5174 g_byte_array_set_size (content, pos + GET_CONTENT_BLOCK_SIZE + 1); 5175 while ((res = g_input_stream_read (G_INPUT_STREAM (in), 5176 content->data + pos, 5177 GET_CONTENT_BLOCK_SIZE, 5178 cancellable, error)) > 0) 5179 { 5180 pos += res; 5181 g_byte_array_set_size (content, pos + GET_CONTENT_BLOCK_SIZE + 1); 5182 } 5183 5184 if (etag_out) 5185 { 5186 *etag_out = NULL; 5187 5188 info = g_file_input_stream_query_info (in, 5189 G_FILE_ATTRIBUTE_ETAG_VALUE, 5190 cancellable, 5191 NULL); 5192 if (info) 5193 { 5194 *etag_out = g_strdup (g_file_info_get_etag (info)); 5195 g_object_unref (info); 5196 } 5197 } 5198 5199 /* Ignore errors on close */ 5200 g_input_stream_close (G_INPUT_STREAM (in), cancellable, NULL); 5201 g_object_unref (in); 5202 5203 if (res < 0) 5204 { 5205 /* error is set already */ 5206 g_byte_array_free (content, TRUE); 5207 return FALSE; 5208 } 5209 5210 if (length) 5211 *length = pos; 5212 5213 /* Zero terminate (we got an extra byte allocated for this */ 5214 content->data[pos] = 0; 5215 5216 *contents = (char *)g_byte_array_free (content, FALSE); 5217 5218 return TRUE; 5219 } 5220 5221 typedef struct { 5222 GFile *file; 5223 GError *error; 5224 GCancellable *cancellable; 5225 GFileReadMoreCallback read_more_callback; 5226 GAsyncReadyCallback callback; 5227 gpointer user_data; 5228 GByteArray *content; 5229 gsize pos; 5230 char *etag; 5231 } LoadContentsData; 5232 5233 5234 static void 5235 load_contents_data_free (LoadContentsData *data) 5236 { 5237 if (data->error) 5238 g_error_free (data->error); 5239 if (data->cancellable) 5240 g_object_unref (data->cancellable); 5241 if (data->content) 5242 g_byte_array_free (data->content, TRUE); 5243 g_free (data->etag); 5244 g_object_unref (data->file); 5245 g_free (data); 5246 } 5247 5248 static void 5249 load_contents_close_callback (GObject *obj, 5250 GAsyncResult *close_res, 5251 gpointer user_data) 5252 { 5253 GInputStream *stream = G_INPUT_STREAM (obj); 5254 LoadContentsData *data = user_data; 5255 GSimpleAsyncResult *res; 5256 5257 /* Ignore errors here, we're only reading anyway */ 5258 g_input_stream_close_finish (stream, close_res, NULL); 5259 g_object_unref (stream); 5260 5261 res = g_simple_async_result_new (G_OBJECT (data->file), 5262 data->callback, 5263 data->user_data, 5264 g_file_load_contents_async); 5265 g_simple_async_result_set_op_res_gpointer (res, data, (GDestroyNotify)load_contents_data_free); 5266 g_simple_async_result_complete (res); 5267 g_object_unref (res); 5268 } 5269 5270 static void 5271 load_contents_fstat_callback (GObject *obj, 5272 GAsyncResult *stat_res, 5273 gpointer user_data) 5274 { 5275 GInputStream *stream = G_INPUT_STREAM (obj); 5276 LoadContentsData *data = user_data; 5277 GFileInfo *info; 5278 5279 info = g_file_input_stream_query_info_finish (G_FILE_INPUT_STREAM (stream), 5280 stat_res, NULL); 5281 if (info) 5282 { 5283 data->etag = g_strdup (g_file_info_get_etag (info)); 5284 g_object_unref (info); 5285 } 5286 5287 g_input_stream_close_async (stream, 0, 5288 data->cancellable, 5289 load_contents_close_callback, data); 5290 } 5291 5292 static void 5293 load_contents_read_callback (GObject *obj, 5294 GAsyncResult *read_res, 5295 gpointer user_data) 5296 { 5297 GInputStream *stream = G_INPUT_STREAM (obj); 5298 LoadContentsData *data = user_data; 5299 GError *error = NULL; 5300 gssize read_size; 5301 5302 read_size = g_input_stream_read_finish (stream, read_res, &error); 5303 5304 if (read_size < 0) 5305 { 5306 /* Error or EOF, close the file */ 5307 data->error = error; 5308 g_input_stream_close_async (stream, 0, 5309 data->cancellable, 5310 load_contents_close_callback, data); 5311 } 5312 else if (read_size == 0) 5313 { 5314 g_file_input_stream_query_info_async (G_FILE_INPUT_STREAM (stream), 5315 G_FILE_ATTRIBUTE_ETAG_VALUE, 5316 0, 5317 data->cancellable, 5318 load_contents_fstat_callback, 5319 data); 5320 } 5321 else if (read_size > 0) 5322 { 5323 data->pos += read_size; 5324 5325 g_byte_array_set_size (data->content, 5326 data->pos + GET_CONTENT_BLOCK_SIZE); 5327 5328 5329 if (data->read_more_callback && 5330 !data->read_more_callback ((char *)data->content->data, data->pos, data->user_data)) 5331 g_file_input_stream_query_info_async (G_FILE_INPUT_STREAM (stream), 5332 G_FILE_ATTRIBUTE_ETAG_VALUE, 5333 0, 5334 data->cancellable, 5335 load_contents_fstat_callback, 5336 data); 5337 else 5338 g_input_stream_read_async (stream, 5339 data->content->data + data->pos, 5340 GET_CONTENT_BLOCK_SIZE, 5341 0, 5342 data->cancellable, 5343 load_contents_read_callback, 5344 data); 5345 } 5346 } 5347 5348 static void 5349 load_contents_open_callback (GObject *obj, 5350 GAsyncResult *open_res, 5351 gpointer user_data) 5352 { 5353 GFile *file = G_FILE (obj); 5354 GFileInputStream *stream; 5355 LoadContentsData *data = user_data; 5356 GError *error = NULL; 5357 GSimpleAsyncResult *res; 5358 5359 stream = g_file_read_finish (file, open_res, &error); 5360 5361 if (stream) 5362 { 5363 g_byte_array_set_size (data->content, 5364 data->pos + GET_CONTENT_BLOCK_SIZE); 5365 g_input_stream_read_async (G_INPUT_STREAM (stream), 5366 data->content->data + data->pos, 5367 GET_CONTENT_BLOCK_SIZE, 5368 0, 5369 data->cancellable, 5370 load_contents_read_callback, 5371 data); 5372 5373 } 5374 else 5375 { 5376 res = g_simple_async_result_new_from_error (G_OBJECT (data->file), 5377 data->callback, 5378 data->user_data, 5379 error); 5380 g_simple_async_result_complete (res); 5381 g_error_free (error); 5382 load_contents_data_free (data); 5383 g_object_unref (res); 5384 } 5385 } 5386 5387 /** 5388 * g_file_load_partial_contents_async: 5389 * @file: input #GFile. 5390 * @cancellable: optional #GCancellable object, %NULL to ignore. 5391 * @read_more_callback: a #GFileReadMoreCallback to receive partial data and to specify whether further data should be read. 5392 * @callback: a #GAsyncReadyCallback to call when the request is satisfied 5393 * @user_data: the data to pass to the callback functions. 5394 * 5395 * Reads the partial contents of a file. A #GFileReadMoreCallback should be 5396 * used to stop reading from the file when appropriate, else this function 5397 * will behave exactly as g_file_load_contents_async(). This operation 5398 * can be finished by g_file_load_partial_contents_finish(). 5399 * 5400 * Users of this function should be aware that @user_data is passed to 5401 * both the @read_more_callback and the @callback. 5402 * 5403 * If @cancellable is not %NULL, then the operation can be cancelled by 5404 * triggering the cancellable object from another thread. If the operation 5405 * was cancelled, the error %G_IO_ERROR_CANCELLED will be returned. 5406 **/ 5407 void 5408 g_file_load_partial_contents_async (GFile *file, 5409 GCancellable *cancellable, 5410 GFileReadMoreCallback read_more_callback, 5411 GAsyncReadyCallback callback, 5412 gpointer user_data) 5413 { 5414 LoadContentsData *data; 5415 5416 g_return_if_fail (G_IS_FILE (file)); 5417 5418 data = g_new0 (LoadContentsData, 1); 5419 5420 if (cancellable) 5421 data->cancellable = g_object_ref (cancellable); 5422 data->read_more_callback = read_more_callback; 5423 data->callback = callback; 5424 data->user_data = user_data; 5425 data->content = g_byte_array_new (); 5426 data->file = g_object_ref (file); 5427 5428 g_file_read_async (file, 5429 0, 5430 cancellable, 5431 load_contents_open_callback, 5432 data); 5433 } 5434 5435 /** 5436 * g_file_load_partial_contents_finish: 5437 * @file: input #GFile. 5438 * @res: a #GAsyncResult. 5439 * @contents: a location to place the contents of the file. 5440 * @length: a location to place the length of the contents of the file, 5441 * or %NULL if the length is not needed 5442 * @etag_out: a location to place the current entity tag for the file, 5443 * or %NULL if the entity tag is not needed 5444 * @error: a #GError, or %NULL 5445 * 5446 * Finishes an asynchronous partial load operation that was started 5447 * with g_file_load_partial_contents_async(). The data is always 5448 * zero-terminated, but this is not included in the resultant @length. 5449 * The returned @content should be freed with g_free() when no longer 5450 * needed. 5451 * 5452 * Returns: %TRUE if the load was successful. If %FALSE and @error is 5453 * present, it will be set appropriately. 5454 **/ 5455 gboolean 5456 g_file_load_partial_contents_finish (GFile *file, 5457 GAsyncResult *res, 5458 char **contents, 5459 gsize *length, 5460 char **etag_out, 5461 GError **error) 5462 { 5463 GSimpleAsyncResult *simple; 5464 LoadContentsData *data; 5465 5466 g_return_val_if_fail (G_IS_FILE (file), FALSE); 5467 g_return_val_if_fail (G_IS_SIMPLE_ASYNC_RESULT (res), FALSE); 5468 g_return_val_if_fail (contents != NULL, FALSE); 5469 5470 simple = G_SIMPLE_ASYNC_RESULT (res); 5471 5472 if (g_simple_async_result_propagate_error (simple, error)) 5473 return FALSE; 5474 5475 g_warn_if_fail (g_simple_async_result_get_source_tag (simple) == g_file_load_contents_async); 5476 5477 data = g_simple_async_result_get_op_res_gpointer (simple); 5478 5479 if (data->error) 5480 { 5481 g_propagate_error (error, data->error); 5482 data->error = NULL; 5483 *contents = NULL; 5484 if (length) 5485 *length = 0; 5486 return FALSE; 5487 } 5488 5489 if (length) 5490 *length = data->pos; 5491 5492 if (etag_out) 5493 { 5494 *etag_out = data->etag; 5495 data->etag = NULL; 5496 } 5497 5498 /* Zero terminate */ 5499 g_byte_array_set_size (data->content, data->pos + 1); 5500 data->content->data[data->pos] = 0; 5501 5502 *contents = (char *)g_byte_array_free (data->content, FALSE); 5503 data->content = NULL; 5504 5505 return TRUE; 5506 } 5507 5508 /** 5509 * g_file_load_contents_async: 5510 * @file: input #GFile. 5511 * @cancellable: optional #GCancellable object, %NULL to ignore. 5512 * @callback: a #GAsyncReadyCallback to call when the request is satisfied 5513 * @user_data: the data to pass to callback function 5514 * 5515 * Starts an asynchronous load of the @file's contents. 5516 * 5517 * For more details, see g_file_load_contents() which is 5518 * the synchronous version of this call. 5519 * 5520 * When the load operation has completed, @callback will be called 5521 * with @user data. To finish the operation, call 5522 * g_file_load_contents_finish() with the #GAsyncResult returned by 5523 * the @callback. 5524 * 5525 * If @cancellable is not %NULL, then the operation can be cancelled by 5526 * triggering the cancellable object from another thread. If the operation 5527 * was cancelled, the error %G_IO_ERROR_CANCELLED will be returned. 5528 **/ 5529 void 5530 g_file_load_contents_async (GFile *file, 5531 GCancellable *cancellable, 5532 GAsyncReadyCallback callback, 5533 gpointer user_data) 5534 { 5535 g_file_load_partial_contents_async (file, 5536 cancellable, 5537 NULL, 5538 callback, user_data); 5539 } 5540 5541 /** 5542 * g_file_load_contents_finish: 5543 * @file: input #GFile. 5544 * @res: a #GAsyncResult. 5545 * @contents: a location to place the contents of the file. 5546 * @length: a location to place the length of the contents of the file, 5547 * or %NULL if the length is not needed 5548 * @etag_out: a location to place the current entity tag for the file, 5549 * or %NULL if the entity tag is not needed 5550 * @error: a #GError, or %NULL 5551 * 5552 * Finishes an asynchronous load of the @file's contents. 5553 * The contents are placed in @contents, and @length is set to the 5554 * size of the @contents string. The @content should be freed with 5555 * g_free() when no longer needed. If @etag_out is present, it will be 5556 * set to the new entity tag for the @file. 5557 * 5558 * Returns: %TRUE if the load was successful. If %FALSE and @error is 5559 * present, it will be set appropriately. 5560 **/ 5561 gboolean 5562 g_file_load_contents_finish (GFile *file, 5563 GAsyncResult *res, 5564 char **contents, 5565 gsize *length, 5566 char **etag_out, 5567 GError **error) 5568 { 5569 return g_file_load_partial_contents_finish (file, 5570 res, 5571 contents, 5572 length, 5573 etag_out, 5574 error); 5575 } 5576 5577 /** 5578 * g_file_replace_contents: 5579 * @file: input #GFile. 5580 * @contents: a string containing the new contents for @file. 5581 * @length: the length of @contents in bytes. 5582 * @etag: the old <link linkend="gfile-etag">entity tag</link> 5583 * for the document, or %NULL 5584 * @make_backup: %TRUE if a backup should be created. 5585 * @flags: a set of #GFileCreateFlags. 5586 * @new_etag: a location to a new <link linkend="gfile-etag">entity tag</link> 5587 * for the document. This should be freed with g_free() when no longer 5588 * needed, or %NULL 5589 * @cancellable: optional #GCancellable object, %NULL to ignore. 5590 * @error: a #GError, or %NULL 5591 * 5592 * Replaces the contents of @file with @contents of @length bytes. 5593 5594 * If @etag is specified (not %NULL) any existing file must have that etag, or 5595 * the error %G_IO_ERROR_WRONG_ETAG will be returned. 5596 * 5597 * If @make_backup is %TRUE, this function will attempt to make a backup of @file. 5598 * 5599 * If @cancellable is not %NULL, then the operation can be cancelled by 5600 * triggering the cancellable object from another thread. If the operation 5601 * was cancelled, the error %G_IO_ERROR_CANCELLED will be returned. 5602 * 5603 * The returned @new_etag can be used to verify that the file hasn't changed the 5604 * next time it is saved over. 5605 * 5606 * Returns: %TRUE if successful. If an error 5607 * has occurred, this function will return %FALSE and set @error 5608 * appropriately if present. 5609 **/ 5610 gboolean 5611 g_file_replace_contents (GFile *file, 5612 const char *contents, 5613 gsize length, 5614 const char *etag, 5615 gboolean make_backup, 5616 GFileCreateFlags flags, 5617 char **new_etag, 5618 GCancellable *cancellable, 5619 GError **error) 5620 { 5621 GFileOutputStream *out; 5622 gsize pos, remainder; 5623 gssize res; 5624 gboolean ret; 5625 5626 g_return_val_if_fail (G_IS_FILE (file), FALSE); 5627 g_return_val_if_fail (contents != NULL, FALSE); 5628 5629 out = g_file_replace (file, etag, make_backup, flags, cancellable, error); 5630 if (out == NULL) 5631 return FALSE; 5632 5633 pos = 0; 5634 remainder = length; 5635 while (remainder > 0 && 5636 (res = g_output_stream_write (G_OUTPUT_STREAM (out), 5637 contents + pos, 5638 MIN (remainder, GET_CONTENT_BLOCK_SIZE), 5639 cancellable, 5640 error)) > 0) 5641 { 5642 pos += res; 5643 remainder -= res; 5644 } 5645 5646 if (remainder > 0 && res < 0) 5647 { 5648 /* Ignore errors on close */ 5649 g_output_stream_close (G_OUTPUT_STREAM (out), cancellable, NULL); 5650 g_object_unref (out); 5651 5652 /* error is set already */ 5653 return FALSE; 5654 } 5655 5656 ret = g_output_stream_close (G_OUTPUT_STREAM (out), cancellable, error); 5657 5658 if (new_etag) 5659 *new_etag = g_file_output_stream_get_etag (out); 5660 5661 g_object_unref (out); 5662 5663 return ret; 5664 } 5665 5666 typedef struct { 5667 GFile *file; 5668 GError *error; 5669 GCancellable *cancellable; 5670 GAsyncReadyCallback callback; 5671 gpointer user_data; 5672 const char *content; 5673 gsize length; 5674 gsize pos; 5675 char *etag; 5676 } ReplaceContentsData; 5677 5678 static void 5679 replace_contents_data_free (ReplaceContentsData *data) 5680 { 5681 if (data->error) 5682 g_error_free (data->error); 5683 if (data->cancellable) 5684 g_object_unref (data->cancellable); 5685 g_object_unref (data->file); 5686 g_free (data->etag); 5687 g_free (data); 5688 } 5689 5690 static void 5691 replace_contents_close_callback (GObject *obj, 5692 GAsyncResult *close_res, 5693 gpointer user_data) 5694 { 5695 GOutputStream *stream = G_OUTPUT_STREAM (obj); 5696 ReplaceContentsData *data = user_data; 5697 GSimpleAsyncResult *res; 5698 5699 /* Ignore errors here, we're only reading anyway */ 5700 g_output_stream_close_finish (stream, close_res, NULL); 5701 g_object_unref (stream); 5702 5703 data->etag = g_file_output_stream_get_etag (G_FILE_OUTPUT_STREAM (stream)); 5704 5705 res = g_simple_async_result_new (G_OBJECT (data->file), 5706 data->callback, 5707 data->user_data, 5708 g_file_replace_contents_async); 5709 g_simple_async_result_set_op_res_gpointer (res, data, (GDestroyNotify)replace_contents_data_free); 5710 g_simple_async_result_complete (res); 5711 g_object_unref (res); 5712 } 5713 5714 static void 5715 replace_contents_write_callback (GObject *obj, 5716 GAsyncResult *read_res, 5717 gpointer user_data) 5718 { 5719 GOutputStream *stream = G_OUTPUT_STREAM (obj); 5720 ReplaceContentsData *data = user_data; 5721 GError *error = NULL; 5722 gssize write_size; 5723 5724 write_size = g_output_stream_write_finish (stream, read_res, &error); 5725 5726 if (write_size <= 0) 5727 { 5728 /* Error or EOF, close the file */ 5729 if (write_size < 0) 5730 data->error = error; 5731 g_output_stream_close_async (stream, 0, 5732 data->cancellable, 5733 replace_contents_close_callback, data); 5734 } 5735 else if (write_size > 0) 5736 { 5737 data->pos += write_size; 5738 5739 if (data->pos >= data->length) 5740 g_output_stream_close_async (stream, 0, 5741 data->cancellable, 5742 replace_contents_close_callback, data); 5743 else 5744 g_output_stream_write_async (stream, 5745 data->content + data->pos, 5746 data->length - data->pos, 5747 0, 5748 data->cancellable, 5749 replace_contents_write_callback, 5750 data); 5751 } 5752 } 5753 5754 static void 5755 replace_contents_open_callback (GObject *obj, 5756 GAsyncResult *open_res, 5757 gpointer user_data) 5758 { 5759 GFile *file = G_FILE (obj); 5760 GFileOutputStream *stream; 5761 ReplaceContentsData *data = user_data; 5762 GError *error = NULL; 5763 GSimpleAsyncResult *res; 5764 5765 stream = g_file_replace_finish (file, open_res, &error); 5766 5767 if (stream) 5768 { 5769 g_output_stream_write_async (G_OUTPUT_STREAM (stream), 5770 data->content + data->pos, 5771 data->length - data->pos, 5772 0, 5773 data->cancellable, 5774 replace_contents_write_callback, 5775 data); 5776 5777 } 5778 else 5779 { 5780 res = g_simple_async_result_new_from_error (G_OBJECT (data->file), 5781 data->callback, 5782 data->user_data, 5783 error); 5784 g_simple_async_result_complete (res); 5785 g_error_free (error); 5786 replace_contents_data_free (data); 5787 g_object_unref (res); 5788 } 5789 } 5790 5791 /** 5792 * g_file_replace_contents_async: 5793 * @file: input #GFile. 5794 * @contents: string of contents to replace the file with. 5795 * @length: the length of @contents in bytes. 5796 * @etag: a new <link linkend="gfile-etag">entity tag</link> for the @file, or %NULL 5797 * @make_backup: %TRUE if a backup should be created. 5798 * @flags: a set of #GFileCreateFlags. 5799 * @cancellable: optional #GCancellable object, %NULL to ignore. 5800 * @callback: a #GAsyncReadyCallback to call when the request is satisfied 5801 * @user_data: the data to pass to callback function 5802 * 5803 * Starts an asynchronous replacement of @file with the given 5804 * @contents of @length bytes. @etag will replace the document's 5805 * current entity tag. 5806 * 5807 * When this operation has completed, @callback will be called with 5808 * @user_user data, and the operation can be finalized with 5809 * g_file_replace_contents_finish(). 5810 * 5811 * If @cancellable is not %NULL, then the operation can be cancelled by 5812 * triggering the cancellable object from another thread. If the operation 5813 * was cancelled, the error %G_IO_ERROR_CANCELLED will be returned. 5814 * 5815 * If @make_backup is %TRUE, this function will attempt to 5816 * make a backup of @file. 5817 **/ 5818 void 5819 g_file_replace_contents_async (GFile *file, 5820 const char *contents, 5821 gsize length, 5822 const char *etag, 5823 gboolean make_backup, 5824 GFileCreateFlags flags, 5825 GCancellable *cancellable, 5826 GAsyncReadyCallback callback, 5827 gpointer user_data) 5828 { 5829 ReplaceContentsData *data; 5830 5831 g_return_if_fail (G_IS_FILE (file)); 5832 g_return_if_fail (contents != NULL); 5833 5834 data = g_new0 (ReplaceContentsData, 1); 5835 5836 if (cancellable) 5837 data->cancellable = g_object_ref (cancellable); 5838 data->callback = callback; 5839 data->user_data = user_data; 5840 data->content = contents; 5841 data->length = length; 5842 data->pos = 0; 5843 data->file = g_object_ref (file); 5844 5845 g_file_replace_async (file, 5846 etag, 5847 make_backup, 5848 flags, 5849 0, 5850 cancellable, 5851 replace_contents_open_callback, 5852 data); 5853 } 5854 5855 /** 5856 * g_file_replace_contents_finish: 5857 * @file: input #GFile. 5858 * @res: a #GAsyncResult. 5859 * @new_etag: a location of a new <link linkend="gfile-etag">entity tag</link> 5860 * for the document. This should be freed with g_free() when it is no 5861 * longer needed, or %NULL 5862 * @error: a #GError, or %NULL 5863 * 5864 * Finishes an asynchronous replace of the given @file. See 5865 * g_file_replace_contents_async(). Sets @new_etag to the new entity 5866 * tag for the document, if present. 5867 * 5868 * Returns: %TRUE on success, %FALSE on failure. 5869 **/ 5870 gboolean 5871 g_file_replace_contents_finish (GFile *file, 5872 GAsyncResult *res, 5873 char **new_etag, 5874 GError **error) 5875 { 5876 GSimpleAsyncResult *simple; 5877 ReplaceContentsData *data; 5878 5879 g_return_val_if_fail (G_IS_FILE (file), FALSE); 5880 g_return_val_if_fail (G_IS_SIMPLE_ASYNC_RESULT (res), FALSE); 5881 5882 simple = G_SIMPLE_ASYNC_RESULT (res); 5883 5884 if (g_simple_async_result_propagate_error (simple, error)) 5885 return FALSE; 5886 5887 g_warn_if_fail (g_simple_async_result_get_source_tag (simple) == g_file_replace_contents_async); 5888 5889 data = g_simple_async_result_get_op_res_gpointer (simple); 5890 5891 if (data->error) 5892 { 5893 g_propagate_error (error, data->error); 5894 data->error = NULL; 5895 return FALSE; 5896 } 5897 5898 5899 if (new_etag) 5900 { 5901 *new_etag = data->etag; 5902 data->etag = NULL; /* Take ownership */ 5903 } 5904 5905 return TRUE; 5906 } 5907 5908 #define __G_FILE_C__ 5909 #include "gioaliasdef.c" 5910