diff options
Diffstat (limited to 'src/VBox/Main/src-server/ApplianceImpl.cpp')
-rw-r--r-- | src/VBox/Main/src-server/ApplianceImpl.cpp | 263 |
1 files changed, 224 insertions, 39 deletions
diff --git a/src/VBox/Main/src-server/ApplianceImpl.cpp b/src/VBox/Main/src-server/ApplianceImpl.cpp index 05fc3b67..8d1e6014 100644 --- a/src/VBox/Main/src-server/ApplianceImpl.cpp +++ b/src/VBox/Main/src-server/ApplianceImpl.cpp @@ -1,11 +1,10 @@ /* $Id: ApplianceImpl.cpp $ */ /** @file - * * IAppliance and IVirtualSystem COM class implementations. */ /* - * Copyright (C) 2008-2012 Oracle Corporation + * Copyright (C) 2008-2013 Oracle Corporation * * This file is part of VirtualBox Open Source Edition (OSE), as * available from http://www.virtualbox.org. This file is free software; @@ -18,8 +17,8 @@ #include <iprt/path.h> #include <iprt/cpp/utils.h> - #include <VBox/com/array.h> +#include <map> #include "ApplianceImpl.h" #include "VFSExplorerImpl.h" @@ -28,7 +27,8 @@ #include "Global.h" #include "ProgressImpl.h" #include "MachineImpl.h" - +#include "MediumFormatImpl.h" +#include "SystemPropertiesImpl.h" #include "AutoCaller.h" #include "Logging.h" @@ -42,6 +42,21 @@ using namespace std; // //////////////////////////////////////////////////////////////////////////////// +static const char* const strISOURI = "http://www.ecma-international.org/publications/standards/Ecma-119.htm"; +static const char* const strVMDKStreamURI = "http://www.vmware.com/interfaces/specifications/vmdk.html#streamOptimized"; +static const char* const strVMDKSparseURI = "http://www.vmware.com/specifications/vmdk.html#sparse"; +static const char* const strVMDKCompressedURI = "http://www.vmware.com/specifications/vmdk.html#compressed"; +static const char* const strVMDKCompressedURI2 = "http://www.vmware.com/interfaces/specifications/vmdk.html#compressed"; +static const char* const strVHDURI = "http://go.microsoft.com/fwlink/?LinkId=137171"; + +static std::map<Utf8Str, Utf8Str> supportedStandardsURI; + +static const char* const applianceIOTarName = "Appliance::IOTar"; +static const char* const applianceIOShaName = "Appliance::IOSha"; +static const char* const applianceIOFileName = "Appliance::IOFile"; + +static std::map<APPLIANCEIONAME, Utf8Str> applianceIONameMap; + static const struct { ovf::CIMOSType_T cim; @@ -83,6 +98,11 @@ g_osTypes[] = { ovf::CIMOSType_CIMOS_FreeBSD_64, VBOXOSTYPE_FreeBSD_x64 }, { ovf::CIMOSType_CIMOS_MACOS, VBOXOSTYPE_MacOS }, { ovf::CIMOSType_CIMOS_MACOS, VBOXOSTYPE_MacOS_x64 }, // there is no CIM 64-bit type for this + { ovf::CIMOSType_CIMOS_MACOS, VBOXOSTYPE_MacOS106 }, + { ovf::CIMOSType_CIMOS_MACOS, VBOXOSTYPE_MacOS106_x64 }, + { ovf::CIMOSType_CIMOS_MACOS, VBOXOSTYPE_MacOS107_x64 }, + { ovf::CIMOSType_CIMOS_MACOS, VBOXOSTYPE_MacOS108_x64 }, + { ovf::CIMOSType_CIMOS_MACOS, VBOXOSTYPE_MacOS109_x64 }, // Linuxes { ovf::CIMOSType_CIMOS_RedHatEnterpriseLinux, VBOXOSTYPE_RedHat }, @@ -238,24 +258,44 @@ void convertCIMOSType2VBoxOSType(Utf8Str &strType, ovf::CIMOSType_T c, const Utf } } - strType = Global::OSTypeId(VBOXOSTYPE_Unknown); + if (c == ovf::CIMOSType_CIMOS_Other_64) + strType = Global::OSTypeId(VBOXOSTYPE_Unknown_x64); + else + strType = Global::OSTypeId(VBOXOSTYPE_Unknown); } /** * Private helper func that suggests a VirtualBox guest OS type * for the given OVF operating system type. - * @param osTypeVBox - * @param c + * @returns CIM OS type. + * @param pcszVBox Our guest OS type identifier string. + * @param fLongMode Whether long mode is enabled and a 64-bit CIM type is + * preferred even if the VBox guest type isn't 64-bit. */ -ovf::CIMOSType_T convertVBoxOSType2CIMOSType(const char *pcszVbox) +ovf::CIMOSType_T convertVBoxOSType2CIMOSType(const char *pcszVBox, BOOL fLongMode) { for (size_t i = 0; i < RT_ELEMENTS(g_osTypes); ++i) { - if (!RTStrICmp(pcszVbox, Global::OSTypeId(g_osTypes[i].osType))) + if (!RTStrICmp(pcszVBox, Global::OSTypeId(g_osTypes[i].osType))) + { + if (fLongMode && !(g_osTypes[i].osType & VBOXOSTYPE_x64)) + { + VBOXOSTYPE enmDesiredOsType = (VBOXOSTYPE)((int)g_osTypes[i].osType | (int)VBOXOSTYPE_x64); + size_t j = i; + while (++j < RT_ELEMENTS(g_osTypes)) + if (g_osTypes[j].osType == enmDesiredOsType) + return g_osTypes[j].cim; + j = i; + while (--j > 0) + if (g_osTypes[j].osType == enmDesiredOsType) + return g_osTypes[j].cim; + /* Not all OSes have 64-bit versions, so just return the 32-bit variant. */ + } return g_osTypes[i].cim; + } } - return ovf::CIMOSType_CIMOS_Other; + return fLongMode ? ovf::CIMOSType_CIMOS_Other_64 : ovf::CIMOSType_CIMOS_Other; } Utf8Str convertNetworkAttachmentTypeToString(NetworkAttachmentType_T type) @@ -268,6 +308,7 @@ Utf8Str convertNetworkAttachmentTypeToString(NetworkAttachmentType_T type) case NetworkAttachmentType_Internal: strType = "Internal"; break; case NetworkAttachmentType_HostOnly: strType = "HostOnly"; break; case NetworkAttachmentType_Generic: strType = "Generic"; break; + case NetworkAttachmentType_NATNetwork: strType = "NATNetwork"; break; case NetworkAttachmentType_Null: strType = "Null"; break; } return strType; @@ -324,6 +365,7 @@ Appliance::~Appliance() */ HRESULT Appliance::init(VirtualBox *aVirtualBox) { + HRESULT rc = S_OK; /* Enclose the state transition NotReady->InInit->Ready */ AutoInitSpan autoInitSpan(this); AssertReturn(autoInitSpan.isOk(), E_FAIL); @@ -334,10 +376,14 @@ HRESULT Appliance::init(VirtualBox *aVirtualBox) // initialize data m = new Data; + initApplianceIONameMap(); + + rc = initSetOfSupportedStandardsURI(); + /* Confirm a successful initialization */ autoInitSpan.setSucceeded(); - return S_OK; + return rc; } /** @@ -573,6 +619,113 @@ STDMETHODIMP Appliance::GetWarnings(ComSafeArrayOut(BSTR, aWarnings)) // //////////////////////////////////////////////////////////////////////////////// +HRESULT Appliance::initSetOfSupportedStandardsURI() +{ + HRESULT rc = S_OK; + if (!supportedStandardsURI.empty()) + return rc; + + /* Get the system properties. */ + SystemProperties *pSysProps = mVirtualBox->getSystemProperties(); + { + ComObjPtr<MediumFormat> trgFormat = pSysProps->mediumFormatFromExtension("iso"); + if (trgFormat.isNull()) + return setError(E_FAIL, tr("Can't find appropriate medium format for ISO type of a virtual disk.")); + + Bstr bstrFormatName; + rc = trgFormat->COMGETTER(Name)(bstrFormatName.asOutParam()); + if (FAILED(rc)) return rc; + + Utf8Str strTrgFormat = Utf8Str(bstrFormatName); + + supportedStandardsURI.insert(std::make_pair(Utf8Str(strISOURI), strTrgFormat)); + } + + { + ComObjPtr<MediumFormat> trgFormat = pSysProps->mediumFormatFromExtension("vmdk"); + if (trgFormat.isNull()) + return setError(E_FAIL, tr("Can't find appropriate medium format for VMDK type of a virtual disk.")); + + Bstr bstrFormatName; + rc = trgFormat->COMGETTER(Name)(bstrFormatName.asOutParam()); + if (FAILED(rc)) return rc; + + Utf8Str strTrgFormat = Utf8Str(bstrFormatName); + + supportedStandardsURI.insert(std::make_pair(Utf8Str(strVMDKStreamURI), strTrgFormat)); + supportedStandardsURI.insert(std::make_pair(Utf8Str(strVMDKSparseURI), strTrgFormat)); + supportedStandardsURI.insert(std::make_pair(Utf8Str(strVMDKCompressedURI), strTrgFormat)); + supportedStandardsURI.insert(std::make_pair(Utf8Str(strVMDKCompressedURI2), strTrgFormat)); + } + + { + ComObjPtr<MediumFormat> trgFormat = pSysProps->mediumFormatFromExtension("vhd"); + if (trgFormat.isNull()) + return setError(E_FAIL, tr("Can't find appropriate medium format for VHD type of a virtual disk.")); + + Bstr bstrFormatName; + rc = trgFormat->COMGETTER(Name)(bstrFormatName.asOutParam()); + if (FAILED(rc)) return rc; + + Utf8Str strTrgFormat = Utf8Str(bstrFormatName); + + supportedStandardsURI.insert(std::make_pair(Utf8Str(strVHDURI), strTrgFormat)); + } + + return rc; +} + +Utf8Str Appliance::typeOfVirtualDiskFormatFromURI(Utf8Str uri) const +{ + Utf8Str type; + std::map<Utf8Str, Utf8Str>::const_iterator cit = supportedStandardsURI.find(uri); + if (cit != supportedStandardsURI.end()) + { + type = cit->second; + } + + return type; +} + +std::set<Utf8Str> Appliance::URIFromTypeOfVirtualDiskFormat(Utf8Str type) +{ + std::set<Utf8Str> uri; + std::map<Utf8Str, Utf8Str>::const_iterator cit = supportedStandardsURI.begin(); + while(cit != supportedStandardsURI.end()) + { + if (cit->second.compare(type,Utf8Str::CaseInsensitive) == 0) + uri.insert(cit->first); + ++cit; + } + + return uri; +} + +HRESULT Appliance::initApplianceIONameMap() +{ + HRESULT rc = S_OK; + if (!applianceIONameMap.empty()) + return rc; + + applianceIONameMap.insert(std::make_pair(applianceIOTar, applianceIOTarName)); + applianceIONameMap.insert(std::make_pair(applianceIOFile, applianceIOFileName)); + applianceIONameMap.insert(std::make_pair(applianceIOSha, applianceIOShaName)); + + return rc; +} + +Utf8Str Appliance::applianceIOName(APPLIANCEIONAME type) const +{ + Utf8Str name; + std::map<APPLIANCEIONAME, Utf8Str>::const_iterator cit = applianceIONameMap.find(type); + if (cit != applianceIONameMap.end()) + { + name = cit->second; + } + + return name; +} + /** * Returns true if the appliance is in "idle" state. This should always be the * case unless an import or export is currently in progress. Similar to machine @@ -626,7 +779,7 @@ HRESULT Appliance::searchUniqueDiskImageFilePath(Utf8Str& aName) const * already */ /** @todo: Maybe too cost-intensive; try to find a lighter way */ while ( RTPathExists(tmpName) - || mVirtualBox->OpenMedium(Bstr(tmpName).raw(), DeviceType_HardDisk, AccessMode_ReadWrite, FALSE /* fForceNewUuid */, &harddisk) != VBOX_E_OBJECT_NOT_FOUND + || mVirtualBox->OpenMedium(Bstr(tmpName).raw(), DeviceType_HardDisk, AccessMode_ReadWrite, FALSE /* fForceNewUuid */, &harddisk) != VBOX_E_OBJECT_NOT_FOUND ) { RTStrFree(tmpName); @@ -783,7 +936,7 @@ void Appliance::waitForAsyncProgress(ComObjPtr<Progress> &pProgressThis, that in the meantime more than one async operation was finished. So we have to loop as long as we reached the same operation count. */ ULONG curOp; - for(;;) + for (;;) { rc = pProgressAsync->COMGETTER(Operation(&curOp)); if (FAILED(rc)) throw rc; @@ -866,6 +1019,16 @@ void Appliance::disksWeight() m->ulTotalDisksMB += pHD->ulSizeMB; ++m->cDisks; } + + avsdeHDs = vsdescThis->findByType(VirtualSystemDescriptionType_CDROM); + for (itH = avsdeHDs.begin(); + itH != avsdeHDs.end(); + ++itH) + { + const VirtualSystemDescriptionEntry *pHD = *itH; + m->ulTotalDisksMB += pHD->ulSizeMB; + ++m->cDisks; + } } } @@ -1109,13 +1272,13 @@ STDMETHODIMP VirtualSystemDescription::COMGETTER(Count)(ULONG *aCount) STDMETHODIMP VirtualSystemDescription::GetDescription(ComSafeArrayOut(VirtualSystemDescriptionType_T, aTypes), ComSafeArrayOut(BSTR, aRefs), ComSafeArrayOut(BSTR, aOrigValues), - ComSafeArrayOut(BSTR, aVboxValues), + ComSafeArrayOut(BSTR, aVBoxValues), ComSafeArrayOut(BSTR, aExtraConfigValues)) { if (ComSafeArrayOutIsNull(aTypes) || ComSafeArrayOutIsNull(aRefs) || ComSafeArrayOutIsNull(aOrigValues) || - ComSafeArrayOutIsNull(aVboxValues) || + ComSafeArrayOutIsNull(aVBoxValues) || ComSafeArrayOutIsNull(aExtraConfigValues)) return E_POINTER; @@ -1128,7 +1291,7 @@ STDMETHODIMP VirtualSystemDescription::GetDescription(ComSafeArrayOut(VirtualSys com::SafeArray<VirtualSystemDescriptionType_T> sfaTypes(c); com::SafeArray<BSTR> sfaRefs(c); com::SafeArray<BSTR> sfaOrigValues(c); - com::SafeArray<BSTR> sfaVboxValues(c); + com::SafeArray<BSTR> sfaVBoxValues(c); com::SafeArray<BSTR> sfaExtraConfigValues(c); list<VirtualSystemDescriptionEntry>::const_iterator it; @@ -1147,8 +1310,8 @@ STDMETHODIMP VirtualSystemDescription::GetDescription(ComSafeArrayOut(VirtualSys bstr = vsde.strOvf; bstr.cloneTo(&sfaOrigValues[i]); - bstr = vsde.strVboxCurrent; - bstr.cloneTo(&sfaVboxValues[i]); + bstr = vsde.strVBoxCurrent; + bstr.cloneTo(&sfaVBoxValues[i]); bstr = vsde.strExtraConfigCurrent; bstr.cloneTo(&sfaExtraConfigValues[i]); @@ -1157,7 +1320,7 @@ STDMETHODIMP VirtualSystemDescription::GetDescription(ComSafeArrayOut(VirtualSys sfaTypes.detachTo(ComSafeArrayOutArg(aTypes)); sfaRefs.detachTo(ComSafeArrayOutArg(aRefs)); sfaOrigValues.detachTo(ComSafeArrayOutArg(aOrigValues)); - sfaVboxValues.detachTo(ComSafeArrayOutArg(aVboxValues)); + sfaVBoxValues.detachTo(ComSafeArrayOutArg(aVBoxValues)); sfaExtraConfigValues.detachTo(ComSafeArrayOutArg(aExtraConfigValues)); return S_OK; @@ -1171,13 +1334,13 @@ STDMETHODIMP VirtualSystemDescription::GetDescriptionByType(VirtualSystemDescrip ComSafeArrayOut(VirtualSystemDescriptionType_T, aTypes), ComSafeArrayOut(BSTR, aRefs), ComSafeArrayOut(BSTR, aOrigValues), - ComSafeArrayOut(BSTR, aVboxValues), + ComSafeArrayOut(BSTR, aVBoxValues), ComSafeArrayOut(BSTR, aExtraConfigValues)) { if (ComSafeArrayOutIsNull(aTypes) || ComSafeArrayOutIsNull(aRefs) || ComSafeArrayOutIsNull(aOrigValues) || - ComSafeArrayOutIsNull(aVboxValues) || + ComSafeArrayOutIsNull(aVBoxValues) || ComSafeArrayOutIsNull(aExtraConfigValues)) return E_POINTER; @@ -1191,7 +1354,7 @@ STDMETHODIMP VirtualSystemDescription::GetDescriptionByType(VirtualSystemDescrip com::SafeArray<VirtualSystemDescriptionType_T> sfaTypes(c); com::SafeArray<BSTR> sfaRefs(c); com::SafeArray<BSTR> sfaOrigValues(c); - com::SafeArray<BSTR> sfaVboxValues(c); + com::SafeArray<BSTR> sfaVBoxValues(c); com::SafeArray<BSTR> sfaExtraConfigValues(c); list<VirtualSystemDescriptionEntry*>::const_iterator it; @@ -1210,8 +1373,8 @@ STDMETHODIMP VirtualSystemDescription::GetDescriptionByType(VirtualSystemDescrip bstr = vsde->strOvf; bstr.cloneTo(&sfaOrigValues[i]); - bstr = vsde->strVboxCurrent; - bstr.cloneTo(&sfaVboxValues[i]); + bstr = vsde->strVBoxCurrent; + bstr.cloneTo(&sfaVBoxValues[i]); bstr = vsde->strExtraConfigCurrent; bstr.cloneTo(&sfaExtraConfigValues[i]); @@ -1220,7 +1383,7 @@ STDMETHODIMP VirtualSystemDescription::GetDescriptionByType(VirtualSystemDescrip sfaTypes.detachTo(ComSafeArrayOutArg(aTypes)); sfaRefs.detachTo(ComSafeArrayOutArg(aRefs)); sfaOrigValues.detachTo(ComSafeArrayOutArg(aOrigValues)); - sfaVboxValues.detachTo(ComSafeArrayOutArg(aVboxValues)); + sfaVBoxValues.detachTo(ComSafeArrayOutArg(aVBoxValues)); sfaExtraConfigValues.detachTo(ComSafeArrayOutArg(aExtraConfigValues)); return S_OK; @@ -1258,7 +1421,7 @@ STDMETHODIMP VirtualSystemDescription::GetValuesByType(VirtualSystemDescriptionT { case VirtualSystemDescriptionValueType_Reference: bstr = vsde->strRef; break; case VirtualSystemDescriptionValueType_Original: bstr = vsde->strOvf; break; - case VirtualSystemDescriptionValueType_Auto: bstr = vsde->strVboxCurrent; break; + case VirtualSystemDescriptionValueType_Auto: bstr = vsde->strVBoxCurrent; break; case VirtualSystemDescriptionValueType_ExtraConfig: bstr = vsde->strExtraConfigCurrent; break; } @@ -1275,7 +1438,7 @@ STDMETHODIMP VirtualSystemDescription::GetValuesByType(VirtualSystemDescriptionT * @return */ STDMETHODIMP VirtualSystemDescription::SetFinalValues(ComSafeArrayIn(BOOL, aEnabled), - ComSafeArrayIn(IN_BSTR, argVboxValues), + ComSafeArrayIn(IN_BSTR, argVBoxValues), ComSafeArrayIn(IN_BSTR, argExtraConfigValues)) { #ifndef RT_OS_WINDOWS @@ -1283,7 +1446,7 @@ STDMETHODIMP VirtualSystemDescription::SetFinalValues(ComSafeArrayIn(BOOL, aEnab #endif /* RT_OS_WINDOWS */ CheckComArgSafeArrayNotNull(aEnabled); - CheckComArgSafeArrayNotNull(argVboxValues); + CheckComArgSafeArrayNotNull(argVBoxValues); CheckComArgSafeArrayNotNull(argExtraConfigValues); AutoCaller autoCaller(this); @@ -1292,11 +1455,11 @@ STDMETHODIMP VirtualSystemDescription::SetFinalValues(ComSafeArrayIn(BOOL, aEnab AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS); com::SafeArray<BOOL> sfaEnabled(ComSafeArrayInArg(aEnabled)); - com::SafeArray<IN_BSTR> sfaVboxValues(ComSafeArrayInArg(argVboxValues)); + com::SafeArray<IN_BSTR> sfaVBoxValues(ComSafeArrayInArg(argVBoxValues)); com::SafeArray<IN_BSTR> sfaExtraConfigValues(ComSafeArrayInArg(argExtraConfigValues)); if ( (sfaEnabled.size() != m->llDescriptions.size()) - || (sfaVboxValues.size() != m->llDescriptions.size()) + || (sfaVBoxValues.size() != m->llDescriptions.size()) || (sfaExtraConfigValues.size() != m->llDescriptions.size()) ) return E_INVALIDARG; @@ -1311,7 +1474,7 @@ STDMETHODIMP VirtualSystemDescription::SetFinalValues(ComSafeArrayIn(BOOL, aEnab if (sfaEnabled[i]) { - vsde.strVboxCurrent = sfaVboxValues[i]; + vsde.strVBoxCurrent = sfaVBoxValues[i]; vsde.strExtraConfigCurrent = sfaExtraConfigValues[i]; } else @@ -1326,7 +1489,7 @@ STDMETHODIMP VirtualSystemDescription::SetFinalValues(ComSafeArrayIn(BOOL, aEnab * @return */ STDMETHODIMP VirtualSystemDescription::AddDescription(VirtualSystemDescriptionType_T aType, - IN_BSTR aVboxValue, + IN_BSTR aVBoxValue, IN_BSTR aExtraConfigValue) { AutoCaller autoCaller(this); @@ -1334,7 +1497,7 @@ STDMETHODIMP VirtualSystemDescription::AddDescription(VirtualSystemDescriptionTy AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS); - addEntry(aType, "", aVboxValue, aVboxValue, 0, aExtraConfigValue); + addEntry(aType, "", aVBoxValue, aVBoxValue, 0, aExtraConfigValue); return S_OK; } @@ -1351,7 +1514,7 @@ STDMETHODIMP VirtualSystemDescription::AddDescription(VirtualSystemDescriptionTy void VirtualSystemDescription::addEntry(VirtualSystemDescriptionType_T aType, const Utf8Str &strRef, const Utf8Str &aOvfValue, - const Utf8Str &aVboxValue, + const Utf8Str &aVBoxValue, uint32_t ulSizeMB, const Utf8Str &strExtraConfig /*= ""*/) { @@ -1360,15 +1523,17 @@ void VirtualSystemDescription::addEntry(VirtualSystemDescriptionType_T aType, vsde.type = aType; vsde.strRef = strRef; vsde.strOvf = aOvfValue; - vsde.strVboxSuggested // remember original value - = vsde.strVboxCurrent // and set current value which can be overridden by setFinalValues() - = aVboxValue; + vsde.strVBoxSuggested // remember original value + = vsde.strVBoxCurrent // and set current value which can be overridden by setFinalValues() + = aVBoxValue; vsde.strExtraConfigSuggested = vsde.strExtraConfigCurrent = strExtraConfig; vsde.ulSizeMB = ulSizeMB; + vsde.skipIt = false; m->llDescriptions.push_back(vsde); + } /** @@ -1394,6 +1559,26 @@ std::list<VirtualSystemDescriptionEntry*> VirtualSystemDescription::findByType(V } /** + * Private method; delete all records from the list + * m->llDescriptions that match the given type. + * @param aType + * @return + */ +void VirtualSystemDescription::removeByType(VirtualSystemDescriptionType_T aType) +{ + std::list<VirtualSystemDescriptionEntry*> vsd; + + list<VirtualSystemDescriptionEntry>::iterator it = m->llDescriptions.begin(); + while (it != m->llDescriptions.end()) + { + if (it->type == aType) + it = m->llDescriptions.erase(it); + else + ++it; + } +} + +/** * Private method; looks thru the member hardware items for the IDE, SATA, or SCSI controller with * the given reference ID. Useful when needing the controller for a particular * virtual disk. @@ -1437,7 +1622,7 @@ const VirtualSystemDescriptionEntry* VirtualSystemDescription::findControllerFro * @param elmMachine <vbox:Machine> element with attributes and subelements from some * DOM tree. */ -void VirtualSystemDescription::importVboxMachineXML(const xml::ElementNode &elmMachine) +void VirtualSystemDescription::importVBoxMachineXML(const xml::ElementNode &elmMachine) { settings::MachineConfigFile *pConfig = NULL; @@ -1459,7 +1644,7 @@ void VirtualSystemDescription::importVboxMachineXML(const xml::ElementNode &elmM } /** - * Returns the machine config created by importVboxMachineXML() or NULL if there's none. + * Returns the machine config created by importVBoxMachineXML() or NULL if there's none. * @return */ const settings::MachineConfigFile* VirtualSystemDescription::getMachineConfig() const |