13781343738de4abddf56982325a77bd70a98cd26Alexander Larsson/* GIO - GLib Input, Output and Streaming Library 23781343738de4abddf56982325a77bd70a98cd26Alexander Larsson * 33781343738de4abddf56982325a77bd70a98cd26Alexander Larsson * Copyright (C) 2006-2007 Red Hat, Inc. 43781343738de4abddf56982325a77bd70a98cd26Alexander Larsson * Copyright (C) 2007 Sebastian Dröge. 53781343738de4abddf56982325a77bd70a98cd26Alexander Larsson * 63781343738de4abddf56982325a77bd70a98cd26Alexander Larsson * This library is free software; you can redistribute it and/or 73781343738de4abddf56982325a77bd70a98cd26Alexander Larsson * modify it under the terms of the GNU Lesser General Public 83781343738de4abddf56982325a77bd70a98cd26Alexander Larsson * License as published by the Free Software Foundation; either 93781343738de4abddf56982325a77bd70a98cd26Alexander Larsson * version 2 of the License, or (at your option) any later version. 103781343738de4abddf56982325a77bd70a98cd26Alexander Larsson * 113781343738de4abddf56982325a77bd70a98cd26Alexander Larsson * This library is distributed in the hope that it will be useful, 123781343738de4abddf56982325a77bd70a98cd26Alexander Larsson * but WITHOUT ANY WARRANTY; without even the implied warranty of 133781343738de4abddf56982325a77bd70a98cd26Alexander Larsson * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 143781343738de4abddf56982325a77bd70a98cd26Alexander Larsson * Lesser General Public License for more details. 153781343738de4abddf56982325a77bd70a98cd26Alexander Larsson * 163781343738de4abddf56982325a77bd70a98cd26Alexander Larsson * You should have received a copy of the GNU Lesser General 173781343738de4abddf56982325a77bd70a98cd26Alexander Larsson * Public License along with this library; if not, write to the 183781343738de4abddf56982325a77bd70a98cd26Alexander Larsson * Free Software Foundation, Inc., 59 Temple Place, Suite 330, 193781343738de4abddf56982325a77bd70a98cd26Alexander Larsson * Boston, MA 02111-1307, USA. 203781343738de4abddf56982325a77bd70a98cd26Alexander Larsson * 213781343738de4abddf56982325a77bd70a98cd26Alexander Larsson * Authors: Alexander Larsson <alexl@redhat.com> 223781343738de4abddf56982325a77bd70a98cd26Alexander Larsson * John McCutchan <john@johnmccutchan.com> 233781343738de4abddf56982325a77bd70a98cd26Alexander Larsson * Sebastian Dröge <slomo@circular-chaos.org> 243781343738de4abddf56982325a77bd70a98cd26Alexander Larsson */ 253781343738de4abddf56982325a77bd70a98cd26Alexander Larsson 26761424465aaad736916b029383483b6ac419d831Johan Dahlin#include "config.h" 273781343738de4abddf56982325a77bd70a98cd26Alexander Larsson 283781343738de4abddf56982325a77bd70a98cd26Alexander Larsson#include "gfamfilemonitor.h" 293781343738de4abddf56982325a77bd70a98cd26Alexander Larsson#include "giomodule.h" 303781343738de4abddf56982325a77bd70a98cd26Alexander Larsson 313781343738de4abddf56982325a77bd70a98cd26Alexander Larsson#include "fam-helper.h" 323781343738de4abddf56982325a77bd70a98cd26Alexander Larsson 333781343738de4abddf56982325a77bd70a98cd26Alexander Larssonstruct _GFamFileMonitor 343781343738de4abddf56982325a77bd70a98cd26Alexander Larsson{ 353781343738de4abddf56982325a77bd70a98cd26Alexander Larsson GLocalFileMonitor parent_instance; 363781343738de4abddf56982325a77bd70a98cd26Alexander Larsson fam_sub *sub; 373781343738de4abddf56982325a77bd70a98cd26Alexander Larsson}; 383781343738de4abddf56982325a77bd70a98cd26Alexander Larsson 393781343738de4abddf56982325a77bd70a98cd26Alexander Larssonstatic gboolean g_fam_file_monitor_cancel (GFileMonitor* monitor); 403781343738de4abddf56982325a77bd70a98cd26Alexander Larsson 413781343738de4abddf56982325a77bd70a98cd26Alexander LarssonG_DEFINE_DYNAMIC_TYPE (GFamFileMonitor, g_fam_file_monitor, G_TYPE_LOCAL_FILE_MONITOR) 423781343738de4abddf56982325a77bd70a98cd26Alexander Larsson 433781343738de4abddf56982325a77bd70a98cd26Alexander Larssonstatic void 443781343738de4abddf56982325a77bd70a98cd26Alexander Larssong_fam_file_monitor_finalize (GObject *object) 453781343738de4abddf56982325a77bd70a98cd26Alexander Larsson{ 463781343738de4abddf56982325a77bd70a98cd26Alexander Larsson GFamFileMonitor *fam_monitor = G_FAM_FILE_MONITOR (object); 473781343738de4abddf56982325a77bd70a98cd26Alexander Larsson fam_sub *sub = fam_monitor->sub; 483781343738de4abddf56982325a77bd70a98cd26Alexander Larsson 493781343738de4abddf56982325a77bd70a98cd26Alexander Larsson if (sub) { 503781343738de4abddf56982325a77bd70a98cd26Alexander Larsson if (!_fam_sub_cancel (sub)) 513781343738de4abddf56982325a77bd70a98cd26Alexander Larsson g_warning ("Unexpected error cancelling fam monitor"); 523781343738de4abddf56982325a77bd70a98cd26Alexander Larsson fam_monitor->sub = NULL; 533781343738de4abddf56982325a77bd70a98cd26Alexander Larsson } 543781343738de4abddf56982325a77bd70a98cd26Alexander Larsson 553781343738de4abddf56982325a77bd70a98cd26Alexander Larsson if (G_OBJECT_CLASS (g_fam_file_monitor_parent_class)->finalize) 563781343738de4abddf56982325a77bd70a98cd26Alexander Larsson (*G_OBJECT_CLASS (g_fam_file_monitor_parent_class)->finalize) (object); 573781343738de4abddf56982325a77bd70a98cd26Alexander Larsson} 583781343738de4abddf56982325a77bd70a98cd26Alexander Larsson 593781343738de4abddf56982325a77bd70a98cd26Alexander Larssonstatic GObject * 603781343738de4abddf56982325a77bd70a98cd26Alexander Larssong_fam_file_monitor_constructor (GType type, 613781343738de4abddf56982325a77bd70a98cd26Alexander Larsson guint n_construct_properties, 623781343738de4abddf56982325a77bd70a98cd26Alexander Larsson GObjectConstructParam *construct_properties) 633781343738de4abddf56982325a77bd70a98cd26Alexander Larsson{ 643781343738de4abddf56982325a77bd70a98cd26Alexander Larsson GObject *obj; 653781343738de4abddf56982325a77bd70a98cd26Alexander Larsson GFamFileMonitorClass *klass; 663781343738de4abddf56982325a77bd70a98cd26Alexander Larsson GObjectClass *parent_class; 673781343738de4abddf56982325a77bd70a98cd26Alexander Larsson GFamFileMonitor *fam_monitor; 683781343738de4abddf56982325a77bd70a98cd26Alexander Larsson const gchar *filename = NULL; 693781343738de4abddf56982325a77bd70a98cd26Alexander Larsson fam_sub *sub = NULL; 703781343738de4abddf56982325a77bd70a98cd26Alexander Larsson 713781343738de4abddf56982325a77bd70a98cd26Alexander Larsson klass = G_FAM_FILE_MONITOR_CLASS (g_type_class_peek (G_TYPE_FAM_FILE_MONITOR)); 723781343738de4abddf56982325a77bd70a98cd26Alexander Larsson parent_class = G_OBJECT_CLASS (g_type_class_peek_parent (klass)); 733781343738de4abddf56982325a77bd70a98cd26Alexander Larsson obj = parent_class->constructor (type, 743781343738de4abddf56982325a77bd70a98cd26Alexander Larsson n_construct_properties, 753781343738de4abddf56982325a77bd70a98cd26Alexander Larsson construct_properties); 763781343738de4abddf56982325a77bd70a98cd26Alexander Larsson 773781343738de4abddf56982325a77bd70a98cd26Alexander Larsson fam_monitor = G_FAM_FILE_MONITOR (obj); 783781343738de4abddf56982325a77bd70a98cd26Alexander Larsson 793781343738de4abddf56982325a77bd70a98cd26Alexander Larsson filename = G_LOCAL_FILE_MONITOR (obj)->filename; 803781343738de4abddf56982325a77bd70a98cd26Alexander Larsson 813781343738de4abddf56982325a77bd70a98cd26Alexander Larsson g_assert (filename != NULL); 823781343738de4abddf56982325a77bd70a98cd26Alexander Larsson 833781343738de4abddf56982325a77bd70a98cd26Alexander Larsson sub = _fam_sub_add (filename, FALSE, fam_monitor); 843781343738de4abddf56982325a77bd70a98cd26Alexander Larsson /* FIXME: what to do about errors here? we can't return NULL or another 853781343738de4abddf56982325a77bd70a98cd26Alexander Larsson * kind of error and an assertion is probably too hard */ 863781343738de4abddf56982325a77bd70a98cd26Alexander Larsson g_assert (sub != NULL); 873781343738de4abddf56982325a77bd70a98cd26Alexander Larsson 883781343738de4abddf56982325a77bd70a98cd26Alexander Larsson fam_monitor->sub = sub; 893781343738de4abddf56982325a77bd70a98cd26Alexander Larsson 903781343738de4abddf56982325a77bd70a98cd26Alexander Larsson return obj; 913781343738de4abddf56982325a77bd70a98cd26Alexander Larsson} 923781343738de4abddf56982325a77bd70a98cd26Alexander Larsson 933781343738de4abddf56982325a77bd70a98cd26Alexander Larssonstatic void 943781343738de4abddf56982325a77bd70a98cd26Alexander Larssong_fam_file_monitor_class_finalize (GFamFileMonitorClass *klass) 953781343738de4abddf56982325a77bd70a98cd26Alexander Larsson{ 963781343738de4abddf56982325a77bd70a98cd26Alexander Larsson} 973781343738de4abddf56982325a77bd70a98cd26Alexander Larsson 983781343738de4abddf56982325a77bd70a98cd26Alexander Larssonstatic gboolean 993781343738de4abddf56982325a77bd70a98cd26Alexander Larssong_fam_file_monitor_is_supported (void) 1003781343738de4abddf56982325a77bd70a98cd26Alexander Larsson{ 1013781343738de4abddf56982325a77bd70a98cd26Alexander Larsson return _fam_sub_startup (); 1023781343738de4abddf56982325a77bd70a98cd26Alexander Larsson} 1033781343738de4abddf56982325a77bd70a98cd26Alexander Larsson 1043781343738de4abddf56982325a77bd70a98cd26Alexander Larssonstatic void 1053781343738de4abddf56982325a77bd70a98cd26Alexander Larssong_fam_file_monitor_class_init (GFamFileMonitorClass* klass) 1063781343738de4abddf56982325a77bd70a98cd26Alexander Larsson{ 1073781343738de4abddf56982325a77bd70a98cd26Alexander Larsson GObjectClass* gobject_class = G_OBJECT_CLASS (klass); 1083781343738de4abddf56982325a77bd70a98cd26Alexander Larsson GFileMonitorClass *file_monitor_class = G_FILE_MONITOR_CLASS (klass); 1093781343738de4abddf56982325a77bd70a98cd26Alexander Larsson GLocalFileMonitorClass *local_file_monitor_class = G_LOCAL_FILE_MONITOR_CLASS (klass); 1103781343738de4abddf56982325a77bd70a98cd26Alexander Larsson 1113781343738de4abddf56982325a77bd70a98cd26Alexander Larsson gobject_class->finalize = g_fam_file_monitor_finalize; 1123781343738de4abddf56982325a77bd70a98cd26Alexander Larsson gobject_class->constructor = g_fam_file_monitor_constructor; 1133781343738de4abddf56982325a77bd70a98cd26Alexander Larsson file_monitor_class->cancel = g_fam_file_monitor_cancel; 1143781343738de4abddf56982325a77bd70a98cd26Alexander Larsson 1153781343738de4abddf56982325a77bd70a98cd26Alexander Larsson local_file_monitor_class->is_supported = g_fam_file_monitor_is_supported; 1163781343738de4abddf56982325a77bd70a98cd26Alexander Larsson} 1173781343738de4abddf56982325a77bd70a98cd26Alexander Larsson 1183781343738de4abddf56982325a77bd70a98cd26Alexander Larssonstatic void 1193781343738de4abddf56982325a77bd70a98cd26Alexander Larssong_fam_file_monitor_init (GFamFileMonitor* monitor) 1203781343738de4abddf56982325a77bd70a98cd26Alexander Larsson{ 1213781343738de4abddf56982325a77bd70a98cd26Alexander Larsson 1223781343738de4abddf56982325a77bd70a98cd26Alexander Larsson} 1233781343738de4abddf56982325a77bd70a98cd26Alexander Larsson 1243781343738de4abddf56982325a77bd70a98cd26Alexander Larssonstatic gboolean 1253781343738de4abddf56982325a77bd70a98cd26Alexander Larssong_fam_file_monitor_cancel (GFileMonitor* monitor) 1263781343738de4abddf56982325a77bd70a98cd26Alexander Larsson{ 1273781343738de4abddf56982325a77bd70a98cd26Alexander Larsson GFamFileMonitor *fam_monitor = G_FAM_FILE_MONITOR (monitor); 1283781343738de4abddf56982325a77bd70a98cd26Alexander Larsson fam_sub *sub = fam_monitor->sub; 1293781343738de4abddf56982325a77bd70a98cd26Alexander Larsson 1303781343738de4abddf56982325a77bd70a98cd26Alexander Larsson if (sub) { 1313781343738de4abddf56982325a77bd70a98cd26Alexander Larsson if (!_fam_sub_cancel (sub)) 1323781343738de4abddf56982325a77bd70a98cd26Alexander Larsson g_warning ("Unexpected error cancelling fam monitor"); 1333781343738de4abddf56982325a77bd70a98cd26Alexander Larsson fam_monitor->sub = NULL; 1343781343738de4abddf56982325a77bd70a98cd26Alexander Larsson } 1353781343738de4abddf56982325a77bd70a98cd26Alexander Larsson 1363781343738de4abddf56982325a77bd70a98cd26Alexander Larsson if (G_FILE_MONITOR_CLASS (g_fam_file_monitor_parent_class)->cancel) 1373781343738de4abddf56982325a77bd70a98cd26Alexander Larsson (*G_FILE_MONITOR_CLASS (g_fam_file_monitor_parent_class)->cancel) (monitor); 1383781343738de4abddf56982325a77bd70a98cd26Alexander Larsson 1393781343738de4abddf56982325a77bd70a98cd26Alexander Larsson return TRUE; 1403781343738de4abddf56982325a77bd70a98cd26Alexander Larsson} 1413781343738de4abddf56982325a77bd70a98cd26Alexander Larsson 1423781343738de4abddf56982325a77bd70a98cd26Alexander Larssonvoid 1433781343738de4abddf56982325a77bd70a98cd26Alexander Larssong_fam_file_monitor_register (GIOModule *module) 1443781343738de4abddf56982325a77bd70a98cd26Alexander Larsson{ 1453781343738de4abddf56982325a77bd70a98cd26Alexander Larsson g_fam_file_monitor_register_type (G_TYPE_MODULE (module)); 146bff9ecedbbea1a794827f569638365db40c442e6Alexander Larsson g_io_extension_point_implement (G_LOCAL_FILE_MONITOR_EXTENSION_POINT_NAME, 147bff9ecedbbea1a794827f569638365db40c442e6Alexander Larsson G_TYPE_FAM_FILE_MONITOR, 148bff9ecedbbea1a794827f569638365db40c442e6Alexander Larsson "fam", 149bff9ecedbbea1a794827f569638365db40c442e6Alexander Larsson 10); 1503781343738de4abddf56982325a77bd70a98cd26Alexander Larsson} 1513781343738de4abddf56982325a77bd70a98cd26Alexander Larsson 152