* fix the uri activation, bug NB#58220
[modest] / src / maemo / modest-platform.c
index bd8a6ad..85c2833 100644 (file)
@@ -47,9 +47,9 @@
 #include <gtk/gtkmenuitem.h>
 #include <gtk/gtkmain.h>
 #include <string.h>
-#include <hildon/hildon-notification.h>
 
 #define HILDON_OSSO_URI_ACTION "uri-action"
+#define URI_ACTION_COPY "copy:"
 
 static osso_context_t *osso_context = NULL;
        
@@ -218,22 +218,87 @@ modest_platform_get_file_icon_name (const gchar* name, const gchar* mime_type,
        return icon_name;
 }
 
+
+
+
+#ifdef MODEST_HILDON_VERSION_0
+
 gboolean 
 modest_platform_activate_uri (const gchar *uri)
 {
-       gboolean result;
+       OssoURIAction *action;
+       gboolean result = FALSE;
+       GSList *actions, *iter = NULL;
+       const gchar *scheme;
+       
+       g_return_val_if_fail (uri, FALSE);
+       if (!uri)
+               return FALSE;
+
+       /* the default action should be email */
+       scheme = osso_uri_get_scheme_from_uri (uri, NULL);
+       actions = osso_uri_get_actions (scheme, NULL);
+       
+       for (iter = actions; iter; iter = g_slist_next (iter)) {
+               action = (OssoURIAction*) iter->data;
+               if (action && strcmp (hildon_uri_action_get_service (action), "com.nokia.modest") == 0) {
+                       GError *err = NULL;
+                       result = osso_uri_open (uri, action, &err);
+                       if (!result && err) {
+                               g_printerr ("modest: modest_platform_activate_uri : %s",
+                                           err->message ? err->message : "unknown error");
+                               g_error_free (err);
+                       }
+                       break;
+               }
+       }
+                       
+       if (!result)
+               hildon_banner_show_information (NULL, NULL, _("mcen_ib_unsupported_link"));
+       return result;
+}
+
+#else /* MODEST_HILDON_VERSION_0*/
 
-#ifdef MODEST_HILDON_VERSION_0
-       result = osso_uri_open (uri, NULL, NULL);
-#else
-       result = hildon_uri_open (uri, NULL, NULL);
-#endif
 
+gboolean 
+modest_platform_activate_uri (const gchar *uri)
+{
+       HildonURIAction *action;
+       gboolean result = FALSE;
+       GSList *actions, *iter = NULL;
+       const gchar *scheme;
+       
+       g_return_val_if_fail (uri, FALSE);
+       if (!uri)
+               return FALSE;
+
+       /* the default action should be email */
+       scheme = hildon_uri_get_scheme_from_uri (uri, NULL);
+       actions = hildon_uri_get_actions (scheme, NULL);
+       
+       for (iter = actions; iter; iter = g_slist_next (iter)) {
+               action = (HildonURIAction*) iter->data;
+               if (action && strcmp (hildon_uri_action_get_service (action), "com.nokia.modest") == 0) {
+                       GError *err = NULL;
+                       result = hildon_uri_open (uri, action, &err);
+                       if (!result && err) {
+                               g_printerr ("modest: modest_platform_activate_uri : %s",
+                                           err->message ? err->message : "unknown error");
+                               g_error_free (err);
+                       }
+                       break;
+               }
+       }
+                       
        if (!result)
                hildon_banner_show_information (NULL, NULL, _("mcen_ib_unsupported_link"));
        return result;
 }
 
+
+#endif /* MODEST_HILDON_VERSION_0*/
+
 gboolean 
 modest_platform_activate_file (const gchar *path, const gchar *mime_type)
 {
@@ -271,8 +336,8 @@ modest_platform_activate_file (const gchar *path, const gchar *mime_type)
 }
 
 typedef struct  {
-       GSList * actions;
-       gchar *uri;
+       GSList *actions;
+       gchar  *uri;
 } ModestPlatformPopupInfo;
 
 static gboolean
@@ -304,7 +369,21 @@ activate_uri_popup_item (GtkMenuItem *menu_item,
                g_printerr ("modest: no action name defined\n");
                return;
        }
+
+       /* special handling for the copy menu item -- copy the uri to the clipboard */
+       /* if it's a copy thingy, the uri will look like 'copy:http://slashdot.org' */
+       if (g_str_has_prefix (action_name, URI_ACTION_COPY)) {
+               GtkClipboard *clipboard = gtk_clipboard_get (GDK_NONE);
+               action_name += strlen(URI_ACTION_COPY); /* jump past the prefix */
+
+               if (g_str_has_prefix (action_name, "mailto:")) /* ignore mailto: prefixes */
+                       action_name += strlen ("mailto:");
+               
+               gtk_clipboard_set_text (clipboard, action_name, strlen (action_name));
+               return; /* we're done */
+       }
        
+       /* now, the real uri-actions... */
        for (node = popup_info->actions; node != NULL; node = g_slist_next (node)) {
 #ifdef MODEST_HILDON_VERSION_0
                OssoURIAction *action = (OssoURIAction *) node->data;
@@ -330,6 +409,7 @@ modest_platform_show_uri_popup (const gchar *uri)
 
        if (uri == NULL)
                return FALSE;
+       
 #ifdef MODEST_HILDON_VERSION_0
        scheme = osso_uri_get_scheme_from_uri (uri, NULL);
        actions_list = osso_uri_get_actions (scheme, NULL);
@@ -378,7 +458,18 @@ modest_platform_show_uri_popup (const gchar *uri)
 #endif 
                        gtk_widget_show (menu_item);
                }
+
+               /* always add the copy item */
+               GtkWidget* menu_item = gtk_menu_item_new_with_label (dgettext("osso-uri", "uri_link_copy_link_location"));
+               g_object_set_data_full (G_OBJECT(menu_item), HILDON_OSSO_URI_ACTION,
+                                       g_strconcat (URI_ACTION_COPY, uri, NULL),
+                                       g_free);
+               g_signal_connect (G_OBJECT (menu_item), "activate", G_CALLBACK (activate_uri_popup_item),NULL);
+               gtk_menu_shell_append (GTK_MENU_SHELL (menu), menu_item);
+               gtk_widget_show (menu_item);
+
                
+               /* and what to do when the link is deleted */
                g_signal_connect (G_OBJECT (menu), "delete-event", G_CALLBACK (delete_uri_popup), popup_info);
                gtk_menu_popup (GTK_MENU(menu), NULL, NULL, NULL, NULL, 1, gtk_get_current_event_time ());
                                                  
@@ -806,6 +897,7 @@ void
 modest_platform_on_new_msg (void)
 {
        return; /* TODO: Reenable this later. I disabled it to avoid having one notification per email. */
+#ifndef MODEST_HILDON_VERSION_0
        HildonNotification *not;
 
        /* Create a new notification. FIXME put the right values, need
@@ -827,6 +919,7 @@ modest_platform_on_new_msg (void)
                g_error ("Failed to send notification");
                
        g_object_unref (not);
+#endif /*MODEST_HILDON_VERSION_0*/
 }