mirror of
https://gitlab.gnome.org/GNOME/glib.git
synced 2025-09-28 01:57:14 +02:00
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:
@@ -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));
|
||||
}
|
||||
|
@@ -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);
|
||||
|
||||
|
@@ -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 ();
|
||||
}
|
||||
|
Reference in New Issue
Block a user