34
G_DEFINE_TYPE (ECalBackend, e_cal_backend, G_TYPE_OBJECT)
34
G_DEFINE_TYPE (ECalBackend, e_cal_backend, G_TYPE_OBJECT);
36
36
/* Private part of the CalBackend structure */
37
37
struct _ECalBackendPrivate {
85
85
static guint e_cal_backend_signals[LAST_SIGNAL];
87
87
static void e_cal_backend_finalize (GObject *object);
88
static void e_cal_backend_remove_client_private (ECalBackend *backend, EDataCal *cal, gboolean weak_unref);
287
288
priv->clients_mutex = g_mutex_new ();
288
289
priv->last_percent_notified = 0;
290
/* FIXME bonobo_object_ref/unref? */
291
priv->queries = e_list_new ((EListCopyFunc) bonobo_object_ref, (EListFreeFunc) bonobo_object_unref, NULL);
291
priv->queries = e_list_new((EListCopyFunc) g_object_ref, (EListFreeFunc) g_object_unref, NULL);
292
292
priv->queries_mutex = g_mutex_new ();
347
347
* Queries the URI of a calendar backend, which must already have an open
350
* Return value: The URI where the calendar is stored.
350
* Returns: The URI where the calendar is stored.
353
353
e_cal_backend_get_uri (ECalBackend *backend)
369
369
* Gets the kind of components the given backend stores.
371
* Return value: The kind of components for this backend.
371
* Returns: The kind of components for this backend.
373
373
icalcomponent_kind
374
374
e_cal_backend_get_kind (ECalBackend *backend)
387
387
cal_destroy_cb (gpointer data, GObject *where_cal_was)
389
ECalBackend *backend = E_CAL_BACKEND (data);
391
e_cal_backend_remove_client (backend, (EDataCal *) where_cal_was);
395
listener_died_cb (gpointer cnx, gpointer data)
397
EDataCal *cal = E_DATA_CAL (data);
399
if (ORBit_small_get_connection_status (e_data_cal_get_listener(cal)) == ORBIT_CONNECTION_DISCONNECTED)
400
e_cal_backend_remove_client (e_data_cal_get_backend (cal), cal);
404
last_client_gone (ECalBackend *backend)
406
g_signal_emit (backend, e_cal_backend_signals[LAST_CLIENT_GONE], 0);
389
e_cal_backend_remove_client_private (E_CAL_BACKEND (data),
390
(EDataCal *) where_cal_was, FALSE);
427
411
priv = backend->priv;
429
bonobo_object_set_immortal (BONOBO_OBJECT (cal), TRUE);
431
413
g_object_weak_ref (G_OBJECT (cal), cal_destroy_cb, backend);
433
ORBit_small_listen_for_broken (e_data_cal_get_listener (cal), G_CALLBACK (listener_died_cb), cal);
435
415
g_mutex_lock (priv->clients_mutex);
436
416
priv->clients = g_list_append (priv->clients, cal);
437
417
g_mutex_unlock (priv->clients_mutex);
441
* e_cal_backend_remove_client:
442
* @backend: An #ECalBackend object.
443
* @cal: An #EDataCal object.
445
* Removes a client from the list of connected clients to the given backend.
448
e_cal_backend_remove_client (ECalBackend *backend, EDataCal *cal)
421
e_cal_backend_remove_client_private (ECalBackend *backend, EDataCal *cal, gboolean weak_unref)
450
423
ECalBackendPrivate *priv;
460
433
priv = backend->priv;
436
g_object_weak_unref (G_OBJECT (cal), cal_destroy_cb, backend);
463
439
g_mutex_lock (priv->clients_mutex);
464
440
priv->clients = g_list_remove (priv->clients, cal);
468
444
* it may decide whether to kill the backend or not.
470
446
if (!priv->clients)
471
last_client_gone (backend);
447
g_signal_emit (backend, e_cal_backend_signals[LAST_CLIENT_GONE], 0);
451
* e_cal_backend_remove_client:
452
* @backend: An #ECalBackend object.
453
* @cal: An #EDataCal object.
455
* Removes a client from the list of connected clients to the given backend.
458
e_cal_backend_remove_client (ECalBackend *backend, EDataCal *cal)
460
e_cal_backend_remove_client_private (backend, cal, TRUE);
516
505
* @query: An #EDataCalView object, previously added with @ref e_cal_backend_add_query.
518
507
* Removes query from the list of live queries for the backend.
521
512
e_cal_backend_remove_query (ECalBackend *backend, EDataCalView *query)
538
529
* must already have an open calendar.
541
e_cal_backend_get_cal_address (ECalBackend *backend, EDataCal *cal)
532
e_cal_backend_get_cal_address (ECalBackend *backend, EDataCal *cal, EServerMethodContext context)
543
534
g_return_if_fail (backend != NULL);
544
535
g_return_if_fail (E_IS_CAL_BACKEND (backend));
546
537
g_assert (CLASS (backend)->get_cal_address != NULL);
547
(* CLASS (backend)->get_cal_address) (backend, cal);
538
(* CLASS (backend)->get_cal_address) (backend, cal, context);
567
e_cal_backend_notify_cal_address (ECalBackend *backend, gchar *address)
558
e_cal_backend_notify_cal_address (ECalBackend *backend, EServerMethodContext context, gchar *address)
569
560
ECalBackendPrivate *priv;
572
563
priv = backend->priv;
574
565
for (l = priv->clients; l; l = l->next)
575
e_data_cal_notify_cal_address (l->data, GNOME_Evolution_Calendar_Success, address);
566
e_data_cal_notify_cal_address (l->data, context, GNOME_Evolution_Calendar_Success, address);
583
574
* Calls the get_alarm_email_address method on the given backend.
586
e_cal_backend_get_alarm_email_address (ECalBackend *backend, EDataCal *cal)
577
e_cal_backend_get_alarm_email_address (ECalBackend *backend, EDataCal *cal, EServerMethodContext context)
588
579
g_return_if_fail (backend != NULL);
589
580
g_return_if_fail (E_IS_CAL_BACKEND (backend));
591
582
g_assert (CLASS (backend)->get_alarm_email_address != NULL);
592
(* CLASS (backend)->get_alarm_email_address) (backend, cal);
583
(* CLASS (backend)->get_alarm_email_address) (backend, cal, context);
600
591
* Calls the get_ldap_attribute method of the given backend.
603
e_cal_backend_get_ldap_attribute (ECalBackend *backend, EDataCal *cal)
594
e_cal_backend_get_ldap_attribute (ECalBackend *backend, EDataCal *cal, EServerMethodContext context)
605
596
g_return_if_fail (backend != NULL);
606
597
g_return_if_fail (E_IS_CAL_BACKEND (backend));
608
599
g_assert (CLASS (backend)->get_ldap_attribute != NULL);
609
(* CLASS (backend)->get_ldap_attribute) (backend, cal);
600
(* CLASS (backend)->get_ldap_attribute) (backend, cal, context);
617
608
* Calls the get_static_capabilities method on the given backend.
620
e_cal_backend_get_static_capabilities (ECalBackend *backend, EDataCal *cal)
611
e_cal_backend_get_static_capabilities (ECalBackend *backend, EDataCal *cal, EServerMethodContext context)
622
613
g_return_if_fail (backend != NULL);
623
614
g_return_if_fail (E_IS_CAL_BACKEND (backend));
625
616
g_assert (CLASS (backend)->get_static_capabilities != NULL);
626
(* CLASS (backend)->get_static_capabilities) (backend, cal);
617
(* CLASS (backend)->get_static_capabilities) (backend, cal, context);
643
e_cal_backend_open (ECalBackend *backend, EDataCal *cal, gboolean only_if_exists,
634
e_cal_backend_open (ECalBackend *backend, EDataCal *cal, EServerMethodContext context, gboolean only_if_exists,
644
635
const gchar *username, const gchar *password)
646
637
g_return_if_fail (backend != NULL);
647
638
g_return_if_fail (E_IS_CAL_BACKEND (backend));
649
640
g_assert (CLASS (backend)->open != NULL);
650
(* CLASS (backend)->open) (backend, cal, only_if_exists, username, password);
641
(* CLASS (backend)->open) (backend, cal, context, only_if_exists, username, password);
645
* e_cal_backend_refresh:
646
* @backend: A calendar backend.
647
* @cal: An #EDataCal object.
649
* Refreshes the calendar being accessed by the given backend.
654
e_cal_backend_refresh (ECalBackend *backend, EDataCal *cal, EServerMethodContext context)
656
g_return_if_fail (backend != NULL);
657
g_return_if_fail (E_IS_CAL_BACKEND (backend));
659
g_assert (CLASS (backend)->refresh != NULL);
660
(* CLASS (backend)->refresh) (backend, cal, context);
658
668
* Removes the calendar being accessed by the given backend.
661
e_cal_backend_remove (ECalBackend *backend, EDataCal *cal)
671
e_cal_backend_remove (ECalBackend *backend, EDataCal *cal, EServerMethodContext context)
663
673
g_return_if_fail (backend != NULL);
664
674
g_return_if_fail (E_IS_CAL_BACKEND (backend));
666
676
g_assert (CLASS (backend)->remove != NULL);
667
(* CLASS (backend)->remove) (backend, cal);
677
(* CLASS (backend)->remove) (backend, cal, context);
732
742
* Queries whether a calendar backend is connected remotely.
734
* Return value: The current mode the calendar is in
744
* Returns: The current mode the calendar is in
737
747
e_cal_backend_get_mode (ECalBackend *backend)
772
782
* Calls the get_default_object method on the given backend.
775
e_cal_backend_get_default_object (ECalBackend *backend, EDataCal *cal)
785
e_cal_backend_get_default_object (ECalBackend *backend, EDataCal *cal, EServerMethodContext context)
777
787
g_return_if_fail (backend != NULL);
778
788
g_return_if_fail (E_IS_CAL_BACKEND (backend));
780
790
g_assert (CLASS (backend)->get_default_object != NULL);
781
(* CLASS (backend)->get_default_object) (backend, cal);
791
(* CLASS (backend)->get_default_object) (backend, cal, context);
792
802
* identifier and its recurrence ID (if a recurrent appointment).
795
e_cal_backend_get_object (ECalBackend *backend, EDataCal *cal, const gchar *uid, const gchar *rid)
805
e_cal_backend_get_object (ECalBackend *backend, EDataCal *cal, EServerMethodContext context, const gchar *uid, const gchar *rid)
797
807
g_return_if_fail (backend != NULL);
798
808
g_return_if_fail (E_IS_CAL_BACKEND (backend));
799
809
g_return_if_fail (uid != NULL);
801
811
g_assert (CLASS (backend)->get_object != NULL);
802
(* CLASS (backend)->get_object) (backend, cal, uid, rid);
812
(* CLASS (backend)->get_object) (backend, cal, context, uid, rid);
811
821
* Calls the get_object_list method on the given backend.
814
e_cal_backend_get_object_list (ECalBackend *backend, EDataCal *cal, const gchar *sexp)
824
e_cal_backend_get_object_list (ECalBackend *backend, EDataCal *cal, EServerMethodContext context, const gchar *sexp)
816
826
g_return_if_fail (backend != NULL);
817
827
g_return_if_fail (E_IS_CAL_BACKEND (backend));
819
829
g_assert (CLASS (backend)->get_object_list != NULL);
820
(* CLASS (backend)->get_object_list) (backend, cal, sexp);
830
(* CLASS (backend)->get_object_list) (backend, cal, context, sexp);
831
841
* on its unique identifier and its recurrence ID (if a recurrent appointment).
834
e_cal_backend_get_attachment_list (ECalBackend *backend, EDataCal *cal, const gchar *uid, const gchar *rid)
844
e_cal_backend_get_attachment_list (ECalBackend *backend, EDataCal *cal, EServerMethodContext context, const gchar *uid, const gchar *rid)
836
846
g_return_if_fail (backend != NULL);
837
847
g_return_if_fail (E_IS_CAL_BACKEND (backend));
838
848
g_return_if_fail (uid != NULL);
840
850
g_assert (CLASS (backend)->get_object != NULL);
841
(* CLASS (backend)->get_attachment_list) (backend, cal, uid, rid);
851
(* CLASS (backend)->get_attachment_list) (backend, cal, context, uid, rid);
852
862
* Gets a free/busy object for the given time interval
855
e_cal_backend_get_free_busy (ECalBackend *backend, EDataCal *cal, GList *users, time_t start, time_t end)
865
e_cal_backend_get_free_busy (ECalBackend *backend, EDataCal *cal, EServerMethodContext context, GList *users, time_t start, time_t end)
857
867
g_return_if_fail (backend != NULL);
858
868
g_return_if_fail (E_IS_CAL_BACKEND (backend));
860
870
g_return_if_fail (start <= end);
862
872
g_assert (CLASS (backend)->get_free_busy != NULL);
863
(* CLASS (backend)->get_free_busy) (backend, cal, users, start, end);
873
(* CLASS (backend)->get_free_busy) (backend, cal, context, users, start, end);
873
883
* the last time the give change_id was seen
876
e_cal_backend_get_changes (ECalBackend *backend, EDataCal *cal, const gchar *change_id)
886
e_cal_backend_get_changes (ECalBackend *backend, EDataCal *cal, EServerMethodContext context, const gchar *change_id)
878
888
g_return_if_fail (backend != NULL);
879
889
g_return_if_fail (E_IS_CAL_BACKEND (backend));
880
890
g_return_if_fail (change_id != NULL);
882
892
g_assert (CLASS (backend)->get_changes != NULL);
883
(* CLASS (backend)->get_changes) (backend, cal, change_id);
893
(* CLASS (backend)->get_changes) (backend, cal, context, change_id);
894
904
* to do whatever is needed to really discard the alarm.
897
e_cal_backend_discard_alarm (ECalBackend *backend, EDataCal *cal, const gchar *uid, const gchar *auid)
907
e_cal_backend_discard_alarm (ECalBackend *backend, EDataCal *cal, EServerMethodContext context, const gchar *uid, const gchar *auid)
899
909
g_return_if_fail (backend != NULL);
900
910
g_return_if_fail (E_IS_CAL_BACKEND (backend));
902
912
g_return_if_fail (auid != NULL);
904
914
g_assert (CLASS (backend)->discard_alarm != NULL);
905
(* CLASS (backend)->discard_alarm) (backend, cal, uid, auid);
915
(* CLASS (backend)->discard_alarm) (backend, cal, context, uid, auid);
914
924
* Calls the create_object method on the given backend.
917
e_cal_backend_create_object (ECalBackend *backend, EDataCal *cal, const gchar *calobj)
927
e_cal_backend_create_object (ECalBackend *backend, EDataCal *cal, EServerMethodContext context, const gchar *calobj)
919
929
g_return_if_fail (backend != NULL);
920
930
g_return_if_fail (E_IS_CAL_BACKEND (backend));
921
931
g_return_if_fail (calobj != NULL);
923
933
if (CLASS (backend)->create_object)
924
(* CLASS (backend)->create_object) (backend, cal, calobj);
934
(* CLASS (backend)->create_object) (backend, cal, context, calobj);
926
e_data_cal_notify_object_created (cal, GNOME_Evolution_Calendar_PermissionDenied, NULL, NULL);
936
e_data_cal_notify_object_created (cal, context, PermissionDenied, NULL, NULL);
936
946
* Calls the modify_object method on the given backend.
939
e_cal_backend_modify_object (ECalBackend *backend, EDataCal *cal, const gchar *calobj, CalObjModType mod)
949
e_cal_backend_modify_object (ECalBackend *backend, EDataCal *cal, EServerMethodContext context, const gchar *calobj, CalObjModType mod)
941
951
g_return_if_fail (backend != NULL);
942
952
g_return_if_fail (E_IS_CAL_BACKEND (backend));
943
953
g_return_if_fail (calobj != NULL);
945
955
if (CLASS (backend)->modify_object)
946
(* CLASS (backend)->modify_object) (backend, cal, calobj, mod);
956
(* CLASS (backend)->modify_object) (backend, cal, context, calobj, mod);
948
e_data_cal_notify_object_removed (cal, GNOME_Evolution_Calendar_PermissionDenied, NULL, NULL, NULL);
958
e_data_cal_notify_object_removed (cal, context, PermissionDenied, NULL, NULL, NULL);
960
970
* clients about the change.
963
e_cal_backend_remove_object (ECalBackend *backend, EDataCal *cal, const gchar *uid, const gchar *rid, CalObjModType mod)
973
e_cal_backend_remove_object (ECalBackend *backend, EDataCal *cal, EServerMethodContext context, const gchar *uid, const gchar *rid, CalObjModType mod)
965
975
g_return_if_fail (backend != NULL);
966
976
g_return_if_fail (E_IS_CAL_BACKEND (backend));
967
977
g_return_if_fail (uid != NULL);
969
979
g_assert (CLASS (backend)->remove_object != NULL);
970
(* CLASS (backend)->remove_object) (backend, cal, uid, rid, mod);
980
(* CLASS (backend)->remove_object) (backend, cal, context, uid, rid, mod);
979
989
* Calls the receive_objects method on the given backend.
982
e_cal_backend_receive_objects (ECalBackend *backend, EDataCal *cal, const gchar *calobj)
992
e_cal_backend_receive_objects (ECalBackend *backend, EDataCal *cal, EServerMethodContext context, const gchar *calobj)
984
994
g_return_if_fail (backend != NULL);
985
995
g_return_if_fail (E_IS_CAL_BACKEND (backend));
986
996
g_return_if_fail (calobj != NULL);
988
998
g_assert (CLASS (backend)->receive_objects != NULL);
989
(* CLASS (backend)->receive_objects) (backend, cal, calobj);
999
(* CLASS (backend)->receive_objects) (backend, cal, context, calobj);
998
1008
* Calls the send_objects method on the given backend.
1001
e_cal_backend_send_objects (ECalBackend *backend, EDataCal *cal, const gchar *calobj)
1011
e_cal_backend_send_objects (ECalBackend *backend, EDataCal *cal, EServerMethodContext context, const gchar *calobj)
1003
1013
g_return_if_fail (backend != NULL);
1004
1014
g_return_if_fail (E_IS_CAL_BACKEND (backend));
1005
1015
g_return_if_fail (calobj != NULL);
1007
1017
g_assert (CLASS (backend)->send_objects != NULL);
1008
(* CLASS (backend)->send_objects) (backend, cal, calobj);
1018
(* CLASS (backend)->send_objects) (backend, cal, context, calobj);
1019
1029
* can't be found.
1022
e_cal_backend_get_timezone (ECalBackend *backend, EDataCal *cal, const gchar *tzid)
1032
e_cal_backend_get_timezone (ECalBackend *backend, EDataCal *cal, EServerMethodContext context, const gchar *tzid)
1024
1034
g_return_if_fail (backend != NULL);
1025
1035
g_return_if_fail (E_IS_CAL_BACKEND (backend));
1026
1036
g_return_if_fail (tzid != NULL);
1028
1038
g_assert (CLASS (backend)->get_timezone != NULL);
1029
(* CLASS (backend)->get_timezone) (backend, cal, tzid);
1039
(* CLASS (backend)->get_timezone) (backend, cal, context, tzid);
1039
1049
* DATE and floating DATE-TIME values.
1042
e_cal_backend_set_default_zone (ECalBackend *backend, EDataCal *cal, const gchar *tzobj)
1052
e_cal_backend_set_default_zone (ECalBackend *backend, EDataCal *cal, EServerMethodContext context, const gchar *tzobj)
1044
1054
g_return_if_fail (backend != NULL);
1045
1055
g_return_if_fail (E_IS_CAL_BACKEND (backend));
1046
1056
g_return_if_fail (tzobj != NULL);
1048
(* CLASS (backend)->set_default_zone) (backend, cal, tzobj);
1058
(* CLASS (backend)->set_default_zone) (backend, cal, context, tzobj);
1066
e_cal_backend_set_default_timezone (ECalBackend *backend, EDataCal *cal, const gchar *tzid)
1076
e_cal_backend_set_default_timezone (ECalBackend *backend, EDataCal *cal, EServerMethodContext context, const gchar *tzid)
1068
1078
g_return_if_fail (backend != NULL);
1069
1079
g_return_if_fail (E_IS_CAL_BACKEND (backend));
1070
1080
g_return_if_fail (tzid != NULL);
1072
(* CLASS (backend)->set_default_timezone) (backend, cal, tzid);
1082
(* CLASS (backend)->set_default_timezone) (backend, cal, context, tzid);
1081
1091
* Add a timezone object to the given backend.
1084
e_cal_backend_add_timezone (ECalBackend *backend, EDataCal *cal, const gchar *tzobj)
1094
e_cal_backend_add_timezone (ECalBackend *backend, EDataCal *cal, EServerMethodContext context, const gchar *tzobj)
1086
1096
g_return_if_fail (E_IS_CAL_BACKEND (backend));
1087
1097
g_return_if_fail (tzobj != NULL);
1088
1098
g_return_if_fail (CLASS (backend)->add_timezone != NULL);
1090
(* CLASS (backend)->add_timezone) (backend, cal, tzobj);
1100
(* CLASS (backend)->add_timezone) (backend, cal, context, tzobj);
1173
1183
while (e_iterator_is_valid (iter)) {
1174
1184
query = QUERY (e_iterator_get (iter));
1176
bonobo_object_ref (query);
1186
g_object_ref (query);
1177
1187
if (e_data_cal_view_object_matches (query, calobj))
1178
1188
e_data_cal_view_notify_objects_added_1 (query, calobj);
1179
bonobo_object_unref (query);
1189
g_object_unref (query);
1181
1191
e_iterator_next (iter);
1262
1274
while (e_iterator_is_valid (iter)) {
1263
1275
query = QUERY (e_iterator_get (iter));
1265
bonobo_object_ref (query);
1277
g_object_ref (query);
1267
1279
e_data_cal_view_notify_progress (query, message, percent);
1269
bonobo_object_unref (query);
1281
g_object_unref (query);
1271
1283
e_iterator_next (iter);
1301
1313
while (e_iterator_is_valid (iter)) {
1302
1314
query = QUERY (e_iterator_get (iter));
1304
bonobo_object_ref (query);
1316
g_object_ref (query);
1306
1318
e_data_cal_view_notify_done (query, status);
1308
bonobo_object_unref (query);
1320
g_object_unref (query);
1310
1322
e_iterator_next (iter);
1346
1358
while (e_iterator_is_valid (iter)) {
1347
1359
query = QUERY (e_iterator_get (iter));
1349
bonobo_object_ref (query);
1361
g_object_ref (query);
1350
1362
match_query_and_notify (query, old_object, object);
1351
bonobo_object_unref (query);
1363
g_object_unref (query);
1353
1365
e_iterator_next (iter);
1392
1404
while (e_iterator_is_valid (iter)) {
1393
1405
query = QUERY (e_iterator_get (iter));
1395
bonobo_object_ref (query);
1407
g_object_ref (query);
1397
1409
if (object == NULL) {
1398
1410
/* if object == NULL, it means the object has been completely
1403
1415
match_query_and_notify (query, old_object, object);
1405
bonobo_object_unref (query);
1417
g_object_unref (query);
1407
1419
e_iterator_next (iter);
1409
1421
g_object_unref (iter);
1425
* e_cal_backend_notify_objects_added:
1413
1430
e_cal_backend_notify_objects_added (ECalBackend *backend, EDataCalView *query, const GList *objects)
1415
1432
e_data_cal_view_notify_objects_added (query, objects);
1436
* e_cal_backend_notify_objects_removed:
1419
1441
e_cal_backend_notify_objects_removed (ECalBackend *backend, EDataCalView *query, const GList *ids)
1421
1443
e_data_cal_view_notify_objects_removed (query, ids);
1447
* e_cal_backend_notify_objects_modified:
1425
1452
e_cal_backend_notify_objects_modified (ECalBackend *backend, EDataCalView *query, const GList *objects)
1440
1467
e_cal_backend_notify_mode (ECalBackend *backend,
1441
GNOME_Evolution_Calendar_CalListener_SetModeStatus status,
1442
GNOME_Evolution_Calendar_CalMode mode)
1468
EDataCalViewListenerSetModeStatus status,
1444
1471
ECalBackendPrivate *priv = backend->priv;