From dd09d630872427be423ac416340192a24e2d037e Mon Sep 17 00:00:00 2001 From: Hans Petter Jansson Date: Fri, 31 Oct 2003 18:03:20 +0000 Subject: Add the webcal source group. 2003-10-31 Hans Petter Jansson * gui/calendar-component.c (calendar_component_init): Add the webcal source group. * gui/dialogs/new-calendar.c (print_uri_noproto): Implement. (group_is_remote): Implement. (create_new_source_with_group): Implement webcal case. (new_calendar_dialog): Get optional location from dialog. * gui/dialogs/new-calendar.glade: Add location entry. * pcs/Makefile.am: Build http backend. * pcs/cal-backend-http.[ch]: Add skeleton based on cal-backend-file. svn path=/trunk/; revision=23153 --- calendar/gui/dialogs/new-calendar.c | 152 ++++++++++++++++++++++++++++---- calendar/gui/dialogs/new-calendar.glade | 102 +++++++++++++++------ 2 files changed, 210 insertions(+), 44 deletions(-) (limited to 'calendar/gui/dialogs') diff --git a/calendar/gui/dialogs/new-calendar.c b/calendar/gui/dialogs/new-calendar.c index aa647b55b2..6f6b979b49 100644 --- a/calendar/gui/dialogs/new-calendar.c +++ b/calendar/gui/dialogs/new-calendar.c @@ -22,6 +22,7 @@ #include #endif +#include #include #include #include @@ -32,15 +33,69 @@ #include #include #include +#include #include "new-calendar.h" +static gchar * +print_uri_noproto (EUri *uri) +{ + gchar *uri_noproto; + + if (uri->port != 0) + uri_noproto = g_strdup_printf ( + "%s%s%s%s%s%s%s:%d%s%s%s", + uri->user ? uri->user : "", + uri->authmech ? ";auth=" : "", + uri->authmech ? uri->authmech : "", + uri->passwd ? ":" : "", + uri->passwd ? uri->passwd : "", + uri->user ? "@" : "", + uri->host ? uri->host : "", + uri->port, + uri->path ? uri->path : "", + uri->query ? "?" : "", + uri->query ? uri->query : ""); + else + uri_noproto = g_strdup_printf ( + "%s%s%s%s%s%s%s%s%s%s", + uri->user ? uri->user : "", + uri->authmech ? ";auth=" : "", + uri->authmech ? uri->authmech : "", + uri->passwd ? ":" : "", + uri->passwd ? uri->passwd : "", + uri->user ? "@" : "", + uri->host ? uri->host : "", + uri->path ? uri->path : "", + uri->query ? "?" : "", + uri->query ? uri->query : ""); + + return uri_noproto; +} + +static gboolean +group_is_remote (ESourceGroup *group) +{ + EUri *uri; + gboolean is_remote = FALSE; + + uri = e_uri_new (e_source_group_peek_base_uri (group)); + if (!uri) + return FALSE; + + if (uri->protocol && strcmp (uri->protocol, "file")) + is_remote = TRUE; + + e_uri_free (uri); + return is_remote; +} + static gboolean create_new_source_with_group (GtkWindow *parent, ESourceGroup *group, - const char *source_name) + const char *source_name, + const char *source_location) { ESource *source; - char *new_dir; if (e_source_group_peek_source_by_name (group, source_name)) { e_notice (parent, GTK_MESSAGE_ERROR, @@ -49,21 +104,82 @@ create_new_source_with_group (GtkWindow *parent, return FALSE; } - /* create the new source */ - new_dir = g_build_filename (e_source_group_peek_base_uri (group), - source_name, NULL); - if (e_mkdir_hier (new_dir, 0700)) { + if (group_is_remote (group)) { + EUri *uri; + gchar *relative_uri; + char *cache_dir; + + /* Remote source */ + + if (!source_location || !strlen (source_location)) { + e_notice (parent, GTK_MESSAGE_ERROR, + _("The group '%s' is remote. You must specify a location " + "to get the calendar from"), + e_source_group_peek_name (group)); + return FALSE; + } + + uri = e_uri_new (source_location); + if (!uri) { + e_notice (parent, GTK_MESSAGE_ERROR, + _("The source location '%s' is not well-formed."), + source_location); + return FALSE; + } + + /* Make sure we're in agreement with the protocol. Note that EUri sets it + * to 'file' if none was specified in the input URI. We don't want to + * silently translate an explicit file:// into http:// though. */ + if (uri->protocol && + strcmp (uri->protocol, "http") && + strcmp (uri->protocol, "webcal")) { + e_uri_free (uri); + e_notice (parent, GTK_MESSAGE_ERROR, + _("The source location '%s' is not a webcal source."), + source_location); + return FALSE; + } + + /* Our relative_uri is everything but protocol, which is supplied by parent group */ + relative_uri = print_uri_noproto (uri); + e_uri_free (uri); + + /* Set up cache dir */ + cache_dir = g_build_filename (g_get_home_dir (), + "/.evolution/calendar/webcal/", + source_name, NULL); + if (e_mkdir_hier (cache_dir, 0700)) { + g_free (relative_uri); + g_free (cache_dir); + e_notice (parent, GTK_MESSAGE_ERROR, + _("Could not create cache for new calendar")); + return FALSE; + } + + /* Create source */ + source = e_source_new (source_name, relative_uri); + + g_free (relative_uri); + g_free (cache_dir); + } else { + char *new_dir; + + /* Local source */ + + new_dir = g_build_filename (e_source_group_peek_base_uri (group), + source_name, NULL); + if (e_mkdir_hier (new_dir, 0700)) { + g_free (new_dir); + e_notice (parent, GTK_MESSAGE_ERROR, + _("Could not create directory for new calendar")); + return FALSE; + } + + source = e_source_new (source_name, source_name); g_free (new_dir); - e_notice (parent, GTK_MESSAGE_ERROR, - _("Could not create directory for new calendar")); - return FALSE; } - source = e_source_new (source_name, source_name); e_source_group_add_source (group, source, -1); - - g_free (new_dir); - return TRUE; } @@ -75,7 +191,7 @@ create_new_source_with_group (GtkWindow *parent, gboolean new_calendar_dialog (GtkWindow *parent) { - GtkWidget *dialog, *cal_group, *cal_name; + GtkWidget *dialog, *cal_group, *cal_name, *cal_location; GladeXML *xml; ESourceList *source_list; GConfClient *gconf_client; @@ -92,6 +208,7 @@ new_calendar_dialog (GtkWindow *parent) dialog = glade_xml_get_widget (xml, "new-calendar-dialog"); cal_group = glade_xml_get_widget (xml, "calendar-group"); cal_name = glade_xml_get_widget (xml, "calendar-name"); + cal_location = glade_xml_get_widget (xml, "calendar-location"); /* set up widgets */ gconf_client = gconf_client_get_default (); @@ -120,14 +237,17 @@ new_calendar_dialog (GtkWindow *parent) /* run the dialog */ do { if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_OK) { - char *name; + const char *name; + const char *location; name = gtk_entry_get_text (GTK_ENTRY (cal_name)); + location = gtk_entry_get_text (GTK_ENTRY (cal_location)); sl = g_slist_nth (groups, gtk_option_menu_get_history (GTK_OPTION_MENU (cal_group))); if (sl) { if (create_new_source_with_group (GTK_WINDOW (dialog), sl->data, - name)) + name, + location)) retry = FALSE; } else { e_notice (dialog, GTK_MESSAGE_ERROR, diff --git a/calendar/gui/dialogs/new-calendar.glade b/calendar/gui/dialogs/new-calendar.glade index 42717a87a8..0a136ed7c8 100644 --- a/calendar/gui/dialogs/new-calendar.glade +++ b/calendar/gui/dialogs/new-calendar.glade @@ -2,7 +2,6 @@ - 12 @@ -61,7 +60,7 @@ True - 3 + 4 3 False 6 @@ -92,31 +91,6 @@ - - - True - Calendar Name - False - False - GTK_JUSTIFY_LEFT - False - False - 0 - 0.5 - 0 - 0 - - - 1 - 2 - 2 - 3 - 6 - fill - - - - True @@ -179,9 +153,81 @@ + + + + True + Calendar Name + False + False + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + + + 1 + 2 + 2 + 3 + 6 + fill + + + + + + + True + Calendar Location + False + False + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + + + 1 + 2 + 3 + 4 + 6 + fill + + + + + + + True + True + True + True + 0 + + True + * + False + + + 2 + 3 + 3 + 4 + 6 + + + - 0 + 4 True True -- cgit v1.2.3