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