26
29
#include <libical/ical.h>
27
#include <bonobo/bonobo-main.h>
28
#include <bonobo/bonobo-exception.h>
29
#include <libedata-cal/e-cal-backend.h>
30
#include <glib/gi18n-lib.h>
33
#include <dbus/dbus.h>
34
#include <dbus/dbus-glib.h>
35
#include <glib-object.h>
30
37
#include "e-data-cal.h"
32
#define PARENT_TYPE BONOBO_TYPE_OBJECT
34
static BonoboObjectClass *parent_class;
36
/* Private part of the Cal structure */
38
#include "e-data-cal-enumtypes.h"
40
DBusGConnection *connection;
43
static void impl_Cal_get_uri (EDataCal *cal, DBusGMethodInvocation *context);
44
static void impl_Cal_open (EDataCal *cal, gboolean only_if_exists, gchar *username, gchar *password, DBusGMethodInvocation *context);
45
static gboolean impl_Cal_close (EDataCal *cal, GError **error);
46
static void impl_Cal_refresh (EDataCal *cal, DBusGMethodInvocation *context);
47
static void impl_Cal_remove (EDataCal *cal, DBusGMethodInvocation *context);
48
static void impl_Cal_isReadOnly (EDataCal *cal, DBusGMethodInvocation *context);
49
static void impl_Cal_getCalAddress (EDataCal *cal, DBusGMethodInvocation *context);
50
static void impl_Cal_getAlarmEmailAddress (EDataCal *cal, DBusGMethodInvocation *context);
51
static void impl_Cal_getLdapAttribute (EDataCal *cal, DBusGMethodInvocation *context);
52
static void impl_Cal_getStaticCapabilities (EDataCal *cal, DBusGMethodInvocation *context);
53
static void impl_Cal_setMode (EDataCal *cal, EDataCalMode mode, DBusGMethodInvocation *context);
54
static void impl_Cal_getDefaultObject (EDataCal *cal, DBusGMethodInvocation *context);
55
static void impl_Cal_getObject (EDataCal *cal, const gchar *uid, const gchar *rid, DBusGMethodInvocation *context);
56
static void impl_Cal_getObjectList (EDataCal *cal, const gchar *sexp, DBusGMethodInvocation *context);
57
static void impl_Cal_getChanges (EDataCal *cal, const gchar *change_id, DBusGMethodInvocation *context);
58
static void impl_Cal_getFreeBusy (EDataCal *cal, const gchar **user_list, const gulong start, const gulong end, DBusGMethodInvocation *context);
59
static void impl_Cal_discardAlarm (EDataCal *cal, const gchar *uid, const gchar *auid, DBusGMethodInvocation *context);
60
static void impl_Cal_createObject (EDataCal *cal, const gchar *calobj, DBusGMethodInvocation *context);
61
static void impl_Cal_modifyObject (EDataCal *cal, const gchar *calobj, const EDataCalObjModType mod, DBusGMethodInvocation *context);
62
static void impl_Cal_removeObject (EDataCal *cal, const gchar *uid, const gchar *rid, const EDataCalObjModType mod, DBusGMethodInvocation *context);
63
static void impl_Cal_receiveObjects (EDataCal *cal, const gchar *calobj, DBusGMethodInvocation *context);
64
static void impl_Cal_sendObjects (EDataCal *cal, const gchar *calobj, DBusGMethodInvocation *context);
65
static void impl_Cal_getAttachmentList (EDataCal *cal, gchar *uid, gchar *rid, DBusGMethodInvocation *context);
66
static void impl_Cal_getQuery (EDataCal *cal, const gchar *sexp, DBusGMethodInvocation *context);
67
static void impl_Cal_getTimezone (EDataCal *cal, const gchar *tzid, DBusGMethodInvocation *context);
68
static void impl_Cal_addTimezone (EDataCal *cal, const gchar *tz, DBusGMethodInvocation *context);
69
static void impl_Cal_setDefaultTimezone (EDataCal *cal, const gchar *tz, DBusGMethodInvocation *context);
70
#include "e-data-cal-glue.h"
81
static guint signals[LAST_SIGNAL] = { 0 };
83
G_DEFINE_TYPE (EDataCal, e_data_cal, G_TYPE_OBJECT);
85
#define E_DATA_CAL_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), E_TYPE_DATA_CAL, EDataCalPrivate))
37
87
struct _EDataCalPrivate {
39
88
ECalBackend *backend;
41
/* Listener on the client we notify */
42
GNOME_Evolution_Calendar_CalListener listener;
44
/* Cache of live queries */
45
90
GHashTable *live_queries;
48
/* Cal::get_uri method */
50
impl_Cal_get_uri (PortableServer_Servant servant,
51
CORBA_Environment *ev)
54
EDataCalPrivate *priv;
56
CORBA_char *str_uri_copy;
58
cal = E_DATA_CAL (bonobo_object_from_servant (servant));
61
str_uri = e_cal_backend_get_uri (priv->backend);
62
str_uri_copy = CORBA_string_dup (str_uri);
68
impl_Cal_open (PortableServer_Servant servant,
69
CORBA_boolean only_if_exists,
70
const CORBA_char *username,
71
const CORBA_char *password,
72
CORBA_Environment *ev)
75
EDataCalPrivate *priv;
77
cal = E_DATA_CAL (bonobo_object_from_servant (servant));
80
e_cal_backend_open (priv->backend, cal, only_if_exists, username, password);
84
impl_Cal_remove (PortableServer_Servant servant,
85
CORBA_Environment *ev)
88
EDataCalPrivate *priv;
90
cal = E_DATA_CAL (bonobo_object_from_servant (servant));
93
e_cal_backend_remove (priv->backend, cal);
96
/* Cal::isReadOnly method */
98
impl_Cal_isReadOnly (PortableServer_Servant servant,
99
CORBA_Environment *ev)
102
EDataCalPrivate *priv;
104
cal = E_DATA_CAL (bonobo_object_from_servant (servant));
107
e_cal_backend_is_read_only (priv->backend, cal);
110
/* Cal::getEmailAddress method */
112
impl_Cal_getCalAddress (PortableServer_Servant servant,
113
CORBA_Environment *ev)
116
EDataCalPrivate *priv;
118
cal = E_DATA_CAL (bonobo_object_from_servant (servant));
121
e_cal_backend_get_cal_address (priv->backend, cal);
124
/* Cal::get_alarm_email_address method */
126
impl_Cal_getAlarmEmailAddress (PortableServer_Servant servant,
127
CORBA_Environment *ev)
130
EDataCalPrivate *priv;
132
cal = E_DATA_CAL (bonobo_object_from_servant (servant));
135
e_cal_backend_get_alarm_email_address (priv->backend, cal);
138
/* Cal::get_ldap_attribute method */
140
impl_Cal_getLdapAttribute (PortableServer_Servant servant,
141
CORBA_Environment *ev)
144
EDataCalPrivate *priv;
146
cal = E_DATA_CAL (bonobo_object_from_servant (servant));
149
e_cal_backend_get_ldap_attribute (priv->backend, cal);
152
/* Cal::getSchedulingInformation method */
154
impl_Cal_getStaticCapabilities (PortableServer_Servant servant,
155
CORBA_Environment *ev)
158
EDataCalPrivate *priv;
160
cal = E_DATA_CAL (bonobo_object_from_servant (servant));
163
e_cal_backend_get_static_capabilities (priv->backend, cal);
166
/* Cal::setMode method */
168
impl_Cal_setMode (PortableServer_Servant servant,
169
GNOME_Evolution_Calendar_CalMode mode,
170
CORBA_Environment *ev)
173
EDataCalPrivate *priv;
175
cal = E_DATA_CAL (bonobo_object_from_servant (servant));
178
e_cal_backend_set_mode (priv->backend, mode);
182
impl_Cal_getDefaultObject (PortableServer_Servant servant,
183
CORBA_Environment *ev)
186
EDataCalPrivate *priv;
188
cal = E_DATA_CAL (bonobo_object_from_servant (servant));
191
e_cal_backend_get_default_object (priv->backend, cal);
194
/* Cal::getObject method */
196
impl_Cal_getObject (PortableServer_Servant servant,
197
const CORBA_char *uid,
198
const CORBA_char *rid,
199
CORBA_Environment *ev)
202
EDataCalPrivate *priv;
204
cal = E_DATA_CAL (bonobo_object_from_servant (servant));
207
e_cal_backend_get_object (priv->backend, cal, uid, rid);
210
/* Cal::getObjectList method */
212
impl_Cal_getObjectList (PortableServer_Servant servant,
213
const CORBA_char *sexp,
214
CORBA_Environment *ev)
217
EDataCalPrivate *priv;
220
cal = E_DATA_CAL (bonobo_object_from_servant (servant));
223
query = g_hash_table_lookup (priv->live_queries, sexp);
225
GList *matched_objects;
227
matched_objects = e_data_cal_view_get_matched_objects (query);
228
e_data_cal_notify_object_list (
230
e_data_cal_view_is_done (query) ? e_data_cal_view_get_done_status (query) : GNOME_Evolution_Calendar_Success,
233
g_list_free (matched_objects);
235
e_cal_backend_get_object_list (priv->backend, cal, sexp);
238
/* Cal::getAttachmentList method */
240
impl_Cal_getAttachmentList (PortableServer_Servant servant,
241
const CORBA_char *uid,
242
const CORBA_char *rid,
243
CORBA_Environment *ev)
246
EDataCalPrivate *priv;
248
cal = E_DATA_CAL (bonobo_object_from_servant (servant));
251
e_cal_backend_get_attachment_list (priv->backend, cal, uid, rid);
254
/* Cal::getChanges method */
256
impl_Cal_getChanges (PortableServer_Servant servant,
257
const CORBA_char *change_id,
258
CORBA_Environment *ev)
261
EDataCalPrivate *priv;
263
cal = E_DATA_CAL (bonobo_object_from_servant (servant));
266
e_cal_backend_get_changes (priv->backend, cal, change_id);
269
/* Cal::getFreeBusy method */
271
impl_Cal_getFreeBusy (PortableServer_Servant servant,
272
const GNOME_Evolution_Calendar_UserList *user_list,
273
const GNOME_Evolution_Calendar_Time_t start,
274
const GNOME_Evolution_Calendar_Time_t end,
275
CORBA_Environment *ev)
278
EDataCalPrivate *priv;
93
/* Create the EDataCal error quark */
95
e_data_cal_error_quark (void)
97
static GQuark quark = 0;
99
quark = g_quark_from_static_string ("e_data_cal_error");
105
e_data_cal_class_init (EDataCalClass *e_data_cal_class)
107
/* TODO: finalise dispose */
109
g_type_class_add_private (e_data_cal_class, sizeof (EDataCalPrivate));
111
signals[AUTH_REQUIRED] =
112
g_signal_new ("auth-required",
113
G_OBJECT_CLASS_TYPE (e_data_cal_class),
114
G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED,
117
g_cclosure_marshal_VOID__VOID,
119
signals[BACKEND_ERROR] =
120
g_signal_new ("backend-error",
121
G_OBJECT_CLASS_TYPE (e_data_cal_class),
122
G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED,
125
g_cclosure_marshal_VOID__STRING,
126
G_TYPE_NONE, 1, G_TYPE_STRING);
128
g_signal_new ("readonly",
129
G_OBJECT_CLASS_TYPE (e_data_cal_class),
130
G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED,
133
g_cclosure_marshal_VOID__BOOLEAN,
134
G_TYPE_NONE, 1, G_TYPE_BOOLEAN);
136
g_signal_new ("mode",
137
G_OBJECT_CLASS_TYPE (e_data_cal_class),
138
G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED,
141
g_cclosure_marshal_VOID__INT,
142
G_TYPE_NONE, 1, G_TYPE_INT);
144
dbus_g_object_type_install_info (G_TYPE_FROM_CLASS (e_data_cal_class), &dbus_glib_e_data_cal_object_info);
146
dbus_g_error_domain_register (E_DATA_CAL_ERROR, NULL, E_TYPE_DATA_CAL_CALL_STATUS);
151
e_data_cal_init (EDataCal *ecal)
153
ecal->priv = E_DATA_CAL_GET_PRIVATE (ecal);
157
e_data_cal_new (ECalBackend *backend, ESource *source)
160
cal = g_object_new (E_TYPE_DATA_CAL, NULL);
161
cal->priv->backend = backend;
162
cal->priv->source = source;
167
* e_data_cal_get_source:
170
* Returns the #ESource for @cal.
172
* Returns: the #ESource for @cal
177
e_data_cal_get_source (EDataCal *cal)
179
return cal->priv->source;
183
e_data_cal_get_backend (EDataCal *cal)
185
return cal->priv->backend;
188
/* EDataCal::getUri method */
190
impl_Cal_get_uri (EDataCal *cal, DBusGMethodInvocation *context)
192
dbus_g_method_return (context, g_strdup (e_cal_backend_get_uri (cal->priv->backend)));
195
/* EDataCal::open method */
197
impl_Cal_open (EDataCal *cal,
198
gboolean only_if_exists,
200
gchar *password, DBusGMethodInvocation *context)
202
e_cal_backend_open (cal->priv->backend, cal, context, only_if_exists, username, password);
205
/* EDataCal::close method */
207
impl_Cal_close (EDataCal *cal, GError **error)
209
e_cal_backend_remove_client (cal->priv->backend, cal);
210
g_object_unref (cal);
214
/* EDataCal::refresh method */
216
impl_Cal_refresh (EDataCal *cal, DBusGMethodInvocation *context)
218
e_cal_backend_refresh (cal->priv->backend, cal, context);
221
/* EDataCal::remove method */
223
impl_Cal_remove (EDataCal *cal, DBusGMethodInvocation *context)
225
e_cal_backend_remove (cal->priv->backend, cal, context);
228
/* EDataCal::isReadOnly method */
230
impl_Cal_isReadOnly (EDataCal *cal, DBusGMethodInvocation *context)
232
e_cal_backend_is_read_only (cal->priv->backend, cal);
233
dbus_g_method_return (context);
236
/* EDataCal::getCalAddress method */
238
impl_Cal_getCalAddress (EDataCal *cal, DBusGMethodInvocation *context)
240
e_cal_backend_get_cal_address (cal->priv->backend, cal, context);
243
/* EDataCal::getAlarmEmailAddress method */
245
impl_Cal_getAlarmEmailAddress (EDataCal *cal, DBusGMethodInvocation *context)
247
e_cal_backend_get_alarm_email_address (cal->priv->backend, cal, context);
250
/* EDataCal::getLdapAttribute method */
252
impl_Cal_getLdapAttribute (EDataCal *cal, DBusGMethodInvocation *context)
254
e_cal_backend_get_ldap_attribute (cal->priv->backend, cal, context);
257
/* EDataCal::getSchedulingInformation method */
259
impl_Cal_getStaticCapabilities (EDataCal *cal, DBusGMethodInvocation *context)
261
e_cal_backend_get_static_capabilities (cal->priv->backend, cal, context);
264
/* EDataCal::setMode method */
266
impl_Cal_setMode (EDataCal *cal,
268
DBusGMethodInvocation *context)
270
e_cal_backend_set_mode (cal->priv->backend, mode);
271
dbus_g_method_return (context);
274
/* EDataCal::getDefaultObject method */
276
impl_Cal_getDefaultObject (EDataCal *cal, DBusGMethodInvocation *context)
278
e_cal_backend_get_default_object (cal->priv->backend, cal, context);
281
/* EDataCal::getObject method */
283
impl_Cal_getObject (EDataCal *cal,
286
DBusGMethodInvocation *context)
288
e_cal_backend_get_object (cal->priv->backend, cal, context, uid, rid);
291
/* EDataCal::getObjectList method */
293
impl_Cal_getObjectList (EDataCal *cal,
295
DBusGMethodInvocation *context)
297
e_cal_backend_get_object_list (cal->priv->backend, cal, context, sexp);
300
/* EDataCal::getChanges method */
302
impl_Cal_getChanges (EDataCal *cal,
303
const gchar *change_id,
304
DBusGMethodInvocation *context)
306
e_cal_backend_get_changes (cal->priv->backend, cal, context, change_id);
309
/* EDataCal::getFreeBusy method */
311
impl_Cal_getFreeBusy (EDataCal *cal,
312
const gchar **user_list,
315
DBusGMethodInvocation *context)
279
317
GList *users = NULL;
281
cal = E_DATA_CAL (bonobo_object_from_servant (servant));
284
/* convert the CORBA user list to a GList */
288
for (i = 0; i < user_list->_length; i++)
289
users = g_list_append (users, user_list->_buffer[i]);
322
for (i = 0; user_list[i]; i++)
323
users = g_list_append (users, (gpointer)user_list[i]);
292
326
/* call the backend's get_free_busy method */
293
e_cal_backend_get_free_busy (priv->backend, cal, users, start, end);
296
/* Cal::discardAlarm method */
298
impl_Cal_discardAlarm (PortableServer_Servant servant,
299
const CORBA_char *uid,
300
const CORBA_char *auid,
301
CORBA_Environment *ev)
304
EDataCalPrivate *priv;
306
cal = E_DATA_CAL (bonobo_object_from_servant (servant));
309
e_cal_backend_discard_alarm (priv->backend, cal, uid, auid);
313
impl_Cal_createObject (PortableServer_Servant servant,
314
const CORBA_char *calobj,
315
CORBA_Environment *ev)
318
EDataCalPrivate *priv;
320
cal = E_DATA_CAL (bonobo_object_from_servant (servant));
323
e_cal_backend_create_object (priv->backend, cal, calobj);
327
impl_Cal_modifyObject (PortableServer_Servant servant,
328
const CORBA_char *calobj,
329
const GNOME_Evolution_Calendar_CalObjModType mod,
330
CORBA_Environment *ev)
333
EDataCalPrivate *priv;
335
cal = E_DATA_CAL (bonobo_object_from_servant (servant));
338
e_cal_backend_modify_object (priv->backend, cal, calobj, mod);
341
/* Cal::removeObject method */
343
impl_Cal_removeObject (PortableServer_Servant servant,
344
const CORBA_char *uid,
345
const CORBA_char *rid,
346
const GNOME_Evolution_Calendar_CalObjModType mod,
347
CORBA_Environment *ev)
350
EDataCalPrivate *priv;
352
cal = E_DATA_CAL (bonobo_object_from_servant (servant));
355
e_cal_backend_remove_object (priv->backend, cal, uid, rid, mod);
359
impl_Cal_receiveObjects (PortableServer_Servant servant,
360
const CORBA_char *calobj,
361
CORBA_Environment *ev)
364
EDataCalPrivate *priv;
366
cal = E_DATA_CAL (bonobo_object_from_servant (servant));
369
e_cal_backend_receive_objects (priv->backend, cal, calobj);
373
impl_Cal_sendObjects (PortableServer_Servant servant,
374
const CORBA_char *calobj,
375
CORBA_Environment *ev)
378
EDataCalPrivate *priv;
380
cal = E_DATA_CAL (bonobo_object_from_servant (servant));
383
e_cal_backend_send_objects (priv->backend, cal, calobj);
387
disconnect_query (gpointer key, EDataCalView *query, EDataCal *cal)
389
g_signal_handlers_disconnect_matched (query, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, cal);
390
e_cal_backend_remove_query (cal->priv->backend, query);
394
query_last_listener_gone_cb (EDataCalView *query, EDataCal *cal)
396
EDataCalPrivate *priv;
398
g_return_if_fail (cal != NULL);
402
disconnect_query (NULL, query, cal);
403
g_hash_table_remove (priv->live_queries, e_data_cal_view_get_text (query));
406
/* Cal::getQuery implementation */
408
impl_Cal_getQuery (PortableServer_Servant servant,
409
const CORBA_char *sexp,
410
GNOME_Evolution_Calendar_CalViewListener ql,
411
CORBA_Environment *ev)
415
EDataCalPrivate *priv;
327
e_cal_backend_get_free_busy (cal->priv->backend, cal, context, users, (time_t)start, (time_t)end);
330
/* EDataCal::discardAlarm method */
332
impl_Cal_discardAlarm (EDataCal *cal,
335
DBusGMethodInvocation *context)
337
e_cal_backend_discard_alarm (cal->priv->backend, cal, context, uid, auid);
340
/* EDataCal::createObject method */
342
impl_Cal_createObject (EDataCal *cal,
344
DBusGMethodInvocation *context)
346
e_cal_backend_create_object (cal->priv->backend, cal, context, calobj);
349
/* EDataCal::modifyObject method */
351
impl_Cal_modifyObject (EDataCal *cal,
353
const EDataCalObjModType mod,
354
DBusGMethodInvocation *context)
356
e_cal_backend_modify_object (cal->priv->backend, cal, context, calobj, mod);
359
/* EDataCal::removeObject method */
361
impl_Cal_removeObject (EDataCal *cal,
364
const EDataCalObjModType mod,
365
DBusGMethodInvocation *context)
370
e_cal_backend_remove_object (cal->priv->backend, cal, context, uid, rid, mod);
373
/* EDataCal::receiveObjects method */
375
impl_Cal_receiveObjects (EDataCal *cal,
377
DBusGMethodInvocation *context)
379
e_cal_backend_receive_objects (cal->priv->backend, cal, context, calobj);
382
/* EDataCal::sendObjects method */
384
impl_Cal_sendObjects (EDataCal *cal,
386
DBusGMethodInvocation *context)
388
e_cal_backend_send_objects (cal->priv->backend, cal, context, calobj);
391
/* EDataCal::getAttachmentList method */
393
impl_Cal_getAttachmentList (EDataCal *cal,
396
DBusGMethodInvocation *context)
398
e_cal_backend_get_attachment_list (cal->priv->backend, cal, context, uid, rid);
401
/* Function to get a new EDataCalView path, used by getQuery below */
403
construct_calview_path (void)
405
static guint counter = 1;
406
return g_strdup_printf ("/org/gnome/evolution/dataserver/calendar/CalView/%d/%d", getpid(), counter++);
409
/* EDataCal::getQuery method */
411
impl_Cal_getQuery (EDataCal *cal,
413
DBusGMethodInvocation *context)
416
415
EDataCalView *query;
417
416
ECalBackendSExp *obj_sexp;
419
cal = E_DATA_CAL (bonobo_object_from_servant (servant));
422
/* first see if we already have the query in the cache */
423
query = g_hash_table_lookup (priv->live_queries, sexp);
425
e_data_cal_view_add_listener (query, ql);
426
e_data_cal_notify_query (cal, GNOME_Evolution_Calendar_Success, query);
430
419
/* we handle this entirely here, since it doesn't require any
431
420
backend involvement now that we have e_cal_view_start to
434
423
obj_sexp = e_cal_backend_sexp_new (sexp);
436
e_data_cal_notify_query (cal, GNOME_Evolution_Calendar_InvalidQuery, NULL);
425
e_data_cal_notify_query (cal, context, InvalidQuery, NULL);
441
query = e_data_cal_view_new (priv->backend, ql, obj_sexp);
429
path = construct_calview_path ();
430
query = e_data_cal_view_new (cal->priv->backend, path, obj_sexp);
443
432
g_object_unref (obj_sexp);
444
e_data_cal_notify_query (cal, GNOME_Evolution_Calendar_OtherError, NULL);
433
e_data_cal_notify_query (cal, context, OtherError, NULL);
449
g_signal_connect (query, "last_listener_gone", G_CALLBACK (query_last_listener_gone_cb), cal);
451
g_hash_table_insert (priv->live_queries, g_strdup (sexp), query);
452
e_cal_backend_add_query (priv->backend, query);
454
e_data_cal_notify_query (cal, GNOME_Evolution_Calendar_Success, query);
457
/* Cal::getTimezone method */
459
impl_Cal_getTimezone (PortableServer_Servant servant,
460
const CORBA_char *tzid,
461
CORBA_Environment *ev)
464
EDataCalPrivate *priv;
466
cal = E_DATA_CAL (bonobo_object_from_servant (servant));
469
e_cal_backend_get_timezone (priv->backend, cal, tzid);
472
/* Cal::addTimezone method */
474
impl_Cal_addTimezone (PortableServer_Servant servant,
475
const CORBA_char *tz,
476
CORBA_Environment *ev)
479
EDataCalPrivate *priv;
481
cal = E_DATA_CAL (bonobo_object_from_servant (servant));
484
e_cal_backend_add_timezone (priv->backend, cal, tz);
487
/* Cal::setDefaultTimezone method */
489
impl_Cal_setDefaultTimezone (PortableServer_Servant servant,
490
const CORBA_char *tz,
491
CORBA_Environment *ev)
494
EDataCalPrivate *priv;
496
cal = E_DATA_CAL (bonobo_object_from_servant (servant));
499
e_cal_backend_set_default_zone (priv->backend, cal, tz);
503
* e_data_cal_construct:
504
* @cal: A calendar client interface.
505
* @backend: Calendar backend that this @cal presents an interface to.
506
* @listener: Calendar listener for notification.
508
* Constructs a calendar client interface object by binding the corresponding
509
* CORBA object to it. The calendar interface is bound to the specified
510
* @backend, and will notify the @listener about changes to the calendar.
512
* Return value: The same object as the @cal argument.
515
e_data_cal_construct (EDataCal *cal,
516
ECalBackend *backend,
517
GNOME_Evolution_Calendar_CalListener listener)
519
EDataCalPrivate *priv;
520
CORBA_Environment ev;
522
g_return_val_if_fail (cal != NULL, NULL);
523
g_return_val_if_fail (E_IS_DATA_CAL (cal), NULL);
524
g_return_val_if_fail (backend != NULL, NULL);
525
g_return_val_if_fail (E_IS_CAL_BACKEND (backend), NULL);
529
CORBA_exception_init (&ev);
530
priv->listener = CORBA_Object_duplicate (listener, &ev);
531
if (BONOBO_EX (&ev)) {
532
g_message ("cal_construct: could not duplicate the listener");
533
priv->listener = CORBA_OBJECT_NIL;
534
CORBA_exception_free (&ev);
538
CORBA_exception_free (&ev);
540
priv->backend = backend;
547
* @backend: A calendar backend.
548
* @listener: A calendar listener.
550
* Creates a new calendar client interface object and binds it to the
551
* specified @backend and @listener objects.
553
* Return value: A newly-created #EDataCal calendar client interface
554
* object, or %NULL if its corresponding CORBA object could not be
558
e_data_cal_new (ECalBackend *backend, GNOME_Evolution_Calendar_CalListener listener)
560
EDataCal *cal, *retval;
562
g_return_val_if_fail (backend != NULL, NULL);
563
g_return_val_if_fail (E_IS_CAL_BACKEND (backend), NULL);
565
cal = E_DATA_CAL (g_object_new (E_TYPE_DATA_CAL,
566
"poa", bonobo_poa_get_threaded (ORBIT_THREAD_HINT_PER_REQUEST, NULL),
569
retval = e_data_cal_construct (cal, backend, listener);
571
g_message (G_STRLOC ": could not construct the calendar client interface");
572
bonobo_object_unref (BONOBO_OBJECT (cal));
580
* e_data_cal_get_backend:
581
* @cal: A calendar client interface.
583
* Gets the associated backend.
585
* Return value: An #ECalBackend.
588
e_data_cal_get_backend (EDataCal *cal)
590
g_return_val_if_fail (cal != NULL, NULL);
591
g_return_val_if_fail (E_IS_DATA_CAL (cal), NULL);
593
return cal->priv->backend;
597
* e_data_cal_get_listener:
598
* @cal: A calendar client interface.
600
* Gets the listener associated with a calendar client interface.
602
* Return value: The listener.
604
GNOME_Evolution_Calendar_CalListener
605
e_data_cal_get_listener (EDataCal *cal)
607
g_return_val_if_fail (cal != NULL, NULL);
608
g_return_val_if_fail (E_IS_DATA_CAL (cal), NULL);
610
return cal->priv->listener;
613
/* Destroy handler for the calendar */
615
e_data_cal_finalize (GObject *object)
618
EDataCalPrivate *priv;
619
CORBA_Environment ev;
621
g_return_if_fail (object != NULL);
622
g_return_if_fail (E_IS_DATA_CAL (object));
624
cal = E_DATA_CAL (object);
627
priv->backend = NULL;
629
CORBA_exception_init (&ev);
630
bonobo_object_release_unref (priv->listener, &ev);
632
g_message (G_STRLOC ": could not release the listener");
634
priv->listener = NULL;
635
CORBA_exception_free (&ev);
637
g_hash_table_foreach (priv->live_queries, (GHFunc) disconnect_query, cal);
638
g_hash_table_destroy (priv->live_queries);
639
priv->live_queries = NULL;
643
if (G_OBJECT_CLASS (parent_class)->finalize)
644
(* G_OBJECT_CLASS (parent_class)->finalize) (object);
649
/* Class initialization function for the calendar */
651
e_data_cal_class_init (EDataCalClass *klass)
653
GObjectClass *object_class = (GObjectClass *) klass;
654
POA_GNOME_Evolution_Calendar_Cal__epv *epv = &klass->epv;
656
parent_class = g_type_class_peek_parent (klass);
658
/* Class method overrides */
659
object_class->finalize = e_data_cal_finalize;
662
epv->_get_uri = impl_Cal_get_uri;
663
epv->open = impl_Cal_open;
664
epv->remove = impl_Cal_remove;
665
epv->isReadOnly = impl_Cal_isReadOnly;
666
epv->getCalAddress = impl_Cal_getCalAddress;
667
epv->getAlarmEmailAddress = impl_Cal_getAlarmEmailAddress;
668
epv->getLdapAttribute = impl_Cal_getLdapAttribute;
669
epv->getStaticCapabilities = impl_Cal_getStaticCapabilities;
670
epv->setMode = impl_Cal_setMode;
671
epv->getDefaultObject = impl_Cal_getDefaultObject;
672
epv->getObject = impl_Cal_getObject;
673
epv->getTimezone = impl_Cal_getTimezone;
674
epv->addTimezone = impl_Cal_addTimezone;
675
epv->setDefaultTimezone = impl_Cal_setDefaultTimezone;
676
epv->getObjectList = impl_Cal_getObjectList;
677
epv->getAttachmentList = impl_Cal_getAttachmentList;
678
epv->getChanges = impl_Cal_getChanges;
679
epv->getFreeBusy = impl_Cal_getFreeBusy;
680
epv->discardAlarm = impl_Cal_discardAlarm;
681
epv->createObject = impl_Cal_createObject;
682
epv->modifyObject = impl_Cal_modifyObject;
683
epv->removeObject = impl_Cal_removeObject;
684
epv->receiveObjects = impl_Cal_receiveObjects;
685
epv->sendObjects = impl_Cal_sendObjects;
686
epv->getQuery = impl_Cal_getQuery;
689
/* Object initialization function for the calendar */
691
e_data_cal_init (EDataCal *cal, EDataCalClass *klass)
693
EDataCalPrivate *priv;
695
priv = g_new0 (EDataCalPrivate, 1);
698
priv->listener = CORBA_OBJECT_NIL;
699
priv->live_queries = g_hash_table_new_full (g_str_hash, g_str_equal,
700
(GDestroyNotify) g_free,
701
(GDestroyNotify) bonobo_object_unref);
704
BONOBO_TYPE_FUNC_FULL (EDataCal, GNOME_Evolution_Calendar_Cal, PARENT_TYPE, e_data_cal)
437
e_cal_backend_add_query (cal->priv->backend, query);
439
e_data_cal_notify_query (cal, context, Success, path);
444
/* EDataCal::getTimezone method */
446
impl_Cal_getTimezone (EDataCal *cal,
448
DBusGMethodInvocation *context)
450
e_cal_backend_get_timezone (cal->priv->backend, cal, context, tzid);
453
/* EDataCal::addTimezone method */
455
impl_Cal_addTimezone (EDataCal *cal,
457
DBusGMethodInvocation *context)
459
e_cal_backend_add_timezone (cal->priv->backend, cal, context, tz);
462
/* EDataCal::setDefaultTimezone method */
464
impl_Cal_setDefaultTimezone (EDataCal *cal,
466
DBusGMethodInvocation *context)
468
e_cal_backend_set_default_zone (cal->priv->backend, cal, context, tz);
707
472
* e_data_cal_notify_read_only: