MachineImpl.cpp revision 73bef7f249418907cb1dc8dce51319772a3dbeee
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * Implementation of IMachine in VBoxSVC.
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * Copyright (C) 2004-2012 Oracle Corporation
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * available from http://www.virtualbox.org. This file is free software;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * you can redistribute it and/or modify it under the terms of the GNU
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * General Public License (GPL) as published by the Free Software
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync/* Make sure all the stdint.h macros are included - must come first! */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync// generated header
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync#include <iprt/cpp/xml.h> /* xml::XmlFileWriter::s_psz*Suff. */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync#else /* !RT_OS_WINDOWS */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync#endif /* !RT_OS_WINDOWS */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync// defines / prototypes
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync/////////////////////////////////////////////////////////////////////////////
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync/////////////////////////////////////////////////////////////////////////////
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync// Machine::Data structure
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync/////////////////////////////////////////////////////////////////////////////
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync /* Contains hints on what has changed when the user is using the VM (config
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * changes, running the VM, ...). This is used to decide if a config needs
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * to be written to disk. */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync /* VM modification usually also trigger setting the current state to
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * "Modified". Although this is not always the case. An e.g. is the VM
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * initialization phase or when snapshot related data is changed. The
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * actually behavior is controlled by the following flag. */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync /* mUuid is initialized in Machine::init() */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync/////////////////////////////////////////////////////////////////////////////
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync// Machine::HWData structure
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync/////////////////////////////////////////////////////////////////////////////
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync /* default values for a newly created machine */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync mHWVersion = "2"; /** @todo get the default from the schema if that is possible. */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync /* Not supported on 32 bits hosts. */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync#if HC_ARCH_BITS == 64 || defined(RT_OS_WINDOWS) || defined(RT_OS_DARWIN)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync /* default boot order: floppy - DVD - HDD */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync for (size_t i = 3; i < RT_ELEMENTS(mBootOrder); ++i)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync for (size_t i = 0; i < RT_ELEMENTS(mCPUAttached); i++)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync /* Maximum CPU execution cap by default. */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync/////////////////////////////////////////////////////////////////////////////
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync// Machine::HDData structure
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync/////////////////////////////////////////////////////////////////////////////
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync/////////////////////////////////////////////////////////////////////////////
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync// Machine class
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync/////////////////////////////////////////////////////////////////////////////
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync// constructor / destructor
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync/////////////////////////////////////////////////////////////////////////////
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * Initializes a new machine instance; this init() variant creates a new, empty machine.
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * This gets called from VirtualBox::CreateMachine().
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * @param aParent Associated parent object
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * @param strConfigFile Local file system path to the VM settings file (can
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * be relative to the VirtualBox config directory).
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * @param strName name for the machine
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * @param aId UUID for the new machine.
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * @param aOsType OS Type of this machine or NULL.
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * @param fForceOverwrite Whether to overwrite an existing machine settings file.
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * @return Success indicator. if not S_OK, the machine object is invalid
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync LogFlowThisFunc(("(Init_New) aConfigFile='%s'\n", strConfigFile.c_str()));
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync /* Enclose the state transition NotReady->InInit->Ready */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync // create an empty machine config
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync mData->pMachineConfigFile = new settings::MachineConfigFile(NULL);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync // set to true now to cause uninit() to call uninitDataAndChildObjects() on failure
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync // the "name sync" flag determines whether the machine directory gets renamed along
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync // with the machine file; say so if the settings file name is the same as the
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync // settings file parent directory (machine directory)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync // initialize the default snapshots folder
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync /* Store OS type */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync /* Apply BIOS defaults */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync /* Apply network adapters defaults */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync for (ULONG slot = 0; slot < mNetworkAdapters.size(); ++slot)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync /* Apply serial port defaults */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync for (ULONG slot = 0; slot < RT_ELEMENTS(mSerialPorts); ++slot)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync /* At this point the changing of the current state modification
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * flag is allowed. */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync /* commit all changes made during the initialization */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync /* Confirm a successful initialization when it's the case */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync LogFlowThisFunc(("mName='%s', mRegistered=%RTbool, mAccessible=%RTbool, rc=%08X\n",
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync !!mUserData ? mUserData->s.strName.c_str() : "NULL",
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * Initializes a new instance with data from machine XML (formerly Init_Registered).
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * Gets called in two modes:
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * -- from VirtualBox::initMachines() during VirtualBox startup; in that case, the
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * UUID is specified and we mark the machine as "registered";
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * -- from the public VirtualBox::OpenMachine() API, in which case the UUID is NULL
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * and the machine remains unregistered until RegisterMachine() is called.
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * @param aParent Associated parent object
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * @param aConfigFile Local file system path to the VM settings file (can
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * be relative to the VirtualBox config directory).
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * @param aId UUID of the machine or NULL (see above).
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * @return Success indicator. if not S_OK, the machine object is invalid
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync LogFlowThisFunc(("(Init_Registered) aConfigFile='%s\n", strConfigFile.c_str()));
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync /* Enclose the state transition NotReady->InInit->Ready */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync // loading a registered VM:
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync // now load the settings from XML:
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync // this calls initDataAndChildObjects() and loadSettings()
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync // opening an unregistered VM (VirtualBox::OpenMachine()):
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync // set to true now to cause uninit() to call uninitDataAndChildObjects() on failure
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync // load and parse machine XML; this will throw on XML or logic errors
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync mData->pMachineConfigFile = new settings::MachineConfigFile(&mData->m_strConfigFileFull);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync // reject VM UUID duplicates, they can happen if someone
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync // tries to register an already known VM config again
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (aParent->findMachine(mData->pMachineConfigFile->uuid,
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync true /* fPermitInaccessible */,
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync false /* aDoSetError */,
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync tr("Trying to open a VM config '%s' which has the same UUID as an existing virtual machine"),
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync // use UUID from machine config
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync unconst(mData->mUuid) = mData->pMachineConfigFile->uuid;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync rc = loadMachineDataFromSettings(*mData->pMachineConfigFile,
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync /* At this point the changing of the current state modification
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * flag is allowed. */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync /* we assume that error info is set by the thrower */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync catch (...)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync rc = VirtualBoxBase::handleUnexpectedExceptions(this, RT_SRC_POS);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync /* Confirm a successful initialization when it's the case */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync // uninit media from this machine's media registry, or else
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync // reloading the settings will fail
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync LogFlowThisFunc(("mName='%s', mRegistered=%RTbool, mAccessible=%RTbool "
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync "rc=%08X\n",
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync !!mUserData ? mUserData->s.strName.c_str() : "NULL",
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * Initializes a new instance from a machine config that is already in memory
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * (import OVF case). Since we are importing, the UUID in the machine
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * config is ignored and we always generate a fresh one.
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * @param strName Name for the new machine; this overrides what is specified in config and is used
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * for the settings file as well.
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * @param config Machine configuration loaded and parsed from XML.
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * @return Success indicator. if not S_OK, the machine object is invalid
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync /* Enclose the state transition NotReady->InInit->Ready */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync rc = tryCreateMachineConfigFile(false /* fForceOverwrite */);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync // set to true now to cause uninit() to call uninitDataAndChildObjects() on failure
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync // create empty machine config for instance data
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync mData->pMachineConfigFile = new settings::MachineConfigFile(NULL);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync // generate fresh UUID, ignore machine config
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync &mData->mUuid); // puuidRegistry: initialize media with this registry ID
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync // override VM name as well, it may be different
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync /* At this point the changing of the current state modification
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * flag is allowed. */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync /* commit all changes made during the initialization */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync /* Confirm a successful initialization when it's the case */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync // uninit media from this machine's media registry, or else
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync // reloading the settings will fail
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync LogFlowThisFunc(("mName='%s', mRegistered=%RTbool, mAccessible=%RTbool "
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync "rc=%08X\n",
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync !!mUserData ? mUserData->s.strName.c_str() : "NULL",
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * Shared code between the various init() implementations.
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * @param aParent
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync AssertReturn(!strConfigFile.isEmpty(), E_INVALIDARG);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync /* share the parent weakly */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync /* allocate the essential machine data structure (the rest will be
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * allocated later by initDataAndChildObjects() */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync /* memorize the config file name (as provided) */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync /* get the full file name */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync int vrc1 = mParent->calculateFullPath(strConfigFile, mData->m_strConfigFileFull);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync tr("Invalid machine settings file name '%s' (%Rrc)"),
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * Tries to create a machine settings file in the path stored in the machine
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * instance data. Used when a new machine is created to fail gracefully if
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * the settings file could not be written (e.g. because machine dir is read-only).
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsyncHRESULT Machine::tryCreateMachineConfigFile(bool fForceOverwrite)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync // when we create a new machine, we must be able to create the settings file
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync int vrc = RTFileOpen(&f, mData->m_strConfigFileFull.c_str(), RTFILE_O_READ | RTFILE_O_OPEN | RTFILE_O_DENY_NONE);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync /* try to delete the config file, as otherwise the creation
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * of a new settings file will fail. */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync int vrc2 = RTFileDelete(mData->m_strConfigFileFull.c_str());
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync tr("Could not delete the existing settings file '%s' (%Rrc)"),
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync tr("Invalid machine settings file name '%s' (%Rrc)"),
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * Initializes the registered machine by loading the settings file.
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * This method is separated from #init() in order to make it possible to
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * retry the operation after VirtualBox startup instead of refusing to
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * startup the whole VirtualBox server in case if the settings file of some
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * registered VM is invalid or inaccessible.
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * @note Must be always called from this object's write lock
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * (unless called from #init() that doesn't need any locking).
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * @note Locks the mUSBController method for writing.
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * @note Subclasses must not call this method.
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync /* Temporarily reset the registered flag in order to let setters
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * potentially called from loadSettings() succeed (isMutable() used in
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * all setters will return FALSE for a Machine instance if mRegistered
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * is TRUE). */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync // load and parse machine XML; this will throw on XML or logic errors
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync mData->pMachineConfigFile = new settings::MachineConfigFile(&mData->m_strConfigFileFull);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (mData->mUuid != mData->pMachineConfigFile->uuid)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync tr("Machine UUID {%RTuuid} in '%s' doesn't match its UUID {%s} in the registry file '%s'"),
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync rc = loadMachineDataFromSettings(*mData->pMachineConfigFile,
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync /* we assume that error info is set by the thrower */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync catch (...)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync rc = VirtualBoxBase::handleUnexpectedExceptions(this, RT_SRC_POS);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync /* Restore the registered flag (even on failure) */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync /* Set mAccessible to TRUE only if we successfully locked and loaded
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * the settings file */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync /* commit all changes made during loading the settings file */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync commit(); // @todo r=dj why do we need a commit during init?!? this is very expensive
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync /// @todo r=klaus for some reason the settings loading logic backs up
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync // the settings, and therefore a commit is needed. Should probably be changed.
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync /* If the machine is registered, then, instead of returning a
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * failure, we mark it as inaccessible and set the result to
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * success to give it a try later */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync /* fetch the current error info */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync LogWarning(("Machine {%RTuuid} is inaccessible! [%ls]\n",
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync /* rollback all changes */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync // uninit media from this machine's media registry, or else
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync // reloading the settings will fail
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync /* uninitialize the common part to make sure all data is reset to
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * default (null) values */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * Uninitializes the instance.
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * Called either from FinalRelease() or by the parent when it gets destroyed.
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * @note The caller of this method must make sure that this object
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * a) doesn't have active callers on the current thread and b) is not locked
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * by the current thread; otherwise uninit() will hang either a) due to
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * AutoUninitSpan waiting for a number of calls to drop to zero or b) due to
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * a dead-lock caused by this thread waiting for all callers on the other
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * threads are done but preventing them from doing so by holding a lock.
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync /* Enclose the state transition Ready->InUninit->NotReady */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync LogFlowThisFunc(("initFailed()=%d\n", autoUninitSpan.initFailed()));
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync LogFlowThisFunc(("mRegistered=%d\n", mData->mRegistered));
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync /* Theoretically, this can only happen if the VirtualBox server has been
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * terminated while there were clients running that owned open direct
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * sessions. Since in this case we are definitely called by
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * VirtualBox::uninit(), we may be sure that SessionMachine::uninit()
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * won't happen on the client watcher thread (because it does
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * VirtualBox::addCaller() for the duration of the
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * SessionMachine::checkForDeath() call, so that VirtualBox::uninit()
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * cannot happen until the VirtualBox caller is released). This is
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * important, because SessionMachine::uninit() cannot correctly operate
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * after we return from this method (it expects the Machine instance is
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * still valid). We'll call it ourselves below.
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync LogWarningThisFunc(("Session machine is not NULL (%p), the direct session is still open!\n",
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (Global::IsOnlineOrTransient(mData->mMachineState))
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync LogWarningThisFunc(("Setting state to Aborted!\n"));
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync /* set machine state using SessionMachine reimplementation */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync static_cast<Machine*>(mData->mSession.mMachine)->setMachineState(MachineState_Aborted);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * Uninitialize SessionMachine using public uninit() to indicate
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * an unexpected uninitialization.
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync /* SessionMachine::uninit() must set mSession.mMachine to null */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync // uninit media from this machine's media registry, if they're still there
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync /* XXX This will fail with
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * "cannot be closed because it is still attached to 1 virtual machines"
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * because at this point we did not call uninitDataAndChildObjects() yet
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * and therefore also removeBackReference() for all these mediums was not called! */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (!uuidMachine.isEmpty()) // can be empty if we're called from a failure of Machine::init
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync /* the lock is no more necessary (SessionMachine is uninitialized) */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync // has machine been modified?
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync LogWarningThisFunc(("Discarding unsaved settings changes!\n"));
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync /* free the essential data structure last */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync// IMachine properties
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync/////////////////////////////////////////////////////////////////////////////
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsyncSTDMETHODIMP Machine::COMGETTER(Parent)(IVirtualBox **aParent)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync /* mParent is constant during life time, no need to lock */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsyncSTDMETHODIMP Machine::COMGETTER(Accessible)(BOOL *aAccessible)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync /* try to initialize the VM once more if not accessible */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync LogFlowThisFunc(("Dumping media backreferences\n"));
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync // reset the XML file to force loadSettings() (called from registeredInit())
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync // to parse it again; the file might have changed
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync /* make sure interesting parties will notice the accessibility
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * state change */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync mParent->onMachineStateChange(mData->mUuid, mData->mMachineState);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsyncSTDMETHODIMP Machine::COMGETTER(AccessError)(IVirtualBoxErrorInfo **aAccessError)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (mData->mAccessible || !mData->mAccessError.isBasicAvailable())
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync /* return shortly */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync errorInfo->init(mData->mAccessError.getResultCode(),
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync Utf8Str(mData->mAccessError.getComponent()).c_str(),
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsyncSTDMETHODIMP Machine::COMSETTER(Name)(IN_BSTR aName)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync // prohibit setting a UUID only as the machine name, or else it can
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync // never be found by findMachine()
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync return setError(E_INVALIDARG, tr("A machine cannot have a UUID as its name"));
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync HRESULT rc = checkStateDependency(MutableStateDep);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsyncSTDMETHODIMP Machine::COMGETTER(Description)(BSTR *aDescription)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsyncSTDMETHODIMP Machine::COMSETTER(Description)(IN_BSTR aDescription)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync HRESULT rc = checkStateDependency(MutableStateDep);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsyncSTDMETHODIMP Machine::COMGETTER(OSTypeId)(BSTR *aOSTypeId)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsyncSTDMETHODIMP Machine::COMSETTER(OSTypeId)(IN_BSTR aOSTypeId)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync /* look up the object by Id to check it is valid */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync HRESULT rc = mParent->GetGuestOSType(aOSTypeId, guestOSType.asOutParam());
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync /* when setting, always use the "etalon" value for consistency -- lookup
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * by ID is case-insensitive and the input value may have different case */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync rc = guestOSType->COMGETTER(Id)(osTypeId.asOutParam());
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsyncSTDMETHODIMP Machine::COMGETTER(FirmwareType)(FirmwareType_T *aFirmwareType)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsyncSTDMETHODIMP Machine::COMSETTER(FirmwareType)(FirmwareType_T aFirmwareType)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsyncSTDMETHODIMP Machine::COMGETTER(KeyboardHidType)(KeyboardHidType_T *aKeyboardHidType)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsyncSTDMETHODIMP Machine::COMSETTER(KeyboardHidType)(KeyboardHidType_T aKeyboardHidType)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsyncSTDMETHODIMP Machine::COMGETTER(PointingHidType)(PointingHidType_T *aPointingHidType)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsyncSTDMETHODIMP Machine::COMSETTER(PointingHidType)(PointingHidType_T aPointingHidType)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsyncSTDMETHODIMP Machine::COMGETTER(ChipsetType)(ChipsetType_T *aChipsetType)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsyncSTDMETHODIMP Machine::COMSETTER(ChipsetType)(ChipsetType_T aChipsetType)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync // Resize network adapter array, to be finalized on commit/rollback.
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync // We must not throw away entries yet, otherwise settings are lost
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync // without a way to roll back.
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync uint32_t newCount = Global::getMaxNetworkAdapters(aChipsetType);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync for (ULONG slot = oldCount; slot < mNetworkAdapters.size(); slot++)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsyncSTDMETHODIMP Machine::COMGETTER(HardwareVersion)(BSTR *aHWVersion)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsyncSTDMETHODIMP Machine::COMSETTER(HardwareVersion)(IN_BSTR aHWVersion)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync /* check known version */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync tr("Invalid hardware version: %ls\n"), aHWVersion);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync HRESULT rc = checkStateDependency(MutableStateDep);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsyncSTDMETHODIMP Machine::COMGETTER(HardwareUUID)(BSTR *aUUID)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsyncSTDMETHODIMP Machine::COMSETTER(HardwareUUID)(IN_BSTR aUUID)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync HRESULT rc = checkStateDependency(MutableStateDep);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsyncSTDMETHODIMP Machine::COMGETTER(MemorySize)(ULONG *memorySize)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsyncSTDMETHODIMP Machine::COMSETTER(MemorySize)(ULONG memorySize)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync /* check RAM limits */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync tr("Invalid RAM size: %lu MB (must be in range [%lu, %lu] MB)"),
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync HRESULT rc = checkStateDependency(MutableStateDep);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsyncSTDMETHODIMP Machine::COMGETTER(CPUCount)(ULONG *CPUCount)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsyncSTDMETHODIMP Machine::COMSETTER(CPUCount)(ULONG CPUCount)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync /* check CPU limits */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync tr("Invalid virtual CPU count: %lu (must be in range [%lu, %lu])"),
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync CPUCount, SchemaDefs::MinCPUCount, SchemaDefs::MaxCPUCount);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync /* We cant go below the current number of CPUs attached if hotplug is enabled*/
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync for (unsigned idx = CPUCount; idx < SchemaDefs::MaxCPUCount; idx++)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync "Detach the CPU before removing the socket"),
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync HRESULT rc = checkStateDependency(MutableStateDep);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsyncSTDMETHODIMP Machine::COMGETTER(CPUExecutionCap)(ULONG *aExecutionCap)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsyncSTDMETHODIMP Machine::COMSETTER(CPUExecutionCap)(ULONG aExecutionCap)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync /* check throttle limits */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync tr("Invalid CPU execution cap value: %lu (must be in range [%lu, %lu])"),
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync /* Save settings if online - todo why is this required?? */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsyncSTDMETHODIMP Machine::COMGETTER(CPUHotPlugEnabled)(BOOL *enabled)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsyncSTDMETHODIMP Machine::COMSETTER(CPUHotPlugEnabled)(BOOL enabled)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync /* Add the amount of CPUs currently attached */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * We can disable hotplug only if the amount of maximum CPUs is equal
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * to the amount of attached CPUs
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync unsigned iHighestId = 0;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync for (unsigned i = 0; i < SchemaDefs::MaxCPUCount; i++)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync tr("CPU hotplugging can't be disabled because the maximum number of CPUs is not equal to the amount of CPUs attached"));
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsyncSTDMETHODIMP Machine::COMGETTER(EmulatedUSBCardReaderEnabled)(BOOL *enabled)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsyncSTDMETHODIMP Machine::COMSETTER(EmulatedUSBCardReaderEnabled)(BOOL enabled)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsyncSTDMETHODIMP Machine::COMGETTER(EmulatedUSBWebcameraEnabled)(BOOL *enabled)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsyncSTDMETHODIMP Machine::COMSETTER(EmulatedUSBWebcameraEnabled)(BOOL enabled)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsyncSTDMETHODIMP Machine::COMGETTER(HpetEnabled)(BOOL *enabled)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsyncSTDMETHODIMP Machine::COMSETTER(HpetEnabled)(BOOL enabled)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsyncSTDMETHODIMP Machine::COMGETTER(VRAMSize)(ULONG *memorySize)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsyncSTDMETHODIMP Machine::COMSETTER(VRAMSize)(ULONG memorySize)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync /* check VRAM limits */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync tr("Invalid VRAM size: %lu MB (must be in range [%lu, %lu] MB)"),
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync memorySize, SchemaDefs::MinGuestVRAM, SchemaDefs::MaxGuestVRAM);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync HRESULT rc = checkStateDependency(MutableStateDep);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync/** @todo this method should not be public */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsyncSTDMETHODIMP Machine::COMGETTER(MemoryBalloonSize)(ULONG *memoryBalloonSize)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * Set the memory balloon size.
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * This method is also called from IGuest::COMSETTER(MemoryBalloonSize) so
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * we have to make sure that we never call IGuest from here.
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsyncSTDMETHODIMP Machine::COMSETTER(MemoryBalloonSize)(ULONG memoryBalloonSize)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync /* This must match GMMR0Init; currently we only support memory ballooning on all 64-bit hosts except Mac OS X */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync#if HC_ARCH_BITS == 64 && (defined(RT_OS_WINDOWS) || defined(RT_OS_SOLARIS) || defined(RT_OS_LINUX) || defined(RT_OS_FREEBSD))
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync /* check limits */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (memoryBalloonSize >= VMMDEV_MAX_MEMORY_BALLOON(mHWData->mMemorySize))
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync tr("Invalid memory balloon size: %lu MB (must be in range [%lu, %lu] MB)"),
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync memoryBalloonSize, 0, VMMDEV_MAX_MEMORY_BALLOON(mHWData->mMemorySize));
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync return setError(E_NOTIMPL, tr("Memory ballooning is only supported on 64-bit hosts"));
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsyncSTDMETHODIMP Machine::COMGETTER(PageFusionEnabled) (BOOL *enabled)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsyncSTDMETHODIMP Machine::COMSETTER(PageFusionEnabled) (BOOL enabled)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync /** @todo must support changes for running vms and keep this in sync with IGuest. */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync return setError(E_NOTIMPL, tr("Page fusion is only supported on 64-bit hosts"));
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsyncSTDMETHODIMP Machine::COMGETTER(Accelerate3DEnabled)(BOOL *enabled)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsyncSTDMETHODIMP Machine::COMSETTER(Accelerate3DEnabled)(BOOL enable)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync HRESULT rc = checkStateDependency(MutableStateDep);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync /** @todo check validity! */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsyncSTDMETHODIMP Machine::COMGETTER(Accelerate2DVideoEnabled)(BOOL *enabled)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsyncSTDMETHODIMP Machine::COMSETTER(Accelerate2DVideoEnabled)(BOOL enable)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync HRESULT rc = checkStateDependency(MutableStateDep);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync /** @todo check validity! */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsyncSTDMETHODIMP Machine::COMGETTER(MonitorCount)(ULONG *monitorCount)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsyncSTDMETHODIMP Machine::COMSETTER(MonitorCount)(ULONG monitorCount)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync /* make sure monitor count is a sensible number */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (monitorCount < 1 || monitorCount > SchemaDefs::MaxGuestMonitors)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync tr("Invalid monitor count: %lu (must be in range [%lu, %lu])"),
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync HRESULT rc = checkStateDependency(MutableStateDep);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsyncSTDMETHODIMP Machine::COMGETTER(BIOSSettings)(IBIOSSettings **biosSettings)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync /* mBIOSSettings is constant during life time, no need to lock */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsyncSTDMETHODIMP Machine::GetCPUProperty(CPUPropertyType_T property, BOOL *aVal)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsyncSTDMETHODIMP Machine::SetCPUProperty(CPUPropertyType_T property, BOOL aVal)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync HRESULT rc = checkStateDependency(MutableStateDep);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsyncSTDMETHODIMP Machine::GetCPUIDLeaf(ULONG aId, ULONG *aValEax, ULONG *aValEbx, ULONG *aValEcx, ULONG *aValEdx)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync case 0x80000000:
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync case 0x80000001:
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync case 0x80000002:
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync case 0x80000003:
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync case 0x80000004:
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync case 0x80000005:
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync case 0x80000006:
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync case 0x80000007:
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync case 0x80000008:
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync case 0x80000009:
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync case 0x8000000A:
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (mHWData->mCpuIdExtLeafs[aId - 0x80000000].ulId != aId)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync *aValEax = mHWData->mCpuIdExtLeafs[aId - 0x80000000].ulEax;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync *aValEbx = mHWData->mCpuIdExtLeafs[aId - 0x80000000].ulEbx;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync *aValEcx = mHWData->mCpuIdExtLeafs[aId - 0x80000000].ulEcx;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync *aValEdx = mHWData->mCpuIdExtLeafs[aId - 0x80000000].ulEdx;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync return setError(E_INVALIDARG, tr("CpuId override leaf %#x is out of range"), aId);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsyncSTDMETHODIMP Machine::SetCPUIDLeaf(ULONG aId, ULONG aValEax, ULONG aValEbx, ULONG aValEcx, ULONG aValEdx)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync HRESULT rc = checkStateDependency(MutableStateDep);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync AssertCompile(RT_ELEMENTS(mHWData->mCpuIdStdLeafs) == 0xB);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync AssertRelease(aId < RT_ELEMENTS(mHWData->mCpuIdStdLeafs));
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync case 0x80000000:
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync case 0x80000001:
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync case 0x80000002:
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync case 0x80000003:
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync case 0x80000004:
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync case 0x80000005:
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync case 0x80000006:
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync case 0x80000007:
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync case 0x80000008:
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync case 0x80000009:
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync case 0x8000000A:
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync AssertCompile(RT_ELEMENTS(mHWData->mCpuIdExtLeafs) == 0xB);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync AssertRelease(aId - 0x80000000 < RT_ELEMENTS(mHWData->mCpuIdExtLeafs));
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync mHWData->mCpuIdExtLeafs[aId - 0x80000000].ulId = aId;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync mHWData->mCpuIdExtLeafs[aId - 0x80000000].ulEax = aValEax;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync mHWData->mCpuIdExtLeafs[aId - 0x80000000].ulEbx = aValEbx;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync mHWData->mCpuIdExtLeafs[aId - 0x80000000].ulEcx = aValEcx;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync mHWData->mCpuIdExtLeafs[aId - 0x80000000].ulEdx = aValEdx;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync return setError(E_INVALIDARG, tr("CpuId override leaf %#x is out of range"), aId);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync HRESULT rc = checkStateDependency(MutableStateDep);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync AssertCompile(RT_ELEMENTS(mHWData->mCpuIdStdLeafs) == 0xB);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync AssertRelease(aId < RT_ELEMENTS(mHWData->mCpuIdStdLeafs));
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync /* Invalidate leaf. */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync case 0x80000000:
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync case 0x80000001:
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync case 0x80000002:
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync case 0x80000003:
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync case 0x80000004:
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync case 0x80000005:
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync case 0x80000006:
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync case 0x80000007:
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync case 0x80000008:
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync case 0x80000009:
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync case 0x8000000A:
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync AssertCompile(RT_ELEMENTS(mHWData->mCpuIdExtLeafs) == 0xB);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync AssertRelease(aId - 0x80000000 < RT_ELEMENTS(mHWData->mCpuIdExtLeafs));
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync /* Invalidate leaf. */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync mHWData->mCpuIdExtLeafs[aId - 0x80000000].ulId = UINT32_MAX;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync return setError(E_INVALIDARG, tr("CpuId override leaf %#x is out of range"), aId);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync HRESULT rc = checkStateDependency(MutableStateDep);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync /* Invalidate all standard leafs. */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync for (unsigned i = 0; i < RT_ELEMENTS(mHWData->mCpuIdStdLeafs); i++)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync /* Invalidate all extended leafs. */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync for (unsigned i = 0; i < RT_ELEMENTS(mHWData->mCpuIdExtLeafs); i++)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsyncSTDMETHODIMP Machine::GetHWVirtExProperty(HWVirtExPropertyType_T property, BOOL *aVal)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync#if defined(DEBUG_bird) && defined(RT_OS_LINUX) /* This feature is deadly here */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsyncSTDMETHODIMP Machine::SetHWVirtExProperty(HWVirtExPropertyType_T property, BOOL aVal)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync HRESULT rc = checkStateDependency(MutableStateDep);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsyncSTDMETHODIMP Machine::COMGETTER(SnapshotFolder)(BSTR *aSnapshotFolder)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync calculateFullPath(mUserData->s.strSnapshotFolder, strFullSnapshotFolder);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsyncSTDMETHODIMP Machine::COMSETTER(SnapshotFolder)(IN_BSTR aSnapshotFolder)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync /* @todo (r=dmik):
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * 1. Allow to change the name of the snapshot folder containing snapshots
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * 2. Rename the folder on disk instead of just changing the property
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * value (to be smart and not to leave garbage). Note that it cannot be
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * done here because the change may be rolled back. Thus, the right
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * place is #saveSettings().
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync HRESULT rc = checkStateDependency(MutableStateDep);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync tr("The snapshot folder of a machine with snapshots cannot be changed (please delete all snapshots first)"));
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync Utf8Str strSnapshotFolder0(aSnapshotFolder); // keep original
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync copyPathRelativeToMachine(strSnapshotFolder, mUserData->s.strSnapshotFolder);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsyncSTDMETHODIMP Machine::COMGETTER(MediumAttachments)(ComSafeArrayOut(IMediumAttachment*, aAttachments))
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync SafeIfaceArray<IMediumAttachment> attachments(mMediaData->mAttachments);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync attachments.detachTo(ComSafeArrayOutArg(aAttachments));
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsyncSTDMETHODIMP Machine::COMGETTER(VRDEServer)(IVRDEServer **vrdeServer)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsyncSTDMETHODIMP Machine::COMGETTER(AudioAdapter)(IAudioAdapter **audioAdapter)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsyncSTDMETHODIMP Machine::COMGETTER(USBController)(IUSBController **aUSBController)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync return rc = mUSBController.queryInterfaceTo(aUSBController);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync /* Note: The GUI depends on this method returning E_NOTIMPL with no
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * extended error info to indicate that USB is simply not available
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * (w/o treating it as a failure), for example, as in OSE */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync#endif /* VBOX_WITH_VUSB */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsyncSTDMETHODIMP Machine::COMGETTER(SettingsFilePath)(BSTR *aFilePath)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsyncSTDMETHODIMP Machine::COMGETTER(SettingsModified)(BOOL *aModified)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync HRESULT rc = checkStateDependency(MutableStateDep);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync // this is a new machine, and no config file exists yet:
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsyncSTDMETHODIMP Machine::COMGETTER(SessionState)(SessionState_T *aSessionState)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsyncSTDMETHODIMP Machine::COMGETTER(SessionType)(BSTR *aSessionType)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsyncSTDMETHODIMP Machine::COMGETTER(SessionPid)(ULONG *aSessionPid)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsyncSTDMETHODIMP Machine::COMGETTER(State)(MachineState_T *machineState)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsyncSTDMETHODIMP Machine::COMGETTER(LastStateChange)(LONG64 *aLastStateChange)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync *aLastStateChange = RTTimeSpecGetMilli(&mData->mLastStateChange);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsyncSTDMETHODIMP Machine::COMGETTER(StateFilePath)(BSTR *aStateFilePath)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsyncSTDMETHODIMP Machine::COMGETTER(LogFolder)(BSTR *aLogFolder)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsyncSTDMETHODIMP Machine::COMGETTER(CurrentSnapshot) (ISnapshot **aCurrentSnapshot)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync mData->mCurrentSnapshot.queryInterfaceTo(aCurrentSnapshot);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsyncSTDMETHODIMP Machine::COMGETTER(SnapshotCount)(ULONG *aSnapshotCount)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync : mData->mFirstSnapshot->getAllChildrenCount() + 1;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsyncSTDMETHODIMP Machine::COMGETTER(CurrentStateModified)(BOOL *aCurrentStateModified)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync /* Note: for machines with no snapshots, we always return FALSE
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * (mData->mCurrentStateModified will be TRUE in this case, for historical
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * reasons :) */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync *aCurrentStateModified = mData->mFirstSnapshot.isNull()
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsyncSTDMETHODIMP Machine::COMGETTER(SharedFolders)(ComSafeArrayOut(ISharedFolder *, aSharedFolders))
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync CheckComArgOutSafeArrayPointerValid(aSharedFolders);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync SafeIfaceArray<ISharedFolder> folders(mHWData->mSharedFolders);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync folders.detachTo(ComSafeArrayOutArg(aSharedFolders));
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsyncSTDMETHODIMP Machine::COMGETTER(ClipboardMode)(ClipboardMode_T *aClipboardMode)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsyncMachine::COMSETTER(ClipboardMode)(ClipboardMode_T aClipboardMode)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync /* Save settings if online - todo why is this required?? */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsyncMachine::COMGETTER(GuestPropertyNotificationPatterns)(BSTR *aPatterns)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync mHWData->mGuestPropertyNotificationPatterns.cloneTo(aPatterns);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync catch (...)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync return VirtualBoxBase::handleUnexpectedExceptions(this, RT_SRC_POS);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsyncMachine::COMSETTER(GuestPropertyNotificationPatterns)(IN_BSTR aPatterns)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync HRESULT rc = checkStateDependency(MutableStateDep);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync mHWData->mGuestPropertyNotificationPatterns = aPatterns;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsyncMachine::COMGETTER(StorageControllers)(ComSafeArrayOut(IStorageController *, aStorageControllers))
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync CheckComArgOutSafeArrayPointerValid(aStorageControllers);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync SafeIfaceArray<IStorageController> ctrls(*mStorageControllers.data());
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync ctrls.detachTo(ComSafeArrayOutArg(aStorageControllers));
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsyncMachine::COMGETTER(TeleporterEnabled)(BOOL *aEnabled)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsyncSTDMETHODIMP Machine::COMSETTER(TeleporterEnabled)(BOOL aEnabled)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync /* Only allow it to be set to true when PoweredOff or Aborted.
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync (Clearing it is always permitted.) */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync || ( mData->mMachineState != MachineState_PoweredOff
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync tr("The machine is not powered off (state is %s)"),
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync Global::stringifyMachineState(mData->mMachineState));
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsyncSTDMETHODIMP Machine::COMGETTER(TeleporterPort)(ULONG *aPort)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsyncSTDMETHODIMP Machine::COMSETTER(TeleporterPort)(ULONG aPort)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync return setError(E_INVALIDARG, tr("Invalid port number %d"), aPort);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync HRESULT rc = checkStateDependency(MutableStateDep);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsyncSTDMETHODIMP Machine::COMGETTER(TeleporterAddress)(BSTR *aAddress)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync mUserData->s.strTeleporterAddress.cloneTo(aAddress);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsyncSTDMETHODIMP Machine::COMSETTER(TeleporterAddress)(IN_BSTR aAddress)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync HRESULT rc = checkStateDependency(MutableStateDep);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsyncSTDMETHODIMP Machine::COMGETTER(TeleporterPassword)(BSTR *aPassword)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync mUserData->s.strTeleporterPassword.cloneTo(aPassword);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsyncSTDMETHODIMP Machine::COMSETTER(TeleporterPassword)(IN_BSTR aPassword)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * Hash the password first.
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync return setError(E_INVALIDARG, tr("Cannot set an already hashed password, only plain text password please"));
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * Do the update.
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsyncSTDMETHODIMP Machine::COMGETTER(FaultToleranceState)(FaultToleranceState_T *aState)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsyncSTDMETHODIMP Machine::COMSETTER(FaultToleranceState)(FaultToleranceState_T aState)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync /* @todo deal with running state change. */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync HRESULT rc = checkStateDependency(MutableStateDep);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsyncSTDMETHODIMP Machine::COMGETTER(FaultToleranceAddress)(BSTR *aAddress)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync mUserData->s.strFaultToleranceAddress.cloneTo(aAddress);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsyncSTDMETHODIMP Machine::COMSETTER(FaultToleranceAddress)(IN_BSTR aAddress)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync /* @todo deal with running state change. */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync HRESULT rc = checkStateDependency(MutableStateDep);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsyncSTDMETHODIMP Machine::COMGETTER(FaultTolerancePort)(ULONG *aPort)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsyncSTDMETHODIMP Machine::COMSETTER(FaultTolerancePort)(ULONG aPort)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync /* @todo deal with running state change. */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync HRESULT rc = checkStateDependency(MutableStateDep);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsyncSTDMETHODIMP Machine::COMGETTER(FaultTolerancePassword)(BSTR *aPassword)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync mUserData->s.strFaultTolerancePassword.cloneTo(aPassword);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsyncSTDMETHODIMP Machine::COMSETTER(FaultTolerancePassword)(IN_BSTR aPassword)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync /* @todo deal with running state change. */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync HRESULT rc = checkStateDependency(MutableStateDep);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync mUserData->s.strFaultTolerancePassword = aPassword;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsyncSTDMETHODIMP Machine::COMGETTER(FaultToleranceSyncInterval)(ULONG *aInterval)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsyncSTDMETHODIMP Machine::COMSETTER(FaultToleranceSyncInterval)(ULONG aInterval)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync /* @todo deal with running state change. */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync HRESULT rc = checkStateDependency(MutableStateDep);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsyncSTDMETHODIMP Machine::COMGETTER(RTCUseUTC)(BOOL *aEnabled)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsyncSTDMETHODIMP Machine::COMSETTER(RTCUseUTC)(BOOL aEnabled)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync /* Only allow it to be set to true when PoweredOff or Aborted.
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync (Clearing it is always permitted.) */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync || ( mData->mMachineState != MachineState_PoweredOff
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync tr("The machine is not powered off (state is %s)"),
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync Global::stringifyMachineState(mData->mMachineState));
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsyncSTDMETHODIMP Machine::COMGETTER(IoCacheEnabled)(BOOL *aEnabled)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsyncSTDMETHODIMP Machine::COMSETTER(IoCacheEnabled)(BOOL aEnabled)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync HRESULT rc = checkStateDependency(MutableStateDep);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsyncSTDMETHODIMP Machine::COMGETTER(IoCacheSize)(ULONG *aIoCacheSize)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsyncSTDMETHODIMP Machine::COMSETTER(IoCacheSize)(ULONG aIoCacheSize)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync HRESULT rc = checkStateDependency(MutableStateDep);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * @note Locks objects!
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsyncSTDMETHODIMP Machine::LockMachine(ISession *aSession,
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (FAILED(autoCaller.rc())) return autoCaller.rc();
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync /* check the session state */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync // get the client's IInternalSessionControl interface
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync ComPtr<IInternalSessionControl> pSessionControl = aSession;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync ComAssertMsgRet(!!pSessionControl, ("No IInternalSessionControl interface"),
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync LogFlowThisFunc(("mSession.mState=%s\n", Global::stringifySessionState(mData->mSession.mState)));
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync /* Hack: in case the session is closing and there is a progress object
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * which allows waiting for the session to be closed, take the opportunity
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * and do a limited wait (max. 1 second). This helps a lot when the system
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * is busy and thus session closing can take a little while. */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if ( mData->mSession.mState == SessionState_Unlocking
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync mData->mSession.mProgress->WaitForCompletion(1000);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync LogFlowThisFunc(("after waiting: mSession.mState=%s\n", Global::stringifySessionState(mData->mSession.mState)));
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync // try again now
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if ( (mData->mSession.mState == SessionState_Locked) // machine is write-locked already (i.e. session machine exists)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync && (lockType == LockType_Shared) // caller wants a shared link to the existing session that holds the write lock:
// 3) process W: the process which already holds the write lock on the machine (write-locking session)
if (fLaunchingVMProcess)
* Machine/SessionMachine methods. Releasing the lock here is quite safe
if (fLaunchingVMProcess)
return rc;
return rc;
return rc;
static_cast<IMachine*>(this),
BstrFmt(tr("Creating process for virtual machine \"%s\" (%s)"), mUserData->s.strName.c_str(), strType.c_str()).raw(),
return rc;
return S_OK;
return S_OK;
bool fHotplug = false;
fHotplug = true;
aDevice)))
if (pMedium)
tr("Medium '%s' is already attached to port %d, device %d of controller '%ls' of this virtual machine"),
bool fIndirect = false;
bool associate = true;
return S_OK;
associate = false;
if (!fIndirect)
++it)
pMedium))
return S_OK;
fIndirect = false;
associate = false;
while (snap)
++it)
else if ( !pAttachFound
if (pAttachFound)
delete pMediumLockList;
if (fHotplug)
return rc;
bool fHotplug = false;
fHotplug = true;
aDevice);
if (!pAttach)
if (fHotplug)
return rc;
aDevice);
if (!pAttach)
tr("Setting passthrough rejected as the device attached to device slot %d on port %d of controller '%ls' is not a DVD"),
return S_OK;
aDevice);
if (!pAttach)
tr("Setting temporary eject flag rejected as the device attached to device slot %d on port %d of controller '%ls' is not a DVD"),
return S_OK;
aDevice);
if (!pAttach)
tr("Setting the non-rotational medium flag rejected as the device attached to device slot %d on port %d of controller '%ls' is not a hard disk"),
return S_OK;
aDevice);
if (!pAttach)
tr("Setting the discard medium flag rejected as the device attached to device slot %d on port %d of controller '%ls' is not a hard disk"),
return S_OK;
aDevice);
if (!pAttach)
return S_OK;
this->lockHandle(),
aDevice);
if (pMedium)
switch (mediumType)
case DeviceType_DVD:
case DeviceType_Floppy:
tr("The device at port %d, device %d of controller '%ls' of this virtual machine is not removeable"),
aDevice);
aDevice);
return rc;
return rc;
aDevice);
return S_OK;
return S_OK;
return S_OK;
return S_OK;
return E_POINTER;
for (settings::StringsMap::const_iterator it = mData->pMachineConfigFile->mapExtraDataItems.begin();
++it, ++i)
return S_OK;
settings::StringsMap::const_iterator it = mData->pMachineConfigFile->mapExtraDataItems.find(Utf8Str(aKey));
return S_OK;
settings::StringsMap::const_iterator it = mData->pMachineConfigFile->mapExtraDataItems.find(strKey);
bool fChanged;
aKey,
sep,
err);
if (isSnapshotMachine())
bool fNeedsGlobalSaveSettings = false;
if (fChanged)
return S_OK;
bool fNeedsGlobalSaveSettings = false;
return rc;
return S_OK;
uninit();
return S_OK;
if (cSnapshots)
return rc;
commitMedia();
return S_OK;
(void*)pTask,
delete pTask;
return S_OK;
delete pTask;
return VINF_SUCCESS;
++it;
Utf8Str otherXml = Utf8StrFmt("%s%s", mData->m_strConfigFileFull.c_str(), xml::XmlFileWriter::s_pszTmpSuff);
otherXml = Utf8StrFmt("%s%s", mData->m_strConfigFileFull.c_str(), xml::XmlFileWriter::s_pszPrevSuff);
for (int i = uLogHistoryCount; i > 0; i--)
return rc;
return rc;
STDMETHODIMP Machine::CreateSharedFolder(IN_BSTR aName, IN_BSTR aHostPath, BOOL aWritable, BOOL aAutoMount)
!!aWritable,
!!aAutoMount,
return S_OK;
return S_OK;
if (!directControl)
return S_OK;
if (!directControl)
return S_OK;
#ifdef VBOX_WITH_GUEST_PROPS
using namespace guestProp;
return S_OK;
if (!directControl)
return rc;
#ifndef VBOX_WITH_GUEST_PROPS
return rc;
#ifdef VBOX_WITH_GUEST_PROPS
using namespace guestProp;
bool found = false;
aFlags);
aName);
++it)
found = true;
if (aValue)
NULL)
return rc;
if (!directControl)
return rc;
#ifndef VBOX_WITH_GUEST_PROPS
return rc;
#ifdef VBOX_WITH_GUEST_PROPS
using namespace guestProp;
++it)
NULL)
++it)
++iProp;
return S_OK;
if (!directControl)
return rc;
#ifndef VBOX_WITH_GUEST_PROPS
return rc;
return S_OK;
aDevice);
return S_OK;
aName);
bool fBootable = true;
++it)
fBootable = false;
return S_OK;
return rc;
++it)
return S_OK;
++it)
return rc;
++it)
aName);
return S_OK;
#ifdef RT_OS_WINDOWS
vrc);
return S_OK;
STDMETHODIMP Machine::QuerySavedThumbnailSize(ULONG aScreenId, ULONG *aSize, ULONG *aWidth, ULONG *aHeight)
if (aScreenId != 0)
return E_NOTIMPL;
int vrc = readSavedDisplayScreenshot(mSSData->strStateFilePath, 0 /* u32Type */, &pu8Data, &cbData, &u32Width, &u32Height);
vrc);
return S_OK;
STDMETHODIMP Machine::ReadSavedThumbnailToArray(ULONG aScreenId, BOOL aBGR, ULONG *aWidth, ULONG *aHeight, ComSafeArrayOut(BYTE, aData))
if (aScreenId != 0)
return E_NOTIMPL;
int vrc = readSavedDisplayScreenshot(mSSData->strStateFilePath, 0 /* u32Type */, &pu8Data, &cbData, &u32Width, &u32Height);
vrc);
if (aBGR)
return S_OK;
STDMETHODIMP Machine::ReadSavedThumbnailPNGToArray(ULONG aScreenId, ULONG *aWidth, ULONG *aHeight, ComSafeArrayOut(BYTE, aData))
if (aScreenId != 0)
return E_NOTIMPL;
int vrc = readSavedDisplayScreenshot(mSSData->strStateFilePath, 0 /* u32Type */, &pu8Data, &cbData, &u32Width, &u32Height);
vrc);
if (pu8PNG)
if (pu8PNG)
vrc);
return rc;
STDMETHODIMP Machine::QuerySavedScreenshotPNGSize(ULONG aScreenId, ULONG *aSize, ULONG *aWidth, ULONG *aHeight)
if (aScreenId != 0)
return E_NOTIMPL;
int vrc = readSavedDisplayScreenshot(mSSData->strStateFilePath, 1 /* u32Type */, &pu8Data, &cbData, &u32Width, &u32Height);
vrc);
return S_OK;
STDMETHODIMP Machine::ReadSavedScreenshotPNGToArray(ULONG aScreenId, ULONG *aWidth, ULONG *aHeight, ComSafeArrayOut(BYTE, aData))
if (aScreenId != 0)
return E_NOTIMPL;
int vrc = readSavedDisplayScreenshot(mSSData->strStateFilePath, 1 /* u32Type */, &pu8Data, &cbData, &u32Width, &u32Height);
vrc);
return S_OK;
return setError(E_INVALIDARG, tr("CPU id exceeds number of possible CPUs [0:%lu]"), mHWData->mCPUCount-1);
return S_OK;
if (aCpu == 0)
return S_OK;
*aCpuAttached = false;
*aCpuAttached = true;
return S_OK;
return S_OK;
STDMETHODIMP Machine::ReadLog(ULONG aIdx, LONG64 aOffset, LONG64 aSize, ComSafeArrayOut(BYTE, aData))
if (aSize < 0)
return rc;
STDMETHODIMP Machine::AttachHostPciDevice(LONG hostAddress, LONG desiredGuestAddress, BOOL /*tryToUnbind*/)
++it)
RTStrPrintf(name, sizeof(name), "host%02x:%02x.%x", (hostAddress>>8) & 0xff, (hostAddress & 0xf8) >> 3, hostAddress & 7);
return S_OK;
bool fRemoved = false;
++it)
fRemoved = true;
if (fRemoved)
fireHostPciDevicePlugEvent(es, mid.raw(), false /* unplugged */, true /* success */, pAttach, NULL);
STDMETHODIMP Machine::COMGETTER(PciDeviceAssignments)(ComSafeArrayOut(IPciDeviceAttachment *, aAssignments))
return S_OK;
return S_OK;
return hrc;
return hrc;
return hrc;
return hrc;
return hrc;
return hrc;
return hrc;
int vrc;
if (fEnabled)
return hrc;
return hrc;
return hrc;
return hrc;
int vrc;
return hrc;
STDMETHODIMP Machine::CloneTo(IMachine *pTarget, CloneMode_T mode, ComSafeArrayIn(CloneOptions_T, options), IProgress **pProgress)
if (!isSnapshotMachine())
AssertReturn(!(optList.contains(CloneOptions_KeepAllMACs) && optList.contains(CloneOptions_KeepNATMACs)), E_INVALIDARG);
return rc;
return S_OK;
return vrc;
if (idx == 0)
return log;
* Utf8StrFmt("%s%c{%RTuuid}.sav", strFullSnapshotFolder.c_str(), RTPATH_DELIMITER, mData->mUuid.raw())
for (char *p = newEnvStr; *p; ++p)
if (*var)
if (val)
#ifdef VBOX_WITH_QTGUI
# ifdef RT_OS_DARWIN /* Avoid Launch Services confusing this with the selector by using a helper app. */
const char * args[] = {szPath, "--comment", mUserData->s.strName.c_str(), "--startvm", idStr.c_str(), "--no-startvm-errormsgbox", 0 };
#ifdef VBOX_WITH_VBOXSDL
const char * args[] = {szPath, "--comment", mUserData->s.strName.c_str(), "--startvm", idStr.c_str(), 0 };
#ifdef VBOX_WITH_HEADLESS
/* On pre-4.0 the "headless" type was used for passing "--vrdp off" to VBoxHeadless to let it work in OSE,
#ifdef RT_OS_WINDOWS
, &pid);
return S_OK;
#if defined(RT_OS_WINDOWS)
&status);
// no need to check whether VirtualBox.xml needs saving too since
commit();
return rc;
AssertFailed();
if (aState)
if (aRegistered)
return S_OK;
switch (aDepType)
case AnyStateDep:
case MutableStateDep:
&& ( !isSessionMachine() /** @todo This was just converted raw; Check if Running and Paused should actually be included here... (Live Migration) */
case MutableOrSavedStateDep:
&& ( !isSessionMachine() /** @todo This was just converted raw; Check if Running and Paused should actually be included here... (Live Migration) */
return S_OK;
return S_OK;
if (mBandwidthControl)
if (mUSBController)
if (mAudioAdapter)
if (mVRDEServer)
if (mBIOSSettings)
if ( !!mMediaData
&& (!isSessionMachine())
++it)
if (isSessionMachine())
return S_OK;
++it)
return rc;
* @param puuidRegistry If != NULL, Medium::setRegistryIdIfFirst() gets called with this registry ID for each attached medium in the config.
vrc);
return S_OK;
vrc);
++it)
return rc;
++it)
++it)
for (size_t i = 0;
++it)
++it)
++it)
++it)
++it)
#ifdef VBOX_WITH_GUEST_PROPS
++it)
return rc;
return E_OUTOFMEMORY;
return rc;
return S_OK;
* @param puuidRegistry media registry ID to set media to or NULL; see Machine::loadMachineDataFromSettings()
++it)
return rc;
return S_OK;
* @param puuidRegistry media registry ID to set media to or NULL; see Machine::loadMachineDataFromSettings()
++it)
++it2)
tr("Duplicate attachments for storage controller '%s', port %d, device %d of the virtual machine '%s'"),
++it)
case DeviceType_Floppy:
case DeviceType_DVD:
rc = mParent->host()->findHostDriveByName(dev.deviceType, dev.strHostDriveSrc, false /* fRefresh */, medium);
medium);
// This is not an error. The host drive or UUID might have vanished, so just go ahead without this removeable medium attachment
case DeviceType_HardDisk:
if (isSnapshotMachine())
return rc;
if (isSnapshotMachine())
tr("Immutable hard disk '%s' with UUID {%RTuuid} cannot be directly attached to snapshot with UUID {%RTuuid} "
tr("Immutable hard disk '%s' with UUID {%RTuuid} cannot be directly attached to the virtual machine '%s' ('%s')"),
if (isSnapshotMachine())
tr("Multi-attach hard disk '%s' with UUID {%RTuuid} cannot be directly attached to snapshot with UUID {%RTuuid} "
tr("Multi-attach hard disk '%s' with UUID {%RTuuid} cannot be directly attached to the virtual machine '%s' ('%s')"),
if ( !isSnapshotMachine()
tr("Hard disk '%s' with UUID {%RTuuid} cannot be directly attached to the virtual machine '%s' ('%s') "
medium))
if (isSnapshotMachine())
if (puuidRegistry)
return rc;
if (aSetError)
return E_FAIL;
if (!aSnapshot)
if (aSetError)
return E_FAIL;
return S_OK;
if (aSetError)
return VBOX_E_OBJECT_NOT_FOUND;
if (!aSnapshot)
if (aSetError)
return VBOX_E_OBJECT_NOT_FOUND;
return S_OK;
++it)
return S_OK;
if (aSetError)
return VBOX_E_OBJECT_NOT_FOUND;
++it)
return S_OK;
bool dirRenamed = false;
bool fileRenamed = false;
if (!fSettingsFileIsNew)
vrc);
dirRenamed = true;
if (!fSettingsFileIsNew)
vrc);
fileRenamed = true;
*pfNeedsGlobalSaveSettings = true;
mSSData->strStateFilePath = newConfigDir.append(mSSData->strStateFilePath.c_str() + configDir.length());
if (fileRenamed)
if (dirRenamed)
if (fSettingsFileIsNew)
vrc);
vrc);
RTFileClose(f);
return rc;
E_FAIL);
bool fNeedsWrite = false;
fNeedsWrite = true;
if (fNeedsWrite)
delete pOldConfig;
commit();
delete pNewConfig;
if (isSessionMachine())
return rc;
return rc;
mHWData->mHWVersion = "2"; /** @todo Is this safe, to update mHWVersion here? If not some other point needs to be found where this can be done. */
for (size_t i = 0;
uint32_t uMaxNICs = RT_MIN(Global::getMaxNetworkAdapters(mHWData->mChipsetType), mNetworkAdapters.size());
++slot)
++slot)
++it)
++it)
#ifdef VBOX_WITH_GUEST_PROPS
++it)
return E_OUTOFMEMORY;
return rc;
++it)
return S_OK;
++it)
if (pMedium)
return S_OK;
if (aFlags == 0)
return S_OK;
//@todo live migration mData->pMachineConfigFile->fTeleported = (mData->mMachineState == MachineState_Teleported);
return rc;
bool aOnline)
, E_FAIL);
if (aOnline)
if (!aOnline)
++it)
NULL,
delete pMediumLockList;
throw rc;
++it)
if (aOnline)
diff,
if (!aOnline)
return rc;
++it)
++it)
AssertMsg(SUCCEEDED(rc), ("rc=%Rhrc it=%s hd=%s\n", rc, (*it)->getLogName(), hd->getLocationFull().c_str() ));
return mrc;
++it)
return pAttach;
return NULL;
++it)
return pAttach;
return NULL;
++it)
return pAttach;
return NULL;
* @param writeLock Machine write lock which the caller must have locked once. This may be released temporarily in here.
* @param pSnapshot If NULL, then the detachment is for the current machine. Otherwise this is for a SnapshotMachine, and this must be its snapshot.
LogFlowThisFunc(("Entering, medium of attachment is %s\n", oldmedium ? oldmedium->getLocationFull().c_str() : "NULL"));
if (pSnapshot)
return S_OK;
* @param pSnapshot Must be NULL when called for a "real" Machine or a snapshot object if called for a SnapshotMachine.
* @param cleanupMode If DetachAllReturnHardDisksOnly, only hard disk media get added to llMedia; if Full, then all media get added;
* @param llMedia Caller's list to receive Medium objects which got detached so caller can close() them, depending on cleanupMode.
++it)
return rc;
return S_OK;
bool fMediaNeedsLocking = false;
++it)
fImplicit));
if (fImplicit)
if ( aOnline
&& pMedium
if (pMediumLockList)
if (!fMediaNeedsLocking)
fMediaNeedsLocking = true;
if (pMedium)
++oldIt)
LogFlowThisFunc(("--> medium '%s' was attached before, will not remove\n", pMedium->getName().c_str()));
++it)
if (aOnline)
if (pMediumLockList)
if (fMediaNeedsLocking)
if (isSessionMachine())
++it)
++it)
if (pMedium)
if (pMedium)
if (aSettingsDir)
++it;
++it;
if (mBIOSSettings)
if (mAudioAdapter)
if (aNotify)
commitMedia();
bool commitStorageControllers = false;
if (mPeer)
if (!peer)
++it;
++it;
commitStorageControllers = true;
commitStorageControllers = true;
++it;
if (isSessionMachine())
++it)
++it)
switch (enmCtrlType)
#ifdef VBOX_WITH_RESOURCE_USAGE_API
/* The total amount of physical ram is fixed now, but we'll support dynamic guest ram configurations in the future. */
pm::SubMetric *guestMemTotal = new pm::SubMetric("Guest/RAM/Usage/Total", "Total amount of physical guest RAM.");
pm::SubMetric *guestMemFree = new pm::SubMetric("Guest/RAM/Usage/Free", "Free amount of physical guest RAM.");
pm::SubMetric *guestMemBalloon = new pm::SubMetric("Guest/RAM/Usage/Balloon", "Amount of ballooned physical guest RAM.");
pm::SubMetric *guestMemShared = new pm::SubMetric("Guest/RAM/Usage/Shared", "Amount of shared physical guest RAM.");
pm::SubMetric *guestMemCache = new pm::SubMetric("Guest/RAM/Usage/Cache", "Total amount of guest (disk) cache memory.");
pm::SubMetric *guestPagedTotal = new pm::SubMetric("Guest/Pagefile/Usage/Total", "Total amount of space in the page file.");
if (aCollector)
#if defined(RT_OS_WINDOWS)
return BaseFinalConstruct();
#if defined(RT_OS_WINDOWS)
E_FAIL);
E_FAIL);
# ifdef VBOX_WITH_NEW_SYS_V_KEYGEN
if (sem >= 0)
return E_FAIL;
#ifdef RT_OS_LINUX
return E_FAIL;
E_FAIL);
E_FAIL);
++it)
mRemoveSavedState = true;
return S_OK;
* mData->mSession.mMachine.setNull() below (which can release the last
#if defined(RT_OS_WINDOWS)
if (mIPCSem)
if (mIPCSem >= 0)
# ifdef VBOX_WITH_NEW_SYS_V_KEYGEN
#ifdef VBOX_WITH_USB
if (service)
if (mCollectorGuest)
++it;
#if defined(RT_OS_WINDOWS)
if (mIPCSem)
if (mIPCSem >= 0)
# ifdef VBOX_WITH_NEW_SYS_V_KEYGEN
if (mCollectorGuest)
return S_OK;
return S_OK;
return S_OK;
# ifdef VBOX_WITH_NEW_SYS_V_KEYGEN
return S_OK;
return VBOX_E_INVALID_OBJECT_STATE;
return S_OK;
return VBOX_E_INVALID_OBJECT_STATE;
#ifdef VBOX_WITH_RESOURCE_USAGE_API
return S_OK;
E_FAIL);
return S_OK;
E_FAIL);
return S_OK;
#ifdef VBOX_WITH_USB
return S_OK;
#ifdef VBOX_WITH_USB
clearError();
return E_NOTIMPL;
#ifdef VBOX_WITH_USB
return E_NOTIMPL;
#ifdef VBOX_WITH_USB
return S_OK;
* Machine/SessionMachine lock).
#ifdef VBOX_WITH_USB
return S_OK;
++it;
return S_OK;
E_FAIL);
return S_OK;
E_FAIL);
vrc);
#ifdef VBOX_WITH_GUEST_PROPS
using namespace guestProp;
++it)
return S_OK;
#ifdef VBOX_WITH_GUEST_PROPS
using namespace guestProp;
if (aFlags)
case MachineState_Paused:
case MachineState_Running:
case MachineState_Teleporting:
case MachineState_Saving:
#ifndef DEBUG_sunlover
return VBOX_E_INVALID_VM_STATE;
++iter)
aFlags);
return S_OK;
this->lockHandle(),
bool fTempEject;
if (!fTempEject)
lDevice);
return S_OK;
bool terminated = false;
#if defined(RT_OS_WINDOWS)
terminated = true;
terminated = true;
if (val > 0)
terminated = true;
if (terminated)
return terminated;
if (!directControl)
return S_OK;
HRESULT SessionMachine::onNATRedirectRuleChange(ULONG ulSlot, BOOL aNatRuleRemove, IN_BSTR aRuleName,
if (!directControl)
return S_OK;
mParent->onNatRedirectChange(getId(), ulSlot, RT_BOOL(aNatRuleRemove), aRuleName, aProto, aHostIp, aHostPort, aGuestIp, aGuestPort);
return S_OK;
if (!directControl)
return S_OK;
if (!directControl)
return S_OK;
if (!directControl)
return S_OK;
if (!directControl)
return S_OK;
if (!directControl)
return S_OK;
if (!directControl)
return S_OK;
if (!directControl)
return S_OK;
if (!directControl)
return S_OK;
if (!directControl)
return S_OK;
if (!directControl)
return S_OK;
if (!directControl)
return S_OK;
if (!directControl)
return S_OK;
bool SessionMachine::hasMatchingUSBFilter(const ComObjPtr<HostUSBDevice> &aDevice, ULONG *aMaskedIfs)
#ifdef VBOX_WITH_USB
case MachineState_Starting:
case MachineState_Restoring:
case MachineState_Paused:
case MachineState_Running:
if (!directControl)
return E_FAIL;
AssertMsg(RTLockValidatorWriteLockGetCount(RTThreadSelf()) == 0, ("%d\n", RTLockValidatorWriteLockGetCount(RTThreadSelf())));
AssertMsg(RTLockValidatorReadLockGetCount(RTThreadSelf()) == 0, ("%d\n", RTLockValidatorReadLockGetCount(RTThreadSelf())));
if (!directControl)
return E_FAIL;
AssertMsg(RTLockValidatorWriteLockGetCount(RTThreadSelf()) == 0, ("%d\n", RTLockValidatorWriteLockGetCount(RTThreadSelf())));
AssertMsg(RTLockValidatorReadLockGetCount(RTThreadSelf()) == 0, ("%d\n", RTLockValidatorReadLockGetCount(RTThreadSelf())));
// no need to check whether VirtualBox.xml needs saving also since
return rc;
* @param pSnapshotToIgnore Passed to Snapshot::sharesSavedStateFile(); this snapshot is ignored in the test for whether the saved state file is in use.
clearError();
++it)
NULL,
delete pMediumLockList;
return mrc;
E_FAIL);
int stsFlags = 0;
bool deleteSavedState = false;
|| mConsoleTaskData.mLastState >= MachineState_Running /** @todo Live Migration: clean up (lazy bird) */
unlockMedia();
deleteSavedState = true;
deleteSavedState = true;
if (deleteSavedState)
if (mRemoveSavedState)
|| !mData->mFirstSnapshot->sharesSavedStateFile(mSSData->strStateFilePath, NULL /* pSnapshotToIgnore */)
#ifdef VBOX_WITH_GUEST_PROPS
if (!fNeedsSaving)
fNeedsSaving = true;
if (fNeedsSaving)
SaveSettings(); // @todo r=dj why the public method? why first SaveSettings and then saveStateSettings?
return rc;
return S_OK;