aboutsummaryrefslogtreecommitdiffstats
path: root/calendar/gui/e-itip-control.c
diff options
context:
space:
mode:
authorJP Rosevear <jpr@ximian.com>2003-12-22 01:05:24 +0800
committerJP Rosevear <jpr@src.gnome.org>2003-12-22 01:05:24 +0800
commit093937a09306fc4f6f2cfb730d5e58c8b7d39e25 (patch)
tree6459a5ed73bbe03e319500dbe3e0950c7386d152 /calendar/gui/e-itip-control.c
parentffc6f6edaa26c5764bb91b780e7344440d3d22be (diff)
downloadgsoc2013-evolution-093937a09306fc4f6f2cfb730d5e58c8b7d39e25.tar
gsoc2013-evolution-093937a09306fc4f6f2cfb730d5e58c8b7d39e25.tar.gz
gsoc2013-evolution-093937a09306fc4f6f2cfb730d5e58c8b7d39e25.tar.bz2
gsoc2013-evolution-093937a09306fc4f6f2cfb730d5e58c8b7d39e25.tar.lz
gsoc2013-evolution-093937a09306fc4f6f2cfb730d5e58c8b7d39e25.tar.xz
gsoc2013-evolution-093937a09306fc4f6f2cfb730d5e58c8b7d39e25.tar.zst
gsoc2013-evolution-093937a09306fc4f6f2cfb730d5e58c8b7d39e25.zip
rewrite for new ecal api, cache all ecal's by type and minimize loading.
2003-12-21 JP Rosevear <jpr@ximian.com> * gui/e-itip-control.[hc]: rewrite for new ecal api, cache all ecal's by type and minimize loading. Switch to using the source option menu * conduits/todo/todo-conduit.c (start_calendar_server): ditto * conduits/calendar/calendar-conduit.c (start_calendar_server): use ECalSourceType * importers/icalendar-importer.c (load_file_fn): ditto (vcal_load_file_fn): ditto (gnome_calendar_import_data_fn): ditto * gui/dialogs/task-page.c (source_changed_cb): ditto * gui/dialogs/event-page.c (source_changed_cb): ditto * gui/dialogs/copy-source-dialog.h: update proto * gui/dialogs/copy-source-dialog.c (copy_source_dialog): ditto * gui/alarm-notify/alarm-notify.c (alarm_notify_add_calendar): ditto * gui/tasks-component.c (copy_task_list_cb): ditto (setup_create_ecal): ditto * gui/gnome-cal.c (gnome_calendar_construct): ditto (gnome_calendar_add_event_uri): ditto * gui/e-tasks.c (e_tasks_add_todo_uri): ditto * gui/comp-editor-factory.c (open_client): ditto * gui/calendar-offline-handler.c (backend_go_offline): ditto (backend_go_online): ditto (calendar_offline_handler_init): ditto * gui/calendar-component.c (copy_calendar_cb): ditto (setup_create_ecal): ditto * gui/print.c (print_month_small): don't pass type to e_cal_generate_instances (print_day_details): ditto (print_week_summary): ditto * gui/tag-calendar.c (tag_calendar_by_client): ditto svn path=/trunk/; revision=23994
Diffstat (limited to 'calendar/gui/e-itip-control.c')
-rw-r--r--calendar/gui/e-itip-control.c490
1 files changed, 159 insertions, 331 deletions
diff --git a/calendar/gui/e-itip-control.c b/calendar/gui/e-itip-control.c
index 44f0a97c2c..40b5487e60 100644
--- a/calendar/gui/e-itip-control.c
+++ b/calendar/gui/e-itip-control.c
@@ -41,6 +41,7 @@
#include <bonobo/bonobo-exception.h>
#include <gtkhtml/gtkhtml.h>
#include <gtkhtml/gtkhtml-stream.h>
+#include <libedataserver/e-source-list.h>
#include <libical/ical.h>
#include <libecal/e-cal-component.h>
#include <libecal/e-cal-time-util.h>
@@ -48,6 +49,7 @@
#include <e-util/e-time-utils.h>
#include <e-util/e-dialog-widgets.h>
#include <camel/camel-mime-filter-tohtml.h>
+#include <widgets/misc/e-source-option-menu.h>
#include "dialogs/delete-error.h"
#include "calendar-config.h"
#include "itip-utils.h"
@@ -55,11 +57,12 @@
struct _EItipControlPrivate {
GtkWidget *html;
-
- GPtrArray *event_clients;
- ECal *event_client;
- GPtrArray *task_clients;
- ECal *task_client;
+
+ ESourceList *source_lists[E_CAL_SOURCE_TYPE_LAST];
+ GHashTable *ecals[E_CAL_SOURCE_TYPE_LAST];
+
+ ECal *current_ecal;
+ ECalSourceType type;
char *vcalendar;
ECalComponent *comp;
@@ -72,7 +75,7 @@ struct _EItipControlPrivate {
int current;
int total;
- gchar *calendar_uri;
+ gchar *calendar_uid;
EAccountList *accounts;
@@ -91,12 +94,6 @@ struct _EItipControlPrivate {
#define HTML_BODY_END "</body>"
#define HTML_FOOTER "</html>"
-/* We intentionally use "calendar" instead of "calendar / *" here. We
- * don't want public calendars.
- */
-static const char *calendar_types[] = { "calendar", NULL };
-static const char *tasks_types[] = { "tasks", NULL };
-
static void class_init (EItipControlClass *klass);
static void init (EItipControl *itip);
static void destroy (GtkObject *obj);
@@ -128,123 +125,78 @@ class_init (EItipControlClass *klass)
}
static ECal *
-start_calendar_server (EItipControl *itip, char *uri)
+start_calendar_server (EItipControl *itip, ESource *source, ECalSourceType type)
{
- ECal *client;
- GError *error = NULL;
-
- client = e_cal_new_from_uri (uri, CALOBJ_TYPE_EVENT);
+ EItipControlPrivate *priv;
+ ECal *ecal;
- if (!e_cal_open (client, TRUE, &error)) {
- g_warning (_("start_calendar_server(): %s"), error->message);
- g_error_free (error);
- g_object_unref (client);
+ priv = itip->priv;
+
+ ecal = g_hash_table_lookup (priv->ecals[type], e_source_peek_uid (source));
+ if (ecal)
+ return ecal;
+
+ ecal = e_cal_new (source, type);
+ if (!e_cal_open (ecal, TRUE, NULL))
return NULL;
- }
- return client;
-}
-
-static gboolean
-start_default_server (EItipControl *itip, ECal *client, gboolean tasks)
-{
-#if 0
- if (tasks)
- return e_cal_open_default_tasks (client, FALSE);
- else
- return e_cal_open_default_calendar (client, FALSE);
-#endif
- return FALSE;
+ g_hash_table_insert (priv->ecals[type], g_strdup (e_source_peek_uid (source)), ecal);
+
+ return ecal;
}
-#if 0 /* EPFIXME, rewrite this */
-static GPtrArray *
-get_servers (EItipControl *itip, EvolutionShellClient *shell_client, const char *possible_types[], gboolean tasks)
+static ECal *
+start_calendar_server_by_uid (EItipControl *itip, const char *uid, ECalSourceType type)
{
- GNOME_Evolution_StorageRegistry registry;
- GNOME_Evolution_StorageRegistry_StorageList *storage_list;
- GPtrArray *servers;
- int i, j, k;
- CORBA_Environment ev;
-
- servers = g_ptr_array_new ();
-
- g_object_ref (shell_client);
- registry = evolution_shell_client_get_storage_registry_interface (shell_client);
-
- CORBA_exception_init (&ev);
- storage_list = GNOME_Evolution_StorageRegistry_getStorageList (registry, &ev);
- if (BONOBO_EX (&ev)) {
- CORBA_exception_free (&ev);
- return servers;
- }
+ EItipControlPrivate *priv;
+ int i;
- for (i = 0; i < storage_list->_length; i++) {
- GNOME_Evolution_Storage storage;
- GNOME_Evolution_FolderList *folder_list;
-
- CORBA_exception_init (&ev);
-
- storage = storage_list->_buffer[i];
- folder_list = GNOME_Evolution_Storage__get_folderList (storage, &ev);
- if (BONOBO_EX (&ev)) {
- CORBA_exception_free (&ev);
- continue;
- }
-
- CORBA_exception_free (&ev);
-
- for (j = 0; j < folder_list->_length; j++) {
- GNOME_Evolution_Folder folder;
-
- folder = folder_list->_buffer[j];
- for (k = 0; possible_types[k] != NULL; k++) {
- ECal *client;
- char *uri;
-
- if (itip->priv->destroyed)
- continue;
-
- if (strcmp (possible_types[k], folder.type))
- continue;
-
- uri = e_cal_util_expand_uri (folder.physicalUri, tasks);
- client = start_calendar_server (itip, uri);
- if (client != NULL)
- g_ptr_array_add (servers, client);
- g_free (uri);
+ priv = itip->priv;
- break;
- }
- }
+ for (i = 0; i < E_CAL_SOURCE_TYPE_LAST; i++) {
+ ESource *source;
- CORBA_free (folder_list);
+ source = e_source_list_peek_source_by_uid (priv->source_lists[i], uid);
+ if (source)
+ return start_calendar_server (itip, source, type);
}
- g_object_unref (shell_client);
-
- return servers;
+ return NULL;
}
-#endif
static ECal *
-find_server (GPtrArray *servers, ECalComponent *comp)
+find_server (EItipControl *itip, ECalComponent *comp)
{
+ EItipControlPrivate *priv;
+ GSList *groups, *l;
const char *uid;
- int i;
- e_cal_component_get_uid (comp, &uid);
- for (i = 0; i < servers->len; i++) {
- ECal *client;
- icalcomponent *icalcomp;
-
- client = g_ptr_array_index (servers, i);
- if (e_cal_get_object (client, uid, NULL, &icalcomp, NULL)) {
- icalcomponent_free (icalcomp);
- g_object_ref (client);
+ priv = itip->priv;
+
+ e_cal_component_get_uid (comp, &uid);
- return client;
- }
+ groups = e_source_list_peek_groups (priv->source_lists[priv->type]);
+ for (l = groups; l; l = l->next) {
+ ESourceGroup *group;
+ GSList *sources, *m;
+
+ group = l->data;
+
+ sources = e_source_group_peek_sources (group);
+ for (m = sources; m; m = m->next) {
+ ESource *source;
+ ECal *ecal;
+ icalcomponent *icalcomp;
+
+ source = m->data;
+ ecal = start_calendar_server (itip, source, priv->type);
+
+ if (ecal && e_cal_get_object (ecal, uid, NULL, &icalcomp, NULL)) {
+ icalcomponent_free (icalcomp);
+
+ return ecal;
+ }
+ }
}
return NULL;
@@ -266,22 +218,28 @@ init (EItipControl *itip)
{
EItipControlPrivate *priv;
GtkWidget *scrolled_window;
+ int i;
priv = g_new0 (EItipControlPrivate, 1);
-
itip->priv = priv;
/* Addresses */
priv->accounts = itip_addresses_get ();
- /* Initialize the cal clients */
- priv->event_clients = NULL;
- priv->event_client = NULL;
- priv->task_clients = NULL;
- priv->task_client = NULL;
+ /* Source Lists */
+ for (i = 0; i < E_CAL_SOURCE_TYPE_LAST; i++)
+ priv->source_lists[i] = NULL;
+
+ priv->source_lists[E_CAL_SOURCE_TYPE_EVENT] = e_source_list_new_for_gconf_default ("/apps/evolution/calendar/sources");
+ priv->source_lists[E_CAL_SOURCE_TYPE_TODO] = e_source_list_new_for_gconf_default ("/apps/evolution/tasks/sources");
+
+ /* Initialize the ecal hashes */
+ for (i = 0; i < E_CAL_SOURCE_TYPE_LAST; i++)
+ priv->ecals[i] = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_object_unref);;
+ priv->current_ecal = NULL;
/* Other fields to init */
- priv->calendar_uri = NULL;
+ priv->calendar_uid = NULL;
priv->from_address = NULL;
priv->delegator_address = NULL;
priv->delegator_name = NULL;
@@ -344,8 +302,8 @@ clean_up (EItipControl *itip)
priv->current = 0;
priv->total = 0;
- g_free (priv->calendar_uri);
- priv->calendar_uri = NULL;
+ g_free (priv->calendar_uid);
+ priv->calendar_uid = NULL;
g_free (priv->from_address);
priv->from_address = NULL;
@@ -385,23 +343,14 @@ finalize (GObject *obj)
gtk_object_weakunref (GTK_OBJECT (priv->html), html_destroyed, itip);
priv->accounts = NULL;
-
- if (priv->event_clients) {
- for (i = 0; i < priv->event_clients->len; i++)
- g_object_unref (g_ptr_array_index (priv->event_clients, i));
- g_ptr_array_free (priv->event_clients, TRUE);
- priv->event_client = NULL;
- priv->event_clients = NULL;
- }
-
- if (priv->task_clients) {
- for (i = 0; i < priv->task_clients->len; i++)
- g_object_unref (g_ptr_array_index (priv->task_clients, i));
- g_ptr_array_free (priv->task_clients, TRUE);
- priv->task_client = NULL;
- priv->task_clients = NULL;
+
+ for (i = 0; i < E_CAL_SOURCE_TYPE_LAST; i++) {
+ if (priv->ecals[i]) {
+ g_hash_table_destroy (priv->ecals[i]);
+ priv->ecals[i] = NULL;
+ }
}
-
+
g_free (priv);
itip->priv = NULL;
@@ -724,7 +673,7 @@ write_recurrence_piece (EItipControl *itip, ECalComponent *comp,
/* FIXME This should get the tzid id, not the whole zone */
dt.value = &r->until;
- dt.tzid = r->until.zone;
+ dt.tzid = icaltimezone_get_tzid ((icaltimezone *)r->until.zone);
write_label_piece (itip, &dt, buffer, size,
_(", ending on "), NULL, TRUE);
@@ -1180,28 +1129,14 @@ get_real_item (EItipControl *itip)
EItipControlPrivate *priv;
ECalComponent *comp;
icalcomponent *icalcomp;
- ECalComponentVType type;
gboolean found = FALSE;
const char *uid;
priv = itip->priv;
- type = e_cal_component_get_vtype (priv->comp);
e_cal_component_get_uid (priv->comp, &uid);
- switch (type) {
- case E_CAL_COMPONENT_EVENT:
- if (priv->event_client != NULL)
- found = e_cal_get_object (priv->event_client, uid, NULL, &icalcomp, NULL);
- break;
- case E_CAL_COMPONENT_TODO:
- if (priv->task_client != NULL)
- found = e_cal_get_object (priv->task_client, uid, NULL, &icalcomp, NULL);
- break;
- default:
- found = FALSE;
- }
-
+ found = e_cal_get_object (priv->current_ecal, uid, NULL, &icalcomp, NULL);
if (!found)
return NULL;
@@ -1251,16 +1186,17 @@ show_current_event (EItipControl *itip)
priv = itip->priv;
- if (priv->calendar_uri)
- priv->event_client = start_calendar_server (itip, priv->calendar_uri);
+ priv->type = E_CAL_SOURCE_TYPE_EVENT;
+ if (priv->calendar_uid)
+ priv->current_ecal = start_calendar_server_by_uid (itip, priv->calendar_uid, priv->type);
else
- priv->event_client = find_server (priv->event_clients, priv->comp);
+ priv->current_ecal = find_server (itip, priv->comp);
switch (priv->method) {
case ICAL_METHOD_PUBLISH:
itip_desc = _("<b>%s</b> has published meeting information.");
itip_title = _("Meeting Information");
- options = get_publish_options (priv->event_client ? FALSE : TRUE);
+ options = get_publish_options (priv->current_ecal ? FALSE : TRUE);
break;
case ICAL_METHOD_REQUEST:
if (priv->delegator_address != NULL)
@@ -1268,12 +1204,12 @@ show_current_event (EItipControl *itip)
else
itip_desc = _("<b>%s</b> requests your presence at a meeting.");
itip_title = _("Meeting Proposal");
- options = get_request_options (priv->event_client ? FALSE : TRUE);
+ options = get_request_options (priv->current_ecal ? FALSE : TRUE);
break;
case ICAL_METHOD_ADD:
itip_desc = _("<b>%s</b> wishes to add to an existing meeting.");
itip_title = _("Meeting Update");
- options = get_publish_options (priv->event_client ? FALSE : TRUE);
+ options = get_publish_options (priv->current_ecal ? FALSE : TRUE);
break;
case ICAL_METHOD_REFRESH:
itip_desc = _("<b>%s</b> wishes to receive the latest meeting information.");
@@ -1318,16 +1254,17 @@ show_current_todo (EItipControl *itip)
priv = itip->priv;
- if (priv->calendar_uri)
- priv->task_client = start_calendar_server (itip, priv->calendar_uri);
+ priv->type = E_CAL_SOURCE_TYPE_TODO;
+ if (priv->calendar_uid)
+ priv->current_ecal = start_calendar_server_by_uid (itip, priv->calendar_uid, priv->type);
else
- priv->task_client = find_server (priv->task_clients, priv->comp);
+ priv->current_ecal = find_server (itip, priv->comp);
switch (priv->method) {
case ICAL_METHOD_PUBLISH:
itip_desc = _("<b>%s</b> has published task information.");
itip_title = _("Task Information");
- options = get_publish_options (priv->task_client ? FALSE : TRUE);
+ options = get_publish_options (priv->current_ecal ? FALSE : TRUE);
break;
case ICAL_METHOD_REQUEST:
if (priv->delegator_address != NULL)
@@ -1335,12 +1272,12 @@ show_current_todo (EItipControl *itip)
else
itip_desc = _("<b>%s</b> requests you perform a task.");
itip_title = _("Task Proposal");
- options = get_request_options (priv->task_client ? FALSE : TRUE);
+ options = get_request_options (priv->current_ecal ? FALSE : TRUE);
break;
case ICAL_METHOD_ADD:
itip_desc = _("<b>%s</b> wishes to add to an existing task.");
itip_title = _("Task Update");
- options = get_publish_options (priv->task_client ? FALSE : TRUE);
+ options = get_publish_options (priv->current_ecal ? FALSE : TRUE);
break;
case ICAL_METHOD_REFRESH:
itip_desc = _("<b>%s</b> wishes to receive the latest task information.");
@@ -1444,12 +1381,7 @@ show_current (EItipControl *itip)
if (priv->comp)
g_object_unref (priv->comp);
- if (priv->event_client != NULL)
- g_object_unref (priv->event_client);
- priv->event_client = NULL;
- if (priv->task_client != NULL)
- g_object_unref (priv->task_client);
- priv->task_client = NULL;
+ priv->current_ecal = NULL;
/* Determine any delegate sections */
prop = icalcomponent_get_first_property (priv->ical_comp, ICAL_X_PROPERTY);
@@ -1459,8 +1391,10 @@ show_current (EItipControl *itip)
x_name = icalproperty_get_x_name (prop);
x_val = icalproperty_get_x (prop);
- if (!strcmp (x_name, "X-EVOLUTION-DELEGATOR-CALENDAR-URI"))
- e_itip_control_set_calendar_uri (itip, x_val);
+ if (!strcmp (x_name, "X-EVOLUTION-DELEGATOR-CALENDAR-UID"))
+ e_itip_control_set_calendar_uid (itip, x_val);
+ else if (!strcmp (x_name, "X-EVOLUTION-DELEGATOR-CALENDAR-URI"))
+ g_warning (G_STRLOC ": X-EVOLUTION-DELEGATOR-CALENDAR-URI used");
else if (!strcmp (x_name, "X-EVOLUTION-DELEGATOR-ADDRESS"))
e_itip_control_set_delegator_address (itip, x_val);
else if (!strcmp (x_name, "X-EVOLUTION-DELEGATOR-NAME"))
@@ -1529,18 +1463,9 @@ show_current (EItipControl *itip)
switch (type) {
case E_CAL_COMPONENT_EVENT:
- if (!priv->event_clients) {
- priv->event_clients = g_ptr_array_new ();
- /* EPFIXME */
- /* priv->event_clients = get_servers (itip, global_shell_client, calendar_types, FALSE); */
- }
show_current_event (itip);
break;
case E_CAL_COMPONENT_TODO:
- if (!priv->task_clients) {
- /* EPFIXME */
- /* priv->task_clients = get_servers (itip, global_shell_client, tasks_types, TRUE); */
- }
show_current_todo (itip);
break;
case E_CAL_COMPONENT_FREEBUSY:
@@ -1740,26 +1665,26 @@ e_itip_control_get_delegator_name (EItipControl *itip)
}
void
-e_itip_control_set_calendar_uri (EItipControl *itip, const gchar *uri)
+e_itip_control_set_calendar_uid (EItipControl *itip, const gchar *uri)
{
EItipControlPrivate *priv;
priv = itip->priv;
- if (priv->calendar_uri)
- g_free (priv->calendar_uri);
+ if (priv->calendar_uid)
+ g_free (priv->calendar_uid);
- priv->calendar_uri = g_strdup (uri);
+ priv->calendar_uid = g_strdup (uri);
}
const gchar *
-e_itip_control_get_calendar_uri (EItipControl *itip)
+e_itip_control_get_calendar_uid (EItipControl *itip)
{
EItipControlPrivate *priv;
priv = itip->priv;
- return priv->calendar_uri;
+ return priv->calendar_uid;
}
@@ -1816,8 +1741,6 @@ update_item (EItipControl *itip)
struct icaltimetype stamp;
icalproperty *prop;
icalcomponent *clone;
- ECal *client;
- ECalComponentVType type;
GtkWidget *dialog;
priv = itip->priv;
@@ -1835,19 +1758,13 @@ update_item (EItipControl *itip)
prop = icalproperty_new_x (icaltime_as_ical_string (stamp));
icalproperty_set_x_name (prop, "X-MICROSOFT-CDO-REPLYTIME");
icalcomponent_add_property (priv->ical_comp, prop);
-
- type = e_cal_component_get_vtype (priv->comp);
- if (type == E_CAL_COMPONENT_TODO)
- client = priv->task_client;
- else
- client = priv->event_client;
clone = icalcomponent_new_clone (priv->ical_comp);
icalcomponent_add_component (priv->top_level, clone);
icalcomponent_set_method (priv->top_level, priv->method);
/* FIXME Better error dialog */
- if (!e_cal_receive_objects (client, priv->top_level, NULL)) {
+ if (!e_cal_receive_objects (priv->current_ecal, priv->top_level, NULL)) {
dialog = gnome_warning_dialog (_("Calendar file could not be updated!\n"));
} else {
dialog = gnome_ok_dialog (_("Update complete\n"));
@@ -1967,30 +1884,23 @@ static void
remove_item (EItipControl *itip)
{
EItipControlPrivate *priv;
- ECal *client;
- ECalComponentVType type;
const char *uid;
GtkWidget *dialog;
GError *error = NULL;
priv = itip->priv;
- type = e_cal_component_get_vtype (priv->comp);
- if (type == E_CAL_COMPONENT_TODO)
- client = priv->task_client;
- else
- client = priv->event_client;
-
- if (client == NULL)
+ /* FIXME Is this check necessary? */
+ if (!priv->current_ecal)
return;
e_cal_component_get_uid (priv->comp, &uid);
- e_cal_remove_object (client, uid, &error);
+ e_cal_remove_object (priv->current_ecal, uid, &error);
if (!error || error->code == E_CALENDAR_STATUS_OBJECT_NOT_FOUND) {
dialog = gnome_ok_dialog (_("Removal Complete"));
gnome_dialog_run_and_close (GNOME_DIALOG (dialog));
} else {
- delete_error_dialog (error, type);
+ delete_error_dialog (error, e_cal_component_get_vtype (priv->comp));
}
g_clear_error (&error);
@@ -2001,25 +1911,14 @@ send_item (EItipControl *itip)
{
EItipControlPrivate *priv;
ECalComponent *comp;
- ECalComponentVType vtype;
GtkWidget *dialog;
priv = itip->priv;
comp = get_real_item (itip);
- vtype = e_cal_component_get_vtype (comp);
if (comp != NULL) {
- switch (vtype) {
- case E_CAL_COMPONENT_EVENT:
- itip_send_comp (E_CAL_COMPONENT_METHOD_REQUEST, comp, priv->event_client, NULL);
- break;
- case E_CAL_COMPONENT_TODO:
- itip_send_comp (E_CAL_COMPONENT_METHOD_REQUEST, comp, priv->task_client, NULL);
- break;
- default:
- itip_send_comp (E_CAL_COMPONENT_METHOD_REQUEST, comp, NULL, NULL);
- }
+ itip_send_comp (E_CAL_COMPONENT_METHOD_REQUEST, comp, priv->current_ecal, NULL);
g_object_unref (comp);
dialog = gnome_ok_dialog (_("Item sent!\n"));
} else {
@@ -2060,12 +1959,12 @@ send_freebusy (EItipControl *itip)
end = icaltime_as_timet_with_zone (*datetime.value, zone);
e_cal_component_free_datetime (&datetime);
- if (e_cal_get_free_busy (priv->event_client, NULL, start, end, &comp_list, NULL)) {
+ if (e_cal_get_free_busy (priv->current_ecal, NULL, start, end, &comp_list, NULL)) {
GList *l;
for (l = comp_list; l; l = l->next) {
ECalComponent *comp = E_CAL_COMPONENT (l->data);
- itip_send_comp (E_CAL_COMPONENT_METHOD_REPLY, comp, priv->event_client, NULL);
+ itip_send_comp (E_CAL_COMPONENT_METHOD_REPLY, comp, priv->current_ecal, NULL);
g_object_unref (comp);
}
@@ -2078,29 +1977,22 @@ send_freebusy (EItipControl *itip)
gnome_dialog_run_and_close (GNOME_DIALOG (dialog));
}
-#if 0 /* FIXME */
static void
-button_selected_cb (EvolutionFolderSelectorButton *button, GNOME_Evolution_Folder *folder, gpointer data)
+source_selected_cb (ESourceOptionMenu *esom, ESource *source, gpointer data)
{
- EItipControl *itip = E_ITIP_CONTROL (data);
+ EItipControl *itip = data;
EItipControlPrivate *priv;
- ECalComponentVType type;
- char *uri;
+ ECal *ecal = NULL;
priv = itip->priv;
-
- type = e_cal_component_get_vtype (priv->comp);
- if (type == E_CAL_COMPONENT_TODO)
- uri = e_cal_util_expand_uri (folder->physicalUri, TRUE);
- else
- uri = e_cal_util_expand_uri (folder->physicalUri, FALSE);
- g_object_unref (priv->event_client);
- priv->event_client = start_calendar_server (itip, uri);
+ ecal = start_calendar_server (itip, source, priv->type);
+ if (!ecal) {
+ /* FIXME Show error dialog */
+ }
- g_free (uri);
+ priv->current_ecal = ecal;
}
-#endif
static void
url_requested_cb (GtkHTML *html, const gchar *url, GtkHTMLStream *handle, gpointer data)
@@ -2133,104 +2025,50 @@ url_requested_cb (GtkHTML *html, const gchar *url, GtkHTMLStream *handle, gpoint
g_free (path);
}
-typedef struct
-{
- EItipControl *itip;
- GtkHTMLEmbedded *eb;
- ECal *client;
-}
-ObjectRequestContext;
-
-static void
-default_server_started_cb (ECal *client, ECalendarStatus status, gpointer data)
-{
- ObjectRequestContext *context = data;
- EItipControlPrivate *priv;
- GtkWidget *button;
- ECalComponentVType vtype;
-
- priv = context->itip->priv;
-
- if (status != E_CALENDAR_STATUS_OK ||
- context->itip->priv->destroyed ||
- context->itip->priv->html == NULL) {
- g_object_unref (context->client);
- g_object_unref (context->itip);
- g_free (context);
- return;
- }
-
- priv->event_client = client;
- vtype = e_cal_component_get_vtype (priv->comp);
-
- switch (vtype) {
-#if 0 /* EPFIXME */
- case E_CAL_COMPONENT_EVENT:
- button = evolution_folder_selector_button_new (
- global_shell_client, _("Select Calendar Folder"),
- calendar_config_default_calendar_folder (),
- calendar_types);
- break;
- case E_CAL_COMPONENT_TODO:
- button = evolution_folder_selector_button_new (
- global_shell_client, _("Select Tasks Folder"),
- calendar_config_default_tasks_folder (),
- tasks_types);
- break;
-#endif
- default:
- button = NULL;
- }
-
-#if 0
- g_signal_connect (button, "selected", G_CALLBACK (button_selected_cb), context->itip);
-#endif
-
- gtk_container_add (GTK_CONTAINER (context->eb), button);
- gtk_widget_show (button);
-
- g_object_unref (context->itip);
- g_free (context);
- return;
-}
-
static gboolean
object_requested_cb (GtkHTML *html, GtkHTMLEmbedded *eb, gpointer data)
{
EItipControl *itip = E_ITIP_CONTROL (data);
- ObjectRequestContext *context;
EItipControlPrivate *priv;
- ECalComponentVType vtype;
- gboolean success;
-
+ GtkWidget *esom;
+ ESource *source = NULL;
+ char *uid;
+
priv = itip->priv;
- vtype = e_cal_component_get_vtype (priv->comp);
-
- context = g_new0 (ObjectRequestContext, 1);
- context->itip = itip;
- context->eb = eb;
- switch (vtype) {
- case E_CAL_COMPONENT_EVENT:
- context->client = e_cal_new_from_uri ("", CALOBJ_TYPE_EVENT);
- success = start_default_server (itip, context->client, FALSE);
+ switch (priv->type) {
+ case E_CAL_SOURCE_TYPE_EVENT:
+ uid = calendar_config_get_primary_calendar ();
break;
- case E_CAL_COMPONENT_TODO:
- context->client = e_cal_new_from_uri ("", CALOBJ_TYPE_TODO);
- success = start_default_server (itip, context->client, TRUE);
+ case E_CAL_SOURCE_TYPE_TODO:
+ uid = calendar_config_get_primary_tasks ();
break;
default:
- g_free (context);
return FALSE;
+ }
+
+ if (uid) {
+ source = e_source_list_peek_source_by_uid (priv->source_lists[priv->type], uid);
+ g_free (uid);
}
-
- if (!success) {
- g_object_unref (context->client);
- g_free (context);
- return FALSE;
+ if (!source) {
+ ESource *source;
+
+ /* Try to create a default if there isn't one */
+ source = e_source_list_peek_source_any (priv->source_lists[priv->type]);
}
- g_object_ref (itip);
+ esom = e_source_option_menu_new (priv->source_lists[priv->type]);
+ g_signal_connect_object (esom, "source_selected",
+ G_CALLBACK (source_selected_cb),
+ itip, 0);
+
+ gtk_container_add (GTK_CONTAINER (eb), esom);
+ gtk_widget_show (esom);
+
+ /* FIXME What if there is no source? */
+ if (source)
+ e_source_option_menu_select (E_SOURCE_OPTION_MENU (esom), source);
return TRUE;
}
@@ -2356,18 +2194,8 @@ ok_clicked_cb (GtkHTML *html, const gchar *method, const gchar *url, const gchar
g_slist_free (list);
e_cal_component_rescan (comp);
- switch (vtype) {
- case E_CAL_COMPONENT_EVENT:
- itip_send_comp (E_CAL_COMPONENT_METHOD_REPLY, comp,
- priv->event_client, priv->top_level);
- break;
- case E_CAL_COMPONENT_TODO:
- itip_send_comp (E_CAL_COMPONENT_METHOD_REPLY, comp,
- priv->task_client, priv->top_level);
- break;
- default:
- itip_send_comp (E_CAL_COMPONENT_METHOD_REPLY, comp, NULL, NULL);
- }
+ itip_send_comp (E_CAL_COMPONENT_METHOD_REPLY, comp, priv->current_ecal, priv->top_level);
+
g_object_unref (comp);
}
}