aboutsummaryrefslogtreecommitdiffstats
path: root/calendar/cal-client/cal-client.c
diff options
context:
space:
mode:
Diffstat (limited to 'calendar/cal-client/cal-client.c')
-rw-r--r--calendar/cal-client/cal-client.c255
1 files changed, 223 insertions, 32 deletions
diff --git a/calendar/cal-client/cal-client.c b/calendar/cal-client/cal-client.c
index 89579a34a0..5fe10efcbc 100644
--- a/calendar/cal-client/cal-client.c
+++ b/calendar/cal-client/cal-client.c
@@ -49,7 +49,11 @@ struct _CalClientPrivate {
/* Email address associated with this calendar, or NULL */
char *email_address;
+ char *alarm_email_address;
+ /* Scheduling info */
+ char *capabilities;
+
/* The calendar factories we are contacting */
GList *factories;
@@ -309,6 +313,8 @@ cal_client_init (CalClient *client, CalClientClass *klass)
priv->load_state = CAL_CLIENT_LOAD_NOT_LOADED;
priv->uri = NULL;
priv->email_address = NULL;
+ priv->alarm_email_address = NULL;
+ priv->capabilities = FALSE;
priv->factories = NULL;
priv->timezones = g_hash_table_new (g_str_hash, g_str_equal);
priv->w_client = NULL;
@@ -447,6 +453,14 @@ cal_client_finalize (GObject *object)
g_free (priv->email_address);
priv->email_address = NULL;
}
+ if (priv->alarm_email_address) {
+ g_free (priv->email_address);
+ priv->email_address = NULL;
+ }
+ if (priv->capabilities) {
+ g_free (priv->capabilities);
+ priv->capabilities = NULL;
+ }
g_hash_table_foreach (priv->timezones, free_timezone, NULL);
g_hash_table_destroy (priv->timezones);
@@ -1178,6 +1192,101 @@ cal_client_get_email_address (CalClient *client)
return priv->email_address;
}
+const char *
+cal_client_get_alarm_email_address (CalClient *client)
+{
+ CalClientPrivate *priv;
+
+ g_return_val_if_fail (client != NULL, NULL);
+ g_return_val_if_fail (IS_CAL_CLIENT (client), NULL);
+
+ priv = client->priv;
+ g_return_val_if_fail (priv->load_state == CAL_CLIENT_LOAD_LOADED, NULL);
+
+ if (priv->alarm_email_address == NULL) {
+ CORBA_Environment ev;
+ CORBA_char *email_address;
+
+ CORBA_exception_init (&ev);
+ email_address = GNOME_Evolution_Calendar_Cal_getAlarmEmailAddress (priv->cal, &ev);
+ if (!BONOBO_EX (&ev)) {
+ priv->alarm_email_address = g_strdup (email_address);
+ CORBA_free (email_address);
+ }
+ CORBA_exception_free (&ev);
+ }
+
+ return priv->alarm_email_address;
+}
+
+static void
+load_static_capabilities (CalClient *client)
+{
+ CalClientPrivate *priv;
+ CORBA_Environment ev;
+ char *cap;
+
+ priv = client->priv;
+
+ if (priv->capabilities)
+ return;
+
+ CORBA_exception_init (&ev);
+ cap = GNOME_Evolution_Calendar_Cal_getStaticCapabilities (priv->cal, &ev);
+ if (!BONOBO_EX (&ev))
+ priv->capabilities = g_strdup (cap);
+ else
+ priv->capabilities = g_strdup ("");
+ CORBA_exception_free (&ev);
+}
+
+static gboolean
+check_capability (CalClient *client, const char *cap)
+{
+ CalClientPrivate *priv;
+
+ priv = client->priv;
+
+ load_static_capabilities (client);
+ if (strstr (priv->capabilities, cap))
+ return TRUE;
+
+ return FALSE;
+}
+
+gboolean
+cal_client_get_one_alarm_only (CalClient *client)
+{
+ g_return_val_if_fail (client != NULL, FALSE);
+ g_return_val_if_fail (IS_CAL_CLIENT (client), FALSE);
+
+ return check_capability (client, "one-alarm-only");
+}
+
+gboolean
+cal_client_get_organizer_must_attend (CalClient *client)
+{
+ g_return_val_if_fail (client != NULL, FALSE);
+ g_return_val_if_fail (IS_CAL_CLIENT (client), FALSE);
+
+ return check_capability (client, "organizer-must-attend");
+}
+
+gboolean
+cal_client_get_static_capability (CalClient *client, const char *cap)
+{
+ return check_capability (client, cap);
+}
+
+gboolean
+cal_client_get_save_schedules (CalClient *client)
+{
+ g_return_val_if_fail (client != NULL, FALSE);
+ g_return_val_if_fail (IS_CAL_CLIENT (client), FALSE);
+
+ return check_capability (client, "save-schedules");
+}
+
/* Converts our representation of a calendar component type into its CORBA representation */
static GNOME_Evolution_Calendar_CalObjType
corba_obj_type (CalObjType type)
@@ -1262,6 +1371,75 @@ struct _CalClientGetTimezonesData {
CalClientGetStatus status;
};
+CalClientGetStatus
+cal_client_get_default_object (CalClient *client, CalObjType type, CalComponent **comp)
+{
+ CalClientPrivate *priv;
+ CORBA_Environment ev;
+ GNOME_Evolution_Calendar_CalObj comp_str;
+ CalClientGetStatus retval;
+ icalcomponent *icalcomp;
+ CalClientGetTimezonesData cb_data;
+
+ g_return_val_if_fail (client != NULL, CAL_CLIENT_GET_NOT_FOUND);
+ g_return_val_if_fail (IS_CAL_CLIENT (client), CAL_CLIENT_GET_NOT_FOUND);
+
+ priv = client->priv;
+ g_return_val_if_fail (priv->load_state == CAL_CLIENT_LOAD_LOADED, CAL_CLIENT_GET_NOT_FOUND);
+
+ g_return_val_if_fail (comp != NULL, CAL_CLIENT_GET_NOT_FOUND);
+
+ retval = CAL_CLIENT_GET_NOT_FOUND;
+ *comp = NULL;
+
+ CORBA_exception_init (&ev);
+ comp_str = GNOME_Evolution_Calendar_Cal_getDefaultObject (priv->cal, type, &ev);
+
+ if (BONOBO_USER_EX (&ev, ex_GNOME_Evolution_Calendar_Cal_NotFound))
+ goto out;
+ else if (BONOBO_EX (&ev)) {
+ g_message ("cal_client_get_object(): could not get the object");
+ goto out;
+ }
+
+ icalcomp = icalparser_parse_string (comp_str);
+ CORBA_free (comp_str);
+
+ if (!icalcomp) {
+ retval = CAL_CLIENT_GET_SYNTAX_ERROR;
+ goto out;
+ }
+
+ *comp = cal_component_new ();
+ if (!cal_component_set_icalcomponent (*comp, icalcomp)) {
+ icalcomponent_free (icalcomp);
+ g_object_unref (*comp);
+ *comp = NULL;
+
+ retval = CAL_CLIENT_GET_SYNTAX_ERROR;
+ goto out;
+ }
+
+ /* Now make sure we have all timezones needed for this object.
+ We do this to try to avoid any problems caused by getting a timezone
+ in the middle of other code. Any calls to ORBit result in a
+ recursive call of the GTK+ main loop, which can cause problems for
+ code that doesn't expect it. Currently GnomeCanvas has problems if
+ we try to get a timezone in the middle of a redraw, and there is a
+ resize pending, which leads to an assert failure and an abort. */
+ cb_data.client = client;
+ cb_data.status = CAL_CLIENT_GET_SUCCESS;
+ icalcomponent_foreach_tzid (icalcomp,
+ cal_client_get_object_timezones_cb,
+ &cb_data);
+
+ retval = cb_data.status;
+
+ out:
+
+ CORBA_exception_free (&ev);
+ return retval;
+}
/**
* cal_client_get_object:
@@ -2450,21 +2628,8 @@ cal_client_get_component_as_string (CalClient *client,
TRUE);
}
-/**
- * cal_client_update_object:
- * @client: A calendar client.
- * @comp: A calendar component object.
- *
- * Asks a calendar to update a component. Any existing component with the
- * specified component's UID will be replaced. The client program should not
- * assume that the object is actually in the server's storage until it has
- * received the "obj_updated" notification signal.
- *
- * Return value: a #CalClientResult value indicating the result of the
- * operation.
- **/
CalClientResult
-cal_client_update_object (CalClient *client, CalComponent *comp)
+cal_client_update_object_with_mod (CalClient *client, CalComponent *comp, CalObjModType mod)
{
CalClientPrivate *priv;
CORBA_Environment ev;
@@ -2487,7 +2652,7 @@ cal_client_update_object (CalClient *client, CalComponent *comp)
return CAL_CLIENT_RESULT_INVALID_OBJECT;
CORBA_exception_init (&ev);
- GNOME_Evolution_Calendar_Cal_updateObjects (priv->cal, obj_string, &ev);
+ GNOME_Evolution_Calendar_Cal_updateObjects (priv->cal, obj_string, mod, &ev);
g_free (obj_string);
if (BONOBO_USER_EX (&ev, ex_GNOME_Evolution_Calendar_Cal_InvalidObject))
@@ -2507,6 +2672,27 @@ cal_client_update_object (CalClient *client, CalComponent *comp)
return retval;
}
+
+/**
+ * cal_client_update_object:
+ * @client: A calendar client.
+ * @comp: A calendar component object.
+ *
+ * Asks a calendar to update a component. Any existing component with the
+ * specified component's UID will be replaced. The client program should not
+ * assume that the object is actually in the server's storage until it has
+ * received the "obj_updated" notification signal.
+ *
+ * Return value: a #CalClientResult value indicating the result of the
+ * operation.
+ **/
+CalClientResult
+cal_client_update_object (CalClient *client, CalComponent *comp)
+{
+
+ return cal_client_update_object_with_mod (client, comp, CALOBJ_MOD_ALL);
+}
+
/**
* cal_client_update_objects:
* @client: A calendar client.
@@ -2546,7 +2732,7 @@ cal_client_update_objects (CalClient *client, icalcomponent *icalcomp)
obj_string = icalcomponent_as_ical_string (icalcomp);
CORBA_exception_init (&ev);
- GNOME_Evolution_Calendar_Cal_updateObjects (priv->cal, obj_string, &ev);
+ GNOME_Evolution_Calendar_Cal_updateObjects (priv->cal, obj_string, GNOME_Evolution_Calendar_MOD_ALL, &ev);
if (BONOBO_USER_EX (&ev, ex_GNOME_Evolution_Calendar_Cal_InvalidObject))
retval = CAL_CLIENT_RESULT_INVALID_OBJECT;
@@ -2565,21 +2751,8 @@ cal_client_update_objects (CalClient *client, icalcomponent *icalcomp)
return retval;
}
-
-/**
- * cal_client_remove_object:
- * @client: A calendar client.
- * @uid: Unique identifier of the calendar component to remove.
- *
- * Asks a calendar to remove a component. If the server is able to remove the
- * component, all clients will be notified and they will emit the "obj_removed"
- * signal.
- *
- * Return value: a #CalClientResult value indicating the result of the
- * operation.
- **/
CalClientResult
-cal_client_remove_object (CalClient *client, const char *uid)
+cal_client_remove_object_with_mod (CalClient *client, const char *uid, CalObjModType mod)
{
CalClientPrivate *priv;
CORBA_Environment ev;
@@ -2594,7 +2767,7 @@ cal_client_remove_object (CalClient *client, const char *uid)
g_return_val_if_fail (uid != NULL, CAL_CLIENT_RESULT_NOT_FOUND);
CORBA_exception_init (&ev);
- GNOME_Evolution_Calendar_Cal_removeObject (priv->cal, (char *) uid, &ev);
+ GNOME_Evolution_Calendar_Cal_removeObject (priv->cal, (char *) uid, mod, &ev);
if (BONOBO_USER_EX (&ev, ex_GNOME_Evolution_Calendar_Cal_InvalidObject))
retval = CAL_CLIENT_RESULT_INVALID_OBJECT;
@@ -2613,6 +2786,24 @@ cal_client_remove_object (CalClient *client, const char *uid)
return retval;
}
+/**
+ * cal_client_remove_object:
+ * @client: A calendar client.
+ * @uid: Unique identifier of the calendar component to remove.
+ *
+ * Asks a calendar to remove a component. If the server is able to remove the
+ * component, all clients will be notified and they will emit the "obj_removed"
+ * signal.
+ *
+ * Return value: a #CalClientResult value indicating the result of the
+ * operation.
+ **/
+CalClientResult
+cal_client_remove_object (CalClient *client, const char *uid)
+{
+ return cal_client_remove_object_with_mod (client, uid, CALOBJ_MOD_ALL);
+}
+
CalClientResult
cal_client_send_object (CalClient *client, icalcomponent *icalcomp,
icalcomponent **new_icalcomp, GList **users,
@@ -2758,7 +2949,7 @@ cal_client_ensure_timezone_on_server (CalClient *client, icaltimezone *zone)
g_string_free (vcal_string, FALSE);
CORBA_exception_init (&ev);
- GNOME_Evolution_Calendar_Cal_updateObjects (priv->cal, obj_string, &ev);
+ GNOME_Evolution_Calendar_Cal_updateObjects (priv->cal, obj_string, GNOME_Evolution_Calendar_MOD_ALL, &ev);
g_free (obj_string);
if (BONOBO_USER_EX (&ev, ex_GNOME_Evolution_Calendar_Cal_InvalidObject))