2006-06-08 Zoltan Varga <vargaz@gmail.com>
[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         int lib_used = 4; /* gamin */
108
109         MONO_ARCH_SAVE_REGS;
110
111         filename = g_module_build_path (NULL, "libgamin-1.so.0");
112         fam_module = g_module_open (filename, G_MODULE_BIND_LAZY);
113         g_free (filename);
114         if (fam_module == NULL) {
115                 lib_used = 2; /* FAM */
116                 filename = g_module_build_path (NULL, "libfam.so.0");
117                 fam_module = g_module_open (filename, G_MODULE_BIND_LAZY);
118                 g_free (filename);
119         }
120
121         if (fam_module == NULL)
122                 return 0;
123
124         g_module_symbol (fam_module, "FAMNextEvent", (gpointer *) &FAMNextEvent);
125         if (FAMNextEvent == NULL)
126                 return 0;
127
128         return lib_used;
129 #endif
130 }
131
132 gpointer
133 ves_icall_System_IO_FSW_OpenDirectory (MonoString *path, gpointer reserved)
134 {
135         return NULL;
136 }
137
138 gboolean
139 ves_icall_System_IO_FSW_CloseDirectory (gpointer handle)
140 {
141         return FALSE;
142 }
143
144 gboolean
145 ves_icall_System_IO_FSW_ReadDirectoryChanges (gpointer handle,
146                                               MonoArray *buffer,
147                                               gboolean includeSubdirs,
148                                               gint filters,
149                                               gpointer overlap,
150                                               gpointer callback)
151 {
152         return FALSE;
153 }
154
155 /* Almost copied from fam.h. Weird, I know */
156 typedef struct {
157         gint reqnum;
158 } FAMRequest;
159
160 typedef struct FAMEvent {
161         gpointer fc;
162         FAMRequest fr;
163         gchar *hostname;
164         gchar filename [PATH_MAX];
165         gpointer userdata;
166         gint code;
167 } FAMEvent;
168
169 gboolean
170 ves_icall_System_IO_FAMW_InternalFAMNextEvent (gpointer conn,
171                                                MonoString **filename,
172                                                gint *code,
173                                                gint *reqnum)
174 {
175         FAMEvent ev;
176
177         MONO_ARCH_SAVE_REGS;
178
179         if (FAMNextEvent (conn, &ev) == 1) {
180                 *filename = mono_string_new (mono_domain_get (), ev.filename);
181                 *code = ev.code;
182                 *reqnum = ev.fr.reqnum;
183                 return TRUE;
184         }
185
186         return FALSE;
187 }
188
189 #endif
190