diff options
Diffstat (limited to 'executive-summary/component/e-summary-url.c')
-rw-r--r-- | executive-summary/component/e-summary-url.c | 206 |
1 files changed, 139 insertions, 67 deletions
diff --git a/executive-summary/component/e-summary-url.c b/executive-summary/component/e-summary-url.c index 9dfff28713..f99db8b42e 100644 --- a/executive-summary/component/e-summary-url.c +++ b/executive-summary/component/e-summary-url.c @@ -39,7 +39,6 @@ #include "e-summary-url.h" #include "e-summary-util.h" -#include <evolution-services/executive-summary-component-view.h> #include "Composer.h" typedef enum _ESummaryProtocol { @@ -101,7 +100,8 @@ e_summary_url_request (GtkHTML *html, gtk_html_stream_close (stream, GTK_HTML_STREAM_ERROR); return; } - + + g_print ("Filename: %s\n", filename); result = gnome_vfs_open (&handle, filename, GNOME_VFS_OPEN_READ); if (result != GNOME_VFS_OK) { @@ -143,10 +143,10 @@ parse_uri (const char *uri, ESummaryProtocol protocol, ESummary *esummary) { - ExecutiveSummaryComponentView *view; char *parsed; char *p; - int id; + int address; + ESummaryWindow *window; switch (protocol) { @@ -184,39 +184,39 @@ parse_uri (const char *uri, break; case PROTOCOL_CLOSE: - id = atoi (uri + 8); - view = e_summary_view_from_id (esummary, id); - parsed = g_strdup (executive_summary_component_view_get_title (view)); + address = atoi (uri + 8); + window = (ESummaryWindow *) GINT_TO_POINTER (address); + parsed = g_strdup (window->title); break; case PROTOCOL_LEFT: - id = atoi (uri + 7); - view = e_summary_view_from_id (esummary, id); - parsed = g_strdup (executive_summary_component_view_get_title (view)); + address = atoi (uri + 7); + window = (ESummaryWindow *) GINT_TO_POINTER (address); + parsed = g_strdup (window->title); break; case PROTOCOL_RIGHT: - id = atoi (uri + 8); - view = e_summary_view_from_id (esummary, id); - parsed = g_strdup (executive_summary_component_view_get_title (view)); + address = atoi (uri + 8); + window = (ESummaryWindow *) GINT_TO_POINTER (address); + parsed = g_strdup (window->title); break; case PROTOCOL_UP: - id = atoi (uri + 5); - view = e_summary_view_from_id (esummary, id); - parsed = g_strdup (executive_summary_component_view_get_title (view)); + address = atoi (uri + 5); + window = (ESummaryWindow *) GINT_TO_POINTER (address); + parsed = g_strdup (window->title); break; case PROTOCOL_DOWN: - id = atoi (uri + 7); - view = e_summary_view_from_id (esummary, id); - parsed = g_strdup (executive_summary_component_view_get_title (view)); + address = atoi (uri + 7); + window = (ESummaryWindow *) GINT_TO_POINTER (address); + parsed = g_strdup (window->title); break; case PROTOCOL_CONFIGURE: - id = atoi (uri + 12); - view = e_summary_view_from_id (esummary, id); - parsed = g_strdup (executive_summary_component_view_get_title (view)); + address = atoi (uri + 12); + window = (ESummaryWindow *) GINT_TO_POINTER (address); + parsed = g_strdup (window->title); break; case PROTOCOL_NONE: @@ -325,10 +325,9 @@ e_summary_url_click (GtkWidget *widget, ESummary *esummary) { ESummaryProtocol protocol; - ExecutiveSummaryComponentView *view; - gpointer window; /* FIXME */ char *parsed; - int id; + int address; + ESummaryWindow *window; protocol = get_protocol (url); @@ -352,22 +351,20 @@ e_summary_url_click (GtkWidget *widget, case PROTOCOL_CLOSE: /* Close the window. */ - id = atoi (url + 8); - view = e_summary_view_from_id (esummary, id); - if (view == NULL) + address = atoi (url + 8); + window = (ESummaryWindow *) GINT_TO_POINTER (address); + if (window->iid == NULL) return; - window = e_summary_window_from_view (esummary, view); - e_summary_window_remove_from_ht (window, esummary); - e_summary_window_free (window, esummary); + e_summary_remove_window (esummary, window); e_summary_rebuild_page (esummary); break; case PROTOCOL_CONFIGURE: /* Configure the window. . . */ - id = atoi (url + 12); - view = e_summary_view_from_id (esummary, id); - if (view == NULL) + address = atoi (url + 12); + window = (ESummaryWindow *) GINT_TO_POINTER (address); + if (window->iid == NULL) return; /* Issue the configure command some how :) */ @@ -375,50 +372,41 @@ e_summary_url_click (GtkWidget *widget, case PROTOCOL_LEFT: /* Window left */ - id = atoi (url + 7); - view = e_summary_view_from_id (esummary, id); - - if (view == NULL) + address = atoi (url + 7); + window = (ESummaryWindow *) GINT_TO_POINTER (address); + if (window->iid == NULL) return; - window = e_summary_window_from_view (esummary, view); - e_summary_window_move_left (esummary, window); e_summary_rebuild_page (esummary); break; case PROTOCOL_RIGHT: - id = atoi (url + 8); - view = e_summary_view_from_id (esummary, id); - if (view == NULL) + address = atoi (url + 8); + window = (ESummaryWindow *) GINT_TO_POINTER (address); + if (window->iid == NULL) return; - window = e_summary_window_from_view (esummary, view); - e_summary_window_move_right (esummary, window); e_summary_rebuild_page (esummary); break; case PROTOCOL_UP: - id = atoi (url + 5); - view = e_summary_view_from_id (esummary, id); - if (view == NULL) + address = atoi (url + 5); + window = (ESummaryWindow *) GINT_TO_POINTER (address); + if (window->iid == NULL) return; - window = e_summary_window_from_view (esummary, view); - e_summary_window_move_up (esummary, window); e_summary_rebuild_page (esummary); break; case PROTOCOL_DOWN: - id = atoi (url + 7); - view = e_summary_view_from_id (esummary, id); - if (view == NULL) + address = atoi (url + 7); + window = (ESummaryWindow *) GINT_TO_POINTER (address); + if (window->iid == NULL) return; - window = e_summary_window_from_view (esummary, view); - e_summary_window_move_down (esummary, window); e_summary_rebuild_page (esummary); break; @@ -437,16 +425,75 @@ e_summary_url_click (GtkWidget *widget, g_free (parsed); } +static void +parse_mail_url (char *url, + GList **cc, + GList **bcc, + char **subject) +{ + char **options; + int i = 0; + + options = g_strsplit (url, "&", 0); + while (options[i] != NULL) { + char **params; + + params = g_strsplit (options[i], "=", 2); + if (strcmp (params[0], "subject") == 0) { + *subject = g_strdup (params[1]); + } else if (strcmp (params[0], "cc") == 0) { + *cc = g_list_prepend (*cc, g_strdup (params[1])); + } else if (strcmp (params[1], "bcc") == 0) { + *bcc = g_list_prepend (*bcc, g_strdup (params[1])); + } + + g_strfreev (params); + i++; + } + + g_strfreev (options); + /* Reverse the list so it's in the correct order */ + *cc = g_list_reverse (*cc); + *bcc = g_list_reverse (*bcc); +} + +static void +recipients_from_list (GNOME_Evolution_Composer_RecipientList *recipients, + GList *list) +{ + GList *t; + int i; + + for (i = 0, t = list; t; i++, t = t->next) { + GNOME_Evolution_Composer_Recipient *recipient; + char *address = (char *)t->data; + + recipient = recipients->_buffer + i; + recipient->name = CORBA_string_dup (""); + recipient->address = CORBA_string_dup (address ? address : ""); + } +} + +static void +free_list (GList *list) +{ + for (; list; list = list->next) { + g_free (list->data); + } +} + gboolean e_summary_url_mail_compose (ESummary *esummary, const char *url) { CORBA_Object composer; CORBA_Environment ev; + char *full_address, *address, *proto, *q; GNOME_Evolution_Composer_RecipientList *to, *cc, *bcc; GNOME_Evolution_Composer_Recipient *recipient; - char *address, *proto; CORBA_char *subject; + GList *gcc = NULL, *gbcc = NULL; + char *gsubject = NULL; CORBA_exception_init (&ev); @@ -459,12 +506,20 @@ e_summary_url_mail_compose (ESummary *esummary, } if ( (proto = strstr (url, "://")) != NULL){ - address = proto + 3; + full_address = proto + 3; } else { if (strncmp (url, "mailto:", 7) == 0) - address = (char *) (url + 7); + full_address = (char *) (url + 7); else - address = (char *) url; + full_address = (char *) url; + } + + q = strchr (full_address, '?'); + if (q != NULL) { + address = g_strndup (full_address, q - full_address); + parse_mail_url (q + 1, &gcc, &gbcc, &gsubject); + } else { + address = g_strdup (full_address); } to = GNOME_Evolution_Composer_RecipientList__alloc (); @@ -475,31 +530,48 @@ e_summary_url_mail_compose (ESummary *esummary, recipient = to->_buffer; recipient->name = CORBA_string_dup (""); recipient->address = CORBA_string_dup (address?address:""); - + g_free (address); + /* FIXME: Get these out of the URL */ cc = GNOME_Evolution_Composer_RecipientList__alloc (); - cc->_length = 0; - cc->_maximum = 0; + cc->_length = g_list_length (gcc); + cc->_maximum = cc->_length; cc->_buffer = CORBA_sequence_GNOME_Evolution_Composer_Recipient_allocbuf (cc->_maximum); + recipients_from_list (cc, gcc); + free_list (gcc); + g_list_free (gcc); + bcc = GNOME_Evolution_Composer_RecipientList__alloc (); - bcc->_length = 0; - bcc->_maximum = 0; + bcc->_length = g_list_length (gbcc); + bcc->_maximum = bcc->_length; bcc->_buffer = CORBA_sequence_GNOME_Evolution_Composer_Recipient_allocbuf (bcc->_maximum); - subject = CORBA_string_dup (""); - + recipients_from_list (bcc, gbcc); + free_list (gbcc); + g_list_free (gbcc); + + subject = CORBA_string_dup (gsubject ? gsubject : ""); + g_free (gsubject); + CORBA_exception_init (&ev); GNOME_Evolution_Composer_setHeaders (composer, to, cc, bcc, subject, &ev); if (ev._major != CORBA_NO_EXCEPTION) { CORBA_exception_free (&ev); CORBA_free (to); + CORBA_free (cc); + CORBA_free (bcc); + CORBA_free (subject); + g_warning ("%s(%d): Error setting headers", __FUNCTION__, __LINE__); return FALSE; } CORBA_free (to); - + CORBA_free (cc); + CORBA_free (bcc); + CORBA_free (subject); + CORBA_exception_init (&ev); GNOME_Evolution_Composer_show (composer, &ev); if (ev._major != CORBA_NO_EXCEPTION) { |