Files
glib/gio/win32/gwin32filemonitorutils.h
Chun-wei Fan 55847d9258 Continue to Improve File Monitoring on Windows
This updates the file monitoring on Windows by:
-Clean up the code, and ensure things are indeed being freed when we exit.
-Have attributes changes in files (when monitoring directories) properly
 done.
-Split up the code, to ease readability

To Possibly Do:
-Check on whether we want to monitor the case when we try to pull out a USB
 stick without ejecting in in Windows (the monitoring mechanism
 understandbly denies such ejection requests, since the monitored
 file/directory is obviously in use in this case)
-Investigate on the interesting/boredom algorithm, whether we can do it
 here.

Possible Limitations:
-If moving a file out of the directory (or vice versa), the system reports
 that as a delete event (or create event in the vice versa case), so in the
 current form without using NTFS hournals (which is not optimal as that
 would trigger UAC), so we can't reliably emit MOVE OUT or MOVE IN events
 on Windows.
-Hard links are supported transparently, but notifications are only sent
 by the system on changes when the monitored file/directory (or monitored
 hard link) is being changed, when the file is modified via the hard link
 or original file respectively in this case.

https://bugzilla.gnome.org/show_bug.cgi?id=730116
2015-03-30 14:24:38 +08:00

90 lines
2.9 KiB
C

/* GIO - GLib Input, Output and Streaming Library
*
* Copyright (C) 2006-2015 Red Hat, Inc.
* Copyright (C) 2015 Chun-wei Fan
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General
* Public License along with this library; if not, see <http://www.gnu.org/licenses/>.
*
* Author: Vlad Grecescu <b100dian@gmail.com>
* Author: Chun-wei Fan <fanc999@yahoo.com.tw>
*
*/
#ifndef __G_WIN32_FILE_MONITOR_UTILS_H__
#define __G_WIN32_FILE_MONITOR_UTILS_H__
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include "gio/glocalfilemonitor.h"
#include "gio/gfilemonitor.h"
#define MAX_PATH_LONG 32767 /* Support Paths longer than MAX_PATH (260) characters */
#define LONGPFX "\\\\?\\" /* MSDN: Append Paths with \\?\ to support over paths over 256 characters */
#define G_DIR_SEPARATOR_W L'\\'
#define STRIP_PFX_LENGTH g_utf8_strlen (LONGPFX, -1)
G_BEGIN_DECLS
typedef struct _GWin32FileMonitorPrivate GWin32FileMonitorPrivate;
typedef struct _GWin32FileMonitorInfo GWin32FileMonitorInfo;
typedef struct _GWin32FileMonitorDirInfo GWin32FileMonitorDirInfo;
struct _GWin32FileMonitorPrivate
{
OVERLAPPED overlapped;
DWORD buffer_allocated_bytes;
PFILE_NOTIFY_INFORMATION file_notify_buffer;
DWORD buffer_filled_bytes;
HANDLE hDirectory;
gboolean isfile;
GHashTable *ht_watched_dirs;
GHashTable *ht_watched_names;
GHashTable *ht_files_attribs;
DWORD file_attribs;
PFILE_NOTIFY_INFORMATION pfni_prev;
/* Needed in the APC where we only have this private struct */
GFileMonitor *self;
GFileMonitorSource *fms;
};
struct _GWin32FileMonitorInfo
{
gchar *name;
gchar *dirname_with_long_prefix;
gchar *longname;
gchar *shortname;
gboolean isfile;
WIN32_FILE_ATTRIBUTE_DATA attribs;
};
void g_win32_file_monitor_prepare (GWin32FileMonitorPrivate *monitor,
gchar *dirname,
gchar *filename,
gboolean isfile);
void g_win32_file_monitor_set_names (GWin32FileMonitorInfo *info);
GHashTable* g_win32_file_monitor_dir_refresh_attribs (GWin32FileMonitorPrivate *monitor,
GWin32FileMonitorInfo *info);
gboolean g_win32_file_monitor_check_attrib_changed (GWin32FileMonitorInfo *info,
gchar *filename,
GHashTable *ht_attribs);
G_END_DECLS
#endif