summaryrefslogtreecommitdiff
path: root/gio/gpollfilemonitor.c
diff options
context:
space:
mode:
Diffstat (limited to 'gio/gpollfilemonitor.c')
-rw-r--r--gio/gpollfilemonitor.c198
1 files changed, 0 insertions, 198 deletions
diff --git a/gio/gpollfilemonitor.c b/gio/gpollfilemonitor.c
deleted file mode 100644
index eee499b3..00000000
--- a/gio/gpollfilemonitor.c
+++ /dev/null
@@ -1,198 +0,0 @@
-#include <config.h>
-#include <string.h>
-
-#include "gpollfilemonitor.h"
-#include "gfilemonitorpriv.h"
-
-static gboolean g_poll_file_monitor_cancel (GFileMonitor* monitor);
-static void schedule_poll_timeout (GPollFileMonitor* poll_monitor);
-
-struct _GPollFileMonitor
-{
- GFileMonitor parent_instance;
- GFile *file;
- GFileInfo *last_info;
- guint timeout;
-};
-
-#define POLL_TIME_SECS 5
-
-G_DEFINE_TYPE (GPollFileMonitor, g_poll_file_monitor, G_TYPE_FILE_MONITOR)
-
-static void
-g_poll_file_monitor_finalize (GObject* object)
-{
- GPollFileMonitor* poll_monitor;
-
- poll_monitor = G_POLL_FILE_MONITOR (object);
-
- g_object_unref (poll_monitor->file);
-
- if (G_OBJECT_CLASS (g_poll_file_monitor_parent_class)->finalize)
- (*G_OBJECT_CLASS (g_poll_file_monitor_parent_class)->finalize) (object);
-}
-
-
-static void
-g_poll_file_monitor_class_init (GPollFileMonitorClass* klass)
-{
- GObjectClass* gobject_class = G_OBJECT_CLASS (klass);
- GFileMonitorClass *file_monitor_class = G_FILE_MONITOR_CLASS (klass);
-
- gobject_class->finalize = g_poll_file_monitor_finalize;
-
- file_monitor_class->cancel = g_poll_file_monitor_cancel;
-}
-
-static void
-g_poll_file_monitor_init (GPollFileMonitor* poll_monitor)
-{
-}
-
-static gboolean
-safe_strcmp (const char *a, const char *b)
-{
- if (a == NULL && b == NULL)
- return 0;
- if (a == NULL)
- return -1;
- if (b == NULL)
- return 1;
-
- return strcmp (a, b);
-}
-
-static int
-calc_event_type (GFileInfo *last,
- GFileInfo *new)
-{
- if (last == NULL && new == NULL)
- return -1;
-
- if (last == NULL && new != NULL)
- return G_FILE_MONITOR_EVENT_CREATED;
-
- if (last != NULL && new == NULL)
- return G_FILE_MONITOR_EVENT_DELETED;
-
- if (safe_strcmp (g_file_info_get_etag (last),
- g_file_info_get_etag (new)))
- return G_FILE_MONITOR_EVENT_CHANGED;
-
- if (g_file_info_get_size (last) !=
- g_file_info_get_size (new))
- return G_FILE_MONITOR_EVENT_CHANGED;
-
- return -1;
-}
-
-static void
-got_new_info (GObject *source_object,
- GAsyncResult *res,
- gpointer user_data)
-{
- GPollFileMonitor* poll_monitor = user_data;
- GFileInfo *info;
- int event;
-
- info = g_file_get_info_finish (poll_monitor->file, res, NULL);
-
- if (!g_file_monitor_is_cancelled (G_FILE_MONITOR (poll_monitor)))
- {
- event = calc_event_type (poll_monitor->last_info, info);
-
- if (event != -1)
- {
- g_file_monitor_emit_event (G_FILE_MONITOR (poll_monitor),
- poll_monitor->file,
- NULL, event);
- /* We're polling so slowly anyway, so always emit the done hint */
- if (event == G_FILE_MONITOR_EVENT_CHANGED)
- g_file_monitor_emit_event (G_FILE_MONITOR (poll_monitor),
- poll_monitor->file,
- NULL, G_FILE_MONITOR_EVENT_CHANGES_DONE_HINT);
- }
-
- if (poll_monitor->last_info)
- {
- g_object_unref (poll_monitor->last_info);
- poll_monitor->last_info = NULL;
- }
-
- if (info)
- poll_monitor->last_info = g_object_ref (info);
-
- schedule_poll_timeout (poll_monitor);
- }
-
- if (info)
- g_object_unref (info);
-
- g_object_unref (poll_monitor);
-}
-
-static gboolean
-poll_file_timeout (gpointer data)
-{
- GPollFileMonitor* poll_monitor = data;
-
- poll_monitor->timeout = FALSE;
-
- g_file_get_info_async (poll_monitor->file, G_FILE_ATTRIBUTE_ETAG_VALUE "," G_FILE_ATTRIBUTE_STD_SIZE,
- 0, 0, NULL, got_new_info, g_object_ref (poll_monitor));
-
- return FALSE;
-}
-
-static void
-schedule_poll_timeout (GPollFileMonitor* poll_monitor)
-{
- poll_monitor->timeout = g_timeout_add_seconds (POLL_TIME_SECS, poll_file_timeout, poll_monitor);
- }
-
-static void
-got_initial_info (GObject *source_object,
- GAsyncResult *res,
- gpointer user_data)
-{
- GPollFileMonitor* poll_monitor = user_data;
- GFileInfo *info;
-
- info = g_file_get_info_finish (poll_monitor->file, res, NULL);
-
- poll_monitor->last_info = info;
-
- if (!g_file_monitor_is_cancelled (G_FILE_MONITOR (poll_monitor)))
- schedule_poll_timeout (poll_monitor);
-
- g_object_unref (poll_monitor);
-}
-
-GFileMonitor*
-g_poll_file_monitor_new (GFile *file)
-{
- GPollFileMonitor* poll_monitor;
-
- poll_monitor = g_object_new (G_TYPE_POLL_FILE_MONITOR, NULL);
-
- poll_monitor->file = g_object_ref (file);
-
- g_file_get_info_async (file, G_FILE_ATTRIBUTE_ETAG_VALUE "," G_FILE_ATTRIBUTE_STD_SIZE,
- 0, 0, NULL, got_initial_info, g_object_ref (poll_monitor));
-
- return G_FILE_MONITOR (poll_monitor);
-}
-
-static gboolean
-g_poll_file_monitor_cancel (GFileMonitor* monitor)
-{
- GPollFileMonitor *poll_monitor = G_POLL_FILE_MONITOR (monitor);
-
- if (poll_monitor->timeout)
- {
- g_source_remove (poll_monitor->timeout);
- poll_monitor->timeout = 0;
- }
-
- return TRUE;
-}