mail-notification

Fork of Jean-Yves Lefort's mail-notification, a tray icon to notify of new mail
git clone https://code.djc.id.au/git/mail-notification/

src/mn-sylpheed-message.gob (2720B) - raw

      1 /*
      2  * Mail Notification
      3  * Copyright (C) 2003-2008 Jean-Yves Lefort <jylefort@brutele.be>
      4  *
      5  * This program is free software; you can redistribute it and/or modify
      6  * it under the terms of the GNU General Public License as published by
      7  * the Free Software Foundation; either version 3 of the License, or
      8  * (at your option) any later version.
      9  *
     10  * This program is distributed in the hope that it will be useful,
     11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
     12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     13  * GNU General Public License for more details.
     14  *
     15  * You should have received a copy of the GNU General Public License along
     16  * with this program; if not, write to the Free Software Foundation, Inc.,
     17  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
     18  */
     19 
     20 %headertop{
     21 #include "mn-vfs-message.h"
     22 %}
     23 
     24 %{
     25 #include <stdlib.h>
     26 #include <glib/gi18n.h>
     27 #include "mn-util.h"
     28 #include "mn-sylpheed-mailbox-backend-private.h"
     29 #include "mn-message-private.h"
     30 %}
     31 
     32 class MN:Sylpheed:Message from MN:VFS:Message
     33 {
     34   override (MN:Message) void
     35     builtin_mark_as_read (MNMessage *message, MNMessageActionRequest *request)
     36   {
     37     mn_message_perform_action_in_thread(request, self_builtin_mark_as_read_cb, NULL);
     38   }
     39 
     40   private GError *
     41     builtin_mark_as_read_cb (MNMessage *message, gpointer data)
     42   {
     43     MNVFSMessage *vmessage = MN_VFS_MESSAGE(message);
     44     char *filename;
     45     guint32 num;
     46     guint32 flags;
     47     GError *tmp_err = NULL;
     48     GHashTable *marks;
     49     GError *err = NULL;
     50 
     51     filename = gnome_vfs_uri_extract_short_name(vmessage->vfs_uri);
     52     g_assert(mn_str_isnumeric(filename));
     53     num = atoi(filename);
     54     g_free(filename);
     55 
     56     /*
     57      * We hold the mailbox lock to prevent this:
     58      *
     59      *	  thread A: read mark file
     60      *	  thread B: read mark file
     61      *    thread A: write new mark file
     62      *    thread B: write new mark file, A's modifications are overwritten
     63      */
     64     mn_vfs_mailbox_lock(MN_VFS_MAILBOX(message->mailbox));
     65 
     66     marks = mn_sylpheed_mailbox_backend_read_marks(MN_VFS_MAILBOX(message->mailbox)->vfs_uri, &tmp_err);
     67     if (! marks)
     68       {
     69 	g_set_error(&err, 0, 0, _("Unable to read %s: %s."), SYLPHEED_MARK_FILE, tmp_err->message);
     70 	g_error_free(tmp_err);
     71 	goto end;
     72       }
     73 
     74     flags = GPOINTER_TO_UINT(g_hash_table_lookup(marks, GUINT_TO_POINTER(num)));
     75     flags &= ~(SYLPHEED_MSG_NEW | SYLPHEED_MSG_UNREAD);
     76     g_hash_table_insert(marks, GUINT_TO_POINTER(num), GUINT_TO_POINTER(flags));
     77 
     78     mn_sylpheed_mailbox_backend_write_marks(MN_VFS_MAILBOX(message->mailbox)->vfs_uri, marks, &err);
     79     g_hash_table_destroy(marks);
     80 
     81   end:
     82     mn_vfs_mailbox_unlock(MN_VFS_MAILBOX(message->mailbox));
     83 
     84     return err;
     85   }
     86 }