<part id="migrating">
  <title>Migrating to GIO</title>

  <chapter>
    <title>Migrating from POSIX to GIO</title>
  
    <table id="posix-vs-gio">
      <title>Comparison of POSIX and GIO concepts</title>
      <tgroup cols="2">
        <thead>
          <row><entry>POSIX</entry><entry>GIO</entry></row>
        </thead>
        <tbody>
          <row><entry>char *path</entry><entry>GFile *file</entry></row>
          <row><entry>struct stat *buf</entry><entry>GFileInfo *info</entry></row>
          <row><entry>struct statvfs *buf</entry><entry>GFileInfo *info</entry></row>
          <row><entry morerows="1">int fd</entry><entry>GInputStream *in</entry></row>
          <row><entry>GOutputStream *out</entry></row>
          <row><entry>DIR *</entry><entry>GFileEnumerator *enum</entry></row>
          <row><entry>fstab entry</entry><entry>GUnixMountPoint *mount_point</entry></row>
          <row><entry>mtab entry</entry><entry>GUnixMountEntry *mount_entry</entry></row>
        </tbody>
      </tgroup>
    </table>  

  </chapter>

  <chapter>
    <title>Migrating from GnomeVFS to GIO</title>

    <table id="gnome-vfs-vs-gio">
      <title>Comparison of GnomeVFS and GIO concepts</title>
      <tgroup cols="2">
        <thead>
          <row><entry>GnomeVFS</entry><entry>GIO</entry></row>
        </thead>
        <tbody>
          <row><entry>GnomeVFSURI</entry><entry>GFile</entry></row>
          <row><entry>GnomeVFSFileInfo</entry><entry>GFileInfo</entry></row>
          <row><entry>GnomeVFSResult</entry><entry>GError, with G_IO_ERROR values</entry></row>
          <row><entry>GnomeVFSHandle &amp; GnomeVFSAsyncHandle</entry><entry>GInputStream or GOutputStream</entry></row>
          <row><entry>GnomeVFSDirectoryHandle</entry><entry>GFileEnumerator</entry></row>
          <row><entry>mime type</entry><entry>content type</entry></row>
          <row><entry>GnomeVFSMonitor</entry><entry>GFileMonitor</entry></row>
          <row><entry>GnomeVFSVolumeMonitor</entry><entry>GVolumeMonitor</entry></row>
          <row><entry>GnomeVFSVolume</entry><entry>GMount</entry></row>
          <row><entry>GnomeVFSDrive</entry><entry>GVolume</entry></row>
          <row><entry>-</entry><entry>GDrive</entry></row>
          <row><entry>GnomeVFSContext</entry><entry>GCancellable</entry></row>
          <row><entry>gnome_vfs_async_cancel</entry><entry>g_cancellable_cancel</entry></row>
        </tbody>
      </tgroup>
    </table>

    <section>
      <title>Trash handling</title>

      <para>
        The handling of trashed files has been changed in GIO, compared
        to gnome-vfs. gnome-vfs has a home-grown trash implementation that 
        predates the freedesktop.org <ulink url="http://www.freedesktop.org/wiki/Specifications/trash-spec">Desktop Trash Can</ulink> specification
        that is implemented in GIO. The location for storing trashed files 
        has changed from <filename>$HOME/.Trash</filename> to 
        <filename>$HOME/.local/share/Trash</filename> (or more correctly
        <filename>$XDG_DATA_HOME/Trash</filename>), which means that 
        there is a need for migrating files that have been trashed by 
        gnome-vfs to the new location.
      </para>
      <para>
        In gnome-vfs, the <filename>trash://</filename> scheme offering a 
        merged view of all trash directories was implemented in nautilus,
        and trash-handling applications had to find and monitor all trash 
        directories themselves. With GIO, the <filename>trash://</filename>
        implementation has been moved to gvfs and applications can simply
        monitor that location:
      </para>
<informalexample><programlisting>
static void
file_changed (GFileMonitor      *file_monitor,
              GFile             *child,
              GFile             *other_file,
              GFileMonitorEvent  event_type,
              gpointer           user_data)
{
  switch (event_type)
  {
  case G_FILE_MONITOR_EVENT_DELETED:
    g_print ("'%s' removed from trash\n", g_file_get_basename (child));
    break;
  case G_FILE_MONITOR_EVENT_CREATED:
    g_print ("'%s' added to trash\n", g_file_get_basename (child));
    break;
  default: ;
  }
}

static void
start_monitoring_trash (void)
{
  GFile *file;
  GFileMonitor *monitor;

  file = g_file_new_for_uri ("trash://");
  monitor = g_file_monitor_directory (file, 0, NULL, NULL);
  g_object_unref (file);

  g_signal_connect (monitor, "changed", G_CALLBACK (file_changed), NULL);

  /* ... */

}       
</programlisting></informalexample> 
      <para>
        GIO exposes some useful metadata about trashed files. There are
        trash::orig-path and trash::deletion-date attributes. The 
        standard::icon attribute of the <filename>trash://</filename> 
        itself provides a suitable icon for displaying the trash can on 
        the desktop. If you are using this icon, make sure to monitor
        this attribute for changes, since the icon may be updated to
        reflect that state of the trash can.
      </para>
      <para>
	Moving a file to the trash is much simpler with GIO. Instead of
        using gnome_vfs_find_directory() with %GNOME_VFS_DIRECTORY_KIND_TRASH 
        to find out where to move the trashed file, just use the g_file_trash()
        function.
      </para>
    </section>

    <section>
      <title>Operations on multiple files</title>

      <para>
        gnome-vfs has the dreaded gnome_vfs_xfer_uri_list() function which
        has tons of options and offers the equivalent of cp, mv, ln, mkdir
        and rm at the same time. 
      </para>
      <para>
        GIO offers a much simpler I/O scheduler functionality instead, that
        lets you schedule a function to be called in a separate thread, or
        if threads are not available, as an idle in the mainloop.
        See g_io_scheduler_push_job(). 
      </para>

    </section>
  </chapter>

</part>
