Compatibility with Gnome-VFS-2.0.x - missing gnome_vfs_read_entire_file().
[captive.git] / gnome_vfs_read_entire_file.c
diff --git a/gnome_vfs_read_entire_file.c b/gnome_vfs_read_entire_file.c
new file mode 100644 (file)
index 0000000..597d459
--- /dev/null
@@ -0,0 +1,112 @@
+/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
+
+/* gnome-vfs-utils.c - Private utility functions for the GNOME Virtual
+   File System.
+   gnome_vfs_read_entire_file() extraction for Captive
+
+   Copyright (C) 1999 Free Software Foundation
+   Copyright (C) 2000, 2001 Eazel, Inc.
+
+   The Gnome Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public License as
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
+
+   The Gnome Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with the Gnome Library; see the file COPYING.LIB.  If not,
+   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.
+
+   Authors: Ettore Perazzoli <ettore@comm2000.it>
+           John Sullivan <sullivan@eazel.com> 
+            Darin Adler <darin@eazel.com>
+*/
+
+
+#include "config.h"
+
+#include <glib/gmem.h>
+#include <libgnomevfs/gnome-vfs-result.h>
+#include <libgnomevfs/gnome-vfs-handle.h>
+#include <libgnomevfs/gnome-vfs-ops.h>
+
+
+#define READ_CHUNK_SIZE 8192
+
+
+/**
+ * gnome_vfs_read_entire_file:
+ * @uri: URI of the file to read
+ * @file_size: after reading the file, contains the size of the file read
+ * @file_contents: contains the file_size bytes, the contents of the file at @uri.
+ * 
+ * Reads an entire file into memory for convenience. Beware accidentally
+ * loading large files into memory with this function.
+ *
+ * Return value: An integer representing the result of the operation
+ *
+ * Since: 2.2
+ */
+
+GnomeVFSResult
+gnome_vfs_read_entire_file (const char *uri,
+                           int *file_size,
+                           char **file_contents)
+{
+       GnomeVFSResult result;
+       GnomeVFSHandle *handle;
+       char *buffer;
+       GnomeVFSFileSize total_bytes_read;
+       GnomeVFSFileSize bytes_read;
+
+       *file_size = 0;
+       *file_contents = NULL;
+
+       /* Open the file. */
+       result = gnome_vfs_open (&handle, uri, GNOME_VFS_OPEN_READ);
+       if (result != GNOME_VFS_OK) {
+               return result;
+       }
+
+       /* Read the whole thing. */
+       buffer = NULL;
+       total_bytes_read = 0;
+       do {
+               buffer = g_realloc (buffer, total_bytes_read + READ_CHUNK_SIZE);
+               result = gnome_vfs_read (handle,
+                                        buffer + total_bytes_read,
+                                        READ_CHUNK_SIZE,
+                                        &bytes_read);
+               if (result != GNOME_VFS_OK && result != GNOME_VFS_ERROR_EOF) {
+                       g_free (buffer);
+                       gnome_vfs_close (handle);
+                       return result;
+               }
+
+               /* Check for overflow. */
+               if (total_bytes_read + bytes_read < total_bytes_read) {
+                       g_free (buffer);
+                       gnome_vfs_close (handle);
+                       return GNOME_VFS_ERROR_TOO_BIG;
+               }
+
+               total_bytes_read += bytes_read;
+       } while (result == GNOME_VFS_OK);
+
+       /* Close the file. */
+       result = gnome_vfs_close (handle);
+       if (result != GNOME_VFS_OK) {
+               g_free (buffer);
+               return result;
+       }
+
+       /* Return the file. */
+       *file_size = total_bytes_read;
+       *file_contents = g_realloc (buffer, total_bytes_read);
+       return GNOME_VFS_OK;
+}