remibd pushed a commit to branch master in repository gnunet. commit cb2028f885fe06d18cc531502281842519320ab5 Author: Rémi Birot-Delrue <asg...@free.fr> Date: Thu Aug 6 16:44:52 2015 +0200
Complete the container/metadata bindings. --- gnu/gnunet/container/metadata.scm | 68 +++++++++++++++++++++++++++++++++---- 1 files changed, 61 insertions(+), 7 deletions(-) diff --git a/gnu/gnunet/container/metadata.scm b/gnu/gnunet/container/metadata.scm index 8ea34ba..e9a31e5 100644 --- a/gnu/gnunet/container/metadata.scm +++ b/gnu/gnunet/container/metadata.scm @@ -43,7 +43,13 @@ metadata-set! metadata-ref metadata-iterate - metadata-map)) + metadata-map + + metadata-copy + metadata-equal? + metadata-clear! + metadata-add-publication-date! + )) (define-record-type <metadata> @@ -68,7 +74,8 @@ #:unknown))) (define metadata-type-alist - '((#:unknown . 45) + '((#:publication-date . 24) + (#:unknown . 45) (#:original-filename . 180))) (define (metadata-type->integer type) @@ -83,6 +90,9 @@ (define-gnunet %metadata-create "GNUNET_CONTAINER_meta_data_create" : '() -> '*) +(define-gnunet %metadata-duplicate + "GNUNET_CONTAINER_meta_data_duplicate" : '(*) -> '*) + (define %metadata-destroy (dynamic-func "GNUNET_CONTAINER_meta_data_destroy" gnunet-util-ffi)) @@ -90,11 +100,26 @@ "GNUNET_CONTAINER_meta_data_insert" : (list '* '* unsigned-int unsigned-int '* '* size_t) -> int) -(define-gnunet %metadata-get-by-type - "GNUNET_CONTAINER_meta_data_get_by_type" : (list '* unsigned-int) -> '*) +(define-gnunet %metadata-test-equal + "GNUNET_CONTAINER_meta_data_test_equal" : '(* *) -> int) + +(define-gnunet %metadata-merge + "GNUNET_CONTAINER_meta_data_merge" : '(* *) -> void) + +(define-gnunet %metadata-delete + "GNUNET_CONTAINER_meta_data_delete" : (list '* unsigned-int '* size_t) -> int) + +(define-gnunet %metadata-clear + "GNUNET_CONTAINER_meta_data_clear" : '(*) -> void) + +(define-gnunet %metadata-add-publication-date + "GNUNET_CONTAINER_meta_data_add_publication_date" : '(*) -> void) (define-gnunet %metadata-iterate - "GNUNET_CONTAINER_meta_data_iterate" : (list '* '* '*) -> int) + "GNUNET_CONTAINER_meta_data_iterate" : '(* * *) -> int) + +(define-gnunet %metadata-get-by-type + "GNUNET_CONTAINER_meta_data_get_by_type" : (list '* unsigned-int) -> '*) (define* (wrap-metadata pointer #:key (finalize #f)) @@ -102,8 +127,8 @@ (set-pointer-finalizer! pointer %metadata-destroy)) (%wrap-metadata pointer)) -(define (make-metadata) - (wrap-metadata (%metadata-create))) +(define* (make-metadata #:key (finalize #t)) + (wrap-metadata (%metadata-create) #:finalize finalize)) (define-record-type <metadata-item> (make-metadata-item name type format mime-type data) @@ -161,3 +186,32 @@ where plugin-name is a string, 0) metadata) (reverse result))) + +;;; utility functions + +(define* (metadata-copy meta #:key (finalize #t)) + "Return a newly created copy of META." + (let ((ptr (%metadata-duplicate (unwrap-metadata meta)))) + (when (eq? %null-pointer ptr) + (throw 'invalid-result "metadata-copy" "%metadata-duplicate" %null-pointer)) + (wrap-metadata ptr #:finalize finalize))) + +(define (metadata-equal? m n) + "Test if to metadata are equal: two metadata are considered equal if the +meta-types, formats and content match (mime-types and plugin names aren’t +considered)." + (int->bool (%metadata-test-equal (unwrap-metadata m) (unwrap-metadata n)))) + +;;+TODO: metadata-merge + +;;+TODO: metadata-delete + +(define (metadata-clear! m) + "Remove all items in the metadata." + (%metadata-clear (unwrap-metadata m))) + +(define (metadata-add-publication-date! m) + "Add the current time as the publication date to the metadata." + (%metadata-add-publication-date (unwrap-metadata m))) + +