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>
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)
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);
153 icalerror_check_arg_rz((dir != 0),
"dir");
154 icalerror_check_arg_rz((set != 0),
"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;
190 reader_options.
flags = O_RDONLY;
199 writer_options.
flags = O_RDWR | O_CREAT;
209 icaldirset_unlock(dset->dir);
211 if (dset->dir != 0) {
216 if (dset->gauge != 0) {
221 if (dset->cluster != 0) {
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;
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) {
257 snprintf(path,
sizeof(path),
"%s/%s", dset->dir, (
char *)icalpvl_data(dset->directory_iterator));
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");
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");
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");
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) {
350 if (dset->cluster == 0) {
353 if (dset->cluster == 0) {
374 icalcomponent *filecomp;
382 icalerror_check_arg_re((dset->cluster != 0),
"Cluster pointer",
ICAL_USAGE_ERROR);
396 icalerror_warn(
"icaldirset_remove_component: component is not part of current cluster");
438 fprintf(stderr,
" icaldirset_fetch_match is not implemented\n");
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);
460 old_gauge = dset->gauge;
465 dset->gauge = old_gauge;
476 const icalcomponent *c;
478 icalerror_check_arg_rz((set != 0),
"set");
479 icalerror_check_arg_rz((uid != 0),
"uid");
525 icalerror_check_arg_rz((dset != 0),
"dset");
527 if (dset->cluster == 0) {
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) {
565 if (dset->cluster == 0) {
568 if (dset->cluster == 0) {
578 dset->first_component = 1;
589 icalerror_check_arg_rz((set != 0),
"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) {
602 dset->first_component = 0;
627 error = icaldirset_next_cluster(dset);
icalcomponent * icalcluster_get_current_component(icalcluster *cluster)
Iterate through components.
int icalcluster_count_components(icalcluster *cluster, icalcomponent_kind kind)
const char * icalcluster_key(const icalcluster *cluster)
icalerrorenum icalcluster_add_component(icalcluster *cluster, icalcomponent *child)
icalcomponent * icalcluster_get_component(const icalcluster *cluster)
icalcomponent * icalcluster_get_next_component(icalcluster *cluster)
void icalcluster_free(icalcluster *cluster)
icalerrorenum icalcluster_remove_component(icalcluster *cluster, icalcomponent *child)
void icalcluster_mark(icalcluster *cluster)
icalcomponent * icalcluster_get_first_component(icalcluster *cluster)
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)
const char * icalproperty_get_uid(const icalproperty *prop)
icalproperty * icalproperty_new_uid(const char *v)
struct icaltimetype icalvalue_get_datetime(const icalvalue *value)
struct icalvalue_impl icalvalue
icalerrorenum icaldirset_add_component(icalset *set, icalcomponent *comp)
icalsetiter icaldirset_begin_component(icalset *set, icalcomponent_kind kind, icalgauge *gauge, const char *tzid)
icalcomponent * icaldirset_fetch(icalset *set, icalcomponent_kind kind, const char *uid)
icalset * icaldirset_init(icalset *set, const char *dir, void *options_in)
icalcomponent * icaldirset_get_current_component(icalset *set)
int icaldirset_has_uid(icalset *set, const char *uid)
icalset * icaldirset_new_reader(const char *dir)
icalerrorenum icaldirset_commit(icalset *set)
void icaldirset_clear(icalset *set)
icalerrorenum icaldirset_modify(icalset *set, icalcomponent *oldcomp, icalcomponent *newcomp)
icalcomponent * icaldirset_fetch_match(icalset *set, const icalcomponent *c)
icalcomponent * icaldirset_get_next_component(icalset *set)
const char * icaldirset_path(icalset *set)
void icaldirset_mark(icalset *set)
icalerrorenum icaldirset_remove_component(icalset *set, icalcomponent *comp)
icalset * icaldirset_new(const char *dir)
icalset * icaldirset_new_writer(const char *dir)
icalerrorenum icaldirset_select(icalset *set, icalgauge *gauge)
icalcomponent * icaldirset_get_first_component(icalset *set)
icalcomponent * icaldirsetiter_to_next(icalset *set, icalsetiter *i)
icalcomponent * icaldirsetiter_to_prior(icalset *set, icalsetiter *i)
void icaldirset_free(icalset *s)
int icaldirset_count_components(icalset *store, icalcomponent_kind kind)
Manages a database of ical components and offers interfaces for reading, writing and searching for co...
struct icaldirset_impl icaldirset
enum icalrequeststatus kind
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.
icalcluster * icalfileset_produce_icalcluster(const char *path)
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.