agendafs
A filesystem for your calendar.
git clone git://mccd.space/agendafscommit 1d886e40816b1f8ecc36a708a03469a5d41bf95f
parent c1dcdcd95e6dc9f86520e18e2ff5d83be9de958e
Author: Marc Coquand <marc@coquand.email>
Date: Mon, 28 Jul 2025 17:06:01 +0200
Handle explicitly unset filenames
Diffstat:
2 files changed, 46 insertions(+), 9 deletions(-)
diff --git a/fuse_node.c b/fuse_node.c
@@ -209,9 +209,11 @@ parse_ics_to_agenda_entry(memory_region *mreg, const char *vdir_filepath)
filename = rstrdup(mreg, summary);
}
else {
+ LOG("GETTING FILE EXT");
const char *extension =
icalcomponent_get_file_extension(component);
if (!extension) {
+ LOG("Has none, setting to default");
extension = get_default_file_extension();
}
diff --git a/ical_extra.c b/ical_extra.c
@@ -1,5 +1,7 @@
+#include "ical_extra.h"
#include "libical/ical.h"
#include "mregion.h"
+#include "path.h"
#include "sys/stat.h"
#include "uuid/uuid.h"
#include <stdbool.h>
@@ -22,6 +24,7 @@ icalcomponent_get_uniq_x_value(icalcomponent *component, const char *key)
const char *prop_name = icalproperty_get_x_name(prop);
if (prop_name && strcmp(prop_name, key) == 0) {
+ LOG("FOUND PROP %s", key);
return icalproperty_get_value_as_string(prop);
}
}
@@ -202,7 +205,17 @@ create_vjournal_entry(memory_region *mreg, const char *summary)
icalcomponent_add_property(
journal, icalproperty_new_dtstamp(icaltime_current_time_with_zone(
icaltimezone_get_utc_timezone())));
- icalcomponent_add_property(journal, icalproperty_new_summary(summary));
+ char *file_extension = get_file_extension(mreg, summary);
+ if (!file_extension) {
+ file_extension = "";
+ }
+
+ char *without_extension = without_file_extension(mreg, summary);
+
+ icalcomponent_add_property(journal,
+ icalproperty_new_summary(without_extension));
+ icalcomponent_set_file_extension(journal, file_extension);
+
icalcomponent_add_property(journal, icalproperty_new_description(""));
icalcomponent_add_component(calendar, journal);
@@ -289,11 +302,22 @@ icalcomponent_insert_description(memory_region *mreg, icalcomponent *ic,
icalcomponent_set_description(ic, new_desc);
}
+icalcomponent *
+icalcomponent_get_innermost(icalcomponent *c)
+{
+ icalcomponent *inner =
+ icalcomponent_get_first_component(c, ICAL_ANY_COMPONENT);
+
+ if (!inner) {
+ inner = c;
+ }
+ return inner;
+}
+
void
icalcomponent_remove_x_prop(icalcomponent *component, const char *key)
{
- icalcomponent *inner =
- icalcomponent_get_first_component(component, ICAL_ANY_COMPONENT);
+ icalcomponent *inner = icalcomponent_get_innermost(component);
assert(inner);
icalproperty *prop_iter =
@@ -316,8 +340,7 @@ icalcomponent_set_unique_x_value(icalcomponent *component, const char *key,
const char *value)
{
icalcomponent_remove_x_prop(component, key);
- icalcomponent *inner =
- icalcomponent_get_first_component(component, ICAL_ANY_COMPONENT);
+ icalcomponent *inner = icalcomponent_get_innermost(component);
assert(inner);
icalproperty *fileext_prop = icalproperty_new_x(key);
@@ -328,21 +351,33 @@ icalcomponent_set_unique_x_value(icalcomponent *component, const char *key,
icalcomponent_add_property(inner, fileext_prop);
}
+// Since empty values are considered null, we store a disallowed extension (..)
+// to indicate that the system has explicitly not set an extension.
void
icalcomponent_set_file_extension(icalcomponent *component,
const char *extension)
{
- icalcomponent_set_unique_x_value(component, FILE_EXTENSION_PROPERTY,
- extension);
+ if (strcmp(extension, "") == 0) {
+ icalcomponent_set_unique_x_value(component,
+ FILE_EXTENSION_PROPERTY, ".");
+ }
+ else {
+ icalcomponent_set_unique_x_value(
+ component, FILE_EXTENSION_PROPERTY, extension);
+ }
LOG("Set X-CALDAVFS-FILEEXT to '%s' on component.", extension);
}
const char *
icalcomponent_get_file_extension(icalcomponent *component)
{
- return icalcomponent_get_uniq_x_value(component,
- FILE_EXTENSION_PROPERTY);
+ const char *ext =
+ icalcomponent_get_uniq_x_value(component, FILE_EXTENSION_PROPERTY);
+
+ if (ext && strcmp(ext, ".") == 0)
+ return "";
+ return ext;
}
void