diff options
Diffstat (limited to 'src/VBox/Main/src-all/GlobalStatusConversion.cpp')
-rw-r--r-- | src/VBox/Main/src-all/GlobalStatusConversion.cpp | 148 |
1 files changed, 148 insertions, 0 deletions
diff --git a/src/VBox/Main/src-all/GlobalStatusConversion.cpp b/src/VBox/Main/src-all/GlobalStatusConversion.cpp new file mode 100644 index 00000000..5c6394c3 --- /dev/null +++ b/src/VBox/Main/src-all/GlobalStatusConversion.cpp @@ -0,0 +1,148 @@ +/* $Id: GlobalStatusConversion.cpp $ */ +/** @file + * VirtualBox COM global definitions - status code conversion. + * + * NOTE: This file is part of both VBoxC.dll and VBoxSVC.exe. + */ + +/* + * Copyright (C) 2008-2023 Oracle and/or its affiliates. + * + * This file is part of VirtualBox base platform packages, as + * available from https://www.virtualbox.org. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation, in version 3 of the + * License. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, see <https://www.gnu.org/licenses>. + * + * SPDX-License-Identifier: GPL-3.0-only + */ + +#include "Global.h" + +#include <iprt/assert.h> +#include <VBox/err.h> + + +/*static*/ int +Global::vboxStatusCodeFromCOM(HRESULT aComStatus) +{ + switch (aComStatus) + { + case S_OK: return VINF_SUCCESS; + + /* Standard COM status codes. See also RTErrConvertFromDarwinCOM */ + case E_UNEXPECTED: return VERR_COM_UNEXPECTED; + case E_NOTIMPL: return VERR_NOT_IMPLEMENTED; + case E_OUTOFMEMORY: return VERR_NO_MEMORY; + case E_INVALIDARG: return VERR_INVALID_PARAMETER; + case E_NOINTERFACE: return VERR_NOT_SUPPORTED; + case E_POINTER: return VERR_INVALID_POINTER; +#ifdef E_HANDLE + case E_HANDLE: return VERR_INVALID_HANDLE; +#endif + case E_ABORT: return VERR_CANCELLED; + case E_FAIL: return VERR_GENERAL_FAILURE; + case E_ACCESSDENIED: return VERR_ACCESS_DENIED; + + /* VirtualBox status codes */ + case VBOX_E_OBJECT_NOT_FOUND: return VERR_COM_OBJECT_NOT_FOUND; + case VBOX_E_INVALID_VM_STATE: return VERR_COM_INVALID_VM_STATE; + case VBOX_E_VM_ERROR: return VERR_COM_VM_ERROR; + case VBOX_E_FILE_ERROR: return VERR_COM_FILE_ERROR; + case VBOX_E_IPRT_ERROR: return VERR_COM_IPRT_ERROR; + case VBOX_E_PDM_ERROR: return VERR_COM_PDM_ERROR; + case VBOX_E_INVALID_OBJECT_STATE: return VERR_COM_INVALID_OBJECT_STATE; + case VBOX_E_HOST_ERROR: return VERR_COM_HOST_ERROR; + case VBOX_E_NOT_SUPPORTED: return VERR_COM_NOT_SUPPORTED; + case VBOX_E_XML_ERROR: return VERR_COM_XML_ERROR; + case VBOX_E_INVALID_SESSION_STATE: return VERR_COM_INVALID_SESSION_STATE; + case VBOX_E_OBJECT_IN_USE: return VERR_COM_OBJECT_IN_USE; + + default: + if (SUCCEEDED(aComStatus)) + return VINF_SUCCESS; + /** @todo Check for the win32 facility and use the + * RTErrConvertFromWin32 function on windows. */ + return VERR_UNRESOLVED_ERROR; + } +} + + +/*static*/ HRESULT +Global::vboxStatusCodeToCOM(int aVBoxStatus) +{ + switch (aVBoxStatus) + { + case VINF_SUCCESS: return S_OK; + + /* Standard COM status codes. */ + case VERR_COM_UNEXPECTED: return E_UNEXPECTED; + case VERR_NOT_IMPLEMENTED: return E_NOTIMPL; + case VERR_NO_MEMORY: return E_OUTOFMEMORY; + case VERR_INVALID_PARAMETER: return E_INVALIDARG; + case VERR_NOT_SUPPORTED: return E_NOINTERFACE; + case VERR_INVALID_POINTER: return E_POINTER; +#ifdef E_HANDLE + case VERR_INVALID_HANDLE: return E_HANDLE; +#endif + case VERR_CANCELLED: return E_ABORT; + case VERR_GENERAL_FAILURE: return E_FAIL; + case VERR_ACCESS_DENIED: return E_ACCESSDENIED; + + /* VirtualBox COM status codes. */ + case VERR_COM_OBJECT_NOT_FOUND: return VBOX_E_OBJECT_NOT_FOUND; + case VERR_COM_INVALID_VM_STATE: return VBOX_E_INVALID_VM_STATE; + case VERR_COM_VM_ERROR: return VBOX_E_VM_ERROR; + case VERR_COM_FILE_ERROR: return VBOX_E_FILE_ERROR; + case VERR_COM_IPRT_ERROR: return VBOX_E_IPRT_ERROR; + case VERR_COM_PDM_ERROR: return VBOX_E_PDM_ERROR; + case VERR_COM_INVALID_OBJECT_STATE: return VBOX_E_INVALID_OBJECT_STATE; + case VERR_COM_HOST_ERROR: return VBOX_E_HOST_ERROR; + case VERR_COM_NOT_SUPPORTED: return VBOX_E_NOT_SUPPORTED; + case VERR_COM_XML_ERROR: return VBOX_E_XML_ERROR; + case VERR_COM_INVALID_SESSION_STATE: return VBOX_E_INVALID_SESSION_STATE; + case VERR_COM_OBJECT_IN_USE: return VBOX_E_OBJECT_IN_USE; + + /* Other errors. */ + case VERR_UNRESOLVED_ERROR: return E_FAIL; + case VERR_NOT_EQUAL: return VBOX_E_FILE_ERROR; + case VERR_FILE_NOT_FOUND: return VBOX_E_OBJECT_NOT_FOUND; + case VERR_IO_NOT_READY: return VBOX_E_INVALID_OBJECT_STATE; + + /* Guest Control errors. */ + case VERR_GSTCTL_MAX_CID_OBJECTS_REACHED: return VBOX_E_MAXIMUM_REACHED; + case VERR_GSTCTL_GUEST_ERROR: return VBOX_E_GSTCTL_GUEST_ERROR; + + default: + if (RT_SUCCESS(aVBoxStatus)) + return S_OK; + + /* try categorize it */ + if ( aVBoxStatus < 0 + && ( aVBoxStatus > -1000 + || (aVBoxStatus < -22000 && aVBoxStatus > -32766) ) + ) + return VBOX_E_IPRT_ERROR; + if ( aVBoxStatus < VERR_PDM_NO_SUCH_LUN / 100 * 10 + && aVBoxStatus > VERR_PDM_NO_SUCH_LUN / 100 * 10 - 100) + return VBOX_E_PDM_ERROR; + if ( aVBoxStatus <= -1000 + && aVBoxStatus > -5000 /* wrong, but so what... */) + return VBOX_E_VM_ERROR; + + AssertMsgFailed(("%Rrc\n", aVBoxStatus)); + return E_FAIL; + } +} + +/* vi: set tabstop=4 shiftwidth=4 expandtab: */ |