7f8deeaceeed5d6de2498dbafc17df014802f575
[mono.git] / mono / metadata / filewatcher.c
1 /*
2  * filewatcher.c: File System Watcher internal calls
3  *
4  * Authors:
5  *      Gonzalo Paniagua Javier (gonzalo@ximian.com)
6  *
7  * (C) 2004 Novell, Inc. (http://www.novell.com)
8  */
9
10 #ifdef HAVE_CONFIG_H
11 #include <config.h>
12 #endif
13
14 #include <mono/metadata/appdomain.h>
15 #include <mono/metadata/exception.h>
16 #include <mono/metadata/filewatcher.h>
17
18 #if (defined (PLATFORM_WIN32) && WINVER >= 0x0400)
19
20 /*
21  * TODO:
22  * We use the managed watcher on windows, so the code inside this #if is never used
23  */
24 gint
25 ves_icall_System_IO_FSW_SupportsFSW (void)
26 {
27         return 1;
28 }
29
30 gpointer
31 ves_icall_System_IO_FSW_OpenDirectory (MonoString *path, gpointer reserved)
32 {
33         return NULL;
34         /*
35         gpointer dir;
36         gchar *utf8path;
37
38         MONO_ARCH_SAVE_REGS;
39
40         dir = CreateFile (path, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_DELETE,
41                           NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL);
42
43         return dir;
44         */
45 }
46
47 gboolean
48 ves_icall_System_IO_FSW_CloseDirectory (gpointer handle)
49 {
50         return FALSE;
51         /*
52         MONO_ARCH_SAVE_REGS;
53
54         return CloseHandle (handle);
55         */
56 }
57
58 gboolean
59 ves_icall_System_IO_FSW_ReadDirectoryChanges (gpointer handle,
60                                               MonoArray *buffer,
61                                               gboolean includeSubdirs,
62                                               gint filters,
63                                               gpointer overlap,
64                                               gpointer callback)
65 {
66         return FALSE;
67         /*
68         gpointer dest;
69         gint size;
70         MonoObject *delegate = (MonoObject *) callback;
71         MonoMethod *im;
72         LPOVERLAPPED_COMPLETION_ROUTINE func;
73
74         MONO_ARCH_SAVE_REGS;
75
76         size = mono_array_length (buffer);
77         dest = mono_array_addr_with_size (buffer, 1, 0);
78
79         im = mono_get_delegate_invoke (mono_object_get_class (delegate));
80         func = mono_compile_method (im);
81         return FALSE;
82         * return ReadDirectoryChanges (handle, dest, size, includeSubdirs, filters,
83                                      NULL, (LPOVERLAPPED) overlap,
84                                      func); */
85 }
86
87 gboolean
88 ves_icall_System_IO_FAMW_InternalFAMNextEvent (gpointer conn,
89                                                MonoString **filename,
90                                                gint *code,
91                                                gint *reqnum)
92 {
93         return FALSE;
94 }
95 #else
96
97 static int (*FAMNextEvent) (gpointer, gpointer);
98
99 gint
100 ves_icall_System_IO_FSW_SupportsFSW (void)
101 {
102 #if HAVE_KQUEUE
103         return 3;
104 #else
105         GModule *fam_module;
106         gchar *filename;
107
108         MONO_ARCH_SAVE_REGS;
109
110         filename = g_module_build_path (NULL, "libfam.so.0");
111         fam_module = g_module_open (filename, G_MODULE_BIND_LAZY);
112         g_free (filename);
113         if (fam_module == NULL)
114                 return 0;
115
116         g_module_symbol (fam_module, "FAMNextEvent", (gpointer *) &FAMNextEvent);
117         if (FAMNextEvent == NULL)
118                 return 0;
119
120         return 2;
121 #endif
122 }
123
124 gpointer
125 ves_icall_System_IO_FSW_OpenDirectory (MonoString *path, gpointer reserved)
126 {
127         return NULL;
128 }
129
130 gboolean
131 ves_icall_System_IO_FSW_CloseDirectory (gpointer handle)
132 {
133         return FALSE;
134 }
135
136 gboolean
137 ves_icall_System_IO_FSW_ReadDirectoryChanges (gpointer handle,
138                                               MonoArray *buffer,
139                                               gboolean includeSubdirs,
140                                               gint filters,
141                                               gpointer overlap,
142                                               gpointer callback)
143 {
144         return FALSE;
145 }
146
147 /* Almost copied from fam.h. Weird, I know */
148 typedef struct {
149         gint reqnum;
150 } FAMRequest;
151
152 typedef struct FAMEvent {
153         gpointer fc;
154         FAMRequest fr;
155         gchar *hostname;
156         gchar filename [PATH_MAX];
157         gpointer userdata;
158         gint code;
159 } FAMEvent;
160
161 gboolean
162 ves_icall_System_IO_FAMW_InternalFAMNextEvent (gpointer conn,
163                                                MonoString **filename,
164                                                gint *code,
165                                                gint *reqnum)
166 {
167         FAMEvent ev;
168
169         MONO_ARCH_SAVE_REGS;
170
171         if (FAMNextEvent (conn, &ev) == 1) {
172                 *filename = mono_string_new (mono_domain_get (), ev.filename);
173                 *code = ev.code;
174                 *reqnum = ev.fr.reqnum;
175                 return TRUE;
176         }
177
178         return FALSE;
179 }
180
181 #endif
182