aboutsummaryrefslogtreecommitdiffstats
path: root/calendar
diff options
context:
space:
mode:
Diffstat (limited to 'calendar')
-rw-r--r--calendar/ChangeLog10
-rw-r--r--calendar/gui/dialogs/copy-source-dialog.c58
2 files changed, 50 insertions, 18 deletions
diff --git a/calendar/ChangeLog b/calendar/ChangeLog
index 3fbd851847..73fc01bcf8 100644
--- a/calendar/ChangeLog
+++ b/calendar/ChangeLog
@@ -1,3 +1,13 @@
+2004-01-27 Rodrigo Moya <rodrigo@ximian.com>
+
+ Fixes #53276
+
+ * gui/dialogs/copy-source-dialog.c (show_error): new function to
+ create an error message dialog.
+ (copy_source): check if the destination calendar is read only, and
+ if so, don't try to copy components over. Fixed leaks. Call show_error
+ to display meaningful error messages.
+
2004-01-26 JP Rosevear <jpr@ximian.com>
* gui/migration.c (migrate_ical_folder): add the source to the
diff --git a/calendar/gui/dialogs/copy-source-dialog.c b/calendar/gui/dialogs/copy-source-dialog.c
index 1bf4cae4a6..b3abd44747 100644
--- a/calendar/gui/dialogs/copy-source-dialog.c
+++ b/calendar/gui/dialogs/copy-source-dialog.c
@@ -21,6 +21,7 @@
#include <gtk/gtkbox.h>
#include <gtk/gtkdialog.h>
#include <gtk/gtklabel.h>
+#include <gtk/gtkmessagedialog.h>
#include <gtk/gtkstock.h>
#include <bonobo/bonobo-i18n.h>
#include <widgets/misc/e-source-option-menu.h>
@@ -54,11 +55,22 @@ source_selected_cb (ESourceOptionMenu *menu, ESource *selected_source, gpointer
gtk_dialog_set_response_sensitive (GTK_DIALOG (csdd->dialog), GTK_RESPONSE_OK, FALSE);
}
+static void
+show_error (GtkWindow *parent, const char *msg)
+{
+ GtkWidget *dialog;
+
+ dialog = gtk_message_dialog_new (parent, 0, GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE, msg);
+ gtk_dialog_run (GTK_DIALOG (dialog));
+ gtk_widget_destroy (dialog);
+}
+
static gboolean
copy_source (CopySourceDialogData *csdd)
{
char *uri;
ECal *source_client, *dest_client;
+ gboolean read_only = TRUE;
GList *obj_list = NULL;
gboolean result = FALSE;
@@ -68,40 +80,50 @@ copy_source (CopySourceDialogData *csdd)
/* open the source */
source_client = auth_new_cal_from_source (csdd->orig_source, csdd->obj_type);
if (!e_cal_open (source_client, TRUE, NULL)) {
+ show_error (GTK_WINDOW (csdd->dialog), _("Could not open source"));
g_object_unref (source_client);
- g_warning (G_STRLOC ": Could not open source");
return FALSE;
}
/* open the destination */
dest_client = auth_new_cal_from_source (csdd->selected_source, csdd->obj_type);
if (!e_cal_open (dest_client, FALSE, NULL)) {
+ show_error (GTK_WINDOW (csdd->dialog), _("Could not open destination"));
g_object_unref (dest_client);
g_object_unref (source_client);
- g_warning (G_STRLOC ": Could not open destination");
return FALSE;
}
- if (e_cal_get_object_list (source_client, "#t", &obj_list, NULL)) {
- GList *l;
- const char *uid;
- icalcomponent *icalcomp;
-
- for (l = obj_list; l != NULL; l = l->next) {
- /* FIXME: process recurrences */
- /* FIXME: process errors */
- if (e_cal_get_object (dest_client, icalcomponent_get_uid (l->data), NULL,
- &icalcomp, NULL)) {
- e_cal_modify_object (dest_client, icalcomp, CALOBJ_MOD_ALL, NULL);
- } else {
- e_cal_create_object (dest_client, l->data, (char **) &uid, NULL);
- g_free ((gpointer) uid);
+ /* check if the destination is read only */
+ e_cal_is_read_only (dest_client, &read_only, NULL);
+ if (read_only) {
+ show_error (GTK_WINDOW (csdd->dialog), _("Destination is read only"));
+ } else {
+ if (e_cal_get_object_list (source_client, "#t", &obj_list, NULL)) {
+ GList *l;
+ const char *uid;
+ icalcomponent *icalcomp;
+
+ for (l = obj_list; l != NULL; l = l->next) {
+ /* FIXME: process recurrences */
+ /* FIXME: process errors */
+ if (e_cal_get_object (dest_client, icalcomponent_get_uid (l->data), NULL,
+ &icalcomp, NULL)) {
+ e_cal_modify_object (dest_client, icalcomp, CALOBJ_MOD_ALL, NULL);
+ } else {
+ e_cal_create_object (dest_client, l->data, (char **) &uid, NULL);
+ g_free ((gpointer) uid);
+ }
}
- }
- e_cal_free_object_list (obj_list);
+ e_cal_free_object_list (obj_list);
+ }
}
+ /* free memory */
+ g_object_unref (dest_client);
+ g_object_unref (source_client);
+
return result;
}