Check out the new USENIX Web site. next up previous
Next: File attributes Up: Asynchronous API Previous: Opening a file as

Asynchronous API example

The following function reads a file asyncrhonously, with the output sent to stdout.

#define BUFFER_SIZE 4096

/* This is the callback that
   will be called whenever
   something happens on the
   I/O channel associated
   with the file. */

static gboolean
io_channel_callback
 (GIOChannel *source,
  GIOCondition condition,
  gpointer data)
{
  char buffer[BUFFER_SIZE + 1];
  unsigned int bytes_read;
  unsigned int i;

  if (condition & G_IO_IN) {
    /* Data is available. */
    g_io_channel_read
      (source, buffer,
       sizeof (buffer),
       &bytes_read);

    for (i = 0; i < bytes_read; i++)
      putchar (buffer[i]);

    fflush (stdout);
  }

  /* An error happened while reading
     the file. */

  if (condition & G_IO_NVAL)
    return FALSE;

  /* We have reached the end of the
     file. */

  if (condition & G_IO_HUP) {
    g_io_channel_close (source);
    return FALSE;
  }

  /* Returning TRUE will make sure
     the callback remains associated
     to the channel. */

  return TRUE;
}

static void
open_callback (GnomeVFSAsyncHandle *handle,
               GIOChannel *channel,
               GnomeVFSResult result,
               gpointer data)
{
  if (result != GNOME_VFS_OK) {
    printf ("Error: %s.\n",
            gnome_vfs_result_to_string
              (result));
    return;
  }
  printf ("Open: `%s'.\n",
    (char *) data);
  g_io_add_watch_full
    (channel, G_PRIORITY_HIGH,
     G_IO_IN | G_IO_NVAL | G_IO_HUP,
     io_channel_callback,
     handle, NULL);
}

void
start_cat (const char *uri)
{
  GnomeVFSAsyncHandle *handle;

  /* Start the `read' operation. */
  gnome_vfs_async_open_as_channel
    (&handle, uri, GNOME_VFS_OPEN_READ,
     BUFFER_SIZE, open_callback, "data");
}



Ettore Perazzoli 2000-04-26