* Fix some detected memory leaks
[modest] / src / maemo / modest-platform.c
index 691da5d..c35b1b4 100644 (file)
@@ -37,6 +37,7 @@
 #include <modest-hildon-includes.h>
 
 #include <dbus_api/modest-dbus-callbacks.h>
+#include <maemo/modest-osso-autosave-callbacks.h>
 #include <libosso.h>
 #include <alarmd/alarm_event.h> /* For alarm_event_add(), etc. */
 #include <tny-maemo-conic-device.h>
@@ -45,9 +46,7 @@
 #include <gtk/gtkmenuitem.h>
 #include <gtk/gtkmain.h>
 #include <string.h>
-
-static cookie_t alarm_cookie = 0;
-
+       
 gboolean
 modest_platform_init (void)
 {      
@@ -84,6 +83,14 @@ modest_platform_init (void)
        /* Register hardware event dbus callback: */
     osso_hw_set_event_cb(osso_context, NULL, modest_osso_cb_hw_state_handler, NULL);
 
+       /* Register osso auto-save callbacks: */
+       result = osso_application_set_autosave_cb (osso_context, 
+               modest_on_osso_application_autosave, NULL /* user_data */);
+       if (result != OSSO_OK) {
+               g_warning ("osso_application_set_autosave_cb() failed.");       
+       }
+       
+       
        /* TODO: Get the actual update interval from gconf, 
         * when that preferences dialog has been implemented.
         * And make sure that this is called again whenever that is changed. */
@@ -304,8 +311,8 @@ GdkPixbuf*
 modest_platform_get_icon (const gchar *name)
 {
        GError *err = NULL;
-       GdkPixbuf* pixbuf;
-       GtkIconTheme *current_theme;
+       GdkPixbuf* pixbuf = NULL;
+       GtkIconTheme *current_theme = NULL;
 
        g_return_val_if_fail (name, NULL);
 
@@ -643,12 +650,19 @@ modest_platform_run_sort_dialog (GtkWindow *parent_window,
 
 gboolean modest_platform_set_update_interval (guint minutes)
 {
+       ModestConf *conf = modest_runtime_get_conf ();
+       if (!conf)
+               return FALSE;
+               
+       cookie_t alarm_cookie = modest_conf_get_int (conf, MODEST_CONF_ALARM_ID, NULL);
+
        /* Delete any existing alarm,
         * because we will replace it: */
        if (alarm_cookie) {
                /* TODO: What does the alarm_event_del() return value mean? */
                alarm_event_del(alarm_cookie);
                alarm_cookie = 0;
+               modest_conf_set_int (conf, MODEST_CONF_ALARM_ID, 0, NULL);
        }
        
        /* 0 means no updates: */
@@ -684,9 +698,29 @@ gboolean modest_platform_set_update_interval (guint minutes)
        
        alarm_cookie = alarm_event_add (&event);
        
+       /* Store the alarm ID in GConf, so we can remove it later:
+        * This is apparently valid between application instances. */
+       modest_conf_set_int (conf, MODEST_CONF_ALARM_ID, alarm_cookie, NULL);
+       
        if (!alarm_cookie) {
            /* Error */
-           printf ("Error setting alarm event. Error code: '%d'\n", alarmd_get_error ());
+           const alarm_error_t alarm_error = alarmd_get_error ();
+           printf ("Error setting alarm event. Error code: '%d'\n", alarm_error);
+           
+           /* Give people some clue: */
+           /* The alarm API should have a function for this: */
+           if (alarm_error == ALARMD_ERROR_DBUS) {
+               printf ("  ALARMD_ERROR_DBUS: An error with D-Bus occurred, probably coudn't get a D-Bus connection.\n");
+           } else if (alarm_error == ALARMD_ERROR_CONNECTION) {
+               printf ("  ALARMD_ERROR_CONNECTION: Could not contact alarmd via D-Bus.\n");
+           } else if (alarm_error == ALARMD_ERROR_INTERNAL) {
+               printf ("  ALARMD_ERROR_INTERNAL: Some alarmd or libalarm internal error, possibly a version mismatch.\n");
+           } else if (alarm_error == ALARMD_ERROR_MEMORY) {
+               printf ("  ALARMD_ERROR_MEMORY: A memory allocation failed.\n");
+           } else if (alarm_error == ALARMD_ERROR_ARGUMENT) {
+               printf ("  ALARMD_ERROR_ARGUMENT: An argument given by caller was invalid.\n");
+           }
+           
            return FALSE;
        }