Initial basic static delta code drop
This has a very basic level of functionality (deltas can be generated, and applied offline). There is only some stubbed out pull code to fetch them via HTTP. But, better to commit this now and improve it from a known starting point, rather than have it languish in a branch.
This commit is contained in:
1 parent
844c5ea652
commit
2d6374822b
24 files changed
+1890
-43
No files matched your search
@@ -23,8 +23,10 @@
|
||||
#include "config.h"
|
||||
|
||||
#include <gio/gio.h>
|
||||
#include <gio/gfiledescriptorbased.h>
|
||||
|
||||
#include <string.h>
|
||||
#include <sys/mman.h>
|
||||
|
||||
#include "otutil.h"
|
||||
|
||||
@@ -149,6 +151,55 @@ ot_util_variant_map (GFile *src,
|
||||
return ret;
|
||||
}
|
||||
|
||||
typedef struct {
|
||||
gpointer addr;
|
||||
gsize len;
|
||||
} VariantMapData;
|
||||
|
||||
static void
|
||||
variant_map_data_destroy (gpointer data)
|
||||
{
|
||||
VariantMapData *mdata = data;
|
||||
(void) munmap (mdata->addr, mdata->len);
|
||||
}
|
||||
|
||||
gboolean
|
||||
ot_util_variant_map_fd (GFileDescriptorBased *stream,
|
||||
goffset start,
|
||||
const GVariantType *type,
|
||||
gboolean trusted,
|
||||
GVariant **out_variant,
|
||||
GError **error)
|
||||
{
|
||||
gboolean ret = FALSE;
|
||||
gpointer map;
|
||||
struct stat stbuf;
|
||||
VariantMapData *mdata = NULL;
|
||||
gsize len;
|
||||
|
||||
if (!gs_stream_fstat (stream, &stbuf, NULL, error))
|
||||
goto out;
|
||||
|
||||
len = stbuf.st_size - start;
|
||||
map = mmap (NULL, len, PROT_READ, MAP_PRIVATE,
|
||||
g_file_descriptor_based_get_fd (stream), start);
|
||||
if (!map)
|
||||
{
|
||||
ot_util_set_error_from_errno (error, errno);
|
||||
goto out;
|
||||
}
|
||||
|
||||
mdata = g_new (VariantMapData, 1);
|
||||
mdata->addr = map;
|
||||
mdata->len = len;
|
||||
|
||||
ret = TRUE;
|
||||
*out_variant = g_variant_new_from_data (type, map, len, trusted,
|
||||
variant_map_data_destroy, mdata);
|
||||
out:
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* Read all input from @src, allocating a new #GVariant from it into
|
||||
* output variable @out_variant. @src will be closed as a result.
|
||||
@@ -219,3 +270,17 @@ ot_util_variant_builder_from_variant (GVariant *variant,
|
||||
return builder;
|
||||
}
|
||||
|
||||
GVariant *
|
||||
ot_variant_new_from_bytes (const GVariantType *type,
|
||||
GBytes *bytes,
|
||||
gboolean trusted)
|
||||
{
|
||||
#if GLIB_VERSION_MIN_REQUIRED >= GLIB_VERSION_2_36
|
||||
return g_variant_new_from_bytes (type, bytes, trusted);
|
||||
#else
|
||||
gsize size;
|
||||
gconstpointer data = g_bytes_get_data (bytes, &size);
|
||||
return g_variant_new_from_data (type, data, size, trusted,
|
||||
(GDestroyNotify)g_bytes_unref, bytes);
|
||||
#endif
|
||||
}
|
||||
@@ -46,6 +46,13 @@ gboolean ot_util_variant_map (GFile *src,
|
||||
GVariant **out_variant,
|
||||
GError **error);
|
||||
|
||||
gboolean ot_util_variant_map_fd (GFileDescriptorBased *stream,
|
||||
goffset offset,
|
||||
const GVariantType *type,
|
||||
gboolean trusted,
|
||||
GVariant **out_variant,
|
||||
GError **error);
|
||||
|
||||
gboolean ot_util_variant_from_stream (GInputStream *src,
|
||||
const GVariantType *type,
|
||||
gboolean trusted,
|
||||
@@ -58,5 +65,10 @@ GInputStream *ot_variant_read (GVariant *variant);
|
||||
GVariantBuilder *ot_util_variant_builder_from_variant (GVariant *variant,
|
||||
const GVariantType *type);
|
||||
|
||||
GVariant *
|
||||
ot_variant_new_from_bytes (const GVariantType *type,
|
||||
GBytes *bytes,
|
||||
gboolean trusted);
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
Reference in new issue
Block a user