24#include "icaldirsetimpl.h"
25#include "icalerror_p.h"
32#if defined(HAVE_DIRENT_H)
36#if defined(HAVE_SYS_UTSNAME_H)
37#include <sys/utsname.h>
43const char *icaldirset_path(icalset *set)
45 const icaldirset *dset = (icaldirset *)set;
50void icaldirset_mark(icalset *set)
52 icaldirset *dset = (icaldirset *)set;
54 icalcluster_mark(dset->cluster);
59 icaldirset *dset = (icaldirset *)set;
63 options.
cluster = dset->cluster;
67 (void)fileset->commit(fileset);
68 fileset->free(fileset);
73static void icaldirset_lock(
const char *dir)
78static void icaldirset_unlock(
const char *dir)
84static icalerrorenum icaldirset_read_directory(icaldirset *dset)
88#if defined(HAVE_DIRENT_H)
89 const struct dirent *de;
92 dp = opendir(dset->dir);
100 while ((str = icalpvl_pop(dset->directory))) {
105 for (de = readdir(dp); de != 0; de = readdir(dp)) {
107 if (strcmp(de->d_name,
".") == 0 || strcmp(de->d_name,
"..") == 0) {
111 icalpvl_push(dset->directory, (
void *)strdup(de->d_name));
116 struct _finddata_t c_file;
120 if ((hFile = _findfirst(
"*", &c_file)) == -1L) {
124 while ((str = icalpvl_pop(dset->directory))) {
131 if (strcmp(c_file.name,
".") == 0 || strcmp(c_file.name,
"..") == 0) {
135 icalpvl_push(dset->directory, (
void *)strdup(c_file.name));
136 }
while (_findnext(hFile, &c_file) == 0);
147icalset *icaldirset_init(icalset *set,
const char *dir,
void *options_in)
153 icalerror_check_arg_rz((dir != 0),
"dir");
154 icalerror_check_arg_rz((set != 0),
"set");
155 dset = (icaldirset *)set;
157 if (stat(dir, &sbuf) != 0) {
163 if (!S_ISDIR(sbuf.st_mode)) {
168 icaldirset_lock(dir);
170 dset->dir = (
char *)strdup(dir);
171 dset->options = *options;
172 dset->directory = icalpvl_newlist();
173 dset->directory_iterator = 0;
175 dset->first_component = 0;
181icalset *icaldirset_new(
const char *dir)
186icalset *icaldirset_new_reader(
const char *dir)
190 reader_options.
flags = O_RDONLY;
195icalset *icaldirset_new_writer(
const char *dir)
199 writer_options.
flags = O_RDWR | O_CREAT;
204void icaldirset_free(icalset *s)
206 icaldirset *dset = (icaldirset *)s;
209 icaldirset_unlock(dset->dir);
211 if (dset->dir != 0) {
216 if (dset->gauge != 0) {
221 if (dset->cluster != 0) {
222 icalcluster_free(dset->cluster);
225 while (dset->directory != 0 && (str = icalpvl_pop(dset->directory)) != 0) {
229 if (dset->directory != 0) {
230 icalpvl_free(dset->directory);
234 dset->directory_iterator = 0;
235 dset->first_component = 0;
238static icalerrorenum icaldirset_next_cluster(icaldirset *dset)
240 char path[MAXPATHLEN];
242 if (dset->directory_iterator == 0) {
246 dset->directory_iterator = icalpvl_next(dset->directory_iterator);
248 if (dset->directory_iterator == 0) {
250 if (dset->cluster != 0) {
251 icalcluster_free(dset->cluster);
257 snprintf(path,
sizeof(path),
"%s/%s", dset->dir, (
char *)icalpvl_data(dset->directory_iterator));
259 icalcluster_free(dset->cluster);
260 dset->cluster = icalfileset_produce_icalcluster(path);
265static void icaldirset_add_uid(icalcomponent *comp)
267 char uidstring[MAXPATHLEN] = {0};
270#if defined(HAVE_SYS_UTSNAME_H)
271 struct utsname unamebuf;
274 icalerror_check_arg_rv((comp != 0),
"comp");
279#if defined(HAVE_SYS_UTSNAME_H)
281 snprintf(uidstring,
sizeof(uidstring),
"%d-%s", (
int)getpid(), unamebuf.nodename);
284 snprintf(uidstring,
sizeof(uidstring),
"%d-%s", (
int)getpid(),
"WINDOWS");
286 uid = icalproperty_new_uid(uidstring);
289 strncpy(uidstring, icalproperty_get_uid(uid), MAXPATHLEN - 1);
295 char clustername[MAXPATHLEN] = {0};
296 icalproperty *dt = 0;
300 icalcomponent *inner;
303 icalerror_check_arg_rz((set != 0),
"set");
304 icalerror_check_arg_rz((comp != 0),
"comp");
306 dset = (icaldirset *)set;
308 icaldirset_add_uid(comp);
333 icalerror_warn(
"The component does not have a DTSTAMP or DTSTART property, "
334 "so it cannot be added to the store");
340 tm = icalvalue_get_datetime(v);
342 snprintf(clustername, MAXPATHLEN,
"%s/%04d%02d", dset->dir, tm.
year, tm.
month);
345 if (dset->cluster != 0 && strcmp(clustername, icalcluster_key(dset->cluster)) != 0) {
346 icalcluster_free(dset->cluster);
350 if (dset->cluster == 0) {
351 dset->cluster = icalfileset_produce_icalcluster(clustername);
353 if (dset->cluster == 0) {
364 (void)icalcluster_add_component(dset->cluster, comp);
374 icalcomponent *filecomp;
381 dset = (icaldirset *)set;
382 icalerror_check_arg_re((dset->cluster != 0),
"Cluster pointer",
ICAL_USAGE_ERROR);
384 filecomp = icalcluster_get_component(dset->cluster);
396 icalerror_warn(
"icaldirset_remove_component: component is not part of current cluster");
401 (void)icalcluster_remove_component(dset->cluster, comp);
410 (void)icalcluster_get_first_component(dset->cluster);
433icalcomponent *icaldirset_fetch_match(icalset *set,
const icalcomponent *c)
438 fprintf(stderr,
" icaldirset_fetch_match is not implemented\n");
443icalcomponent *icaldirset_fetch(icalset *set,
icalcomponent_kind kind,
const char *uid)
447 icalgauge *old_gauge;
453 icalerror_check_arg_rz((set != 0),
"set");
454 icalerror_check_arg_rz((uid != 0),
"uid");
456 snprintf(sql, 256,
"SELECT * FROM VEVENT WHERE UID = \"%s\"", uid);
459 dset = (icaldirset *)set;
460 old_gauge = dset->gauge;
463 c = icaldirset_get_first_component(set);
465 dset->gauge = old_gauge;
474int icaldirset_has_uid(icalset *set,
const char *uid)
476 const icalcomponent *c;
478 icalerror_check_arg_rz((set != 0),
"set");
479 icalerror_check_arg_rz((uid != 0),
"uid");
484 c = icaldirset_fetch(set, 0, uid);
489icalerrorenum icaldirset_select(icalset *set, icalgauge *gauge)
496 dset = (icaldirset *)set;
502icalerrorenum icaldirset_modify(icalset *set, icalcomponent *oldcomp, icalcomponent *newcomp)
513void icaldirset_clear(icalset *set)
521icalcomponent *icaldirset_get_current_component(icalset *set)
523 icaldirset *dset = (icaldirset *)set;
525 icalerror_check_arg_rz((dset != 0),
"dset");
527 if (dset->cluster == 0) {
528 return icaldirset_get_first_component(set);
534icalcomponent *icaldirset_get_first_component(icalset *set)
536 icaldirset *dset = (icaldirset *)set;
539 char path[MAXPATHLEN];
541 error = icaldirset_read_directory(dset);
548 dset->directory_iterator = icalpvl_head(dset->directory);
550 if (dset->directory_iterator == 0) {
555 snprintf(path, MAXPATHLEN,
"%s/%s", dset->dir, (
char *)icalpvl_data(dset->directory_iterator));
560 if (dset->cluster != 0 && strcmp(path, icalcluster_key(dset->cluster)) != 0) {
561 icalcluster_free(dset->cluster);
565 if (dset->cluster == 0) {
566 dset->cluster = icalfileset_produce_icalcluster(path);
568 if (dset->cluster == 0) {
578 dset->first_component = 1;
580 return icaldirset_get_next_component(set);
583icalcomponent *icaldirset_get_next_component(icalset *set)
589 icalerror_check_arg_rz((set != 0),
"set");
590 dset = (icaldirset *)set;
592 if (dset->cluster == 0) {
593 icalerror_warn(
"icaldirset_get_next_component called with a NULL cluster "
594 "(Caller must call icaldirset_get_first_component first)");
600 if (dset->first_component == 1) {
601 (void)icalcluster_get_first_component(dset->cluster);
602 dset->first_component = 0;
604 (void)icalcluster_get_next_component(dset->cluster);
610 c != 0; c = icalcluster_get_next_component(dset->cluster)) {
627 error = icaldirset_next_cluster(dset);
633 c = icalcluster_get_first_component(dset->cluster);
662icalcomponent *icaldirsetiter_to_next(icalset *set,
icalsetiter *i)
670icalcomponent *icaldirsetiter_to_prior(icalset *set,
icalsetiter *i)
icalcomponent * icalcluster_get_current_component(icalcluster *cluster)
Iterate through components.
icalproperty * icalcomponent_get_first_property(icalcomponent *c, icalproperty_kind kind)
icalcomponent * icalcompiter_next(icalcompiter *i)
icalcomponent * icalcomponent_get_next_component(icalcomponent *c, icalcomponent_kind kind)
icalcomponent * icalcomponent_get_first_component(icalcomponent *c, icalcomponent_kind kind)
icalcomponent * icalcompiter_deref(icalcompiter *i)
void icalcomponent_add_property(icalcomponent *component, icalproperty *property)
icalcompiter icalcomponent_begin_component(icalcomponent *component, icalcomponent_kind kind)
icalerrorenum icaldirset_add_component(icalset *set, icalcomponent *comp)
icalerrorenum icaldirset_remove_component(icalset *set, icalcomponent *comp)
Manages a database of ical components and offers interfaces for reading, writing and searching for co...
void icalerror_set_errno(icalerrorenum x)
Sets the icalerrno to a given error.
icalerrorenum
Represents the different types of errors that can be triggered in libical.
#define icalerrno
Access the current icalerrno value.
icalfileset_options icalfileset_options_default
Manages a database of ical components and offers interfaces for reading, writing and searching for co...
bool icalgauge_compare(icalgauge *gauge, icalcomponent *comp)
void icalgauge_free(icalgauge *gauge)
icalgauge * icalgauge_new_from_sql(const char *sql, int expand)
icalvalue * icalproperty_get_value(const icalproperty *prop)
icalsetiter icalsetiter_null
icalset * icalset_new(icalset_kind kind, const char *dsn, void *options)
Options for opening an icalfileset.