X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mono%2Fmetadata%2Fw32file.c;h=f10ae499645e1afd7093c4ca76c1d731d239a85e;hb=ab0b591ca59d99a2370bf9f579b091c5edf09ae5;hp=919965c1639ff43e809e0b4373ada759c7126413;hpb=6ac36d6c40a2dd0ab2800c23d08894856b193c2f;p=mono.git diff --git a/mono/metadata/w32file.c b/mono/metadata/w32file.c index 919965c1639..f10ae499645 100644 --- a/mono/metadata/w32file.c +++ b/mono/metadata/w32file.c @@ -285,167 +285,6 @@ ves_icall_System_IO_MonoIO_RemoveDirectory (MonoString *path, gint32 *error) return(ret); } -static gchar * -get_search_dir (const gunichar2 *pattern) -{ - gchar *p; - gchar *result; - - p = g_utf16_to_utf8 (pattern, -1, NULL, NULL, NULL); - result = g_path_get_dirname (p); - g_free (p); - return result; -} - -static GPtrArray * -get_filesystem_entries (const gunichar2 *path, - const gunichar2 *path_with_pattern, - gint attrs, gint mask, - gint32 *error) -{ - int i; - WIN32_FIND_DATA data; - HANDLE find_handle; - GPtrArray *names = NULL; - gchar *utf8_path = NULL, *utf8_result, *full_name; - gint32 attributes; - - mask = convert_attrs ((MonoFileAttributes)mask); - attributes = get_file_attributes (path); - if (attributes != -1) { - if ((attributes & FILE_ATTRIBUTE_DIRECTORY) == 0) { - *error = ERROR_INVALID_NAME; - goto fail; - } - } else { - *error = mono_w32error_get_last (); - goto fail; - } - - find_handle = mono_w32file_find_first (path_with_pattern, &data); - if (find_handle == INVALID_HANDLE_VALUE) { - gint32 find_error = mono_w32error_get_last (); - - if (find_error == ERROR_FILE_NOT_FOUND || find_error == ERROR_NO_MORE_FILES) { - /* No files, so just return an empty array */ - goto fail; - } - - *error = find_error; - goto fail; - } - - utf8_path = get_search_dir (path_with_pattern); - names = g_ptr_array_new (); - - do { - if ((data.cFileName[0] == '.' && data.cFileName[1] == 0) || - (data.cFileName[0] == '.' && data.cFileName[1] == '.' && data.cFileName[2] == 0)) { - continue; - } - - if ((data.dwFileAttributes & mask) == attrs) { - utf8_result = g_utf16_to_utf8 (data.cFileName, -1, NULL, NULL, NULL); - if (utf8_result == NULL) { - continue; - } - - full_name = g_build_filename (utf8_path, utf8_result, NULL); - g_ptr_array_add (names, full_name); - - g_free (utf8_result); - } - } while(mono_w32file_find_next (find_handle, &data)); - - if (mono_w32file_find_close (find_handle) == FALSE) { - *error = mono_w32error_get_last (); - goto fail; - } - - g_free (utf8_path); - return names; -fail: - if (names) { - for (i = 0; i < names->len; i++) - g_free (g_ptr_array_index (names, i)); - g_ptr_array_free (names, TRUE); - } - g_free (utf8_path); - return FALSE; -} - - -MonoArray * -ves_icall_System_IO_MonoIO_GetFileSystemEntries (MonoString *path, - MonoString *path_with_pattern, - gint attrs, gint mask, - gint32 *ioerror) -{ - MonoError error; - MonoDomain *domain = mono_domain_get (); - MonoArray *result; - int i; - GPtrArray *names; - - *ioerror = ERROR_SUCCESS; - - names = get_filesystem_entries (mono_string_chars (path), mono_string_chars (path_with_pattern), attrs, mask, ioerror); - - if (!names) { - // If there's no array and no error, then return an empty array. - if (*ioerror == ERROR_SUCCESS) { - MonoArray *arr = mono_array_new_checked (domain, mono_defaults.string_class, 0, &error); - mono_error_set_pending_exception (&error); - return arr; - } - return NULL; - } - - result = mono_array_new_checked (domain, mono_defaults.string_class, names->len, &error); - if (mono_error_set_pending_exception (&error)) - goto leave; - for (i = 0; i < names->len; i++) { - MonoString *name = mono_string_new_checked (domain, (const char *)g_ptr_array_index (names, i), &error); - if (mono_error_set_pending_exception (&error)) - goto leave; - mono_array_setref (result, i, name); - g_free (g_ptr_array_index (names, i)); - } -leave: - g_ptr_array_free (names, TRUE); - return result; -} - -typedef struct { - MonoDomain *domain; - gchar *utf8_path; - HANDLE find_handle; -} IncrementalFind; - -static gboolean -incremental_find_check_match (IncrementalFind *handle, WIN32_FIND_DATA *data, MonoString **result, MonoError *error) -{ - error_init (error); - gchar *utf8_result; - gchar *full_name; - - if ((data->cFileName[0] == '.' && data->cFileName[1] == 0) || (data->cFileName[0] == '.' && data->cFileName[1] == '.' && data->cFileName[2] == 0)) - return FALSE; - - utf8_result = g_utf16_to_utf8 (data->cFileName, -1, NULL, NULL, NULL); - if (utf8_result == NULL) - return FALSE; - - full_name = g_build_filename (handle->utf8_path, utf8_result, NULL); - g_free (utf8_result); - *result = mono_string_new_checked (mono_domain_get (), full_name, error); - g_free (full_name); - if (!is_ok (error)) - return FALSE; - - return TRUE; -} - HANDLE ves_icall_System_IO_MonoIO_FindFirstFile (MonoString *path_with_pattern, MonoString **file_name, gint32 *file_attr, gint32 *ioerror) { @@ -502,106 +341,6 @@ ves_icall_System_IO_MonoIO_FindCloseFile (HANDLE hnd) return mono_w32file_find_close (hnd); } -/* FIXME make gc suspendable */ -MonoString * -ves_icall_System_IO_MonoIO_FindFirst (MonoString *path, - MonoString *path_with_pattern, - gint32 *result_attr, gint32 *ioerror, - gpointer *handle) -{ - MonoError error; - WIN32_FIND_DATA data; - HANDLE find_handle; - IncrementalFind *ifh; - MonoString *result; - - *ioerror = ERROR_SUCCESS; - - find_handle = mono_w32file_find_first (mono_string_chars (path_with_pattern), &data); - - if (find_handle == INVALID_HANDLE_VALUE) { - gint32 find_error = mono_w32error_get_last (); - *handle = NULL; - - if (find_error == ERROR_FILE_NOT_FOUND) - return NULL; - - *ioerror = find_error; - return NULL; - } - - ifh = g_new (IncrementalFind, 1); - ifh->find_handle = find_handle; - ifh->utf8_path = mono_string_to_utf8_checked (path, &error); - if (mono_error_set_pending_exception (&error)) { - mono_w32file_find_close (find_handle); - g_free (ifh); - return NULL; - } - ifh->domain = mono_domain_get (); - *handle = ifh; - - while (incremental_find_check_match (ifh, &data, &result, &error) == 0){ - if (!is_ok (&error)) { - mono_error_set_pending_exception (&error); - return NULL; - } - if (mono_w32file_find_next (find_handle, &data) == FALSE){ - int e = mono_w32error_get_last (); - if (e != ERROR_NO_MORE_FILES) - *ioerror = e; - return NULL; - } - } - *result_attr = data.dwFileAttributes; - - return result; -} - -/* FIXME make gc suspendable */ -MonoString * -ves_icall_System_IO_MonoIO_FindNext (gpointer handle, gint32 *result_attr, gint32 *ioerror) -{ - MonoError error; - IncrementalFind *ifh = (IncrementalFind *)handle; - WIN32_FIND_DATA data; - MonoString *result; - - error_init (&error); - *ioerror = ERROR_SUCCESS; - do { - if (!is_ok (&error)) { - mono_error_set_pending_exception (&error); - return NULL; - } - if (mono_w32file_find_next (ifh->find_handle, &data) == FALSE){ - int e = mono_w32error_get_last (); - if (e != ERROR_NO_MORE_FILES) - *ioerror = e; - return NULL; - } - } while (incremental_find_check_match (ifh, &data, &result, &error) == 0); - - *result_attr = data.dwFileAttributes; - return result; -} - -int -ves_icall_System_IO_MonoIO_FindClose (gpointer handle) -{ - IncrementalFind *ifh = (IncrementalFind *)handle; - gint32 error; - - if (mono_w32file_find_close (ifh->find_handle) == FALSE){ - error = mono_w32error_get_last (); - } else - error = ERROR_SUCCESS; - g_free (ifh->utf8_path); - g_free (ifh); - - return error; -} - MonoString * ves_icall_System_IO_MonoIO_GetCurrentDirectory (gint32 *io_error) { @@ -1065,25 +804,22 @@ MonoBoolean ves_icall_System_IO_MonoIO_DuplicateHandle (HANDLE source_process_handle, HANDLE source_handle, HANDLE target_process_handle, HANDLE *target_handle, gint32 access, gint32 inherit, gint32 options, gint32 *error) { - /* This is only used on Windows */ +#ifndef HOST_WIN32 + *target_handle = mono_w32handle_duplicate (source_handle); +#else gboolean ret; - -#ifdef HOST_WIN32 + MONO_ENTER_GC_SAFE; ret=DuplicateHandle (source_process_handle, source_handle, target_process_handle, target_handle, access, inherit, options); MONO_EXIT_GC_SAFE; -#else - mono_w32handle_ref (source_handle); - *target_handle = source_handle; - ret = TRUE; -#endif - if(ret==FALSE) { + if (!ret) { *error = mono_w32error_get_last (); /* FIXME: throw an exception? */ return(FALSE); } - +#endif + return(TRUE); }