return NULL;
}
const gchar* start_to = mailto + 7;
-
+
/* Look for ?, or the end of the string, marking the end of the to address: */
const size_t len_to = strcspn (start_to, "?");
gchar* result_to = uri_unescape (start_to, len_to);
printf("debug: result_to=%s\n", result_to);
-
+
+ if (list_items_and_values == NULL) {
+ return result_to;
+ }
+
/* Get any other items: */
const size_t len_mailto = strlen (start_to);
const gchar* p = start_to + len_to + 1; /* parsed so far. */
const gchar* end = start_to + len_mailto;
- const gchar* start_item_name = p;
- size_t len_item_name = 0;
- const gchar* start_item_value = NULL;
while (p < end) {
-
- /* Looking for the end of a name; */
- if (start_item_name) {
- const size_t len = strcspn (p, "="); /* Returns whole string if none found. */
- if (len) {
- /* This marks the end of a name and the start of the value: */
- len_item_name = len;
-
- /* Skip over the name and mark the start of the value: */
- p += (len + 1); /* Skip over the = */
- start_item_value = p;
- }
+ const gchar *name, *value, *name_start, *name_end, *value_start, *value_end;
+ name_start = p;
+ name_end = strchr (name_start, '='); /* Separator between name and value */
+ if (name_end == NULL) {
+ g_debug ("Malformed URI: %s\n", mailto);
+ return result_to;
}
-
- /* Looking for the end of a value: */
- if (start_item_value) {
- const size_t len = strcspn (p, "&"); /* Returns whole string if none found. */
- /* & marks the start of a new item: */
- if (len) {
- if (start_item_name && len_item_name) {
- /* Finish the previously-started item: */
- gchar *item_value = uri_unescape (start_item_value, len);
- gchar *item_name = g_strndup (start_item_name, len_item_name);
- /* printf ("debug: item name=%s, value=%s\n", item_name, item_value); */
-
- /* Append the items to the list */
- if(list_items_and_values) {
- *list_items_and_values = g_slist_append (*list_items_and_values, item_name);
- *list_items_and_values = g_slist_append (*list_items_and_values, item_value);
- }
- }
-
- /* Skip over the value and mark the start of a possible new name/value pair: */
- p += (len + 1); /* Skip over the & */
- start_item_name = p;
- len_item_name = 0;
- start_item_value = NULL;
- }
+ value_start = name_end + 1;
+ value_end = strchr (value_start, '&'); /* Separator between value and next parameter */
+
+ name = g_strndup(name_start, name_end - name_start);
+ if (value_end != NULL) {
+ value = uri_unescape(value_start, value_end - value_start);
+ p = value_end + 1;
+ } else {
+ value = uri_unescape(value_start, -1);
+ p = end;
}
-
+ *list_items_and_values = g_slist_append (*list_items_and_values, (gpointer) name);
+ *list_items_and_values = g_slist_append (*list_items_and_values, (gpointer) value);
}
return result_to;
{
gchar *uri = (gchar*)user_data;
GSList *list_names_and_values = NULL;
-
+ gchar *to = NULL;
const gchar *cc = NULL;
const gchar *bcc = NULL;
const gchar *subject = NULL;
const gchar *body = NULL;
+ if (!check_and_offer_account_creation ()) {
+ goto cleanup;
+ }
/* Get the relevant items from the list: */
- gchar *to = uri_parse_mailto (uri, &list_names_and_values);
+ to = uri_parse_mailto (uri, &list_names_and_values);
GSList *list = list_names_and_values;
while (list) {
GSList *list_value = g_slist_next (list);
list = g_slist_next (list_value);
}
- ComposeMailIdleData *idle_data = g_new0(ComposeMailIdleData, 1); /* Freed in the idle callback. */
-
- idle_data->to = g_strdup (to);
- idle_data->cc = g_strdup (cc);
- idle_data->bcc = g_strdup (bcc);
- idle_data->subject = g_strdup (subject);
- idle_data->body = g_strdup (body);
- idle_data->attachments = NULL;
+ gdk_threads_enter (); /* CHECKED */
+ modest_ui_actions_compose_msg(NULL, to, cc, bcc, subject, body, NULL);
+ gdk_threads_leave (); /* CHECKED */
+cleanup:
/* Free the to: and the list, as required by uri_parse_mailto() */
g_free(to);
g_slist_foreach (list_names_and_values, (GFunc)g_free, NULL);
g_free(uri);
- on_idle_compose_mail((gpointer)idle_data);
-
return FALSE; /* Do not call this callback again. */
}
static gboolean
on_idle_compose_mail(gpointer user_data)
{
- if (!check_and_offer_account_creation ())
- return FALSE;
-
+ GSList *attachments = NULL;
ComposeMailIdleData *idle_data = (ComposeMailIdleData*)user_data;
- gchar **list = NULL;
- gint i = 0;
-
- /* Get the TnyTransportAccount so we can instantiate a mail operation: */
- ModestAccountMgr *account_mgr = modest_runtime_get_account_mgr();
- gchar *account_name = modest_account_mgr_get_default_account (account_mgr);
- if (!account_name) {
- g_printerr ("modest: no account found.\n");
-
- /* TODO: If the call to this D-Bus method caused the application to start
- * then the new-account wizard will now be shown, and we need to wait
- * until the account exists instead of just failing.
- */
+ if (!check_and_offer_account_creation ()) {
+ goto cleanup;
}
-
- TnyAccount *account = NULL;
- if (account_name && account_mgr) {
- account = modest_tny_account_store_get_transport_account_for_open_connection (
- modest_runtime_get_account_store(), account_name);
- }
-
- if (!account) {
- g_printerr ("modest: failed to get tny account folder'%s'\n", account_name);
- } else {
- gchar * from = modest_account_mgr_get_from_string (account_mgr,
- account_name);
- if (!from) {
- g_printerr ("modest: no from address for account '%s'\n", account_name);
- } else {
- /* Get the signature.
- * TODO: This, like much of this function is copy/pasted from
- * modest_ui_actions_on_new_msg(): */
- gboolean use_signature = FALSE;
- gchar *signature = modest_account_mgr_get_signature (modest_runtime_get_account_mgr (), account_name, &use_signature);
-
- gchar* blank_and_signature = NULL;
- if (use_signature) {
- blank_and_signature = g_strconcat ("\n", signature, NULL);
- } else {
- blank_and_signature = g_strdup ("");
- }
- g_free (signature);
-
- /* Add it to the body. */
- gchar *body_with_sig = NULL;
- if (!(idle_data->body))
- body_with_sig = g_strdup (blank_and_signature);
- else {
- body_with_sig = g_strconcat (idle_data->body, blank_and_signature, NULL);
- }
-
- /* Create the message: */
- TnyMsg *msg = modest_tny_msg_new (idle_data->to, from,
- idle_data->cc, idle_data->bcc, idle_data->subject, body_with_sig,
- NULL); /* NULL because m_t_m_n doesn't use it */
-
- g_free (body_with_sig);
- g_free (blank_and_signature);
-
- if (!msg) {
- g_printerr ("modest: failed to create message\n");
- } else
- {
- /* Add the message to a folder and show its UI for editing: */
- TnyFolder *folder = modest_tny_account_get_special_folder (account,
- TNY_FOLDER_TYPE_DRAFTS);
- if (!folder) {
- g_printerr ("modest: failed to find Drafts folder\n");
- } else {
-
- tny_folder_add_msg (folder, msg, NULL); /* TODO: check err */
-
- /* This is a GDK lock because we are an idle callback and
- * the code below is or does Gtk+ code */
- gdk_threads_enter (); /* CHECKED */
-
- ModestWindow *win = modest_msg_edit_window_new (msg, account_name, FALSE);
-
- /* it seems Sketch at least sends a leading ',' -- take that into account,
- * ie strip that ,*/
- if (idle_data->attachments && idle_data->attachments[0]==',') {
- gchar *tmp = g_strdup (idle_data->attachments + 1);
- g_free(idle_data->attachments);
- idle_data->attachments = tmp;
- }
-
- if (idle_data->attachments != NULL) {
- list = g_strsplit(idle_data->attachments, ",", 0);
- for (i=0; list[i] != NULL; i++) {
- modest_msg_edit_window_attach_file_one(
- (ModestMsgEditWindow *)win, list[i]);
- }
- g_strfreev(list);
- }
-
- modest_window_mgr_register_window (modest_runtime_get_window_mgr (), win);
- gtk_widget_show_all (GTK_WIDGET (win));
-
- gdk_threads_leave (); /* CHECKED */
-
- g_object_unref (G_OBJECT(folder));
- g_object_unref (win);
- }
-
- g_object_unref (G_OBJECT(msg));
- }
-
- g_object_unref (G_OBJECT(account));
+ /* it seems Sketch at least sends a leading ',' -- take that into account,
+ * ie strip that ,*/
+ if (idle_data->attachments && idle_data->attachments[0]==',') {
+ gchar *tmp = g_strdup (idle_data->attachments + 1);
+ g_free(idle_data->attachments);
+ idle_data->attachments = tmp;
+ }
+ if (idle_data->attachments != NULL) {
+ gchar **list = g_strsplit(idle_data->attachments, ",", 0);
+ gint i = 0;
+ for (i=0; list[i] != NULL; i++) {
+ attachments = g_slist_append(attachments, g_strdup(list[i]));
}
- }
-
- /* Free the idle data: */
+ g_strfreev(list);
+ }
+ gdk_threads_enter (); /* CHECKED */
+ modest_ui_actions_compose_msg(NULL, idle_data->to, idle_data->cc,
+ idle_data->bcc, idle_data->subject,
+ idle_data->body, attachments);
+ gdk_threads_leave (); /* CHECKED */
+cleanup:
+ g_slist_foreach(attachments, (GFunc)g_free, NULL);
+ g_slist_free(attachments);
g_free (idle_data->to);
g_free (idle_data->cc);
g_free (idle_data->bcc);
g_free (idle_data->subject);
g_free (idle_data->body);
g_free (idle_data->attachments);
- g_free (idle_data);
-
- g_free (account_name);
-
+ g_free(idle_data);
+
return FALSE; /* Do not call this callback again. */
}
/* Pick the main window if it exists */
win = modest_window_mgr_get_main_window (modest_runtime_get_window_mgr ());
- /* This seems to be necessary to show new messages in the current window.
- * I would expect this to be after the send_receive, but maybe
- * this makes a connection too. murrayc. */
- modest_do_refresh_current_folder (win);
-
/* Send & receive all if "Update automatically" is set */
/* TODO: check the auto-update parameter in the configuration */
modest_ui_actions_do_send_receive_all (win);