Handle calendar URIs from the command line.

This commit is contained in:
Matthew Barnes
2009-08-24 21:29:25 -04:00
parent 943dc3bab4
commit f2b2d42471
5 changed files with 151 additions and 48 deletions

View File

@ -2624,41 +2624,3 @@ gnome_calendar_purge (GnomeCalendar *gcal, time_t older_than)
g_free (end);
}
void
gnome_calendar_edit_appointment (GnomeCalendar *gcal,
const gchar * src_uid,
const gchar * comp_uid,
const gchar * comp_rid)
{
ECal *client = NULL;
GList *l;
icalcomponent* icalcomp = NULL;
icalproperty *attendee_prop = NULL;
if (!src_uid || !comp_uid)
return;
for (l = gcal->priv->clients_list; l != NULL; l = l->next) {
ESource *client_src;
client = l->data;
client_src = e_cal_get_source (client);
if (!strcmp (src_uid, e_source_peek_uid (client_src)))
break;
}
if (!client)
return;
e_cal_get_object (client, comp_uid, comp_rid, &icalcomp, NULL);
if (!icalcomp)
return;
attendee_prop = icalcomponent_get_first_property (icalcomp, ICAL_ATTENDEE_PROPERTY);
e_calendar_view_edit_appointment (gcal->priv->views[gcal->priv->current_view_type],
client, icalcomp, attendee_prop ? TRUE:FALSE);
icalcomponent_free (icalcomp);
}

View File

@ -184,12 +184,6 @@ gint gnome_calendar_get_num_events_selected
void gnome_calendar_purge (GnomeCalendar *gcal,
time_t older_than);
/* Direct calendar component operations */
void gnome_calendar_edit_appointment (GnomeCalendar *gcal,
const gchar * src_uid,
const gchar * comp_uid,
const gchar * comp_rid);
G_END_DECLS
#endif

View File

@ -24,6 +24,7 @@
#include <string.h>
#include <glib/gi18n.h>
#include <libecal/e-cal.h>
#include <libecal/e-cal-time-util.h>
#include <libedataserver/e-url.h>
#include <libedataserver/e-source.h>
#include <libedataserver/e-source-group.h>
@ -552,8 +553,154 @@ static gboolean
cal_shell_backend_handle_uri_cb (EShellBackend *shell_backend,
const gchar *uri)
{
/* FIXME */
return FALSE;
EShell *shell;
CompEditor *editor;
CompEditorFlags flags = 0;
ECal *client;
ECalComponent *comp;
ESource *source;
ESourceList *source_list;
ECalSourceType source_type;
EUri *euri;
icalcomponent *icalcomp;
icalproperty *icalprop;
const gchar *cp;
gchar *source_uid = NULL;
gchar *comp_uid = NULL;
gchar *comp_rid = NULL;
time_t startdate = -1;
time_t enddate = -1;
gboolean handled = FALSE;
GError *error = NULL;
source_type = E_CAL_SOURCE_TYPE_EVENT;
shell = e_shell_backend_get_shell (shell_backend);
if (strncmp (uri, "calendar:", 9) != 0)
return FALSE;
euri = e_uri_new (uri);
cp = euri->query;
if (cp == NULL)
goto exit;
while (*cp != '\0') {
gchar *header;
gchar *content;
gsize header_len;
gsize content_len;
header_len = strcspn (cp, "=&");
/* It it's malformed, give up. */
if (cp[header_len] != '=')
break;
header = (gchar *) cp;
header[header_len] = '\0';
cp += header_len + 1;
content_len = strcspn (cp, "&");
content = g_strndup (cp, content_len);
if (g_ascii_strcasecmp (header, "startdate") == 0)
startdate = time_from_isodate (content);
else if (g_ascii_strcasecmp (header, "enddate") == 0)
enddate = time_from_isodate (content);
else if (g_ascii_strcasecmp (header, "source-uid") == 0)
source_uid = g_strdup (content);
else if (g_ascii_strcasecmp (header, "comp-uid") == 0)
comp_uid = g_strdup (content);
else if (g_ascii_strcasecmp (header, "comp-rid") == 0)
comp_rid = g_strdup (content);
g_free (content);
cp += content_len;
if (*cp == '&') {
cp++;
if (strcmp (cp, "amp;") == 0)
cp += 4;
}
}
if (source_uid == NULL || comp_uid == NULL)
goto exit;
/* URI is valid, so consider it handled. Whether
* we successfully open it is another matter... */
handled = TRUE;
if (!e_cal_get_sources (&source_list, source_type, NULL)) {
g_printerr ("Could not get calendar sources from GConf!\n");
goto exit;
}
source = e_source_list_peek_source_by_uid (source_list, source_uid);
if (source == NULL) {
g_printerr ("No source for UID `%s'\n", source_uid);
g_object_unref (source_list);
goto exit;
}
client = auth_new_cal_from_source (source, source_type);
if (client == NULL || !e_cal_open (client, TRUE, &error)) {
g_printerr ("%s\n", error->message);
g_object_unref (source_list);
g_error_free (error);
goto exit;
}
/* XXX Copied from e_cal_shell_view_open_event().
* Clearly a new utility function is needed. */
editor = comp_editor_find_instance (comp_uid);
if (editor != NULL)
goto present;
if (!e_cal_get_object (client, comp_uid, comp_rid, &icalcomp, &error)) {
g_printerr ("%s\n", error->message);
g_object_unref (source_list);
g_error_free (error);
goto exit;
}
comp = e_cal_component_new ();
e_cal_component_set_icalcomponent (comp, icalcomp);
icalprop = icalcomponent_get_first_property (
icalcomp, ICAL_ATTENDEE_PROPERTY);
if (icalprop != NULL)
flags |= COMP_EDITOR_MEETING;
if (itip_organizer_is_user (comp, client))
flags |= COMP_EDITOR_USER_ORG;
if (itip_sentby_is_user (comp, client))
flags |= COMP_EDITOR_USER_ORG;
if (!e_cal_component_has_attendees (comp))
flags |= COMP_EDITOR_USER_ORG;
editor = event_editor_new (client, shell, flags);
comp_editor_edit_comp (editor, comp);
g_object_unref (comp);
present:
gtk_window_present (GTK_WINDOW (editor));
g_object_unref (source_list);
g_object_unref (client);
exit:
g_free (source_uid);
g_free (comp_uid);
g_free (comp_rid);
e_uri_free (euri);
return handled;
}
static void

View File

@ -780,7 +780,7 @@ e_cal_shell_view_open_event (ECalShellView *cal_shell_view,
editor = event_editor_new (comp_data->client, shell, flags);
comp_editor_edit_comp (editor, comp);
g_object_ref (comp);
g_object_unref (comp);
exit:
gtk_window_present (GTK_WINDOW (editor));

View File

@ -430,7 +430,7 @@ task_module_handle_uri_cb (EShellBackend *shell_backend,
}
}
if (source_uid != NULL || comp_uid != NULL)
if (source_uid == NULL || comp_uid == NULL)
goto exit;
/* URI is valid, so consider it handled. Whether