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