From fc2c499f8bc737190309484a96e13dccd3cefbdf Mon Sep 17 00:00:00 2001 From: Dan Winship Date: Fri, 27 Sep 2002 20:23:20 +0000 Subject: Non-Connector part of #29334 (meeting created by a delegate in the delegator's calendar should have the delegator as Organizer). * idl/evolution-calendar.idl: add Cal_getEmailAddress, to return the email address associated with a backend (if any). * pcs/cal-backend.c (cal_backend_get_email_address): New. * pcs/cal-backend-file.c (cal_backend_file_get_email_address): Return NULL (for now). * pcs/cal.c (impl_Cal_get_email_address): Implement this by calling cal_backend_get_email_address and returning a NotFound exception if it returns NULL. * cal-client/cal-client.c (cal_client_get_email_address): New. (cal_client_init, cal_client_destroy, etc): initialize/free email_address * gui/dialogs/event-editor.c (event_editor_construct): Split this out of event_editor_init. Take and set a CalClient. (event_editor_new): Take a CalClient. * gui/dialogs/task-editor.c (task_editor_construct, task_editor_new): Likewise. * gui/dialogs/meeting-page.c (meeting_page_new, meeting_page_construct): Take a CalClient and call cal_client_get_email_address to find the default organizer address. (Also fix a bug if the default account's name has non-ASCII characters.) * gui/itip-utils.c (comp_from): New. When sending a REQUEST or CANCEL, use the Organizer as the From address. (itip_send_comp): Call comp_from and pass the result to Composer_setHeaders. * gui/comp-editor-factory.c (edit_existing, edit_new): Pass the CalClient to event_editor_new/task_editor_new * gui/e-calendar-table.c (open_task): Likewise. * gui/e-tasks.c (e_tasks_new_task): Likewise. * gui/gnome-cal.c (gnome_calendar_edit_object, gnome_calendar_new_task): Likewise. svn path=/trunk/; revision=18253 --- calendar/ChangeLog | 49 +++++++++++++++++++++++++++++++++++++ calendar/cal-client/cal-client.c | 46 ++++++++++++++++++++++++++++++++++ calendar/cal-client/cal-client.h | 2 ++ calendar/gui/comp-editor-factory.c | 14 +++++------ calendar/gui/dialogs/event-editor.c | 31 +++++++++++++++++------ calendar/gui/dialogs/event-editor.h | 5 ++-- calendar/gui/dialogs/meeting-page.c | 20 +++++++++++---- calendar/gui/dialogs/meeting-page.h | 6 +++-- calendar/gui/dialogs/task-editor.c | 32 ++++++++++++++++++------ calendar/gui/dialogs/task-editor.h | 5 ++-- calendar/gui/e-calendar-table.c | 3 +-- calendar/gui/e-tasks.c | 3 +-- calendar/gui/gnome-cal.c | 6 ++--- calendar/gui/itip-utils.c | 31 +++++++++++++++++++++-- calendar/idl/evolution-calendar.idl | 5 ++++ calendar/pcs/cal-backend-file.c | 12 +++++++++ calendar/pcs/cal-backend.c | 20 +++++++++++++++ calendar/pcs/cal-backend.h | 4 +++ calendar/pcs/cal.c | 25 +++++++++++++++++++ 19 files changed, 274 insertions(+), 45 deletions(-) diff --git a/calendar/ChangeLog b/calendar/ChangeLog index 94f6faa2bd..63363ace19 100644 --- a/calendar/ChangeLog +++ b/calendar/ChangeLog @@ -1,3 +1,52 @@ +2002-09-26 Dan Winship + + Non-Connector part of #29334 (meeting created by a delegate in the + delegator's calendar should have the delegator as Organizer). + + * idl/evolution-calendar.idl: add Cal_getEmailAddress, to return + the email address associated with a backend (if any). + + * pcs/cal-backend.c (cal_backend_get_email_address): New. + + * pcs/cal-backend-file.c (cal_backend_file_get_email_address): + Return NULL (for now). + + * pcs/cal.c (impl_Cal_get_email_address): Implement this by + calling cal_backend_get_email_address and returning a NotFound + exception if it returns NULL. + + * cal-client/cal-client.c (cal_client_get_email_address): New. + (cal_client_init, cal_client_destroy, etc): initialize/free + email_address + + * gui/dialogs/event-editor.c (event_editor_construct): Split this + out of event_editor_init. Take and set a CalClient. + (event_editor_new): Take a CalClient. + + * gui/dialogs/task-editor.c (task_editor_construct, + task_editor_new): Likewise. + + * gui/dialogs/meeting-page.c (meeting_page_new, + meeting_page_construct): Take a CalClient and call + cal_client_get_email_address to find the default organizer + address. (Also fix a bug if the default account's name has + non-ASCII characters.) + + * gui/itip-utils.c (comp_from): New. When sending a REQUEST or + CANCEL, use the Organizer as the From address. + (itip_send_comp): Call comp_from and pass the result to + Composer_setHeaders. + + * gui/comp-editor-factory.c (edit_existing, edit_new): Pass the + CalClient to event_editor_new/task_editor_new + + * gui/e-calendar-table.c (open_task): Likewise. + + * gui/e-tasks.c (e_tasks_new_task): Likewise. + + * gui/gnome-cal.c (gnome_calendar_edit_object, + gnome_calendar_new_task): Likewise. + 2002-09-26 JP Rosevear * gui/e-meeting-model.c (set_value_at): only change the attendee diff --git a/calendar/cal-client/cal-client.c b/calendar/cal-client/cal-client.c index 6d9deacde8..21932ed464 100644 --- a/calendar/cal-client/cal-client.c +++ b/calendar/cal-client/cal-client.c @@ -47,6 +47,9 @@ struct _CalClientPrivate { */ char *uri; + /* Email address associated with this calendar, or NULL */ + char *email_address; + /* The calendar factories we are contacting */ GList *factories; @@ -232,6 +235,7 @@ cal_client_init (CalClient *client) priv->load_state = CAL_CLIENT_LOAD_NOT_LOADED; priv->uri = NULL; + priv->email_address = NULL; priv->factories = NULL; priv->timezones = g_hash_table_new (g_str_hash, g_str_equal); priv->w_client = NULL; @@ -363,6 +367,11 @@ cal_client_destroy (GtkObject *object) priv->uri = NULL; } + if (priv->email_address) { + g_free (priv->email_address); + priv->email_address = NULL; + } + g_hash_table_foreach (priv->timezones, free_timezone, NULL); g_hash_table_destroy (priv->timezones); priv->timezones = NULL; @@ -1009,6 +1018,43 @@ cal_client_get_uri (CalClient *client) return priv->uri; } +/** + * cal_client_get_email_address: + * @client: A calendar client. + * + * Queries the email address associated with a calendar client. + * + * Return value: The email address associated with the calendar that + * is loaded or being loaded, or %NULL if the client has not started a + * load request yet or the calendar has no associated email address. + **/ +const char * +cal_client_get_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->email_address == NULL) { + CORBA_Environment ev; + CORBA_char *email_address; + + CORBA_exception_init (&ev); + email_address = GNOME_Evolution_Calendar_Cal_getEmailAddress (priv->cal, &ev); + if (!BONOBO_EX (&ev)) { + priv->email_address = g_strdup (email_address); + CORBA_free (email_address); + } + CORBA_exception_free (&ev); + } + + return priv->email_address; +} + /* Converts our representation of a calendar component type into its CORBA representation */ static GNOME_Evolution_Calendar_CalObjType corba_obj_type (CalObjType type) diff --git a/calendar/cal-client/cal-client.h b/calendar/cal-client/cal-client.h index ef42cdccd6..f636bf4896 100644 --- a/calendar/cal-client/cal-client.h +++ b/calendar/cal-client/cal-client.h @@ -143,6 +143,8 @@ CalClientLoadState cal_client_get_load_state (CalClient *client); const char *cal_client_get_uri (CalClient *client); +const char *cal_client_get_email_address (CalClient *client); + gboolean cal_client_set_mode (CalClient *client, CalMode mode); int cal_client_get_n_objects (CalClient *client, CalObjType type); diff --git a/calendar/gui/comp-editor-factory.c b/calendar/gui/comp-editor-factory.c index 8cba8baade..31746ae55b 100644 --- a/calendar/gui/comp-editor-factory.c +++ b/calendar/gui/comp-editor-factory.c @@ -272,11 +272,11 @@ edit_existing (OpenClient *oc, const char *uid) switch (vtype) { case CAL_COMPONENT_EVENT: - editor = COMP_EDITOR (event_editor_new ()); + editor = COMP_EDITOR (event_editor_new (oc->client)); break; case CAL_COMPONENT_TODO: - editor = COMP_EDITOR (task_editor_new ()); + editor = COMP_EDITOR (task_editor_new (oc->client)); break; default: @@ -285,8 +285,7 @@ edit_existing (OpenClient *oc, const char *uid) return; } - /* Set the client/object on the editor */ - comp_editor_set_cal_client (editor, oc->client); + /* Set the object on the editor */ comp_editor_edit_comp (editor, comp); comp_editor_focus (editor); @@ -360,15 +359,15 @@ edit_new (OpenClient *oc, const GNOME_Evolution_Calendar_CompEditorFactory_CompE switch (type) { case GNOME_Evolution_Calendar_CompEditorFactory_EDITOR_MODE_EVENT: case GNOME_Evolution_Calendar_CompEditorFactory_EDITOR_MODE_MEETING: - editor = COMP_EDITOR (event_editor_new ()); + editor = COMP_EDITOR (event_editor_new (oc->client)); comp = get_default_event (FALSE); break; case GNOME_Evolution_Calendar_CompEditorFactory_EDITOR_MODE_ALLDAY_EVENT: - editor = COMP_EDITOR (event_editor_new ()); + editor = COMP_EDITOR (event_editor_new (oc->client)); comp = get_default_event (TRUE); break; case GNOME_Evolution_Calendar_CompEditorFactory_EDITOR_MODE_TODO: - editor = COMP_EDITOR (task_editor_new ()); + editor = COMP_EDITOR (task_editor_new (oc->client)); comp = get_default_task (); break; default: @@ -376,7 +375,6 @@ edit_new (OpenClient *oc, const GNOME_Evolution_Calendar_CompEditorFactory_CompE return; } - comp_editor_set_cal_client (editor, oc->client); comp_editor_edit_comp (editor, comp); if (type == GNOME_Evolution_Calendar_CompEditorFactory_EDITOR_MODE_MEETING) event_editor_show_meeting (EVENT_EDITOR (editor)); diff --git a/calendar/gui/dialogs/event-editor.c b/calendar/gui/dialogs/event-editor.c index 20b91475d4..4ee2556d97 100644 --- a/calendar/gui/dialogs/event-editor.c +++ b/calendar/gui/dialogs/event-editor.c @@ -188,6 +188,18 @@ event_editor_init (EventEditor *ee) priv = g_new0 (EventEditorPrivate, 1); ee->priv = priv; + priv->model = E_MEETING_MODEL (e_meeting_model_new ()); + priv->meeting_shown = TRUE; + priv->updating = FALSE; +} + +EventEditor * +event_editor_construct (EventEditor *ee, CalClient *client) +{ + EventEditorPrivate *priv; + + priv = ee->priv; + priv->event_page = event_page_new (); comp_editor_append_page (COMP_EDITOR (ee), COMP_EDITOR_PAGE (priv->event_page), @@ -203,25 +215,24 @@ event_editor_init (EventEditor *ee) COMP_EDITOR_PAGE (priv->recur_page), _("Recurrence")); - priv->model = E_MEETING_MODEL (e_meeting_model_new ()); - priv->sched_page = schedule_page_new (priv->model); comp_editor_append_page (COMP_EDITOR (ee), COMP_EDITOR_PAGE (priv->sched_page), _("Scheduling")); - priv->meet_page = meeting_page_new (priv->model); + priv->meet_page = meeting_page_new (priv->model, client); comp_editor_append_page (COMP_EDITOR (ee), COMP_EDITOR_PAGE (priv->meet_page), _("Meeting")); - comp_editor_merge_ui (COMP_EDITOR (ee), "evolution-event-editor.xml", verbs, pixmaps); + comp_editor_set_cal_client (COMP_EDITOR (ee), client); - priv->meeting_shown = TRUE; - priv->updating = FALSE; + comp_editor_merge_ui (COMP_EDITOR (ee), "evolution-event-editor.xml", verbs, pixmaps); init_widgets (ee); set_menu_sens (ee); + + return ee; } static void @@ -382,6 +393,7 @@ event_editor_destroy (GtkObject *object) /** * event_editor_new: + * @client: a CalClient * * Creates a new event editor dialog. * @@ -389,9 +401,12 @@ event_editor_destroy (GtkObject *object) * editor could not be created. **/ EventEditor * -event_editor_new (void) +event_editor_new (CalClient *client) { - return EVENT_EDITOR (gtk_type_new (TYPE_EVENT_EDITOR)); + EventEditor *ee; + + ee = EVENT_EDITOR (gtk_type_new (TYPE_EVENT_EDITOR)); + return event_editor_construct (ee, client); } static void diff --git a/calendar/gui/dialogs/event-editor.h b/calendar/gui/dialogs/event-editor.h index d27bb8e52d..1b6f72829a 100644 --- a/calendar/gui/dialogs/event-editor.h +++ b/calendar/gui/dialogs/event-editor.h @@ -52,8 +52,9 @@ struct _EventEditorClass { }; GtkType event_editor_get_type (void); -EventEditor *event_editor_construct (EventEditor *ee); -EventEditor *event_editor_new (void); +EventEditor *event_editor_construct (EventEditor *ee, + CalClient *client); +EventEditor *event_editor_new (CalClient *client); void event_editor_show_meeting (EventEditor *ee); diff --git a/calendar/gui/dialogs/meeting-page.c b/calendar/gui/dialogs/meeting-page.c index 011f1301af..44ff76eb08 100644 --- a/calendar/gui/dialogs/meeting-page.c +++ b/calendar/gui/dialogs/meeting-page.c @@ -733,11 +733,13 @@ table_canvas_focus_out_cb (GtkWidget *widget, GdkEventFocus *event, gpointer dat * be created. **/ MeetingPage * -meeting_page_construct (MeetingPage *mpage, EMeetingModel *emm) +meeting_page_construct (MeetingPage *mpage, EMeetingModel *emm, + CalClient *client) { MeetingPagePrivate *priv; ETable *real_table; gchar *filename; + const char *backend_address; GList *l; priv = mpage->priv; @@ -757,6 +759,8 @@ meeting_page_construct (MeetingPage *mpage, EMeetingModel *emm) } /* Address information */ + backend_address = cal_client_get_email_address (client); + priv->addresses = itip_addresses_get (); for (l = priv->addresses; l != NULL; l = l->next) { ItipAddress *a = l->data; @@ -764,8 +768,14 @@ meeting_page_construct (MeetingPage *mpage, EMeetingModel *emm) s = e_utf8_to_gtk_string (GTK_COMBO (priv->organizer)->entry, a->full); priv->address_strings = g_list_append (priv->address_strings, s); - if (a->default_address) - priv->default_address = s; + + /* Note that the address specified by the backend gets + * precedence over the default mail address. + */ + if (backend_address && !strcmp (backend_address, a->address)) + priv->default_address = a->full; + else if (a->default_address && !priv->default_address) + priv->default_address = a->full; } /* The etable displaying attendees and their status */ @@ -803,12 +813,12 @@ meeting_page_construct (MeetingPage *mpage, EMeetingModel *emm) * not be created. **/ MeetingPage * -meeting_page_new (EMeetingModel *emm) +meeting_page_new (EMeetingModel *emm, CalClient *client) { MeetingPage *mpage; mpage = gtk_type_new (TYPE_MEETING_PAGE); - if (!meeting_page_construct (mpage, emm)) { + if (!meeting_page_construct (mpage, emm, client)) { gtk_object_unref (GTK_OBJECT (mpage)); return NULL; } diff --git a/calendar/gui/dialogs/meeting-page.h b/calendar/gui/dialogs/meeting-page.h index b7c8571b44..be55aecf98 100644 --- a/calendar/gui/dialogs/meeting-page.h +++ b/calendar/gui/dialogs/meeting-page.h @@ -53,8 +53,10 @@ typedef struct { GtkType meeting_page_get_type (void); MeetingPage *meeting_page_construct (MeetingPage *mpage, - EMeetingModel *emm); -MeetingPage *meeting_page_new (EMeetingModel *emm); + EMeetingModel *emm, + CalClient *client); +MeetingPage *meeting_page_new (EMeetingModel *emm, + CalClient *client); CalComponent *meeting_page_get_cancel_comp (MeetingPage *mpage); diff --git a/calendar/gui/dialogs/task-editor.c b/calendar/gui/dialogs/task-editor.c index 6261b8deda..e3c55ffe29 100644 --- a/calendar/gui/dialogs/task-editor.c +++ b/calendar/gui/dialogs/task-editor.c @@ -176,6 +176,19 @@ task_editor_init (TaskEditor *te) priv = g_new0 (TaskEditorPrivate, 1); te->priv = priv; + priv->model = E_MEETING_MODEL (e_meeting_model_new ()); + priv->assignment_shown = TRUE; + priv->updating = FALSE; + +} + +TaskEditor * +task_editor_construct (TaskEditor *te, CalClient *client) +{ + TaskEditorPrivate *priv; + + priv = te->priv; + priv->task_page = task_page_new (); comp_editor_append_page (COMP_EDITOR (te), COMP_EDITOR_PAGE (priv->task_page), @@ -186,20 +199,19 @@ task_editor_init (TaskEditor *te) COMP_EDITOR_PAGE (priv->task_details_page), _("Details")); - priv->model = E_MEETING_MODEL (e_meeting_model_new ()); - - priv->meet_page = meeting_page_new (priv->model); + priv->meet_page = meeting_page_new (priv->model, client); comp_editor_append_page (COMP_EDITOR (te), COMP_EDITOR_PAGE (priv->meet_page), _("Assignment")); - comp_editor_merge_ui (COMP_EDITOR (te), "evolution-task-editor.xml", verbs, NULL); + comp_editor_set_cal_client (COMP_EDITOR (te), client); - priv->assignment_shown = TRUE; - priv->updating = FALSE; + comp_editor_merge_ui (COMP_EDITOR (te), "evolution-task-editor.xml", verbs, NULL); init_widgets (te); set_menu_sens (te); + + return te; } static void @@ -334,6 +346,7 @@ task_editor_destroy (GtkObject *object) /** * task_editor_new: + * @client: a CalClient * * Creates a new event editor dialog. * @@ -341,9 +354,12 @@ task_editor_destroy (GtkObject *object) * editor could not be created. **/ TaskEditor * -task_editor_new (void) +task_editor_new (CalClient *client) { - return TASK_EDITOR (gtk_type_new (TYPE_TASK_EDITOR)); + TaskEditor *te; + + te = TASK_EDITOR (gtk_type_new (TYPE_TASK_EDITOR)); + return task_editor_construct (te, client); } static void diff --git a/calendar/gui/dialogs/task-editor.h b/calendar/gui/dialogs/task-editor.h index e9888f446a..070546bee0 100644 --- a/calendar/gui/dialogs/task-editor.h +++ b/calendar/gui/dialogs/task-editor.h @@ -53,8 +53,9 @@ struct _TaskEditorClass { }; GtkType task_editor_get_type (void); -TaskEditor *task_editor_construct (TaskEditor *te); -TaskEditor *task_editor_new (void); +TaskEditor *task_editor_construct (TaskEditor *te, + CalClient *client); +TaskEditor *task_editor_new (CalClient *client); void task_editor_show_assignment(TaskEditor *te); diff --git a/calendar/gui/e-calendar-table.c b/calendar/gui/e-calendar-table.c index f775b68f1a..91786ea389 100644 --- a/calendar/gui/e-calendar-table.c +++ b/calendar/gui/e-calendar-table.c @@ -910,9 +910,8 @@ open_task (ECalendarTable *cal_table, CalComponent *comp, gboolean assign) tedit = e_comp_editor_registry_find (comp_editor_registry, uid); if (tedit == NULL) { - tedit = COMP_EDITOR (task_editor_new ()); + tedit = COMP_EDITOR (task_editor_new (calendar_model_get_cal_client (cal_table->model))); - comp_editor_set_cal_client (tedit, calendar_model_get_cal_client (cal_table->model)); comp_editor_edit_comp (tedit, comp); if (assign) task_editor_show_assignment (TASK_EDITOR (tedit)); diff --git a/calendar/gui/e-tasks.c b/calendar/gui/e-tasks.c index 61c55e1598..d0097cc015 100644 --- a/calendar/gui/e-tasks.c +++ b/calendar/gui/e-tasks.c @@ -485,8 +485,7 @@ e_tasks_new_task (ETasks *tasks) priv = tasks->priv; - tedit = task_editor_new (); - comp_editor_set_cal_client (COMP_EDITOR (tedit), priv->client); + tedit = task_editor_new (priv->client); comp = cal_component_new (); cal_component_set_new_vtype (comp, CAL_COMPONENT_TODO); diff --git a/calendar/gui/gnome-cal.c b/calendar/gui/gnome-cal.c index 1d694e7eae..32f6cd15ed 100644 --- a/calendar/gui/gnome-cal.c +++ b/calendar/gui/gnome-cal.c @@ -2208,14 +2208,13 @@ gnome_calendar_edit_object (GnomeCalendar *gcal, CalComponent *comp, if (!ce) { EventEditor *ee; - ee = event_editor_new (); + ee = event_editor_new (priv->client); if (!ee) { g_message ("gnome_calendar_edit_object(): Could not create the event editor"); return; } ce = COMP_EDITOR (ee); - comp_editor_set_cal_client (ce, priv->client); comp_editor_edit_comp (ce, comp); if (meeting) event_editor_show_meeting (ee); @@ -2341,8 +2340,7 @@ gnome_calendar_new_task (GnomeCalendar *gcal) priv = gcal->priv; - tedit = task_editor_new (); - comp_editor_set_cal_client (COMP_EDITOR (tedit), priv->task_pad_client); + tedit = task_editor_new (priv->task_pad_client); comp = cal_component_new (); cal_component_set_new_vtype (comp, CAL_COMPONENT_TODO); diff --git a/calendar/gui/itip-utils.c b/calendar/gui/itip-utils.c index 65634d9759..224d8b9d52 100644 --- a/calendar/gui/itip-utils.c +++ b/calendar/gui/itip-utils.c @@ -352,6 +352,28 @@ users_has_attendee (GList *users, const char *address) return FALSE; } +static CORBA_char * +comp_from (CalComponentItipMethod method, CalComponent *comp) +{ + CalComponentOrganizer organizer; + + switch (method) { + case CAL_COMPONENT_METHOD_REQUEST: + case CAL_COMPONENT_METHOD_CANCEL: + cal_component_get_organizer (comp, &organizer); + if (organizer.value == NULL) { + e_notice (NULL, GNOME_MESSAGE_BOX_ERROR, + _("An organizer must be set.")); + return NULL; + } + + return CORBA_string_dup (itip_strip_mailto (organizer.value)); + + default: + return CORBA_string_dup (""); + } +} + static GNOME_Evolution_Composer_RecipientList * comp_to_list (CalComponentItipMethod method, CalComponent *comp, GList *users) { @@ -862,7 +884,7 @@ itip_send_comp (CalComponentItipMethod method, CalComponent *send_comp, GNOME_Evolution_Composer_RecipientList *cc_list = NULL; GNOME_Evolution_Composer_RecipientList *bcc_list = NULL; CORBA_char *subject = NULL, *body = NULL, *content_type = NULL; - CORBA_char *filename = NULL, *description = NULL; + CORBA_char *from = NULL, *filename = NULL, *description = NULL; GNOME_Evolution_Composer_AttachmentData *attach_data = NULL; char *ical_string; CORBA_Environment ev; @@ -904,8 +926,11 @@ itip_send_comp (CalComponentItipMethod method, CalComponent *send_comp, /* Subject information */ subject = comp_subject (method, comp); + /* From address */ + from = comp_from (method, comp); + /* Set recipients, subject */ - GNOME_Evolution_Composer_setHeaders (composer_server, to_list, cc_list, bcc_list, subject, &ev); + GNOME_Evolution_Composer_setHeaders (composer_server, from, to_list, cc_list, bcc_list, subject, &ev); if (BONOBO_EX (&ev)) { g_warning ("Unable to set composer headers while sending iTip message"); goto cleanup; @@ -982,6 +1007,8 @@ itip_send_comp (CalComponentItipMethod method, CalComponent *send_comp, if (bcc_list != NULL) CORBA_free (bcc_list); + if (from != NULL) + CORBA_free (from); if (subject != NULL) CORBA_free (subject); if (body != NULL) diff --git a/calendar/idl/evolution-calendar.idl b/calendar/idl/evolution-calendar.idl index abd3954dbd..e5a6e92c27 100644 --- a/calendar/idl/evolution-calendar.idl +++ b/calendar/idl/evolution-calendar.idl @@ -137,6 +137,11 @@ module Calendar { /* A calendar is identified by its URI */ readonly attribute string uri; + /* Return the email address associated with this calendar, + if any. */ + string getEmailAddress () + raises (NotFound); + /* For going online/offline */ void setMode (in CalMode mode); diff --git a/calendar/pcs/cal-backend-file.c b/calendar/pcs/cal-backend-file.c index 0e3c71c548..70b56be130 100644 --- a/calendar/pcs/cal-backend-file.c +++ b/calendar/pcs/cal-backend-file.c @@ -91,6 +91,7 @@ static void cal_backend_file_init (CalBackendFile *cbfile); static void cal_backend_file_destroy (GtkObject *object); static const char *cal_backend_file_get_uri (CalBackend *backend); +static const char *cal_backend_file_get_email_address (CalBackend *backend); static CalBackendOpenStatus cal_backend_file_open (CalBackend *backend, const char *uristr, gboolean only_if_exists); @@ -187,6 +188,7 @@ cal_backend_file_class_init (CalBackendFileClass *class) object_class->destroy = cal_backend_file_destroy; backend_class->get_uri = cal_backend_file_get_uri; + backend_class->get_email_address = cal_backend_file_get_email_address; backend_class->open = cal_backend_file_open; backend_class->is_loaded = cal_backend_file_is_loaded; backend_class->get_query = cal_backend_file_get_query; @@ -449,6 +451,16 @@ cal_backend_file_get_uri (CalBackend *backend) return (const char *) priv->uri; } +/* Get_email_address handler for the file backend */ +static const char * +cal_backend_file_get_email_address (CalBackend *backend) +{ + /* A file backend has no particular email address associated + * with it (although that would be a useful feature some day). + */ + return NULL; +} + /* Used from g_hash_table_foreach(), adds a category name to the sequence */ static void add_category_cb (gpointer key, gpointer value, gpointer data) diff --git a/calendar/pcs/cal-backend.c b/calendar/pcs/cal-backend.c index 0954c53472..19f8261797 100644 --- a/calendar/pcs/cal-backend.c +++ b/calendar/pcs/cal-backend.c @@ -141,6 +141,7 @@ cal_backend_class_init (CalBackendClass *class) class->obj_removed = NULL; class->get_uri = NULL; + class->get_email_address = NULL; class->open = NULL; class->is_loaded = NULL; class->get_query = NULL; @@ -182,6 +183,25 @@ cal_backend_get_uri (CalBackend *backend) return (* CLASS (backend)->get_uri) (backend); } +/** + * cal_backend_get_email_address: + * @backend: A calendar backend. + * + * Queries the email address associated with a calendar backend, which + * must already have an open calendar. + * + * Return value: The email address associated with the calendar. + **/ +const char * +cal_backend_get_email_address (CalBackend *backend) +{ + g_return_val_if_fail (backend != NULL, NULL); + g_return_val_if_fail (IS_CAL_BACKEND (backend), NULL); + + g_assert (CLASS (backend)->get_email_address != NULL); + return (* CLASS (backend)->get_email_address) (backend); +} + /* Callback used when a Cal is destroyed */ static void cal_destroy_cb (GtkObject *object, gpointer data) diff --git a/calendar/pcs/cal-backend.h b/calendar/pcs/cal-backend.h index 737a1604e8..af11be14e8 100644 --- a/calendar/pcs/cal-backend.h +++ b/calendar/pcs/cal-backend.h @@ -93,6 +93,8 @@ struct _CalBackendClass { /* Virtual methods */ const char *(* get_uri) (CalBackend *backend); + const char *(* get_email_address) (CalBackend *backend); + CalBackendOpenStatus (* open) (CalBackend *backend, const char *uristr, gboolean only_if_exists); @@ -146,6 +148,8 @@ GtkType cal_backend_get_type (void); const char *cal_backend_get_uri (CalBackend *backend); +const char *cal_backend_get_email_address (CalBackend *backend); + void cal_backend_add_cal (CalBackend *backend, Cal *cal); CalBackendOpenStatus cal_backend_open (CalBackend *backend, const char *uristr, diff --git a/calendar/pcs/cal.c b/calendar/pcs/cal.c index a266977cbc..31580e62e4 100644 --- a/calendar/pcs/cal.c +++ b/calendar/pcs/cal.c @@ -64,6 +64,30 @@ impl_Cal_get_uri (PortableServer_Servant servant, return str_uri_copy; } +/* Cal::get_email_address method */ +static CORBA_char * +impl_Cal_get_email_address (PortableServer_Servant servant, + CORBA_Environment *ev) +{ + Cal *cal; + CalPrivate *priv; + const char *str_email_address; + CORBA_char *str_email_address_copy; + + cal = CAL (bonobo_object_from_servant (servant)); + priv = cal->priv; + + str_email_address = cal_backend_get_email_address (priv->backend); + if (str_email_address == NULL) { + bonobo_exception_set (ev, ex_GNOME_Evolution_Calendar_Cal_NotFound); + return CORBA_OBJECT_NIL; + } + + str_email_address_copy = CORBA_string_dup (str_email_address); + + return str_email_address_copy; +} + /* Converts a calendar object type from its CORBA representation to our own * representation. */ @@ -707,6 +731,7 @@ cal_class_init (CalClass *klass) /* Epv methods */ epv->_get_uri = impl_Cal_get_uri; + epv->getEmailAddress = impl_Cal_get_email_address; epv->setMode = impl_Cal_set_mode; epv->countObjects = impl_Cal_get_n_objects; epv->getObject = impl_Cal_get_object; -- cgit v1.2.3