aboutsummaryrefslogtreecommitdiff
path: root/module/vcomponent/formats/vdir/save-delete.scm
diff options
context:
space:
mode:
Diffstat (limited to 'module/vcomponent/formats/vdir/save-delete.scm')
-rw-r--r--module/vcomponent/formats/vdir/save-delete.scm40
1 files changed, 40 insertions, 0 deletions
diff --git a/module/vcomponent/formats/vdir/save-delete.scm b/module/vcomponent/formats/vdir/save-delete.scm
new file mode 100644
index 00000000..1c70dabf
--- /dev/null
+++ b/module/vcomponent/formats/vdir/save-delete.scm
@@ -0,0 +1,40 @@
+;;; Commentary:
+;;; Module for writing components to the vdir storage format.
+;;; Currently also has some cases for "big" icalendar files,
+;;; but those are currently unsupported.
+
+;;; TODO generalize save-event and remove-event into a general interface,
+;;; which different database backends can implement. Actually, do that for all
+;;; loading and writing.
+
+;;; Code:
+
+(define-module (vcomponent formats vdir save-delete)
+ :use-module (calp util)
+ :use-module ((calp util exceptions) :select (assert))
+ :use-module (vcomponent formats ical output)
+ :use-module (vcomponent)
+ :use-module ((calp util io) :select (with-atomic-output-to-file))
+ )
+
+
+(define-public (save-event event)
+ (define calendar (parent event))
+
+ (assert (eq? 'vdir (prop calendar '-X-HNH-SOURCETYPE)))
+
+ (let* ((uid (or (prop event 'UID) (uuidgen))))
+ (set! (prop event 'UID) uid
+ ;; TODO use existing filename if present?
+ (prop event '-X-HNH-FILENAME) (path-append
+ (prop calendar '-X-HNH-DIRECTORY)
+ (string-append uid ".ics")))
+ (with-atomic-output-to-file (prop event '-X-HNH-FILENAME)
+ (lambda () (print-components-with-fake-parent (list event))))
+ uid))
+
+
+(define-public (remove-event event)
+ (define calendar (parent event))
+ (assert (eq? 'vdir (prop calendar '-X-HNH-SOURCETYPE)))
+ (delete-file (prop event '-X-HNH-FILENAME)))