31#include "icaldirsetimpl.h"
32#include "icalerror_p.h"
34#include "icalfilesetimpl.h"
38#include "icalbdbsetimpl.h"
45#if defined(_DLOPEN_TEST)
51static icalset icalset_dirset_init = {
62 icaldirset_count_components,
66 icaldirset_fetch_match,
69 icaldirset_get_current_component,
70 icaldirset_get_first_component,
71 icaldirset_get_next_component,
72 icaldirset_begin_component,
73 icaldirsetiter_to_next,
74 icaldirsetiter_to_prior};
76static icalset icalset_fileset_init = {
85 icalfileset_add_component,
86 icalfileset_remove_component,
87 icalfileset_count_components,
91 icalfileset_fetch_match,
94 icalfileset_get_current_component,
95 icalfileset_get_first_component,
96 icalfileset_get_next_component,
97 icalfileset_begin_component,
98 icalfilesetiter_to_next,
102static icalset icalset_bdbset_init = {
111 icalbdbset_add_component,
112 icalbdbset_remove_component,
113 icalbdbset_count_components,
117 icalbdbset_fetch_match,
121 icalbdbset_get_first_component,
122 icalbdbset_get_next_component,
123 icalbdbset_begin_component,
124 icalbdbsetiter_to_next,
128#if defined(_DLOPEN_TEST)
129static int icalset_init_done = 0;
130static icalpvl_list icalset_kinds = 0;
132typedef icalset *(*fptr)(void);
137static bool load(
const char *file)
142 icalset *icalset_init_ptr;
144 if ((modh = dlopen(file, RTLD_NOW)) == 0) {
150 inith = (fptr)dlsym(modh,
"InitModule");
153 fprintf(stderr,
"dlsym error: %s\n", dlerr);
158 while ((icalset_init_ptr = ((inith)())) != 0) {
159 icalpvl_push(icalset_kinds, &icalset_init_ptr);
167static void icalset_init(
void)
169 assert(icalset_kinds == 0);
170 icalset_kinds = icalpvl_newlist();
172 icalpvl_push(icalset_kinds, &icalset_fileset_init);
173 icalpvl_push(icalset_kinds, &icalset_dirset_init);
175 icalpvl_push(icalset_kinds, &icalset_bdb4set_init);
183 if (!icalset_init_done) {
187 icalpvl_push(icalset_kinds, set);
195 icalset *data = NULL;
198#if defined(_DLOPEN_TEST)
202 if (!icalset_init_done) {
206 for (e = icalpvl_head(icalset_kinds); e != 0; e = icalpvl_next(e)) {
207 impl = (icalset *)icalpvl_data(e);
208 if (impl->kind == kind) {
217 data = (icalset *)malloc(impl->size);
218 if (data == (icalset *)NULL) {
225 memset(data, 0, impl->size);
227 memcpy(data, impl,
sizeof(icalset));
229 data->dsn = strdup(dsn);
234 fdata = (icalfileset *)malloc(
sizeof(icalfileset));
235 data = (icalset *)fdata;
241 memset(data, 0,
sizeof(icalfileset));
242 *data = icalset_fileset_init;
247 ddata = (icaldirset *)malloc(
sizeof(icaldirset));
248 data = (icalset *)ddata;
254 memset(data, 0,
sizeof(icaldirset));
255 *data = icalset_dirset_init;
261 bdata = (icalbdbset *)malloc(
sizeof(icalbdbset));
262 data = (icalset *)bdata;
268 memset(data, 0,
sizeof(icalbdbset));
269 *data = icalset_bdbset_init;
281 data->dsn = strdup(dsn);
285 if ((ret = data->init(data, dsn, options)) == NULL) {
293icalset *icalset_new_file(
const char *path)
298icalset *icalset_new_file_writer(
const char *path)
300 return icalfileset_new_writer(path);
303icalset *icalset_new_file_reader(
const char *path)
305 return icalfileset_new_reader(path);
308icalset *icalset_new_dir(
const char *path)
313icalset *icalset_new_dir_writer(
const char *path)
315 return icaldirset_new_writer(path);
318icalset *icalset_new_dir_reader(
const char *path)
320 return icaldirset_new_reader(path);
338const char *icalset_path(icalset *set)
340 return set->path(set);
350 return set->commit(set);
353icalerrorenum icalset_add_component(icalset *set, icalcomponent *comp)
355 return set->add_component(set, comp);
358icalerrorenum icalset_remove_component(icalset *set, icalcomponent *comp)
360 return set->remove_component(set, comp);
365 return set->count_components(set, kind);
370 return set->select(set, gauge);
373void icalset_clear(icalset *set)
380 return set->fetch(set, 0, uid);
383icalcomponent *icalset_fetch_match(icalset *set,
const icalcomponent *comp)
385 return set->fetch_match(set, comp);
388int icalset_has_uid(icalset *set,
const char *uid)
390 return set->has_uid(set, uid);
395 return set->modify(set, old,
new);
400 return set->get_current_component(set);
405 return set->get_first_component(set);
410 return set->get_next_component(set);
418 return set->icalset_begin_component(set, kind, gauge, tzid);
423 icalcomponent *c = 0;
425 icalerror_check_arg_rz((itr != NULL),
"i");
439 icalcomponent *c = 0;
441 icalerror_check_arg_rz((i != NULL),
"i");
455 icalerror_check_arg_rz((i != NULL),
"i");
462 return set->icalsetiter_to_next(set, i);
465icalcomponent *icalsetiter_to_prior(icalset *set,
icalsetiter *i)
467 return set->icalsetiter_to_prior(set, i);
icalerrorenum icalbdbset_select(icalset *set, icalgauge *gauge)
void icalbdbset_clear(icalset *set)
const char * icalbdbset_path(icalset *set)
icalcomponent * icalbdbset_get_current_component(icalset *set)
icalerrorenum icalbdbset_commit(icalset *set)
Manages a Berkeley database of ical components and offers interfaces for reading, writing and searchi...
icalcomponent * icalcompiter_next(icalcompiter *i)
icalcomponent * icalcompiter_deref(icalcompiter *i)
icalcomponent * icalcompiter_prior(icalcompiter *i)
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.
@ ICAL_UNIMPLEMENTED_ERROR
icalerrorenum icalfileset_select(icalset *set, icalgauge *gauge)
icalerrorenum icalfileset_modify(icalset *set, icalcomponent *old, icalcomponent *new)
Modifies components according to the MODIFY method of CAP.
void icalfileset_clear(icalset *set)
Clears the gauge.
icalcomponent * icalfileset_fetch(icalset *set, icalcomponent_kind kind, const char *uid)
Gets and searches for a component by uid.
Manages a database of ical components and offers interfaces for reading, writing and searching for co...
bool icalgauge_compare(icalgauge *gauge, icalcomponent *comp)
icalerrorenum icalset_select(icalset *set, icalgauge *gauge)
void icalset_free(icalset *set)
icalerrorenum icalset_commit(icalset *set)
void icalset_mark(icalset *set)
icalcomponent * icalset_get_current_component(icalset *set)
icalcomponent * icalsetiter_to_next(icalset *set, icalsetiter *i)
icalerrorenum icalset_modify(icalset *set, icalcomponent *old, icalcomponent *new)
icalcomponent * icalset_get_first_component(icalset *set)
icalsetiter icalsetiter_null
icalcomponent * icalsetiter_next(icalsetiter *itr)
icalcomponent * icalset_fetch(icalset *set, const char *uid)
icalcomponent * icalset_get_next_component(icalset *set)
icalset * icalset_new(icalset_kind kind, const char *dsn, void *options)
Icalset is the "base class" for representations of a collection of iCal components.
bool icalset_register_class(icalset *set)