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
This commit is contained in:
Colin Walters 2012-05-29 18:54:58 -04:00 committed by Matthias Clasen
parent b0d8498ee3
commit 056d39c9f7
5 changed files with 47 additions and 0 deletions

View File

@ -1225,6 +1225,7 @@ g_mapped_file_unref
g_mapped_file_free
g_mapped_file_get_length
g_mapped_file_get_contents
g_mapped_file_get_bytes
<SUBSECTION>
g_open

View File

@ -665,6 +665,7 @@ g_mapped_file_new
g_mapped_file_new_from_fd
g_mapped_file_get_length
g_mapped_file_get_contents
g_mapped_file_get_bytes
g_mapped_file_ref
g_mapped_file_unref
g_mapped_file_free

View File

@ -400,3 +400,27 @@ 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.
* The mapped contents of the file must not be modified after creating this
* bytes object, 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_val_if_fail (file != NULL, NULL);
return g_bytes_new_with_free_func (file->contents,
file->length,
(GDestroyNotify) g_mapped_file_unref,
g_mapped_file_ref (file));
}

View File

@ -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);

View File

@ -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 ();
}