[glib/wip/gbytes-takeover: 3/3] GMappedFile: Add g_mapped_file_get_bytes()
- From: Colin Walters <walters src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [glib/wip/gbytes-takeover: 3/3] GMappedFile: Add g_mapped_file_get_bytes()
- Date: Tue, 29 May 2012 23:21:34 +0000 (UTC)
commit 2e4e5c9ce1aa0140af96574d6218703302e18b0c
Author: Colin Walters <walters verbum org>
Date: Tue May 29 18:54:58 2012 -0400
GMappedFile: Add g_mapped_file_get_bytes()
This is yet another API that has a data/length/refcount combination
that one might often want to turn into a GBytes.
https://bugzilla.gnome.org/show_bug.cgi?id=677065
glib/gmappedfile.c | 22 ++++++++++++++++++++++
glib/gmappedfile.h | 2 ++
glib/tests/mappedfile.c | 19 +++++++++++++++++++
3 files changed, 43 insertions(+), 0 deletions(-)
---
diff --git a/glib/gmappedfile.c b/glib/gmappedfile.c
index b541870..3386d19 100644
--- a/glib/gmappedfile.c
+++ b/glib/gmappedfile.c
@@ -400,3 +400,25 @@ g_mapped_file_unref (GMappedFile *file)
if (g_atomic_int_dec_and_test (&file->ref_count))
g_mapped_file_destroy (file);
}
+
+/**
+ * g_mapped_file_get_bytes:
+ * @file: a #GMappedFile
+ *
+ * Creates a new #GBytes which references the data mapped from @file.
+ * It is invalid to use this function if @file is mapped writable,
+ * because a #GBytes should be immutable.
+ *
+ * Returns: (transfer full): A newly allocated #GBytes referencing data from @file
+ * Since: 2.34
+ **/
+GBytes *
+g_mapped_file_get_bytes (GMappedFile *file)
+{
+ g_return_if_fail (file != NULL);
+
+ return g_bytes_new_with_free_func (file->contents,
+ file->length,
+ (GDestroyNotify) g_mapped_file_unref,
+ g_mapped_file_ref (file));
+}
diff --git a/glib/gmappedfile.h b/glib/gmappedfile.h
index 52ba31d..cf122e4 100644
--- a/glib/gmappedfile.h
+++ b/glib/gmappedfile.h
@@ -41,6 +41,8 @@ GMappedFile *g_mapped_file_new_from_fd (gint fd,
GError **error) G_GNUC_MALLOC;
gsize g_mapped_file_get_length (GMappedFile *file);
gchar *g_mapped_file_get_contents (GMappedFile *file);
+GLIB_AVAILABLE_IN_2_34
+GBytes * g_mapped_file_get_bytes (GMappedFile *file);
GMappedFile *g_mapped_file_ref (GMappedFile *file);
void g_mapped_file_unref (GMappedFile *file);
diff --git a/glib/tests/mappedfile.c b/glib/tests/mappedfile.c
index 5387a64..f61f44e 100644
--- a/glib/tests/mappedfile.c
+++ b/glib/tests/mappedfile.c
@@ -147,6 +147,24 @@ test_writable_fd (void)
}
+static void
+test_gbytes (void)
+{
+ GMappedFile *file;
+ GBytes *bytes;
+ GError *error;
+
+ error = NULL;
+ file = g_mapped_file_new (SRCDIR "/empty", FALSE, &error);
+ g_assert_no_error (error);
+
+ bytes = g_mapped_file_get_bytes (file);
+ g_mapped_file_unref (file);
+
+ g_assert_cmpint (g_bytes_get_size (bytes), ==, 0);
+ g_bytes_unref (bytes);
+}
+
int
main (int argc, char *argv[])
{
@@ -158,6 +176,7 @@ main (int argc, char *argv[])
g_test_add_func ("/mappedfile/nonexisting", test_nonexisting);
g_test_add_func ("/mappedfile/writable", test_writable);
g_test_add_func ("/mappedfile/writable_fd", test_writable_fd);
+ g_test_add_func ("/mappedfile/gbytes", test_gbytes);
return g_test_run ();
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]