[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[gnunet-scheme] 26/324: Port meta-data-serialize/uncached
From: |
gnunet |
Subject: |
[gnunet-scheme] 26/324: Port meta-data-serialize/uncached |
Date: |
Tue, 21 Sep 2021 13:21:06 +0200 |
This is an automated email from the git hooks/post-receive script.
maxime-devos pushed a commit to branch master
in repository gnunet-scheme.
commit 63a197d251349b46437c626c621a414ff6a1557a
Author: Maxime Devos <maximedevos@telenet.be>
AuthorDate: Wed Nov 11 21:07:19 2020 +0100
Port meta-data-serialize/uncached
---
gnu/gnunet/metadata.scm | 179 +++++++++++++++++++++++++++++++++++++++++++++++-
1 file changed, 177 insertions(+), 2 deletions(-)
diff --git a/gnu/gnunet/metadata.scm b/gnu/gnunet/metadata.scm
index 7d0c3d7..2152c71 100644
--- a/gnu/gnunet/metadata.scm
+++ b/gnu/gnunet/metadata.scm
@@ -429,5 +429,180 @@ TODO: perhaps a variant raising conditions may be more
informative."
entry-data-length))))
(loop-metadata (+ i 1)
new-md
- left))))))
-
+ left)))))
+
+ (define (break)
+ "This state seems rather suspicious, but not necessarily incorrect."
+ #f)
+
+ (define-syntax ==>
+ (syntax-rules ()
+ ((_ P Q)
+ (if P
+ Q
+ #t))))
+
+ (define (meta-data-serialize/uncached meta-data options)
+ ;; TODO: serialisation cache
+ "Serialize @var{meta-data} into a fresh bytevector
+
+Return the number of bytes written on success,
+or @code{#f} on error. (FIXME: raise a condition instead)
+
+@var{meta-data} <meta-data> to serialize
+@var{options}: TODO (which compression method to use, is a subset
+of the metadata acceptable)"
+ (let^ ((! size
+ (vector-fold
+ (lambda (m)
+ (+ sizeof-MetaDataEntry
+ (meta-item-data-size m)
+ ;; Is ASCII, therefore
+ ;; string length and
+ ;; byte length
+ ;; coincide.
+ (or (string-length
+ (meta-item-plugin-name m))
+ 0)
+ (or (string-length
+ (meta-item-mime-type m))
+ 0)))
+ 0
+ (meta-data-items meta-data)))
+ (? (>= size GNUNET_MAX_MALLOC_CHECKED)
+ ;; too large to be processed by upstream
+ #f)
+ (! ent-bv (make-bytevector size))
+ (! mdata-offset
+ (* sizeof-MetaDataEntry
+ (meta-data-item-count meta-data)))
+ (_ (let^ ((/o/ meta-item-loop
+ (i 0)
+ (off (- size
+ (* sizeof-MetaDataEntry
+ (meta-data-item-count meta-data)))))
+ (? (>= i (meta-data-item-count meta-data))
+ (assert (= 0 off))
+ 'done)
+ (! item (vector-ref (meta-data-items meta-data) i))
+ (! ent-offset (* i sizeof-MetaDataEntry))
+ (_ (set-MetaDataEntry.type!
+ ent-bv
+ ent-offset
+ (meta-item-type item)))
+ (_ (set-MetaDataEntry.format!
+ ent-bv
+ ent-offset
+ (meta-item-format item)))
+ (_ (set-MetaDataEntry.data-size!
+ ent-bv
+ ent-offset
+ (meta-item-data-size item)))
+ (! pname (meta-item-plugin-name item))
+ (! mime (meta-item-mime-type item))
+ (! plugin-bv (and pname (string->utf8 pname)))
+ (! mime-bv (and mime (string->utf8 mime)))
+ ;; Add 1 byte for terminating \0.
+ (_ (set-MetaDataEntry.plugin-name-length
+ ent-bv
+ ent-offset
+ (if plugin-bv
+ (+ 1 (bytevector-length plugin-bv))
+ 0)))
+ (_ (set-MetaDataEntry.mime-type-length
+ ent-bv
+ ent-offset
+ (if mime-bv
+ (+ 1 (bytevector-length mime-bv))
+ 0)))
+ (! off (- off (meta-item-data-size item)))
+ ;; Check for \0 bytes
+ ;; TODO: perform this check elsewhere
+ ;; TODO: check all bytes
+ (? (not (==> (member (meta-item-format item)
+ `(,METAFORMAT_C_STRING
+ ,METAFORMAT_UTF8))
+ (= (bytevector-u8-ref
+ (%meta-item-data item)
+ (bytevector-length
+ (%meta-item-data item)))
+ 0)))
+ (break))
+ (_ (bytevector-copy!
+ (%meta-item-data item)
+ 0
+ ent-bv
+ (+ mdata-offset off)
+ (meta-item-data-size item)))
+ ;; Copy mime type, plugin name
+ ;; and add a terminating \0 byte.
+ (! off (- off (if plugin-bv
+ (+ 1 (bytevector-length plugin-bv))
+ 0)))
+ (_ (when plugin-bv
+ (bytevector-copy!
+ plugin-bv 0
+ ent-bv (+ mdata-offset off)
+ (bytevector-length plugin-bv))
+ (bytevector-u8-set!
+ ent-bv
+ (+ mdata-offset off
+ (bytevector-length plugin-bv))
+ 0)))
+ (! off (- off
+ (if mime-bv
+ (+ 1 (bytevector-length mime-bv))
+ 0)))
+ (_ (when mime-bv
+ (bytevector-copy!
+ mime-bv 0
+ ent-bv (+ mdata-offset off)
+ (bytevector-length mime-bv))
+ (bytevector-u8-set!
+ ent-bv
+ (+ mdata-offset off
+ (bytevector-length mime-bv))
+ 0))))
+ (meta-item-loop
+ (+ 1 i)
+ off)))
+ ;; Don't include upstream loop #2, it is a loop
+ ;; for throwing away meta data until
+ ;; everything fits in the buffer ... which doesn't
+ ;; have a use (yet).
+ (! i 0)
+ (? (>= i (meta-data-item-count meta-data))
+ ;; No meta data, only write header
+ (let^ ((! result-bv (make-bytevector sizeof-MetaDataHeader))
+ (_ (set-MetaDataHeader.version! result-bv 0 2))
+ (_ (set-MetaDataHeader.entries! result-bv 0 0))
+ (_ (set-MetaDataHeader.size! result-bv 0 0)))
+ result-bv))
+ (! left size)
+ (! ent-offset
+ (+ (* i sizeof-MetaDataEntry)))
+ ;; TODO in upstream, it is possible to request
+ ;; no compression
+ (! cdata (try-compression ent-bv ent-offset left))
+ (! maybe-compressed-length
+ (if cdata
+ (bytevector-length cdata)
+ left))
+ (! hdr (make-bytevector (+ sizeof-MetaDataHeader
+ maybe-compessed-length)))
+ ;; TODO proper #f or condition on overflow
+ (_ (set-MetaDataHeader.size! hdr 0 left))
+ (_ (set-MetaDataHeader.entries!
+ hdr 0 (meta-data-item-count meta-data)))
+ (!! (==> cdata (< (bytevector-length cdata) left)))
+ (_ (set-MetaDataHeader.version! hdr 0
+ (bitwise-ior
+ 2
+ (if cdata
+ HEADER_COMPRESSED
+ 0))))
+ (_ (bytevector-copy! (or cdata ent-bv)
+ (if cdata 0 ent-offset)
+ hdr sizeof-MetaDataHeader
+ maybe-compressed-length)))
+ hdr)))
--
To stop receiving notification emails like this one, please contact
gnunet@gnunet.org.
- [gnunet-scheme] 19/324: Define a few missing functions, (continued)
- [gnunet-scheme] 19/324: Define a few missing functions, gnunet, 2021/09/21
- [gnunet-scheme] 27/324: Define bytevector slices, gnunet, 2021/09/21
- [gnunet-scheme] 09/324: Fix libextractor imports, gnunet, 2021/09/21
- [gnunet-scheme] 11/324: Fix some imports and exports, gnunet, 2021/09/21
- [gnunet-scheme] 17/324: Fix libextractor imports, gnunet, 2021/09/21
- [gnunet-scheme] 20/324: Define missing constants, gnunet, 2021/09/21
- [gnunet-scheme] 23/324: Correct variable reference, gnunet, 2021/09/21
- [gnunet-scheme] 24/324: Regularise naming convention, gnunet, 2021/09/21
- [gnunet-scheme] 25/324: Extend let^, gnunet, 2021/09/21
- [gnunet-scheme] 30/324: Correct maximum in metaformats.scm and metatypes.scm, gnunet, 2021/09/21
- [gnunet-scheme] 26/324: Port meta-data-serialize/uncached,
gnunet <=
- [gnunet-scheme] 29/324: Define meta data structures systematically, gnunet, 2021/09/21
- [gnunet-scheme] 31/324: fix netstruct, and implement wrap-reader-setter, gnunet, 2021/09/21
- [gnunet-scheme] 28/324: Define library for structures, gnunet, 2021/09/21
- [gnunet-scheme] 34/324: scripts: add incomplete script for publishing a store item, gnunet, 2021/09/21
- [gnunet-scheme] 33/324: include some notes on reverse-engineering GNUdirs, gnunet, 2021/09/21
- [gnunet-scheme] 36/324: scripts: publish-store: eliminate add-name, gnunet, 2021/09/21
- [gnunet-scheme] 32/324: remove some uses of old accessors, gnunet, 2021/09/21
- [gnunet-scheme] 41/324: scripts: publish-store: fix predicate of --format option, gnunet, 2021/09/21
- [gnunet-scheme] 38/324: scripts: publish-store: publish whole trees, gnunet, 2021/09/21
- [gnunet-scheme] 37/324: scripts: publish-store: publish individual files, gnunet, 2021/09/21