src/mn-vfs-mailbox-backend.gob (4151B) - 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-mailbox.h" 22 %} 23 24 %{ 25 #include <glib/gi18n.h> 26 #include <gtk/gtk.h> 27 #include "mn-mailbox-private.h" 28 #include "mn-reentrant-mailbox-private.h" 29 #include "mn-vfs-mailbox-private.h" 30 #include "mn-conf.h" 31 #include "mn-util.h" 32 %} 33 34 class MN:VFS:Mailbox:Backend from G:Object (abstract) 35 { 36 classwide const char *format; 37 38 /* 39 * In order to not create reference cycles, we do not hold a 40 * reference to the mailbox. The code is arranged so that a VFS 41 * backend cannot survive its containing mailbox (no reference to 42 * the backend is held outside of the mailbox code). 43 */ 44 protected MNVFSMailbox *mailbox; 45 property POINTER mailbox (link, flags = CONSTRUCT_ONLY, type = MNVFSMailbox *); 46 47 private unsigned int queue_check_id; 48 49 /* 50 * The amount of time to wait between a queue_check() call and the 51 * actual mailbox check, in milliseconds. If 0, the check is 52 * performed immediately. Used to avoid race conditions with mailbox 53 * formats which do not support locking. 54 */ 55 protected int check_latency; 56 57 finalize (self) 58 { 59 if (selfp->queue_check_id) 60 g_source_remove(selfp->queue_check_id); 61 62 /* 63 * If the calling mailbox is being finalized, there is no need to 64 * hold its lock. Otherwise, it holds its lock while finalizing us 65 * (see reentrant_check() in mn-vfs-mailbox.gob). 66 */ 67 mn_vfs_mailbox_remove_monitors_by_owner(self->mailbox, self); 68 } 69 70 protected void 71 monitor (self, 72 int check_id, 73 const char *uri (check null), 74 GnomeVFSMonitorType type) 75 { 76 mn_vfs_mailbox_lock(self->mailbox); 77 mn_vfs_mailbox_monitor(self->mailbox, uri, self, type, self_real_monitor_cb, self); 78 mn_vfs_mailbox_unlock(self->mailbox); 79 } 80 81 private void 82 real_monitor_cb (GnomeVFSMonitorHandle *handle, 83 const char *monitor_uri, 84 const char *info_uri, 85 GnomeVFSMonitorEventType event_type, 86 gpointer user_data) 87 { 88 self_monitor_cb(user_data, info_uri, event_type); 89 } 90 91 virtual private void 92 monitor_cb (self, 93 const char *info_uri, 94 GnomeVFSMonitorEventType event_type) 95 { 96 if (event_type == GNOME_VFS_MONITOR_EVENT_CHANGED 97 || event_type == GNOME_VFS_MONITOR_EVENT_DELETED 98 || event_type == GNOME_VFS_MONITOR_EVENT_CREATED) 99 self_queue_check(self); 100 } 101 102 /** 103 * queue_check(): 104 * @self: a backend 105 * 106 * Queues a mail check on the mailbox of @self or replaces an 107 * already queued check. The check_latency member is respected. 108 * 109 * This function is not thread-safe. It is only called from main 110 * loop callbacks (hence always from the same thread). 111 **/ 112 protected void 113 queue_check (self) 114 { 115 if (selfp->queue_check_id) 116 mn_source_clear(&selfp->queue_check_id); 117 118 if (self->check_latency) 119 selfp->queue_check_id = gdk_threads_add_timeout(self->check_latency, self_queue_check_cb, self); 120 else 121 mn_reentrant_mailbox_queue_check(MN_REENTRANT_MAILBOX(self->mailbox)); 122 } 123 124 private gboolean 125 queue_check_cb (gpointer data) 126 { 127 Self *self = data; 128 129 mn_mailbox_check(MN_MAILBOX(self->mailbox)); 130 131 selfp->queue_check_id = 0; 132 return FALSE; /* remove source */ 133 } 134 135 virtual public gboolean 136 is (self, MNVFSMailboxBackendClass *class, MN:VFS:Mailbox *mailbox); 137 138 virtual public void 139 check (self, int check_id (check != 0)); 140 }