summaryrefslogtreecommitdiff
path: root/src/syncevo/eds_abi_wrapper.h
blob: 186fab2974a834d4bec02529e68a960833e9e5b2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
/*
 * Copyright (C) 2005-2009 Patrick Ohly <patrick.ohly@gmx.de>
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) version 3.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
 * 02110-1301  USA
 */

/**
 * The main purpose of this file is to separate SyncEvolution from
 * Evolution Dataserver ABI changes by never depending directly
 * on any symbol in its libraries. Instead all functions are
 * called via function pointers found via dlopen/dlsym.
 *
 * This is more flexible than linking against a specific revision of
 * the libs, but circumvents the usual lib versioning and therefore
 * may fail when the functions needed by SyncEvolution change.
 *
 * History shows that this has not happened for a long time whereas
 * the versions of EDS libs had to be bumped quite a few times due to other
 * changes.
 *
 * A similar problem came up with an API and ABI change in
 * libbluetooth.so.3: the sdp_extract_seqtype() and sdp_extract_pdu()
 * gained one more parameter (a buffer size for the buffer being
 * written into). When compatibility mode is enabled, this header
 * file provides the extended version and maps it back to the older
 * version if necessary.
 *
 * To use the wrappers, include this header file. It overrides
 * the normal C API functions with the function pointers via
 * defines.
 */

#ifndef INCL_EDS_ABI_WRAPPER
#define INCL_EDS_ABI_WRAPPER

#ifdef HAVE_CONFIG_H
#include "config.h"
#endif

#ifdef HAVE_EDS
#include <glib-object.h>
#if defined(USE_EDS_CLIENT)
#include <libedataserver/libedataserver.h>
#else
#ifdef HAVE_LIBEDATASERVER_EDS_VERSION_H
#include <libedataserver/eds-version.h>
#endif
#include <libedataserver/e-source.h>
#include <libedataserver/e-source-list.h>
#endif
#ifdef ENABLE_EBOOK
#ifdef USE_EDS_CLIENT
#include <libebook/libebook.h>
#else
#include <libebook/e-book.h>
#include <libebook/e-vcard.h>
#include <libebook/e-book-query.h>
#endif
#endif
#ifdef ENABLE_ECAL
# define HANDLE_LIBICAL_MEMORY 1
#ifdef USE_EDS_CLIENT
#include <libecal/libecal.h>
#else
#include <libecal/e-cal.h>
#endif
#endif
#endif
#ifdef ENABLE_BLUETOOTH
#include <bluetooth/sdp.h>
#include <bluetooth/sdp_lib.h>
#endif

#if !defined(ENABLE_ECAL) && defined(ENABLE_ICAL)
# define HANDLE_LIBICAL_MEMORY 1
# include <libical/ical.h>
#endif

#ifdef __cplusplus
extern "C" {
#endif

/** libebook, libecal, libedataserver available (currently checks for e_book_new/e_cal_new/e_source_group_peek_sources) */
extern int EDSAbiHaveEbook, EDSAbiHaveEcal, EDSAbiHaveEdataserver;
extern int EDSAbiHaveIcal;

/** libbluetooth available (checks sdp_connect()) */
extern int SyncEvoHaveLibbluetooth;

#ifdef EVOLUTION_COMPATIBILITY

/**
 * This is a struct instead of a namespace because that allows
 * printing it in a debugger. This code also has to be usable
 * in plain C.
 */
struct EDSAbiWrapper {
# ifdef HAVE_EDS
    GType (*e_source_get_type) (void);
    char *(*e_source_get_uri) (ESource *source);
    GType (*e_source_group_get_type) (void);
    GSList *(*e_source_group_peek_sources) (ESourceGroup *group);
    GSList *(*e_source_list_peek_groups) (ESourceList *list);
    const char *(*e_source_peek_name) (ESource *source);
# endif /* HAVE_EDS */

# ifdef ENABLE_EBOOK
    gboolean (*e_book_add_contact) (EBook *book, EContact *contact, GError **error);
    gboolean (*e_book_authenticate_user) (EBook *book, const char *user, const char *passwd, const char *auth_method, GError **error);
    gboolean (*e_book_commit_contact) (EBook *book, EContact *contact, GError **error);
    EContact* (*e_contact_duplicate) (EContact *contact);
    gconstpointer (*e_contact_get_const) (EContact *contact, EContactField field_id);
    gpointer (*e_contact_get) (EContact *contact, EContactField field_id);
    void (*e_contact_name_free)(EContactName *name);
    GType (*e_contact_get_type) (void);
    EContact* (*e_contact_new_from_vcard) (const char *vcard);
    void (*e_contact_set) (EContact *contact, EContactField field_id, const gpointer value);
    gboolean (*e_book_get_addressbooks) (ESourceList** addressbook_sources, GError **error);
    gboolean (*e_book_get_changes) (EBook *book, char *changeid, GList **changes, GError **error);
    gboolean (*e_book_get_contact) (EBook *book, const char *id, EContact **contact, GError **error);
    gboolean (*e_book_get_contacts) (EBook *book, EBookQuery *query, GList **contacts, GError **error);
    gboolean (*e_book_get_supported_auth_methods) (EBook *book, GList **auth_methods, GError **error);
    const char *(*e_book_get_uri) (EBook *book);
    EBook *(*e_book_new) (ESource *source, GError **error);
    EBook *(*e_book_new_default_addressbook) (GError **error);
    EBook *(*e_book_new_from_uri) (const char *uri, GError **error);
    EBook *(*e_book_new_system_addressbook) (GError **error);
    gboolean (*e_book_open) (EBook *book, gboolean only_if_exists, GError **error);
    EBookQuery* (*e_book_query_any_field_contains) (const char  *value);
    void (*e_book_query_unref) (EBookQuery *q);
    GQuark (*e_book_error_quark) (void);
    gboolean (*e_book_remove_contact) (EBook *book, const char *id, GError **error);
    char* (*e_vcard_to_string) (EVCard *evc, EVCardFormat format);
    gboolean (*e_contact_inline_local_photos) (EContact *contact, GError **error);
# endif /* ENABLE_EBOOK */

# ifdef ENABLE_ECAL
    gboolean (*e_cal_add_timezone) (ECal *ecal, icaltimezone *izone, GError **error);
    icalcomponent *(*e_cal_component_get_icalcomponent) (ECalComponent *comp);
    void (*e_cal_component_get_last_modified) (ECalComponent *comp, struct icaltimetype **t);
    GType (*e_cal_component_get_type) (void);
    gboolean (*e_cal_create_object) (ECal *ecal, icalcomponent *icalcomp, char **uid, GError **error);
    GQuark (*e_calendar_error_quark) (void) G_GNUC_CONST;
    char* (*e_cal_get_component_as_string) (ECal *ecal, icalcomponent *icalcomp);
    gboolean (*e_cal_get_object) (ECal *ecal, const char *uid, const char *rid, icalcomponent **icalcomp, GError **error);
    gboolean (*e_cal_get_object_list_as_comp) (ECal *ecal, const char *query, GList **objects, GError **error);
    gboolean (*e_cal_get_sources) (ESourceList **sources, ECalSourceType type, GError **error);
    gboolean (*e_cal_get_timezone) (ECal *ecal, const char *tzid, icaltimezone **zone, GError **error);
    gboolean (*e_cal_modify_object) (ECal *ecal, icalcomponent *icalcomp, CalObjModType mod, GError **error);
    ECal *(*e_cal_new) (ESource *source, ECalSourceType type);
    ECal *(*e_cal_new_from_uri) (const gchar *uri, ECalSourceType type);
    ECal *(*e_cal_new_system_calendar) (void);
    ECal *(*e_cal_new_system_tasks) (void);
    const gchar *(*e_cal_get_uri)(ECal *);
    gboolean (*e_cal_open) (ECal *ecal, gboolean only_if_exists, GError **error);
    gboolean (*e_cal_remove_object) (ECal *ecal, const char *uid, GError **error);
    gboolean (*e_cal_remove_object_with_mod) (ECal *ecal, const char *uid, const char *rid, CalObjModType mod, GError **error);
    void (*e_cal_set_auth_func) (ECal *ecal, ECalAuthFunc func, gpointer data);
#endif /* ENABLE_ECAL */
#ifdef ENABLE_ICAL
    void (*icalcomponent_add_component) (icalcomponent* parent, icalcomponent* child);
    void (*icalcomponent_add_property) (icalcomponent* comp, icalproperty* prop);
    char* (*icalcomponent_as_ical_string) (icalcomponent* component);
    void (*icalcomponent_free) (icalcomponent* component);
    icalcomponent* (*icalcomponent_get_first_component) (icalcomponent* component, icalcomponent_kind kind);
    icalproperty* (*icalcomponent_get_first_property) (icalcomponent* component, icalproperty_kind kind);
    icalcomponent* (*icalcomponent_get_next_component) (icalcomponent* component, icalcomponent_kind kind);
    icalproperty* (*icalcomponent_get_next_property) (icalcomponent* component, icalproperty_kind kind);
    struct icaltimetype (*icalcomponent_get_recurrenceid) (icalcomponent* comp);
    icaltimezone* (*icalcomponent_get_timezone) (icalcomponent* comp, const char *tzid);
    const char* (*icalcomponent_get_location) (icalcomponent* comp);
    const char* (*icalcomponent_get_summary) (icalcomponent* comp);
    const char* (*icalcomponent_get_uid) (icalcomponent* comp);
    struct icaltimetype (*icalcomponent_get_dtstart)(icalcomponent* comp);
    icalcomponent_kind (*icalcomponent_isa) (const icalcomponent* component);
    icalcomponent* (*icalcomponent_new_clone) (icalcomponent* component);
    icalcomponent* (*icalcomponent_new_from_string) (char* str);
    icalcomponent* (*icalcomponent_new) (icalcomponent_kind kind);
    void (*icalcomponent_merge_component) (icalcomponent* component, icalcomponent *comp_to_merge);
    void (*icalcomponent_remove_component) (icalcomponent* component, icalcomponent *comp_to_remove);
    void (*icalcomponent_remove_property) (icalcomponent* component, icalproperty* property);
    void (*icalcomponent_set_uid) (icalcomponent* comp, const char* v);
    void (*icalcomponent_set_recurrenceid)(icalcomponent* comp, struct icaltimetype v);
    icalcomponent* (*icalcomponent_vanew) (icalcomponent_kind kind, ...);
    const char* (*icalparameter_get_tzid) (const icalparameter* value);
    void (*icalparameter_set_tzid) (icalparameter* value, const char* v);
    icalparameter *(*icalparameter_new_from_value_string)(icalparameter_kind kind, const char *value);
    icalparameter *(*icalparameter_new_clone)(icalparameter *param);
    icalproperty *(*icalproperty_new_clone)(icalproperty *prop);
    void (*icalproperty_free)(icalproperty *prop);
    const char* (*icalproperty_get_description) (const icalproperty* prop);
    const char* (*icalproperty_get_property_name) (const icalproperty* prop);
    const char* (*icalproperty_get_uid) (const icalproperty* prop);
    struct icaltimetype (*icalproperty_get_recurrenceid) (const icalproperty* prop);
    void (*icalproperty_set_recurrenceid) (const icalproperty* prop, icaltimetype rid);
    int (*icalproperty_get_sequence) (const icalproperty* prop);
    icalparameter* (*icalproperty_get_first_parameter) (icalproperty* prop, icalparameter_kind kind);
    struct icaltimetype (*icalproperty_get_lastmodified) (const icalproperty* prop);
    icalparameter* (*icalproperty_get_next_parameter) (icalproperty* prop, icalparameter_kind kind);
    void (*icalproperty_set_parameter)(icalproperty *prop, icalparameter *param);
    const char* (*icalproperty_get_summary) (const icalproperty* prop);
    icalproperty* (*icalproperty_new_description) (const char* v);
    icalproperty* (*icalproperty_new_summary) (const char* v);
    icalproperty* (*icalproperty_new_sequence) (int v);
    icalproperty* (*icalproperty_new_uid) (const char* v);
    icalproperty* (*icalproperty_new_recurrenceid) (icaltimetype v);
    void (*icalproperty_set_value_from_string) (icalproperty* prop,const char* value, const char* kind);
    void (*icalproperty_set_dtstamp) (icalproperty* prop, struct icaltimetype v);
    void (*icalproperty_set_lastmodified) (icalproperty* prop, struct icaltimetype v);
    void (*icalproperty_set_sequence) (icalproperty* prop, int v);
    void (*icalproperty_set_uid) (icalproperty* prop, const char *v);
    void (*icalproperty_remove_parameter_by_kind)(icalproperty* prop,
                                                  icalparameter_kind kind);
    void (*icalproperty_add_parameter)(icalproperty* prop,icalparameter* parameter);
    const char* (*icalproperty_get_value_as_string)(const icalproperty* prop);
    const char* (*icalproperty_get_x_name)(icalproperty* prop);
    icalproperty* (*icalproperty_new_from_string)(const char* str);

    int (*icaltime_is_null_time)(const struct icaltimetype t);
    int (*icaltime_is_utc)(const struct icaltimetype t);
    const char* (*icaltime_as_ical_string) (const struct icaltimetype tt);
    icaltimetype (*icaltime_from_string)(const char* str);
    icaltimetype (*icaltime_from_timet)(const time_t v, const int is_date);
    icaltimetype (*icaltime_null_time)();
    time_t (*icaltime_as_timet)(const struct icaltimetype);
    void (*icaltime_set_timezone)(icaltimetype *tt, const icaltimezone *zone);
    struct icaltimetype (*icaltime_convert_to_zone)(const struct icaltimetype tt, icaltimezone *zone);
    const icaltimezone *(*icaltime_get_timezone)(const struct icaltimetype t);

    void (*icaltimezone_free) (icaltimezone *zone, int free_struct);
    icaltimezone* (*icaltimezone_get_builtin_timezone) (const char *location);
    icaltimezone* (*icaltimezone_get_builtin_timezone_from_tzid) (const char *tzid);
    icalcomponent* (*icaltimezone_get_component) (icaltimezone *zone);
    char* (*icaltimezone_get_tzid) (icaltimezone *zone);
    icaltimezone *(*icaltimezone_new) (void);
    int (*icaltimezone_set_component) (icaltimezone *zone, icalcomponent *comp);

    // optional variants which allocate the returned string for us
    const char* (*icaltime_as_ical_string_r) (const struct icaltimetype tt);
    char* (*icalcomponent_as_ical_string_r) (icalcomponent* component);
    char* (*icalproperty_get_value_as_string_r) (const icalproperty* prop);
# endif /* ENABLE_ICAL */

# ifdef ENABLE_BLUETOOTH
    int (*sdp_close)(sdp_session_t *session);
    sdp_session_t *(*sdp_connect)(const bdaddr_t *src, const bdaddr_t *dst, uint32_t flags);
    /** libbluetooth.so.2 version of sdp_extract_pdu() */
    sdp_record_t *(*sdp_extract_pdu)(const uint8_t *pdata, int *scanned);
    /** alternate version of sdp_extract_pdu() only found in some releases of libbluetooth.so.2 */
    sdp_record_t *(*sdp_extract_pdu_safe)(const uint8_t *pdata, int bufsize, int *scanned);
    /** libbluetooth.so.2 version of sdp_extract_seqtype() */
    int (*sdp_extract_seqtype)(const uint8_t *buf, uint8_t *dtdp, int *size);
    /** alternate version of sdp_extract_seqtype() only found in some releases of libbluetooth.so.2 */
    int (*sdp_extract_seqtype_safe)(const uint8_t *buf, int bufsize, uint8_t *dtdp, int *size);
    int (*sdp_get_access_protos)(const sdp_record_t *rec, sdp_list_t **protos);
    int (*sdp_get_proto_port)(const sdp_list_t *list, int proto);
    int (*sdp_get_socket)(const sdp_session_t *session);
    sdp_list_t *(*sdp_list_append)(sdp_list_t *list, void *d);
    void        (*sdp_list_free)(sdp_list_t *list, sdp_free_func_t f);
    int (*sdp_process)(sdp_session_t *session);
    void (*sdp_record_free)(sdp_record_t *rec);
    int (*sdp_service_search_attr_async)(sdp_session_t *session, const sdp_list_t *search, sdp_attrreq_type_t reqtype, const sdp_list_t *attrid_list);
    int (*sdp_set_notify)(sdp_session_t *session, sdp_callback_t *func, void *udata);
    uuid_t *(*sdp_uuid128_create)(uuid_t *uuid, const void *data);
    int (*str2ba)(const char *str, bdaddr_t *ba);
# endif /* ENABLE_BLUETOOTH */

    int initialized;
};

extern struct EDSAbiWrapper EDSAbiWrapperSingleton;

# ifndef EDS_ABI_WRAPPER_NO_REDEFINE
#  ifdef HAVE_EDS
#   define e_source_get_type EDSAbiWrapperSingleton.e_source_get_type
#   define e_source_get_uri EDSAbiWrapperSingleton.e_source_get_uri
#   define e_source_group_get_type EDSAbiWrapperSingleton.e_source_group_get_type
#   define e_source_group_peek_sources EDSAbiWrapperSingleton.e_source_group_peek_sources
#   define e_source_list_peek_groups EDSAbiWrapperSingleton.e_source_list_peek_groups
#   define e_source_peek_name EDSAbiWrapperSingleton.e_source_peek_name
#  endif /* HAVE_EDS */

#  ifdef ENABLE_EBOOK
#   define e_book_add_contact EDSAbiWrapperSingleton.e_book_add_contact
#   define e_book_authenticate_user EDSAbiWrapperSingleton.e_book_authenticate_user
#   define e_book_commit_contact EDSAbiWrapperSingleton.e_book_commit_contact
#   define e_contact_duplicate EDSAbiWrapperSingleton.e_contact_duplicate
#   define e_contact_get_const EDSAbiWrapperSingleton.e_contact_get_const
#   define e_contact_get EDSAbiWrapperSingleton.e_contact_get
#   define e_contact_name_free EDSAbiWrapperSingleton.e_contact_name_free
#   define e_contact_get_type EDSAbiWrapperSingleton.e_contact_get_type
#   define e_contact_new_from_vcard EDSAbiWrapperSingleton.e_contact_new_from_vcard
#   define e_contact_set EDSAbiWrapperSingleton.e_contact_set
#   define e_book_error_quark EDSAbiWrapperSingleton.e_book_error_quark
#   define e_book_get_addressbooks EDSAbiWrapperSingleton.e_book_get_addressbooks
#   define e_book_get_changes EDSAbiWrapperSingleton.e_book_get_changes
#   define e_book_get_contact EDSAbiWrapperSingleton.e_book_get_contact
#   define e_book_get_contacts EDSAbiWrapperSingleton.e_book_get_contacts
#   define e_book_get_supported_auth_methods EDSAbiWrapperSingleton.e_book_get_supported_auth_methods
#   define e_book_get_uri EDSAbiWrapperSingleton.e_book_get_uri
#   define e_book_new EDSAbiWrapperSingleton.e_book_new
#   define e_book_new_default_addressbook EDSAbiWrapperSingleton.e_book_new_default_addressbook
#   define e_book_new_from_uri EDSAbiWrapperSingleton.e_book_new_from_uri
#   define e_book_new_system_addressbook EDSAbiWrapperSingleton.e_book_new_system_addressbook
#   define e_book_open EDSAbiWrapperSingleton.e_book_open
#   define e_book_query_any_field_contains EDSAbiWrapperSingleton.e_book_query_any_field_contains
#   define e_book_query_unref EDSAbiWrapperSingleton.e_book_query_unref
#   define e_book_remove_contact EDSAbiWrapperSingleton.e_book_remove_contact
#   define e_vcard_to_string EDSAbiWrapperSingleton.e_vcard_to_string
#   define e_contact_inline_local_photos EDSAbiWrapperSingleton.e_contact_inline_local_photos
#  endif /* ENABLE_EBOOK */

#  ifdef ENABLE_ECAL
#   define e_cal_add_timezone EDSAbiWrapperSingleton.e_cal_add_timezone
#   define e_cal_component_get_icalcomponent EDSAbiWrapperSingleton.e_cal_component_get_icalcomponent
#   define e_cal_component_get_last_modified EDSAbiWrapperSingleton.e_cal_component_get_last_modified
#   define e_cal_component_get_type EDSAbiWrapperSingleton.e_cal_component_get_type
#   define e_cal_create_object EDSAbiWrapperSingleton.e_cal_create_object
#   define e_calendar_error_quark EDSAbiWrapperSingleton.e_calendar_error_quark
#   define e_cal_get_component_as_string EDSAbiWrapperSingleton.e_cal_get_component_as_string
#   define e_cal_get_object EDSAbiWrapperSingleton.e_cal_get_object
#   define e_cal_get_object_list_as_comp EDSAbiWrapperSingleton.e_cal_get_object_list_as_comp
#   define e_cal_get_sources EDSAbiWrapperSingleton.e_cal_get_sources
#   define e_cal_get_timezone EDSAbiWrapperSingleton.e_cal_get_timezone
#   define e_cal_modify_object EDSAbiWrapperSingleton.e_cal_modify_object
#   define e_cal_new EDSAbiWrapperSingleton.e_cal_new
#   define e_cal_new_from_uri EDSAbiWrapperSingleton.e_cal_new_from_uri
#   define e_cal_new_system_calendar EDSAbiWrapperSingleton.e_cal_new_system_calendar
#   define e_cal_new_system_tasks EDSAbiWrapperSingleton.e_cal_new_system_tasks
#   define e_cal_get_uri EDSAbiWrapperSingleton.e_cal_get_uri
#   define e_cal_open EDSAbiWrapperSingleton.e_cal_open
#   define e_cal_remove_object EDSAbiWrapperSingleton.e_cal_remove_object
#   define e_cal_remove_object_with_mod EDSAbiWrapperSingleton.e_cal_remove_object_with_mod
#   define e_cal_set_auth_func EDSAbiWrapperSingleton.e_cal_set_auth_func
#  endif /* ENABLE_ECAL */
#  ifdef ENABLE_ICAL
#   define icalcomponent_add_component EDSAbiWrapperSingleton.icalcomponent_add_component
#   define icalcomponent_add_property EDSAbiWrapperSingleton.icalcomponent_add_property
#   define icalcomponent_as_ical_string (EDSAbiWrapperSingleton.icalcomponent_as_ical_string_r ? EDSAbiWrapperSingleton.icalcomponent_as_ical_string_r : EDSAbiWrapperSingleton.icalcomponent_as_ical_string)
#   define icalcomponent_free EDSAbiWrapperSingleton.icalcomponent_free
#   define icalcomponent_get_first_component EDSAbiWrapperSingleton.icalcomponent_get_first_component
#   define icalcomponent_get_first_property EDSAbiWrapperSingleton.icalcomponent_get_first_property
#   define icalcomponent_get_next_component EDSAbiWrapperSingleton.icalcomponent_get_next_component
#   define icalcomponent_get_next_property EDSAbiWrapperSingleton.icalcomponent_get_next_property
#   define icalcomponent_get_recurrenceid EDSAbiWrapperSingleton.icalcomponent_get_recurrenceid
#   define icalcomponent_get_timezone EDSAbiWrapperSingleton.icalcomponent_get_timezone
#   define icalcomponent_get_location EDSAbiWrapperSingleton.icalcomponent_get_location
#   define icalcomponent_get_summary EDSAbiWrapperSingleton.icalcomponent_get_summary
#   define icalcomponent_get_uid EDSAbiWrapperSingleton.icalcomponent_get_uid
#   define icalcomponent_get_dtstart EDSAbiWrapperSingleton.icalcomponent_get_dtstart
#   define icalcomponent_isa EDSAbiWrapperSingleton.icalcomponent_isa
#   define icalcomponent_new_clone EDSAbiWrapperSingleton.icalcomponent_new_clone
#   define icalcomponent_new_from_string EDSAbiWrapperSingleton.icalcomponent_new_from_string
#   define icalcomponent_new EDSAbiWrapperSingleton.icalcomponent_new
#   define icalcomponent_merge_component EDSAbiWrapperSingleton.icalcomponent_merge_component
#   define icalcomponent_remove_component EDSAbiWrapperSingleton.icalcomponent_remove_component
#   define icalcomponent_remove_property EDSAbiWrapperSingleton.icalcomponent_remove_property
#   define icalcomponent_set_uid EDSAbiWrapperSingleton.icalcomponent_set_uid
#   define icalcomponent_set_recurrenceid EDSAbiWrapperSingleton.icalcomponent_set_recurrenceid
#   define icalcomponent_vanew EDSAbiWrapperSingleton.icalcomponent_vanew
#   define icalparameter_get_tzid EDSAbiWrapperSingleton.icalparameter_get_tzid
#   define icalparameter_set_tzid EDSAbiWrapperSingleton.icalparameter_set_tzid
#   define icalparameter_new_from_value_string EDSAbiWrapperSingleton.icalparameter_new_from_value_string
#   define icalparameter_new_clone EDSAbiWrapperSingleton.icalparameter_new_clone
#   define icalproperty_new_clone EDSAbiWrapperSingleton.icalproperty_new_clone
#   define icalproperty_free EDSAbiWrapperSingleton.icalproperty_free
#   define icalproperty_get_description EDSAbiWrapperSingleton.icalproperty_get_description
#   define icalproperty_get_uid EDSAbiWrapperSingleton.icalproperty_get_uid
#   define icalproperty_get_recurrenceid EDSAbiWrapperSingleton.icalproperty_get_recurrenceid
#   define icalproperty_set_recurrenceid EDSAbiWrapperSingleton.icalproperty_set_recurrenceid
#   define icalproperty_get_sequence EDSAbiWrapperSingleton.icalproperty_get_sequence
#   define icalproperty_get_property_name EDSAbiWrapperSingleton.icalproperty_get_property_name
#   define icalproperty_get_first_parameter EDSAbiWrapperSingleton.icalproperty_get_first_parameter
#   define icalproperty_get_lastmodified EDSAbiWrapperSingleton.icalproperty_get_lastmodified
#   define icalproperty_get_next_parameter EDSAbiWrapperSingleton.icalproperty_get_next_parameter
#   define icalproperty_set_parameter EDSAbiWrapperSingleton.icalproperty_set_parameter
#   define icalproperty_get_summary EDSAbiWrapperSingleton.icalproperty_get_summary
#   define icalproperty_new_description EDSAbiWrapperSingleton.icalproperty_new_description
#   define icalproperty_new_summary EDSAbiWrapperSingleton.icalproperty_new_summary
#   define icalproperty_new_uid EDSAbiWrapperSingleton.icalproperty_new_uid
#   define icalproperty_new_sequence EDSAbiWrapperSingleton.icalproperty_new_sequence
#   define icalproperty_new_recurrenceid EDSAbiWrapperSingleton.icalproperty_new_recurrenceid
#   define icalproperty_set_value_from_string EDSAbiWrapperSingleton.icalproperty_set_value_from_string
#   define icalproperty_set_dtstamp EDSAbiWrapperSingleton.icalproperty_set_dtstamp
#   define icalproperty_set_lastmodified EDSAbiWrapperSingleton.icalproperty_set_lastmodified
#   define icalproperty_set_sequence EDSAbiWrapperSingleton.icalproperty_set_sequence
#   define icalproperty_set_uid EDSAbiWrapperSingleton.icalproperty_set_uid
#   define icalproperty_remove_parameter_by_kind EDSAbiWrapperSingleton.icalproperty_remove_parameter_by_kind
#   define icalproperty_add_parameter EDSAbiWrapperSingleton.icalproperty_add_parameter
#   define icalproperty_get_value_as_string (EDSAbiWrapperSingleton.icalproperty_get_value_as_string_r ? EDSAbiWrapperSingleton.icalproperty_get_value_as_string_r : (char *(*)(const icalproperty*))EDSAbiWrapperSingleton.icalproperty_get_value_as_string)
#   define icalproperty_get_x_name EDSAbiWrapperSingleton.icalproperty_get_x_name
#   define icalproperty_new_from_string EDSAbiWrapperSingleton.icalproperty_new_from_string
#   define icaltime_is_null_time EDSAbiWrapperSingleton.icaltime_is_null_time
#   define icaltime_is_utc EDSAbiWrapperSingleton.icaltime_is_utc
#   define icaltime_as_ical_string (EDSAbiWrapperSingleton.icaltime_as_ical_string_r ? EDSAbiWrapperSingleton.icaltime_as_ical_string_r : EDSAbiWrapperSingleton.icaltime_as_ical_string)
#   define icaltime_from_string EDSAbiWrapperSingleton.icaltime_from_string
#   define icaltime_from_timet EDSAbiWrapperSingleton.icaltime_from_timet
#   define icaltime_null_time EDSAbiWrapperSingleton.icaltime_null_time
#   define icaltime_as_timet EDSAbiWrapperSingleton.icaltime_as_timet
#   define icaltime_set_timezone EDSAbiWrapperSingleton.icaltime_set_timezone
#   define icaltime_convert_to_zone EDSAbiWrapperSingleton.icaltime_convert_to_zone
#   define icaltime_get_timezone EDSAbiWrapperSingleton.icaltime_get_timezone
#   define icaltimezone_free EDSAbiWrapperSingleton.icaltimezone_free
#   define icaltimezone_get_builtin_timezone EDSAbiWrapperSingleton.icaltimezone_get_builtin_timezone
#   define icaltimezone_get_builtin_timezone_from_tzid EDSAbiWrapperSingleton.icaltimezone_get_builtin_timezone_from_tzid
#   define icaltimezone_get_component EDSAbiWrapperSingleton.icaltimezone_get_component
#   define icaltimezone_get_tzid EDSAbiWrapperSingleton.icaltimezone_get_tzid
#   define icaltimezone_new EDSAbiWrapperSingleton.icaltimezone_new
#   define icaltimezone_set_component EDSAbiWrapperSingleton.icaltimezone_set_component
#  endif /* ENABLE_ICAL */
#  ifdef ENABLE_BLUETOOTH
#   define sdp_close EDSAbiWrapperSingleton.sdp_close
#   define sdp_connect EDSAbiWrapperSingleton.sdp_connect
#   define sdp_extract_pdu do_not_use_sdp_extract_pdu
#   define sdp_extract_pdu_safe EDSAbiWrapperSingleton.sdp_extract_pdu_safe
#   define sdp_extract_seqtype do_not_use_sdp_extract_seqtype
#   define sdp_extract_seqtype_safe EDSAbiWrapperSingleton.sdp_extract_seqtype_safe
#   define sdp_get_access_protos EDSAbiWrapperSingleton.sdp_get_access_protos
#   define sdp_get_proto_port EDSAbiWrapperSingleton.sdp_get_proto_port
#   define sdp_get_socket EDSAbiWrapperSingleton.sdp_get_socket
#   define sdp_list_append EDSAbiWrapperSingleton.sdp_list_append
#   define sdp_list_free EDSAbiWrapperSingleton.sdp_list_free
#   define sdp_process EDSAbiWrapperSingleton.sdp_process
#   define sdp_record_free EDSAbiWrapperSingleton.sdp_record_free
#   define sdp_service_search_attr_async EDSAbiWrapperSingleton.sdp_service_search_attr_async
#   define sdp_set_notify EDSAbiWrapperSingleton.sdp_set_notify
#   define sdp_uuid128_create EDSAbiWrapperSingleton.sdp_uuid128_create
#   define str2ba EDSAbiWrapperSingleton.str2ba
#  endif /* ENABLE_BLUETOOTH */
# endif /* EDS_ABI_WRAPPER_NO_REDEFINE */

#else /* EVOLUTION_COMPATIBILITY */

# if !defined(EDS_ABI_WRAPPER_NO_REDEFINE) && defined(HAVE_LIBICAL_R)
#  ifdef ENABLE_ICAL
#   ifndef LIBICAL_MEMFIXES
     /* This changes the semantic of the normal functions the same way as libecal did. */
#    define LIBICAL_MEMFIXES 1
#    define icaltime_as_ical_string icaltime_as_ical_string_r
#    define icalcomponent_as_ical_string icalcomponent_as_ical_string_r
#    define icalproperty_get_value_as_string icalproperty_get_value_as_string_r
#   endif /* LIBICAL_MEMFIXES */
#  endif /* ENABLE_ICAL */
# endif /* EDS_ABI_WRAPPER_NO_REDEFINE */
#endif /* EVOLUTION_COMPATIBILITY */

/** initialize pointers to EDS functions, if necessary; can be called multiple times */
void EDSAbiWrapperInit();

const char *EDSAbiWrapperInfo();
const char *EDSAbiWrapperDebug();

#ifdef __cplusplus
}
#endif

#endif /* INCL_EDS_ABI_WRAPPER */