Merge pull request #5714 from alexischr/update_bockbuild
[mono.git] / mono / metadata / icall-windows.c
index c0b1d314d9189e72cb8534913a59edb9f0dc792d..691d1b03b30fa50e3a3c62a02fd439eebe195e96 100644 (file)
@@ -46,22 +46,21 @@ mono_icall_module_get_hinstance (MonoReflectionModuleHandle module)
 }
 
 #if G_HAVE_API_SUPPORT(HAVE_CLASSIC_WINAPI_SUPPORT)
-MonoString *
-mono_icall_get_machine_name (void)
+MonoStringHandle
+mono_icall_get_machine_name (MonoError *error)
 {
        gunichar2 *buf;
        guint32 len;
-       MonoString *result;
+       MonoStringHandle result;
 
        len = MAX_COMPUTERNAME_LENGTH + 1;
        buf = g_new (gunichar2, len);
 
        result = NULL;
        if (GetComputerName (buf, (PDWORD) &len)) {
-               MonoError error;
-               result = mono_string_new_utf16_checked (mono_domain_get (), buf, len, &error);
-               mono_error_set_pending_exception (&error);
-       }
+               result = mono_string_new_utf16_handle (mono_domain_get (), buf, len, error);
+       } else
+               result = MONO_HANDLE_NEW (MonoString, NULL);
 
        g_free (buf);
        return result;
@@ -75,10 +74,11 @@ mono_icall_get_platform (void)
        return 2;
 }
 
-MonoString *
-mono_icall_get_new_line (void)
+MonoStringHandle
+mono_icall_get_new_line (MonoError *error)
 {
-       return mono_string_new (mono_domain_get (), "\r\n");
+       error_init (error);
+       return mono_string_new_handle (mono_domain_get (), "\r\n", error);
 }
 
 MonoBoolean
@@ -96,9 +96,8 @@ mono_icall_is_64bit_os (void)
 }
 
 MonoArray *
-mono_icall_get_environment_variable_names (void)
+mono_icall_get_environment_variable_names (MonoError *error)
 {
-       MonoError error;
        MonoArray *names;
        MonoDomain *domain;
        MonoString *str;
@@ -107,6 +106,7 @@ mono_icall_get_environment_variable_names (void)
        WCHAR* equal_str;
        int n = 0;
 
+       error_init (error);
        env_strings = GetEnvironmentStrings();
 
        if (env_strings) {
@@ -122,9 +122,8 @@ mono_icall_get_environment_variable_names (void)
        }
 
        domain = mono_domain_get ();
-       names = mono_array_new_checked (domain, mono_defaults.string_class, n, &error);
-       if (mono_error_set_pending_exception (&error))
-               return NULL;
+       names = mono_array_new_checked (domain, mono_defaults.string_class, n, error);
+       return_val_if_nok (error, NULL);
 
        if (env_strings) {
                n = 0;
@@ -134,9 +133,9 @@ mono_icall_get_environment_variable_names (void)
                        if (*env_string != '=') {
                                equal_str = wcschr(env_string, '=');
                                g_assert(equal_str);
-                               str = mono_string_new_utf16_checked (domain, env_string, (gint32)(equal_str - env_string), &error);
-                               if (mono_error_set_pending_exception (&error))
-                                       return NULL;
+                               str = mono_string_new_utf16_checked (domain, env_string, (gint32)(equal_str - env_string), error);
+                               if (!is_ok (error))
+                                       goto cleanup;
 
                                mono_array_setref (names, n, str);
                                n++;
@@ -146,9 +145,13 @@ mono_icall_get_environment_variable_names (void)
                        env_string++;
                }
 
-               FreeEnvironmentStrings (env_strings);
        }
 
+cleanup:
+       if (env_strings)
+               FreeEnvironmentStrings (env_strings);
+       if (!is_ok (error))
+               return NULL;
        return names;
 }
 
@@ -173,9 +176,10 @@ mono_icall_set_environment_variable (MonoString *name, MonoString *value)
 }
 
 #if G_HAVE_API_SUPPORT(HAVE_CLASSIC_WINAPI_SUPPORT)
-MonoString *
-mono_icall_get_windows_folder_path (int folder)
+MonoStringHandle
+mono_icall_get_windows_folder_path (int folder, MonoError *error)
 {
+       error_init (error);
        #ifndef CSIDL_FLAG_CREATE
                #define CSIDL_FLAG_CREATE       0x8000
        #endif
@@ -186,20 +190,19 @@ mono_icall_get_windows_folder_path (int folder)
                int len = 0;
                while (path [len])
                        ++ len;
-               MonoError error;
-               MonoString *res = mono_string_new_utf16_checked (mono_domain_get (), path, len, &error);
-               mono_error_set_pending_exception (&error);
-               return res;
+               return mono_string_new_utf16_handle (mono_domain_get (), path, len, error);
        }
-       return mono_string_new (mono_domain_get (), "");
+       return mono_string_new_handle (mono_domain_get (), "", error);
 }
 #endif /* G_HAVE_API_SUPPORT(HAVE_CLASSIC_WINAPI_SUPPORT) */
 
 #if G_HAVE_API_SUPPORT(HAVE_CLASSIC_WINAPI_SUPPORT)
-void
-mono_icall_broadcast_setting_change (void)
+MonoBoolean
+mono_icall_broadcast_setting_change (MonoError *error)
 {
+       error_init (error);
        SendMessageTimeout (HWND_BROADCAST, WM_SETTINGCHANGE, (WPARAM)NULL, (LPARAM)L"Environment", SMTO_ABORTIFHUNG, 2000, 0);
+       return TRUE;
 }
 
 gint32