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